【网络专题1】Tina Wi-Fi模组移植_实践篇
-
大家好,我是三颗芋圆,始于LWIP,陷于TCP/IP,忠于80211。
终于迎来了第一个专题:Wi-Fi模组移植,本次专题将介绍如何在Tina上移植一款Wi-Fi模组,从理论到实操移植XR829详细介绍。
避免篇幅太长,分成了前导篇,理论篇,实践篇。实践篇
这里我将以 XR829 为例子详细介绍模组适配的全过程。主控:D1 无线模组:XR829 内核版本:linux-5.4 方案:d1_nezha-tina
按照理论篇的5个步骤来操作
1. 内核驱动适配
内核驱动适配分为如下四个步骤:
• 获取源码。
• 添加 Kconfig 和 Makefile 配置。
• make kernel_menuconfig 配置。
• 编译。
1)获取 xr829 驱动源码,放到内核驱动路径下。客户可以从一号通账号获取。tina/lichee/linux-5.4/drivers/net/wireless/xr829/ ├── include ├── Kconfig ├── Makefile ├── umac └── wlan
2)内核添加 Kconfig 和 Makefile 的配置。
tina/lichee/linux-5.4/drivers/net/wireless/Kconfig 文件中引入 XR829 驱动的 Kconfig 配 置source "drivers/net/wireless/xr829/Kconfig"
tina/lichee/linux-5.4/drivers/net/wireless/Makefile 文件中引入 XR829 驱动的 Makefile配置
obj-$(CONFIG_XR829_WLAN) += xr829/
3)make kernel_menuconfig 配置
在 tina/lichee/linux-5.4 内核目录执行 m kernel_menuconfig
a. XR829 驱动的配置> Device Drivers > Network device support > Wireless LAN <M> XR829 WLAN support
b. sunxi-rf 的配置> Device Drivers > Misc devices <*> Allwinner rfkill driver
c. SDIO 的配置> Device Drivers > MMC/SD/SDIO card support <*> Allwinner sunxi SD/MMC Host Controller support --->
4) 编译
在 tina/lichee/linux-5.4 内核目录执行 mkernel 进行编译tina/lichee/linux-5.4]$ mkernel tina/lichee/linux-5.4/drivers/net/wireless/xr829/ ├── include ├── Kconfig ├── Makefile ├── modules.order ├── umac ├── wlan ├── xr829.ko //正常编译出xr829.ko模块 ├── xr829.mod ├── xr829.mod.c ├── xr829.mod.o └── xr829.o
2. 硬件资源适配
在 tina/device/config/chips/r528/configs/evb1/linux/board.dts中添加引脚配置wlan_pins_a:wlan@0 { pins = "PG11"; function = "clk_fanout1"; //这里涉及一个特殊处理,该方案的32k采用PG11复用给出 }; ... rfkill: rfkill@0 { compatible = "allwinner,sunxi-rfkill"; chip_en; power_en; pinctrl-0 = <&wlan_pins_a>; pinctrl-names = "default"; status = "okay"; wlan: wlan@0 { compatible = "allwinner,sunxi-wlan"; clock-names = "32k-fanout1"; clocks = <&ccu CLK_FANOUT1_OUT>; wlan_busnum = <0x1>; wlan_regon = <&pio PE 17 GPIO_ACTIVE_HIGH>; wlan_hostwake = <&pio PG 10 GPIO_ACTIVE_HIGH>; /*wlan_power = "VCC-3V3";*/ /*wlan_power_vol = <3300000>;*/ /*interrupt-parent = <&pio>;*/ /*interrupts = < PG 10 IRQ_TYPE_LEVEL_HIGH>;*/ wakeup-source; }; ... };
注意:以上所有项必须参看原理图进行配置,配置与原理图实际使用的资源保持一致;最好是和硬件同事一起确认,比如有些设计供电可能是没有 axp 的,硬件直接供电了,所以不需要配置,特别注意的就是 sdio 的配置。
3. 方案 module 适配
在 tina/target/allwinner/r528-common/modules.mk 中添加模块配置define KernelPackage/net-xr829-40M SUBMENU:=$(WIRELESS_MENU) TITLE:=xr829 support (staging) DEPENDS:= +xr829-firmware +@IPV6 +@XR829_USE_40M_SDD +@USES_XRADIO +@PACKAGE_xr829-rftest KCONFIG:=\ CONFIG_XR829_WLAN=m \ CONFIG_PM=y\ CONFIG_BT=y \ CONFIG_BT_BREDR=y \ CONFIG_BT_RFCOMM=y \ CONFIG_BT_RFCOMM_TTY=y \ CONFIG_BT_DEBUGFS=y \ CONFIG_XR_BT_LPM=y \ CONFIG_XR_BT_FDI=y \ CONFIG_BT_HCIUART=y \ CONFIG_BT_HCIUART_H4=y \ CONFIG_HFP_OVER_PCM=y \ CONFIG_RFKILL=y \ CONFIG_RFKILL_PM=y \ CONFIG_RFKILL_GPIO=y #FILES:=$(LINUX_DIR)/drivers/net/wireless/xr829/wlan/xradio_core.ko #FILES+=$(LINUX_DIR)/drivers/net/wireless/xr829/wlan/xradio_wlan.ko #FILES+=$(LINUX_DIR)/drivers/net/wireless/xr829/umac/xradio_mac.ko #AUTOLOAD:=$(call AutoProbe, xradio_mac xradio_core xradio_wlan) FILES:=$(LINUX_DIR)/drivers/net/wireless/xr829/xr829.ko AUTOLOAD:=$(call AutoProbe, xr829) endef define KernelPackage/net-xr829-40M/description Kernel modules for xr829 support endef $(eval $(call KernelPackage,net-xr829-40M))
几点说明:
DEPENDS:Tina包依赖配置
KCONFIG:内核依赖配置
FILES:内核模块路径
一般不需要用户自己适配,可以自己从已经适配过的方案的modules.mk中拷贝过来就好,也可以直接拷贝这段代码。
注意:XR829分为40M和24M晶振,如果是24M晶振建议用下面的配置做区分。define KernelPackage/net-xr829 SUBMENU:=$(WIRELESS_MENU) TITLE:=xr829 support (staging) DEPENDS:= +xr829-firmware +@IPV6 +@USES_XRADIO +@PACKAGE_xr829-rftest +@PACKAGE_xr829- rftest KCONFIG:=\ CONFIG_XR829_WLAN=m \ CONFIG_PM=y\ CONFIG_BT=y \ CONFIG_BT_BREDR=y \ CONFIG_BT_RFCOMM=y \ CONFIG_BT_RFCOMM_TTY=y \ CONFIG_BT_DEBUGFS=y \ CONFIG_XR_BT_LPM=y \ CONFIG_XR_BT_FDI=y \ CONFIG_BT_HCIUART=y \ CONFIG_BT_HCIUART_H4=y \ CONFIG_HFP_OVER_PCM=y \ CONFIG_RFKILL=y \ CONFIG_RFKILL_PM=y \ CONFIG_RFKILL_GPIO=y #FILES:=$(LINUX_DIR)/drivers/net/wireless/xr829/wlan/xradio_core.ko #FILES+=$(LINUX_DIR)/drivers/net/wireless/xr829/wlan/xradio_wlan.ko #FILES+=$(LINUX_DIR)/drivers/net/wireless/xr829/umac/xradio_mac.ko #AUTOLOAD:=$(call AutoProbe, xradio_mac xradio_core xradio_wlan) FILES+=$(LINUX_DIR)/drivers/net/wireless/xr829/xr829.ko AUTOLOAD:=$(call AutoProbe, xr829) endef define KernelPackage/net-xr829/description Kernel modules for xr829 support endef $(eval $(call KernelPackage,net-xr829))
接着在 tina 根目录执行 m menuconfig 就可以看到新添加的模组
make menuconfig > Kernel modules > Wireless Drivers
4. 添加 Firmware
在 tina/package/firmware/linux-firmware/添加 xr829 需要的 firmwaretina/package/firmware/linux-firmwarexr829/ ├── boot_xr829.bin //启动相关bin ├── etf_xr829.bin //etf测试工具相关bin ├── fw_xr829_40M.bin //wifi固件40M晶振需要的bin ├── fw_xr829.bin //wifi固件24M晶振需要的bin ├── fw_xr829_bt_40M.bin //bt固件40M晶振需要的bin ├── fw_xr829_bt.bin //bt固件24M晶振需要的bin ├── sdd_xr829_40M.bin //功率配置40M晶振的bin ├── sdd_xr829.bin //功率配置24M晶振的bin └── xr829.mk //Makefile文件
说明:功能调试阶段 wifi 只需要关注 boot_xr829.bin,fw_xr829.bin,sdd_xr829.bin。这些文件的获取一般伴随 xr829 产品包一起释放。
注意:一定要区分 24M 晶振和 40M 晶振Package/xr829-firmware = $(call Package/firmware-default,Xradio xr829 firmware) PKG_CONFIG_DEPENDS +=CONFIG_XR829_USE_40M_SDD define Package/xr829-firmware/install $(INSTALL_DIR) $(1)/$(FIRMWARE_PATH) $(INSTALL_DATA) $(TOPDIR)/package/firmware/linux-firmware/xr829/boot_xr829.bin $(1) /$(FIRMWARE_PATH)/boot_xr829.bin $(INSTALL_DATA) $(TOPDIR)/package/firmware/linux-firmware/xr829/etf_xr829.bin $(1)/ $(FIRMWARE_PATH)/etf_xr829.bin $(INSTALL_DATA) $(TOPDIR)/package/firmware/linux-firmware/xr829/fw_xr829.bin $(1)/$ (FIRMWARE_PATH)/fw_xr829.bin ifeq ($(CONFIG_XR829_USE_40M_SDD), y) $(INSTALL_DATA) $(TOPDIR)/package/firmware/linux-firmware/xr829/sdd_xr829_40M.bin $(1)/$(FIRMWARE_PATH)/sdd_xr829.bin $(INSTALL_DATA) $(TOPDIR)/package/firmware/linux-firmware/xr829/fw_xr829_bt_40M.bin $(1)/$(FIRMWARE_PATH)/fw_xr829_bt.bin else $(INSTALL_DATA) $(TOPDIR)/package/firmware/linux-firmware/xr829/sdd_xr829.bin $(1)/ $(FIRMWARE_PATH)/sdd_xr829.bin $(INSTALL_DATA) $(TOPDIR)/package/firmware/linux-firmware/xr829/fw_xr829_bt.bin $(1)/$(FIRMWARE_PATH)/fw_xr829_bt.bin endif endef $(eval $(call BuildPackage,xr829-firmware))
说明:可以看到整个 Makefile 文件就只是做了简单的拷贝动作。
注意:一般 firmware 的路径是:系统的/lib/firmware/, 如果更改请确保是否和驱动中定义的保持一致,最新版驱动已经自适应寻找路径了, 早期的驱动版本一定要留意。
驱动中定义 firmware 文件为:xr829/wlan/etf.h#ifdef USE_VFS_FIRMWARE #define XR829_ETF_FIRMWARE ("/system/vendor/etc/firmware/etf_xr829.bin") #else #define XR829_ETF_FIRMWARE ("etf_xr829.bin") #endif xr829/wlan/fwio.h #ifdef USE_VFS_FIRMWARE #define XR829_BOOTLOADER ("/system/vendor/etc/firmware/boot_xr829.bin") #define XR829_FIRMWARE ("/system/vendor/etc/firmware/fw_xr829.bin") #define XR829_SDD_FILE ("/system/vendor/etc/firmware/sdd_xr829.bin") #else #define XR829_BOOTLOADER ("boot_xr829.bin") #define XR829_FIRMWARE ("fw_xr829.bin") #define XR829_SDD_FILE ("sdd_xr829.bin") #endif
接着在 tina 根目录执行 m menuconfig 就可以看到新添加的 firmware 配置
> Firmware -*- xr829-firmware..................................... Xradio xr829 firmware (/lib/firmware/) Firmware's directory //如想临时配置修改也可以改这里的路径 -*- xr829 with 40M sdd
(注意:晶振 24M 和 40M 的区分,根据实际硬件选择)
5. 应用工具适配
1)wifimanager 配置make menuconfig > Allwinner > wifimanager
2)smartlinkd 配网配置make menuconfig > Allwinner > smartlinkd
3)softap 配置make menuconfig > Allwinner > softap
4)rf 工具配置
在 tina/package/utils/rftest 目录下添加 xr829 的 RF 测试工具(一般都会随产品包释放)tina/package/utils/rftest/xr829/ └── etf ├── btetf_1.4.0 ├── btetf_riscv_1.0.5 ├── etf ├── etf_riscv_1.4.0 └── xrbt_testmode_1.4.0
在 tina/package/utils/rftest/Makefile 中添加
define Package/xr829-rftest $(Package/$(PKG_NAME)/Default) TITLE:=xr829 rf test tools endef define Package/xr829-rftest/description $(call Package/$(PKG_NAME)/description/Default) endef define Package/xr829-rftest/install $(INSTALL_DIR) /$(1)/usr/bin ifeq ($(TARGET_ARCH), riscv) $(INSTALL_BIN) ./xr829/etf/etf_riscv_1.4.0 /$(1)/usr/bin/etf $(INSTALL_BIN) ./xr829/etf/btetf_riscv_1.0.5 /$(1)/usr/bin/btetf else $(INSTALL_BIN) ./xr829/etf/btetf_1.4.0 /$(1)/usr/bin/btetf $(INSTALL_BIN) ./xr829/etf/etf /$(1)/usr/bin/etf $(INSTALL_BIN) ./xr829/etf/xrbt_testmode_1.4.0 /$(1)/usr/bin/xrbt_testmode endif endef $(eval $(call BuildPackage,xr829-rftest))
make menuconfig > Utilities > rf test tool
5)iperf 工具配置make menuconfig > Network
6)wpa 工具配置
wpa 工具包括 wpa-supplicant 服务的和 wpa-cli 客户端make menuconfig > Network
6. 测试验证
wifi 的基础功能可以通过下面的步骤进行验证:
• 加载 wifi 驱动,启动 wpa_supplicant
• 扫描测试
• 联网测试
• 查看 ip 地址
• ping 百度测试6.1 加载 wifi 驱动,启动 wpa_supplicant
1). 系统上电后使用 insmod 命令加载驱动,使用 lsmod 查看驱动是否已经加载成功。部分系统已经使用自动化脚本自动加载不需手动加载。2). 确保 wpa_supplicant 是否起来,使用 ps 命令查看wpa_supplicant 是否起来,大部分系统由自动化脚本启动,没有启动的可以手动启动。
3). 使用 wifimanager 进行测试,Tina 系统提供了一套测试 wifi 用的测试 demo(wifimanager),wifimanager 是封装了 wpa_cli 的一套接口但使用更简单。用户可以使用这套测试 demo 来进行测试,下面只介绍 2 个 demo 其他 demo 可以参考 wifimanager 的使用说明文档。
6.2 扫描测试
wifi_scan_results_test 是 wifimanager 用于扫描 AP 用的,在控制台中输入该命令后有以下类似打印说明扫描功能正常。fa:8c:21:2f:2d:98 5240 -64 [WPA2-PSK-CCMP][WPA2-PSK-CCMP][ESS] NNN f2:c5:d3:02:df:97 5180 -65 [WPA2-PSK-CCMP][ESS] nnn 7c:b5:9b:3b:2b:45 5765 -57 [WPA2-PSK-CCMP][ESS] XXX fa:8c:21:2f:2d:96 2417 -58 [WPA2-PSK-CCMP][ESS] xxx
6.3 联网测试
使用命令 wifi_connect_ap_test 命令可以进行联网测试。该命令是 wifimanager 用于连接 AP用的,使用方法如下:wifi_connect_ap_test ssid passwd (例如:wifi_connect_ap_test AWTest 1qaz@WSX) 连接成功会有 connect success 的 log 出现。
6.4 查看 ip 地址
使用 ifconfig 命令可以查看到获取到的 ip 值,该命令是标准命令,更详细说明请百度。6.5 ping 百度测试
即使获取到了 ip 地址也不能说明基本功能已通,一般使用 ping 命令去进行测试 (前提 AP 是能连外网的)ping 百度测试:ping www.baidu.com
如果出现下面类似的 log,说明网络基本功能已通
PING www.a.shifen.com (36.152.44.95) 56(84) bytes of data. 64 bytes from 36.152.44.95 (36.152.44.95): icmp_seq=1 ttl=56 time=10.5 ms 64 bytes from 36.152.44.95 (36.152.44.95): icmp_seq=2 ttl=56 time=11.8 ms 64 bytes from 36.152.44.95 (36.152.44.95): icmp_seq=3 ttl=56 time=10.7 ms
至此【网络专题1】就分享完了,希望对大家有一定的帮助。
今天是2021最后一天,辞旧迎新,祝大家新年快乐,身体健康,阖家幸福!
-
@rcfly 能否分享下你的XR829驱动呢,目前我移植的老是发现cmd53接收不到东西
-
Copyright © 2024 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号