北京合众恒跃科技有限公司
直播中

jf_50393217

5年用户 227经验值
擅长:可编程逻辑 嵌入式技术
私信 关注
[经验]

【HZ-T536开发板免费体验】3、移植星闪WS73模块

image.png

由于前段时间没事儿干,购买了安信可的星闪模块,顺便想折腾一下。就尝试一下,在T536这个板子上能不能跑星闪的模块,移植一下驱动。

在尝试的过程中,发现官方Ubuntu镜像里的内核过于精简(未包含cfg80211和部分加密功能),编译的ws73内核驱动模块没办法正常加载。那就只能编译SDK,重新烧录镜像来测试了。

在SDK里,使用./build.sh menuconfig命令,开启内核配置后,添加了cfg80211和mac80211模块(加密模块懒得找,应该是自动启用了)。重新编译内核,SDK,打包烧录,就可以准备开始了。

首先解压缩下载下来的WS73的SDK。然后修改这几个文件。

1、修改sdk下的Makefile文件,修改默认的编译对象
调整成默认使用ws73_usb_light_v2.config这个文件。

image.png

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

3、在终端执行编译构建命令

make platform
make wifi
make ble
make sle

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

编译时有报错的情况,修改对应的文件即可。

在编译wifi固件时,需要修改kernel/linux-5.10-origin/arch/arm64/include/asm/cpufeature.h文件(内核源码里),不然编译器报错。
image.png

在编译ble固件时,报错如下。
image.png
这时候只需要去sdk目录的driver/bsle/ble_driver/linux/ble_host_hcc.c文件里,注释掉583行定义的函数即可通过编译。
image.png
在编译sle固件和platform固件时正常通过。

5、文件拷贝完毕后,就可以插上设备,然后加载内核模块了。
直接使用

insmod plat_soc.ko
insmod wifi_soc.ko

加载内核模块后的提示如下

image.png

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

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

image.png

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

wpa_cli -iwlan0 status

image.png

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

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

image.png

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

image.png

由于板子的系统是buildroot,我顺便让chatGPT帮忙写了一个一键联网的脚本。

#!/usr/bin/env bash

insmod /root/bin/plat_soc.ko
insmod /root/bin/wifi_soc.ko

# ===== 可按需改动 =====

IFACE="wlan0"
COUNTRY="us"             # 监管域:在阿根廷建议设为 AR;不想设可注释掉对应命令
SSID="Xiaomi_787A"

# =====================

PSK="${1:-walker2048}"
if [ -z "$PSK" ]; then
echo "用法: sudo $0 \"WiFi密码\""
exit 1
fi

# 设监管域(可选)

iw reg set "$COUNTRY" 2>/dev/null

# 确保接口UP

ip link set "$IFACE" up 2>/dev/null

# 干掉可能残留的 wpa_supplicant(不优雅但简单)

pkill -f "wpa_supplicant.*-i $IFACE" 2>/dev/null

# 生成最小配置到 /tmp

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电容后,就可以正常驱动了,只是因为没有一个正规的天线,测试速率会很低。

sub.jpg

更多回帖

发帖
×
20
完善资料,
赚取积分