WHC Wi-Fi Fat Host 驱动移植
驱动移植
FullMAC 当前基于 Linux 内核 5.4 ,5.10 以及 5.15 进行测试和验证,若在其他内核版本遇到编译问题,请`联系我们 <https://aiot.realmcu.com/contact-us/technical-consult>`__。
备注
SPI 会在 CS 引脚置低并检测到 CLK 后立即进行数据传输。总线繁忙时可能存在边界条件:
测试表明,在 CS 置低与主机推送 CLK 之间增加 7μs 延迟可确保总线繁忙时的数据传输安全。
但部分旧版本系统的 SPI 驱动可能不支持
spi_delay
,此时需直接修改驱动代码以添加延迟。
环境准备
在 Linux 系统安装以下依赖包:
sudo apt-get install build-essential
sudo apt install dhcpcd hostapd dhcpd
使能接口
Linux PC:跳过此步骤
树莓派:
通过
dtoverlay
配置 SDIO。树莓派 4 专用指令为:
sudo dtoverlay sdio poll_once=off
树莓派 5 指令为:
sudo dtoverlay sdio
在目录
/component/wifi/whc/whc_host_linux
执行以下操作,nan
和p2p
为可选参数,在需要使能 Wi-Fi NAN 和 Wi-Fi P2P 功能时添加:./fullmac_setup.sh sdio [nan] [p2p]
./fullmac_setup.sh spi [nan] [p2p]
./fullmac_setup.sh usb [nan] [p2p]
根据主机运行模式选择输入 1 或 2
choose target host mode: 1) Fat host with cfg80211 2) Slim host without cfg80211 choose target host mode:
将
whc_host_linux
目录复制到 Linux 内核源码树新终端执行编译
cd {driver_path}/whc_host_linux make
加载驱动
模块路径:
/whc_host_linux/fullmac/sdio/fullmac_sdio.ko
sudo su cp sdio/fullmac_sdio.ko /lib/modules/$(uname -r)/ depmod modprobe fullmac_sdio
模块路径:
/whc_host_linux/fullmac/spi/fullmac_spi.ko
sudo su cp spi/fullmac_spi.ko /lib/modules/$(uname -r)/ depmod modprobe fullmac_spi
模块路径:
/whc_host_linux/fullmac/usb/fullmac_usb.ko
sudo su cp usb/fullmac_usb.ko /lib/modules/$(uname -r)/ depmod modprobe fullmac_usb
Ameba 作为 FullMAC Host 使用指南
环境配置
在目录
{SDK}/amebaxxx_gcc_project
执行配置工具
(Top) -> CONFIG WHC INTF -> WHC_MODE ----Configuration---- ( ) WHC_IPC ( ) FULLMAC_DEV (X) FULLMAC_HOST (Top) -> CONFIG WHC INTF -> FULLMAC HOST config ----Configuration---- (X) Support WHC CMD PATH (X) Support WHC WIFI API PATH
固件编译
生成目标文件:
./build.py
输出文件:
km4_boot_all.bin
km0_km4_app.bin
固件烧录
使用专用烧录工具将固件写入开发板
第三方平台移植
使用其他 Host 芯片时,需将 component/os/freertos
目录移植至目标系统。
功能验证与 Demo 演示
驱动加载确认
在 modprobe 加载成功后,执行
ifconfig
可查看 Wi-Fi 设备信息。输出示例:
Station 模式:设备 MAC 地址前缀为
00:e0:4c
SoftAP 模式:设备 MAC 地址前缀为
00:e1:4c
关闭 NetworkManager 和 DHCP 服务以避免冲突
Ubuntu 系统注意:若需通过命令行连接 AP,需关闭 NetworkManager 和 DHCP 服务以避免冲突
sudo systemctl stop NetworkManager dhcpcd.service sudo systemctl disable NetworkManager
创建配置文件 ``/etc/wpa_supplicant/wpa_supplicant.conf``
ctrl_interface=/var/run/wpa_supplicant network={ ssid="HUAWEI-JX2UX5_HiLink_5G" psk="12345678" }
启动 WPA 连接
wpa_supplicant -D nl80211 -i wlanX -c /etc/wpa_supplicant/wpa_supplicant.conf -dd > /var/wifi_log
获取 IP 地址
dhcpcd wlanX
配置 SoftAP
创建配置文件
/etc/hostapd/hostapd.conf
driver=nl80211 logger_syslog=-1 logger_syslog_level=2 hw_mode=g channel=6 ssid=aaa_test wpa=2 wpa_passphrase=12345678 wpa_key_mgmt=WPA-PSK wpa_pairwise=CCMP
创建 DHCP 配置文件
/etc/udhcpd_wlanX.conf
start 192.168.43.20 end 192.168.43.254 interface wlanX opt dns 192.168.43.1 option subnet 255.255.255.0 opt router 192.168.43.1
启动 SoftAP
hostapd /etc/hostapd/hostapd.conf -i wlanX
设置 AP IP 地址
ifconfig wlanX 192.168.43.1 netmask 255.255.255.0
启动 DHCP 服务
udhcpd -f /etc/udhcpd_wlanX.conf
备注
wlanX
为模式设备名,可在终端执行 ifconfig -a
来获取信息
驱动加载确认
在 modprobe 加载成功后,执行
ifconfig
可查看 Wi-Fi 设备信息。输出示例:
Station 模式:设备 MAC 地址前缀为
00:e0:4c
SoftAP 模式:设备 MAC 地址前缀为
00:e1:4c
关闭 NetworkManager 和 DHCP 服务以避免冲突
Ubuntu 系统注意:若需通过命令行连接 AP,需关闭 NetworkManager 和 DHCP 服务以避免冲突
sudo systemctl stop NetworkManager dhcpcd.service sudo systemctl disable NetworkManager
创建配置文件 ``/etc/wpa_supplicant/wpa_supplicant.conf``
ctrl_interface=/var/run/wpa_supplicant network={ ssid="HUAWEI-JX2UX5_HiLink_5G" psk="12345678" }
启动 WPA 连接
wpa_supplicant -D nl80211 -i wlanX -c /etc/wpa_supplicant/wpa_supplicant.conf -dd > /var/wifi_log
获取 IP 地址
运行 demo
cd ${SDK}/component/wifi/whc/whc_host_linux/app sudo ./whc_slim_host_demo
在 demo 进行初始化操作
> init
在 demo 输入 cmd 通知 Ameba 获取 IP 地址
> dhcp
根据 Ameba 回传的 IP 地址信息,在终端配置 IP 地址以及网关
sudo ip addr add 192.168.x.x/24 dev wlanX sudo ip link set wlanX up sudo ip route add default via 192.168.x.x dev wlanX
网络测试
ping 192.168.x.x
备注
wlanX
为模式设备名,可在终端执行 ifconfig -a
来获取信息
执行 WiFi 扫描
> AT+WLSCAN
建立无线连接
> AT+WLCONN=ssid,ap_test,pw,12345678
备注
ap_test
为目标 AP 的 ssid,12345678
为目标 AP 的密码,开放网络可省略密码参数。网络测试
AT+WLPING=192.168.x.x
客制化通路指南
Fat Host 模式下,如果除了标准的 Wi-Fi/BT/Socket 编程之外,客户还有 Host 与 Device 之间客制化的通信需求,则可以使用 CUST_PATH 。