WS73在Linux SOC下驱动移植的详细教程基于SDIO协议–WIFi网卡、蓝牙BLE、星闪SLE

一、前言

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文件
注意以下操作命令根据自己的环境不同而不同,需要略加修改,请勿完全照做。

  1. 执行命令make ARCH=arm CROSS_COMPILE=arm-v01c02-linux-musleabi- savedefconfig,生成defconfig文件。
  2. 将生成新的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序号就是7×8+5=61,7×8+4=60,所以说修改为61与60,如下图所示:

这两个GPIO的具体功能可以参考《WS73V100 单板配置文件 说明书_01》,我不做详细解释,请自行阅读。

1.2修改ws73_default.config文件

#1.2
vim build/config/ws73_default.config
  1. 找到交叉编译工具链合集名称,并输入。
  2. 找到Linux板卡SDK的内核源码目录,并填写路径。
  3. 修改总线类型:将WSCFG_BUS_USB 为 WSCFG_BUS_SDIO。
  4. 修改 wakeup 引脚序号与 poweron 引脚序号。
  5. 修改.bin固件与ini配置的存放位置。

注意:配置编译参数(编译器与内核存放路径要填本机的绝对路径)

1.3修改ws73_usb_light.config文件

#1.3
vim build/config/ws73_usb_light.config
  1. 找到交叉编译工具链合集名称,并输入。
  2. 找到Linux板卡SDK的内核源码目录,并填写路径。
  3. 修改总线类型:将WSCFG_BUS_USB 为 WSCFG_BUS_SDIO。
  4. 修改 poweron 引脚序号。

1.4修改ws73_usb_light_v2.config文件

#1.4
vim build/config/ws73_usb_light_v2.config
  1. 找到交叉编译工具链合集名称,并输入。
  2. 找到Linux板卡SDK的内核源码目录,并填写路径。
  3. 修改总线类型:将WSCFG_BUS_USB 为 WSCFG_BUS_SDIO。
  4. 修改 wakeup 引脚序号与 poweron 引脚序号。

2.编译SDK

确保是否安装Python工具链以及cmake。没有安装自行安装。请参考《WS73V100 Linux平台驱动移植 用户指南_01》的1.2 Python环境安装。

开始编译:

#开始编译
make all

编译成功打印信息:

生成的ko驱动文件在output/bin目录下

(四)Linux下安装模组驱动

进入你Linux板子的终端。

1.存放.bin固件与.ini配置

  1. 将Linux服务器上的/opt/109sdk/output/ws73_cfg.ini 文件传输到目标板子上的/etc/目录下。
  2. 自己将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口

  1. 检测sdio设备
#查看SDIO设备
cat /proc/mci/mci_info

能看到sdio1有设备并有一些参数信息。说明sdio硬件连接没问题。

  1. 修改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

每次安装成功的打印信息如下:

  1. plat,显示了 plat_init_etc :: succ!,即成功
  2. wifi,显示了insmod wifi ko finished,即成功
#查看网卡信息,检测是否多出来一个wlan0,若是的话网卡驱动安装成功
ip addr
  1. ble,由于笔者没有经过蓝牙测试,所以说不知道蓝牙驱动是否安装成功,以下日志仅供参考。
  2. 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
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇