一、前言
1.关于WS73的驱动移植,海思官方提供了很多文档,文档完整也非常详细。大家要一定要看。
其中的关键文档是《WS73V100 Linux平台驱动移植 用户指南_01》《WS73V100 单板配置文件 说明书_01》《WS73V100 Linux Wi-Fi、BLE软件开发指南_01》,它们非常重要!!!
二、驱动移植步骤
(一)软硬件准备
1.硬件准备
- Linux soc板子
- ws73模组,天线记得插上
我这里用的是易佰纳的板子,Linux板子是Hi3516cv610,ws73的SDIO模组也是他们家的。
2.软件环境与SDK准备
- Linux服务器 or Linux虚拟机
- Windows PC or MacOS PC
- 目标板卡的SDK
- 目标板卡的交叉编译工具链
- ws73的驱动SDK
在Linux服务器下解压SDK与工具链。
- 将ws73的Linux驱动SDK解压到你想存放的目录,这里我解到了
/opt/
,在目录/opt/109sdk
下。 - 将hi3516的SDK解压到你想存放的目录,同样解压到了
/opt/
,在目录/opt/hi3516cv610_musl
下。 - 将工具链解压到你想存放的目录,同样解压到了/opt/,在目录
/opt/gcc-20240318-arm-v01c02-linux-musleabi
下
3.硬件连接
在这里我们使用的是SDIO协议。注意:实际情况得根据自己的硬件做修改。
根据我这边板子的原理图可知,U4芯片是ws73模组,连接的是sdio1共6个引脚。
另外还有一个唤醒引脚WL_HOST_WAKE与一个电源引脚WL_REG_ON。在另一张原理图可以知道这两引脚分别连接到Linux板子的GPIO7_5,GPIO7_4。这两都是普通GPIO口。
相互连接Linux板子与ws73模组这8个引脚。
(二)修改Linux板子的内核配置、板子的设备树并编译镜像
1.修改Linux板子内核配置
文档《WS73V100 Linux平台驱动移植 用户指南_01》中有本小节的具体操作,请自行阅读参考。
为什么要修改Linux内核:因为ws73模组的Wifi、蓝牙、星闪驱动程序依赖内核的这些模块,所以说必须去Linux内核中启用。
以下是两种修改内核两种的方式。任选一种即可。
1.1可视化修改(make menuconfig)
#1.1.1找到自己的Linux板子SDK的内核源码目录并进入
#我板子的内核源码目录是`/opt/hi3516cv610_musl/open_source/linux/linux-5.10.y`
cd /opt/hi3516cv610_musl/open_source/linux/linux-5.10.y
#1.1.2执行make menuconfig
make menuconfig
执行后会进入内核配置界面。启用或不启动用内核模块都可以在里面配置。
操作说明:空格切换三种模式,“不选择” , " * “ ,”M"
a.进入 Networking support → Wireless,设置 cfg80211 和 mac80211。
如果内核中的 CFG80211 设置为’M’, cfg80211 会编译成 cfg80211.ko 文件;如果 CFG80211 设
置为*, cfg80211 会被集成到内核中。
这里我们都设置为*,避免多次安装ko文件。
b.进入 Device Drivers → MMC/SD/SDIO card support,配置 SDIO
c.进入Device Drivers→USBsupport,设置“xHCI HCD (USB 2.0) support”为*,配置USB
d.配置Netlink
选择Networking support→Networking options,设置“Network packet filtering framework (Netfilter)”为*
进入Network packet filtering framework (Netfilter),设置“Advancednetfilter
Configuration”为*
e.配置NAT转发(可选),自行参考文档,笔者省略。
d.编译导出defconfig文件并替换默认的defconfig文件
注意以下操作命令根据自己的环境不同而不同,需要略加修改,请勿完全照做。
- 执行命令make ARCH=arm CROSS_COMPILE=arm-v01c02-linux-musleabi- savedefconfig,生成defconfig文件。
- 将生成新的defconfig文件替换为默认的deconfig文件,执行cp defconfig arch/arm/configs/hi3516cv610_debug_defconfig
1.2直接修改defconfig文件
找到自己板子的默认defconfig文件,笔者的defconfig文件在/opt/hi3516cv610_musl/open_source/linux/linux-5.10.y/arch/arm/configs/hi3516cv610_debug_defconfig
#打开此文件
vim /opt/hi3516cv610_musl/open_source/linux/linux-5.10.y/arch/arm/configs/hi3516cv610_debug_defconfig
#步骤1.修改此文件,添加以下内容,注意有些板子里已有以下启用,即可不用添加
CONFIG_NETFILTER=y
CONFIG_NF_CONNTRACK=y
CONFIG_IP_VS=y
CONFIG_NF_SOCKET_IPV4=y
CONFIG_NF_TPROXY_IPV4=y
CONFIG_NF_DUP_IPV4=y
CONFIG_NF_LOG_ARP=y
CONFIG_IP_NF_IPTABLES=y
CONFIG_IP_NF_ARPTABLES=y
CONFIG_BT=y
CONFIG_CFG80211=y
CONFIG_CFG80211_WEXT=y
CONFIG_MAC80211=y
#步骤2.用#注释掉CONFIG_WIRELESS,保存并退出
如下图所示:
2.修改设备树
找到板子默认的设备树目录,笔者是/opt/hi3516cv610_musl/open_source/linux/linux-5.10.y/arch/arm/boot/dts/
,目录下有多个文件,找到自己板子的文件即可。
修改对应板子的设备树并启用sdio,对于我的板子硬件用的sdio1,所以打开sdio1。
将disable
改成okay
cd /opt/hi3516cv610_musl/open_source/linux/linux-5.10.y/arch/arm/boot/dts/
vim hi3516cv610-demb.dts
如下图所示:
3.编译SDK生成镜像并烧录到目标版
找到SDK全量编译的路径,并完全编译生成镜像后烧录到Linux板子。
笔者的路径是/opt/hi3516cv610_musl/smp/a7_linux/source/bsp
。
cd /opt/hi3516cv610_musl/smp/a7_linux/source/bsp
#全部编译
make all
#编译完成后烧录到板子上
(三)修改WS73驱动SDK配置并编译ko驱动
此小节的内容在《WS73V100 Linux平台驱动移植 用户指南_01》同样存在,请自己参考阅读。
进入ws73的驱动SDK目录中
cd /opt/109sdk
1.修改配置文件
1.1修改ws73_cfg_default.ini文件
#1.1修改ws73_cfg_default.ini文件
vim build/config/ws73_cfg_default.ini
修改 wakeup 引脚序号与 poweron 引脚序号。
根据wakeup与poweron的硬件引脚编号确定Linux中GPIO的序号,硬件编号为GPIO7_5,GPIO7_4,因为我这板子是8个为一组的,所以说在Linux中对应的GPIO序号就是7x8+5=61,7x8+4=60,所以说修改为61与60,如下图所示:
这两个GPIO的具体功能可以参考《WS73V100 单板配置文件 说明书_01》,我不做详细解释,请自行阅读。
1.2修改ws73_default.config文件
#1.2
vim build/config/ws73_default.config
- 找到交叉编译工具链合集名称,并输入。
- 找到Linux板卡SDK的内核源码目录,并填写路径。
- 修改总线类型:将WSCFG_BUS_USB 为 WSCFG_BUS_SDIO。
- 修改 wakeup 引脚序号与 poweron 引脚序号。
- 修改.bin固件与ini配置的存放位置。
注意:配置编译参数(编译器与内核存放路径要填本机的绝对路径)
1.3修改ws73_usb_light.config文件
#1.3
vim build/config/ws73_usb_light.config
- 找到交叉编译工具链合集名称,并输入。
- 找到Linux板卡SDK的内核源码目录,并填写路径。
- 修改总线类型:将WSCFG_BUS_USB 为 WSCFG_BUS_SDIO。
- 修改 poweron 引脚序号。
1.4修改ws73_usb_light_v2.config文件
#1.4
vim build/config/ws73_usb_light_v2.config
- 找到交叉编译工具链合集名称,并输入。
- 找到Linux板卡SDK的内核源码目录,并填写路径。
- 修改总线类型:将WSCFG_BUS_USB 为 WSCFG_BUS_SDIO。
- 修改 wakeup 引脚序号与 poweron 引脚序号。
2.编译SDK
确保是否安装Python工具链以及cmake。没有安装自行安装。请参考《WS73V100 Linux平台驱动移植 用户指南_01》的1.2 Python环境安装。
开始编译:
#开始编译
make all
编译成功打印信息:
生成的ko驱动文件在output/bin目录下
(四)Linux下安装模组驱动
进入你Linux板子的终端。
1.存放.bin固件与.ini配置
-
将Linux服务器上的/opt/109sdk/output/ws73_cfg.ini 文件传输到目标板子上的/etc/目录下。
-
自己将Linux服务器上的/opt/109sdk/firmware/us/ 下的所有.bin文件传输到目标板子上的/etc/ws73/目录下。
传输的方式有很多种,我用的是tftp,你们可以自行选择。
没有ws73文件夹请自行创建。
传输完成后,以下是板子终端的信息,能看到.ini与.bin都已经放好了。
2.传输ko驱动文件并安装
2.1传输ko文件到目标板子上
随便找一个文件夹存放ko文件,这里我选择存放在/usr/komod/
下
#创建并进入komod
cd /usr/
mkdir komod
cd komod
#传输ko文件
tftp 10.168.1.220 -gr plat_soc.ko
tftp 10.168.1.220 -gr wifi_soc.ko
tftp 10.168.1.220 -gr sle_soc.ko
tftp 10.168.1.220 -gr ble_soc.ko
2.2检测sdio设备与修改pin为普通GPIO口
- 检测sdio设备
#查看SDIO设备
cat /proc/mci/mci_info
能看到sdio1有设备并有一些参数信息。说明sdio硬件连接没问题。
- 修改pin为普通GPIO口
这里主要是修改wakeup与poweron的两个引脚pin的硬件映射。把它们映射为普通的GPIO口,并内置下拉。
非常重要!!!根据自己的板子情况会不一样,得自己去查找相关工具或着是用Pinctl子系统的接口修改pin的映射关系。
在我的Linux板子中有bspmm工具可以修改引脚映射。
#修改引脚映射,修改寄存器的值
bspmm 0x11130050 0x1205 #设置为GPIO7_5 下拉
bspmm 0x11130054 0x1205 #设置为GPIO7_4 下拉
3.安装驱动
进入komod文件夹,安装驱动
#首先安装plat_soc.ko
insmod plat_soc.ko
#然后安装wifi_soc.ko
insmod wifi_soc.ko
#其次安装ble_soc.ko
insmod ble_soc.ko
#最后安装sle_soc.ko
insmod sle_soc.ko
每次安装成功的打印信息如下:
-
plat,显示了 plat_init_etc :: succ!,即成功
-
wifi,显示了insmod wifi ko finished,即成功
#查看网卡信息,检测是否多出来一个wlan0,若是的话网卡驱动安装成功
ip addr
-
ble,由于笔者没有经过蓝牙测试,所以说不知道蓝牙驱动是否安装成功,以下日志仅供参考。
-
sle,星闪也没测试过,以下日志仅供参考
(五)Wifi测试、蓝牙测试、星闪测试
这小节内容请参考《WS73V100 Linux Wi-Fi、BLE软件开发指南_01》。
由于时间有限,后续空闲时间我再详细写编写,在这里我列出我常用的命令
Wifi测试
#动态运行库文件获取
tftp 10.168.1.220 -gr libnl-genl-3.so.200.26.0
tftp 10.168.1.220 -gr libnl-3.so.200.26.0
#加载动态链接
ln -s libnl-3.so.200.26.0 libnl-3.so.200
ln -s libnl-genl-3.so.200.26.0 libnl-genl-3.so.200
#添加运行wifi程序
cd /bin
tftp 10.168.1.220 -gr wpa_supplicant
tftp 10.168.1.220 -gr wpa_cli
tftp 10.168.1.220 -gr hostapd
#赋予权限
chmod a+x wpa_supplicant
chmod a+x wpa_cli
chmod a+x hostapd
#wifi程序设置程序,后台跑
wpa_supplicant -iwlan0 -Dnl80211 -c/etc/Wireless/wpa_supplicant.conf &
#wifi程序设置程序,后台跑
#wpa_supplicant -iwlan0 -Dnl80211 -c/etc/Wireless/wpa_supplicant.conf -B -f /dev/null
#进入wifi设置
wpa_cli -iwlan0 -p/etc/Wireless/wpa_supplicant
#扫描wifi
scan
scan_results
#添加网络设置
add_network
set_network 1 ssid "usn"
set_network 1 key_mgmt WPA-PSK
set_network 1 psk "usn123456"
select_network 1
#输入q退出
#自动获取IP地址
udhcpc -i wlan0
#查看获取的IP地址
ip addr
#测试网络连接
ping baidu.com
#测试完成,杀死相关进程
ps | grep wpa_supplicant # 查看进程是否存活
killall wpa_supplicant
killall udhcpc
测试结果:
能看到wlan0分配到了ip地址。
能ping通百度与自己的网站,Wifi网络通信成功。
蓝牙测试
未测试
星闪测试
未测试
转载请声明源作者信息谢谢。
源文章地址:https://ikat.top/?p=105
源作者:ikat易卡
时间:2025-04-21
初版:20250421-V0.1-byikat