Navigation

    全志在线开发者论坛

    • Register
    • Login
    • Search
    • Categories
    • Tags
    • 在线文档
    • 社区主页

    【网络专题1】Tina Wi-Fi模组移植_实践篇

    MR Series
    2
    2
    3000
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • RCfly
      三颗芋圆 LV 4 last edited by

      大家好,我是三颗芋圆,始于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
      

      4e36f67c-e21b-4d67-b61d-945031e390ed-image.png
      b. sunxi-rf 的配置

      > Device Drivers > Misc devices
      <*> Allwinner rfkill driver
      

      269357dd-0e57-4f9a-96df-d9fc38feee18-image.png
      c. SDIO 的配置

      > Device Drivers > MMC/SD/SDIO card support
      <*> Allwinner sunxi SD/MMC Host Controller support --->
      

      822f769e-9fdc-4e67-93b8-c9f77fb8b9a0-image.png
      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; 
       };
       ... 
       };
      

      bd2f9a49-23df-4682-9a2d-a6c81f455b79-image.png
      注意:以上所有项必须参看原理图进行配置,配置与原理图实际使用的资源保持一致;最好是和硬件同事一起确认,比如有些设计供电可能是没有 axp 的,硬件直接供电了,所以不需要配置,特别注意的就是 sdio 的配置。
      99b0ec49-e833-45d2-8c0a-cc0dfbc2360f-image.png
      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
      

      c49be49f-5115-4a1b-9c1a-cf5c52c6001e-image.png

      4. 添加 Firmware
      在 tina/package/firmware/linux-firmware/添加 xr829 需要的 firmware

      tina/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 的区分,根据实际硬件选择)
      38bff7c8-f597-48c5-9ce9-c6b16b1a87d6-image.png
      5. 应用工具适配
      1)wifimanager 配置

      make menuconfig
      > Allwinner > wifimanager
      

      6115849d-b115-4837-b21a-6a30a968fd68-image.png
      2)smartlinkd 配网配置

      make menuconfig
      > Allwinner > smartlinkd
      

      ac527c11-15ac-4cb9-b609-d2f414d18f25-image.png
      3)softap 配置

      make menuconfig
      > Allwinner > softap
      

      eaeb873c-616c-46ec-851c-f2116c4efba0-image.png
      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
      

      44117c8e-accd-4c40-82b6-aeaf414622aa-image.png
      5)iperf 工具配置

      make menuconfig
      > Network
      

      37d834c3-b1dd-41b4-96d9-83260d8322d4-image.png
      6)wpa 工具配置
      wpa 工具包括 wpa-supplicant 服务的和 wpa-cli 客户端

      make menuconfig
      > Network
      

      1d8facb1-a8d1-4ae3-88e4-c5bbde0c4d7b-image.png

      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最后一天,辞旧迎新,祝大家新年快乐,身体健康,阖家幸福!

      J 1 Reply Last reply Reply Quote Share 1
      • J
        Jacky502 LV 5 @RCfly last edited by

        @rcfly 能否分享下你的XR829驱动呢,目前我移植的老是发现cmd53接收不到东西

        1 Reply Last reply Reply Quote Share 0
        • Referenced by  flose flose 
        • Referenced by  J jetpack 
        • Referenced by  J jetpack 
        • 1 / 1
        • First post
          Last post

        Copyright © 2024 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号

        行为准则 | 用户协议 | 隐私权政策