大家好,我是三颗芋圆,从今天开始,我将会在全志在线给大家详细的介绍Tina系统网络相关的知识。主要基于D1+XR829平台
主要分为《网络Tips》和《网络专题》
欢迎大家关注并一起讨论学习网络。
始于LWIP,陷于TCP/IP,忠于80211。
先给大家上点儿干货。
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最后一天,辞旧迎新,祝大家新年快乐,身体健康,阖家幸福!