大家好,我是三颗芋圆,从今天开始,我将会在全志在线给大家详细的介绍Tina系统网络相关的知识。主要基于D1+XR829平台
主要分为《网络Tips》和《网络专题》
欢迎大家关注并一起讨论学习网络。
始于LWIP,陷于TCP/IP,忠于80211。
先给大家上点儿干货。
三颗芋圆LV 4
@RCfly
《802.11权威指南》
《UNIX网络编程》
《嵌入式网络那些事儿》
《精通Linux内核网络》
RCfly 发布的最佳帖子
-
【网络Tips1】Tina网络必看文档
-
回复: 连接wifi无法ping通
@logpi
@logpi
你好,你这个问题是恰好连接的路由器被桥接到br-lan上了。
1.br-lan默认的ip地址是192.168.100.1
2.看你的wlan0获取的ip地址是192.168.100.x
所以恰好就把br-lan当成网关了,请求和数据都发送不出去了。
解决办法:
1.直接修改一下br-lan的地址。
ifconfig br-lan 192.168.200.1(只要不和网关一样就好)2.连接其他路由器(非192.168.100.1)不会有这个问题。
-
【网络Tips8】Tina网络如何设置国家码?
大家好,我是三颗芋圆,始于LWIP,陷于TCP/IP,忠于80211。
本次Tips聊聊Tina系统网络如何设置国家码?
设置国家码比较简单,借用wpa_cli工具就可以做到。
设置国家码:root@TinaLinux:/# wpa_cli -i wlan0 -p /etc/wifi/sockets set country US OK
查看国家码:
root@TinaLinux:/# wpa_cli -i wlan0 -p /etc/wifi/sockets get country US
PS:国家码的设置和查看,虽然可以通过wpa_cli工具来发命令,但本质上需要Wi-Fi驱动的支持额。
-
回复: D1哪吒开发板wifi连接出错,这是什么情况?
哈哈,抱歉来晚了。
整理一下Wi-Fi的启动流程:
1.系统启动通过sunxi-rf驱动读取board.dts配置,解析供电,sdio,引脚,时钟等配置。完成上电动作。
2.驱动加载时完成扫卡,下载firmware,add wlan0 interface。
3.系统的自启动脚本在etc/init.d/wpa_supplicant中启动服务,启wlan0。
4.利用wpa_cli/wifimanager进行应用的操作。
上面的错误
建议排查思路:
1.系统起来执行lsmod 查看xradio_mac/xradio_core/xradio_wlan(也有可能是单ko的形式xr829)驱动是否加载成功。
顺便提一下驱动加载失败最常见的错误:1.供电不匹配。 2.扫卡时失败,sdio配置错误。 3.下载firmware失败。(注意路径:默认是/lib/firmware)
2.执行ps | grep wpa_supplicant查看服务是否启动。
也可以直接执行./etc/init.d/wpa_supplicant start //再次手动启动
服务启动失败的常见原因:
1.前面驱动加载已经失败了,导致没有wlan0 interface. 2.配置文件不存在比如:wpa_supplicant.conf。默认是在/etc/wifi、目录下 3.文件存在,但是文件系统只读,导致无法对配置文件写操作。
可以手动执行wpa_supplicant命令起服务就可以看到提示如下:
Successfully initialized wpa_supplicant [ 796.252780] IPv6: ADDRCONF(NETDEV_UP): wlan0: link is not ready mkdir[ctrl_interface=/etc/wifi/sockets]: **Read-only file system** Failed to initialize control interface '/etc/wifi/sockets'. You may have another wpa_supplicant process already running or the file was left by an unclean termination of wpa_supplicant in which case you will need to manually remove this file before starting wpa_supplicant again. nl80211: deinit ifname=wlan0 disabled_11b_rates=0
解决办法:
1.直接修改文件系统,换成可读写的,例如ext4.
2.可以自己临时创建配置文件到/tmp目录。 -
【网络专题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 使用 40M 晶振与使用 24M 晶振有什么区别
1.从时钟的角度分析,没有多大区别。就是提供一个clk,在软件功能使用上完全没有差异。
2.各有优缺点:
i)使用24M,多数设计可以直接用主控分频,这样可以节省一个外部晶振,但是24M即低频在一些高吞吐,高稳定性要求的场景,性能会相对弱一些。主要体现就是EVM指标会相对比较差。
ii)使用40M,稳定性会更好,EVM指标也比较理想,在一些实际产品中必须用40M,EVM指标(必须大于30)才能验收通过。当然啦,成本会比较高,因为一般主控都没法分频40M,这个40M晶振是没法省去的。 -
回复: D1哪吒开发板wifi连接出错,这是什么情况?
哈哈,抱歉来晚了。
整理一下Wi-Fi的启动流程:
1.系统启动通过sunxi-rf驱动读取board.dts配置,解析供电,sdio,引脚,时钟等配置。完成上电动作。
2.驱动加载时完成扫卡,下载firmware,add wlan0 interface。
3.系统的自启动脚本在etc/init.d/wpa_supplicant中启动服务,启wlan0。
4.利用wpa_cli/wifimanager进行应用的操作。
上面的错误
建议排查思路:
1.系统起来执行lsmod 查看xradio_mac/xradio_core/xradio_wlan(也有可能是单ko的形式xr829)驱动是否加载成功。
顺便提一下驱动加载失败最常见的错误:1.供电不匹配。 2.扫卡时失败,sdio配置错误。 3.下载firmware失败。(注意路径:默认是/lib/firmware)
2.执行ps | grep wpa_supplicant查看服务是否启动。
也可以直接执行./etc/init.d/wpa_supplicant start //再次手动启动
服务启动失败的常见原因:
1.前面驱动加载已经失败了,导致没有wlan0 interface. 2.配置文件不存在比如:wpa_supplicant.conf。默认是在/etc/wifi、目录下 3.文件存在,但是文件系统只读,导致无法对配置文件写操作。
可以手动执行wpa_supplicant命令起服务就可以看到提示如下:
Successfully initialized wpa_supplicant [ 796.252780] IPv6: ADDRCONF(NETDEV_UP): wlan0: link is not ready mkdir[ctrl_interface=/etc/wifi/sockets]: **Read-only file system** Failed to initialize control interface '/etc/wifi/sockets'. You may have another wpa_supplicant process already running or the file was left by an unclean termination of wpa_supplicant in which case you will need to manually remove this file before starting wpa_supplicant again. nl80211: deinit ifname=wlan0 disabled_11b_rates=0
解决办法:
1.直接修改文件系统,换成可读写的,例如ext4.
2.可以自己临时创建配置文件到/tmp目录。 -
回复: D1如何配置系统删除br-lan这个网桥
@yaoxiaoyao
你好,在内核配置中
执行make kernel_menuconfig
br-lan网桥的配置> Networking support > Networking options <*> 802.1d Ethernet Bridging //CONFIG_BRIDGE=y
可以按照如上路径关闭即可。
-
【网络专题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最后一天,辞旧迎新,祝大家新年快乐,身体健康,阖家幸福!
-
【网络专题1】Tina Wi-Fi模组移植_理论篇
大家好,我是三颗芋圆,始于LWIP,陷于TCP/IP,忠于80211。
终于迎来了第一个专题:Wi-Fi模组移植,本次专题将介绍如何在Tina上移植一款Wi-Fi模组,从理论到实操移植XR829详细介绍。
避免篇幅太长,分成了前导篇,理论篇,实践篇。理论篇
1.原理概述
从整体结构上 Wi-Fi 可以分为设备端(Device)和主机端(Host);设备端主要是数据链路层
的实现和接口管理,主机端主要是应用层和协议层的实现。
模组驱动移植主要所做的工作:供电使能,传输接口适配。• 供电使能:提供 WiFi 供电,使能操作。如果平台 WiFi 供电通过电源管理芯片,那么就需要配
置电源管理芯片电源域进行使能 WiFi 的所需电;WiFi 芯片正常工作需要主控 soc 输出使能信
号。• 传输接口适配:WiFi 通过通信接口与主控进行连接,常见的通信接口有 SDIO,USB,PCI,SPI
等。通信接口的驱动往往是由主控端提供,平台层需要提供通信接口初始化(如 SDIO 扫
卡)、读、写等函数操作集合。一般情况下由于通信接口都是标准的 Linux API,所以往往模
组原厂已经适配好了读写等操作的接口函数,平台适配可能仅仅需要配置平台差异就好,如选
择使用 SDIO 接口,需要确定选择的 SDIO 卡号、扫卡函数等。
接下来将围绕硬件接线图及 WiFi 工作的硬件条件、WiFi 启动流程进行重点说明,以理清移植模组本质和原理。
1.1 硬件连接简图
这里主要介绍的是 SDIO 通信方式的连接图:
1.2 硬件工作条件
Wi-Fi 模组工作的条件,如下图,需要满足以下几个条件:
•(1)供电:一般有两路供电,其中 VCCWIFI 为主电源,VCCIOWIFI 为 IO 上拉电源。【需要特别留意,有时候设计可以两路电合并】
•(2)使能:要能正常工作,需要 WLREGON 给高电平。【需要特别留意,部分模组可能有时序要求,比如先拉高再拉低,再拉高】
•(3)唤醒主控:当系统休眠时,Wi-Fi 模组可通过 WLWAKEAP 的中断唤醒主控。【需要特别留意,有些模组也通过该引脚来作为主控接收数据的中断】
•(4)SDIO:与 SOC 的通信有通过 USB,SDIO 等,这里以SDIO 为例,其中 SDIO 0~3为 SDIO 的 4 条数据线。
•(5)次时钟 32.768Khz 信号:根据模组而定,有些模组内部通过(6)中的输入的 clk 进行分频得到,有些需要外部单独输入该信号。
•(6)主时钟 24/26Mhz 信号。1.3 软件启动流程
整体流程分为如下几个阶段:
系统启动-> 驱动加载-> 服务加载-> 启动网卡-> 访问网络
2. 步骤概述
移植适配 Wi-Fi 模组,本小节详细描述移植一款新物料的步骤。总结为五步法,接下来将对其 5
步依次展开叙述。
• 内核驱动适配
• 硬件资源适配
• 方案 module 适配
• 添加 Firmware
• 应用工具适配相关文件说明:
注:-
linux-x.x 代表具体内核版本如:inux-4.9;
-
ic_xxx 表示具体芯片如:r328,r528;
-
plat_xxx 表示具体方案如:evb2;
-
sys_config.fex 和 board.dts 是随着内核版本升级引入的配置文件,路径会有些许改变,不过共功能都一样,都是对设备的配置。具体模组移植时再说明。
2.1 内核驱动适配
内核驱动适配又分为 5 个小步骤:
• 获取源码。
• 添加 Kconfig 和 Makefile 配置。
• 修改驱动源码
• make kernel_menuconfig 配置。
• 编译。
1) 获取驱动源码
在新方案上移植一款 Wi-Fi 模组时,可以先查看《支持列表》文档是否有类似方案支持该模组。
如果没有支持,则需要跟模组原厂获取驱动资料包。拿到原厂提供的资料包需要仔细阅读模组原厂提供的材料,如:支持的通信接口类型 SDIO, 还是 USB;SDIO 是 2.0 还是 3.0;支持 2.4G
还是 5G 甚至是双频等。
2)添加 Kconfig 和 Makefile 配置。
tina/lichee/linux-5.4/drivers/net/wireless/Kconfig 文件中引入 xxx 驱动的 Kconfig 配置source "drivers/net/wireless/xxx/Kconfig"
tina/lichee/linux-5.4/drivers/net/wireless/Makefile 文件中引入 xxx 驱动的 Makefile 配置
obj-$(CONFIG_RTL8723DS) += xxx/
注:xxx 代办具体驱动型号,如 xr829、rtl8723ds 等
3)修改驱动源码
这一步是很关键的,我们需要定义自己的模组上下电,扫卡接口来对接 Tina 系统提供的接口,以
及原厂提到的关于平台适配的注意事项修改。
Tina 常用接口:void sunxi_wlan_set_power(bool on); //上下电接口,参数0:上电;1:下电 int sunxi_wlan_get_bus_index(void); //获取sdio通信接口的busnum,一般是sdc1 int sunxi_wlan_get_oob_irq(void); //获取中断号 int sunxi_wlan_get_oob_irq_flags(void); //获取中断标志 void sunxi_mmc_rescan_card(unsigned ids); //mmc提供的扫卡函数
一般对接过程:
上电: int platform_wifi_power_on(void) { int wlan_bus_index = 0; sunxi_wlan_set_power(1); mdelay(100); wlan_bus_index = sunxi_wlan_get_bus_index(); if(wlan_bus_index < 0){ RTW_INFO("get wifi_sdc_id failed\n"); return -1; } else { RTW_INFO("----- %s sdc_id: %d\n", __FUNCTION__, wlan_bus_index); sunxi_mmc_rescan_card(wlan_bus_index); } #ifdef CONFIG_GPIO_WAKEUP oob_irq = sunxi_wlan_get_oob_irq(); #endif return 0; } 下电: void platform_wifi_power_off(void) { int wlan_bus_index = 0; sunxi_wlan_set_power(0); mdelay(100); RTW_INFO("%s: remove card, power off.\n", __FUNCTION__); wlan_bus_index = sunxi_wlan_get_bus_index(); sunxi_mmc_rescan_card(wlan_bus_index); }
提供 platform_wifi_power_on() 和 platform_wifi_power_off() 接口给驱动 probe 调用。
注:以上提到的接口对接都是系统平台通用的,可以直接从已经支持的模组中获取适配的文件tina/lichee/linux-5.4/drivers/net/wireless/xxx/platform/platform_ARM_SUNxI_sdio.c
2.2 硬件资源适配
1)确认供电方式
模组的供电,我们需要确认的是 VCC-WIFI 和 VCCIO-WIFI 供电的来源,如果两路供电来源来
自电源管理芯片,则需要配置电源管理芯片输出两路电,如果是直接供电,那么就不需要进行软件配置输出。
两路供电来源于 R818 AXP707:
合并一路供电来源于 R329 :
对于 WiFi 和 BT 二合一的模组,供电部分是复用的。分别为 VCC-WIFI 和 VCCIO-WIFI,从R818 原理图来判断,两路电源是由电源管理芯片 DLDO1 和 DLDO4 分别输出;从 R329 原理图来判断,合并一路供电由 DCDC3 直接供电。关于电源管理芯片的驱动原理可参考电源管理驱动使用说明或咨询电源管理芯片驱动开发工程师。通常情况下该部分已经准备好,对于 Wi-Fi开发工程师来说只需要会配置电源输出即可, 配置方法见下 board.dts 中关于 wlan_power、wlan_io_regulator 标识的配置。2.3 方案 module 适配
1)添加 module 配置文件:
模组一般会编译生成 KO 文件,添加这个配置文件主要是基于 Tina 系统的构建法则,将编译生成的 ko 文件拷贝到文件系统中,同时可以配置驱动是否需要开机启动自加载。示例如下:define KernelPackage/net-xr829-40M SUBMENU:=$(WIRELESS_MENU) TITLE:=xr829 support (staging) DEPENDS:= +@IPV6 KCONFIG:= \ CONFIG_XR829_WLAN=m \ 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) endef define KernelPackage/net-xr829-40M/description Kernel modules for xr829 support endef $(eval $(call KernelPackage,net-xr829-40M))
module 配置整体分为两个部分,都是固定的格式,第一部分是配置 module 在 menuconfig 中的显示和加载信息,第二部分是 module 的简单描述信息。
具体标签含义如下:
2.4 添加 Firmware
1)添加 firmware 文件:
部分 Wi-Fi 模组工作涉及运行在 devices 端的 firmware 文件【可以简单理解为一些未开源的bin 文件】,添加这个文件主要就是在启动阶段中完成下载的流程,具体 firmware 的原理不用
深入了解。
Tina 上的统一路径为:tina/package/firmware/linux-firmware
2)添加 firmware 配置:
增加 Makefile 文件,配置的主要作用就是基于 Tina 系统的构建法则将 firmware 文件拷贝到系
统对应的目录,为启动流程下载 firmware 做准备。2.5 应用工具适配
1)iperf
2)wifimanager
3)wpa_supplicant
4)wpa_cli
5)rf 工具
应用工具的配置,主要功能就是借助应用来测试 Wi-Fi 的扫描联网等功能。这一部分在【网络Tips2中有截图介绍,这里就不再贴图了哈。】今天是2021最后一天,辞旧迎新,祝大家新年快乐,好运连连,升职加薪!
-
-
【网络专题1】Tina Wi-Fi模组移植_前导篇
大家好,我是三颗芋圆,始于LWIP,陷于TCP/IP,忠于80211。
终于迎来了第一个专题:Wi-Fi模组移植,本次专题将介绍如何在Tina上移植一款Wi-Fi模组,从理论到实操移植XR829详细介绍。
避免篇幅太长,分成了前导篇,理论篇,实践篇。
前导篇
1.相关术语
2.Wi-Fi框架概述
Wi-Fi 是一种无线通信技术,在 Tina Linux 系统上一般可处于三种工作模式,分别是:
STATION、AP、MONITOR。
Wi-Fi协议遵循分层的思想:
注:以上分层模型可能会存在重叠部分,详细的分层可以参考 TCP/IP 协议模型。
• wifimanger:主要用于 STATION 模式,提供 wifi 连接扫描等功能。
• softap manager:提供启动 AP 的功能。
• smartlink:对于 NoInput 的设备,通过借助第三方设备(如手机)实现透传配网的功能。
• wpa_supplicant: 开源的无线网络配置工具,主要用来支持 WEP,WPA/WPA2 和 WAPI 无
线协议和加密认证的,实际上的工作内容是通过 socket 与驱动交互上报数据给用户。
• hostapd: 是一个用户态用于 AP 和认证服务器的守护进程。
• monitor: wifi 处于混杂设备监听模式的处理应用。
3.Wi-Fi硬件的认识
常见的通信接口有SDIO/USB/PCI等。
常见的贴片形式有module、on board形式。
模组形式就是pin to pin的,业界遵循统一的标准,可移植性特别好,同一个板卡可以适配多款模组
on board形式设计时走线与具体板卡相关,复用性很差,几乎是不可能一个板卡同时支持多个Wi-Fi产商模块的
今天是2021最后一天,辞旧迎新,祝大家新年快乐,心想事成,财源广进!
-
【网络Tips10】Tina网络XR829的基本调试节点
大家好,我是三颗芋圆,始于LWIP,陷于TCP/IP,忠于80211。
本次Tips介绍一下XR829的几个关键调试节点
xradio调试节点:
1.版本信息和帧交互控制/sys/kernel/debug/ieee80211/phy0/xradio/
2.设置打印等级
xr829的打印不同于一般驱动统一按照warning,error,info...,而是针对每个流程都加入了控制,例如,扫描,连接,数据收发。/sys/kernel/debug/xradio_host_dbg/ dbg_sta dbg_scan dbg_tx dbg_ap ...
3.数据收发帧的打印
echo 0x5143,0x5143 > /sys/kernel/debug/ieee80211/phy0/xradio/parse_flags //xr829打开tx rx log echo 0x40 0x40 > /sys/kernel/debug/ieee80211/phy0/xradio/parse_flags //dhcp交互帧
具体bit表示的帧类型参考如下:
0x1 显示控制帧 0x2 显示管理帧(扫描相关帧除外) 0x4 显示数据帧 0x8 显示扫描相关帧 0x10 显示 TCP 协议帧 0x20 显示 UDP 协议帧 0x40 显示 DHCP 协议帧 0x80 显示 ICMP 协议帧(包含 ping 协议 0x100 显示 PF_8021X 协议帧 0x200 在信息中显示 MAC 层的序列号 0x400 在信息中显示自身 MAC 地址 0x800 在信息中显示源 MAC 地址和目标 MAC 地址 0x1000 在信息中显示无线层对端 MAC 地址 0x2000 在信息中显示 IP 地址 0x4000 显示未知协议的帧
4.模式和速率查看
跑吞吐前先cat一次清零,跑完再cat一次,就可以知道用了什么速率跑root@TinaLinux:/sys/kernel/debug/ieee80211/phy0/xradio# cat ratemap TxRateMap: [20SGI TX][20LGI TX] [40SGI TX][40LGI TX] [DSSS TX] [OFDM TX] MCS7:[ 0][ 0] [ 0][ 0] 11MS:[ 0] 54M:[ 0] MCS6:[ 0][ 0] [ 0][ 0] 11ML:[ 0] 48M:[ 0] MCS5:[ 0][ 0] [ 0][ 0] 5M5S:[ 0] 36M:[ 0] MCS4:[ 0][ 0] [ 0][ 0] 5M5L:[ 0] 24M:[ 0] MCS3:[ 0][ 0] [ 0][ 0] 2MS:[ 0] 18M:[ 0] MCS2:[ 0][ 0] [ 0][ 0] 2ML:[ 0] 12M:[ 0] MCS1:[ 3][ 0] [ 0][ 0] ----:[ 0] 9M:[ 0] MCS0:[ 0][ 0] [ 0][ 0] 1ML:[ 0] 6M:[ 0] RxRateMap: [20SGI RX][20LGI RX] [40SGI RX][40LGI RX] [DSSS RX] [OFDM RX] MCS7:[ 2][ 0] [ 0][ 0] 11MS:[ 0] 54M:[ 0] MCS6:[ 0][ 0] [ 0][ 0] 11ML:[ 0] 48M:[ 0] MCS5:[ 0][ 0] [ 0][ 0] 5M5S:[ 0] 36M:[ 0] MCS4:[ 0][ 0] [ 0][ 0] 5M5L:[ 0] 24M:[ 0] MCS3:[ 0][ 0] [ 0][ 0] 2MS:[ 0] 18M:[ 0] MCS2:[ 0][ 0] [ 0][ 0] 2ML:[ 0] 12M:[ 0] MCS1:[ 0][ 0] [ 0][ 0] ----:[ 0] 9M:[ 0] MCS0:[ 0][ 0] [ 0][ 0] 1ML:[ 4] 6M:[ 0]
-
【网络Tips9】Tina网络XR829如何关闭HT40
大家好,我是三颗芋圆,始于LWIP,陷于TCP/IP,忠于80211。
我们知道影响网络速率的一个重要指标就是带宽,Wi-Fi4及之前还是主要停留在HT20/HT40。的确带宽越高,速率越快。最新的Wi-Fi6都已经支持HT80甚至HT160了。但是并不是速率越高越好,在复杂环境中,速率越高,稳定性就很不好。
本次Tips聊聊Tina系统网络XR829驱动如何关闭HT40。XR829支持HT20/HT40。在一些特别复杂的环境使用HT20稳定性会更好。
具体操作如下:
在tina/lichee/linux-5.4/driver/wireless/xr829/wlan/main.c#ifndef SUPPORT_NON_HT40_CHIP - | IEEE80211_HT_CAP_SUP_WIDTH_20_40 + //| IEEE80211_HT_CAP_SUP_WIDTH_20_40 | IEEE80211_HT_CAP_SGI_20 - | IEEE80211_HT_CAP_SGI_40 + //| IEEE80211_HT_CAP_SGI_40 #endif'''
PS:注释掉HT40的宏定义即可。暂时还不支持节点操作。
-
【网络Tips8】Tina网络如何设置国家码?
大家好,我是三颗芋圆,始于LWIP,陷于TCP/IP,忠于80211。
本次Tips聊聊Tina系统网络如何设置国家码?
设置国家码比较简单,借用wpa_cli工具就可以做到。
设置国家码:root@TinaLinux:/# wpa_cli -i wlan0 -p /etc/wifi/sockets set country US OK
查看国家码:
root@TinaLinux:/# wpa_cli -i wlan0 -p /etc/wifi/sockets get country US
PS:国家码的设置和查看,虽然可以通过wpa_cli工具来发命令,但本质上需要Wi-Fi驱动的支持额。
-
【网络Tips7】Tina网络_XR829如何省电?
大家好,我是三颗芋圆,始于LWIP,陷于TCP/IP,忠于80211。
我们知道嵌入式的设备都有个共同的目标,追求极致极低的功耗。本次Tips聊聊Tina系统网络XR829驱动如何实现低功耗。一.掉电休眠
省电最直接的方式就是关闭不用的模块,XR829支持掉电休眠,如下配置即可。
在tina/lichee/linux-5.4/drivers/net/wireless/xr829/MakefileCONFIG_XRADIO_SUSPEND_POWER_OFF = y
PS:
1.掉电休眠的确是最省电的方式,但是唤醒后重开Wi-Fi的时间会加长,因为驱动加载,服务加载流程相当于重新走一遍。
2.驱动的suspend(休眠函数)中只是做一个flag位的处理,真正掉电是交给AXP(pmu电源管理)的。二.保活休眠
保活休眠是指系统休眠时,Wi-Fi仍然保持和路由器之间的连接,能够进行简单的收Beacon帧和发NULL data帧。使整个Wi-Fi模块处于低功耗模式。
打开方式:
在tina/lichee/linux-5.4/drivers/net/wireless/xr829/Makefileccflags-y += -DXRADIO_USE_LONG_KEEP_ALIVE_PERIOD
固件默认会配置开启power save,可以通过
echo 1 > /sys/kernel/debug/ieee80211/phy0/xradio/low_pwr_disable //关闭power save模式