
由于前段时间没事儿干,购买了安信可的星闪模块,顺便想折腾一下。就尝试一下,在T536这个板子上能不能跑星闪的模块,移植一下驱动。
在尝试的过程中,发现官方Ubuntu镜像里的内核过于精简(未包含cfg80211和部分加密功能),编译的ws73内核驱动模块没办法正常加载。那就只能编译SDK,重新烧录镜像来测试了。
在SDK里,使用./build.sh menuconfig命令,开启内核配置后,添加了cfg80211和mac80211模块(加密模块懒得找,应该是自动启用了)。重新编译内核,SDK,打包烧录,就可以准备开始了。
首先解压缩下载下来的WS73的SDK。然后修改这几个文件。
1、修改sdk下的Makefile文件,修改默认的编译对象
调整成默认使用ws73_usb_light_v2.config这个文件。

2、修改sdk下的sdk/build/config/ws73_usb_light_v2.config配置文件,添加工具链设置和内核目录设置,并且设置目标架构成arm64

3、在终端执行编译构建命令
make platform
make wifi
make ble
make sle
4、上传固件到设备上
拷贝ws73的固件放到板子的/etc/ws73/目录下,就是这些固件。

拷贝以下的内核文件和配置文件到板子上。ws73_cfg.ini 直接放到/etc/目录下,内核模块文件随意。
固件和配置文件的目录是写死的,在编译内核固件时就在编译配置里写死了,必须拷贝到指定目录。

编译时有报错的情况,修改对应的文件即可。
在编译wifi固件时,需要修改kernel/linux-5.10-origin/arch/arm64/include/asm/cpufeature.h文件(内核源码里),不然编译器报错。

在编译ble固件时,报错如下。

这时候只需要去sdk目录的driver/bsle/ble_driver/linux/ble_host_hcc.c文件里,注释掉583行定义的函数即可通过编译。

在编译sle固件和platform固件时正常通过。
5、文件拷贝完毕后,就可以插上设备,然后加载内核模块了。
直接使用
insmod plat_soc.ko
insmod wifi_soc.ko
加载内核模块后的提示如下

此时ip addr命令可以看到模块的两个节点wlan0和wlan1,一个是sta节点,一个是ap节点。

加载完毕后就直接使用下面这个命令就可以连上wifi节点了。(我提前把wifi配置写到配置文件里了)
wpa_supplicant -iwlan0 -Dnl80211 -c /etc/wpa_supplicant.conf &

这时候使用下面的命令可以查看连接状态。可以看到已经连上了。
wpa_cli -iwlan0 status

但是ip地址还是没有的,可能是网络配置里没有设置好自动获取ip地址。

这时候可以运行下面的命令自动获取ip地址。
udhcpc -iwlan0

正常的话,就可以获取到ip地址了。然后顺便ping一下一个网址,可以看到能成功连上

由于板子的系统是buildroot,我顺便让chatGPT帮忙写了一个一键联网的脚本。
#!/usr/bin/env bash
insmod /root/bin/plat_soc.ko
insmod /root/bin/wifi_soc.ko
IFACE="wlan0"
COUNTRY="us"
SSID="Xiaomi_787A"
PSK="${1:-walker2048}"
if [ -z "$PSK" ]; then
echo "用法: sudo $0 \"WiFi密码\""
exit 1
fi
iw reg set "$COUNTRY" 2>/dev/null
ip link set "$IFACE" up 2>/dev/null
pkill -f "wpa_supplicant.*-i $IFACE" 2>/dev/null
CONF="/tmp/wpa_${IFACE}.conf"
cat > "$CONF" </dev/null | awk -F= '/^wpa_state=/{print $2}')"
if [ "$STATE" = "COMPLETED" ]; then
echo "[OK] 已连接到 ${SSID}"
break
fi
sleep 1
done
if [ "$STATE" != "COMPLETED" ]; then
echo "[ERR] 40秒内未连上(当前状态: ${STATE:-UNKNOWN})。"
exit 2
fi
# 获取 DHCP(优先 dhclient,其次 udhcpc)
if command -v dhclient >/dev/null 2>&1; then
dhclient -v "$IFACE"
elif command -v udhcpc >/dev/null 2>&1; then
udhcpc -i "$IFACE" -q -n -t 5
else
echo "[ERR] 未找到 dhclient/udhcpc,请安装一个 DHCP 客户端。"
exit 3
fi
ip -4 addr show dev "$IFACE" | awk '/inet /{print "[IP] "$2}'
使用这个脚本就可以自动加载模块,并且获取到ip地址了。如果想开机自动联网,就得把这个脚本加到启动服务里。
顺便晒一下随意焊接的星闪模块,一开始只想焊接3.3V、GND、DM和DP信号线,结果工作不正常(能枚举USB设备,但是驱动通信失败),给3.3V和VIO的两个引脚飞了104电容后,就可以正常驱动了,只是因为没有一个正规的天线,测试速率会很低。
