1. Tina Linux Wi-Fi模组移植基础
第一次接触Tina Linux的Wi-Fi模组移植时,我被各种专业术语和复杂的配置流程搞得晕头转向。经过几个实际项目的摸爬滚打,我总结出了一套适合新手的实战方法。Tina Linux是全志科技基于OpenWRT开发的嵌入式Linux系统,广泛应用于智能硬件领域。Wi-Fi模组作为物联网设备的关键组件,其移植过程需要特别注意硬件适配和软件配置的协同。
Wi-Fi模组要正常工作,必须满足几个基本条件:稳定的电源供应(通常需要3.3V主电源和IO电源)、正确的使能信号(WL-REG-ON引脚控制)、可靠的通信接口(如SDIO或USB)以及时钟信号(24/26MHz主时钟和32.768KHz待机时钟)。在实际项目中,我遇到过因为电源时序不对导致模组无法启动的情况,后来通过调整PMU供电配置才解决问题。
Tina平台支持多种Wi-Fi工作模式,最常用的是STATION模式(设备作为客户端连接路由器)和AP模式(设备作为热点)。比如在智能家居网关项目中,我们需要同时启用STA和AP模式,这时就要特别注意模组是否支持并发工作。RTL8723DS这类双频模组通常支持得比较好,而一些单频模组可能会有冲突。
2. 驱动移植全流程详解
2.1 驱动源码准备与修改
拿到模组厂商提供的驱动源码后,我习惯先创建一个专门的目录存放:
tina/lichee/linux-4.9/drivers/net/wireless/rtl8723ds驱动适配最关键的是实现平台相关函数。以SDIO接口的RTL8723DS为例,需要重点修改platform_ARM_SUNxI_sdio.c文件。这里有个坑我踩过 - 不同内核版本接口函数可能不同。比如在Linux 3.4中上电函数是wifi_pm_power(),而4.9内核变成了sunxi_wlan_set_power()。
一个典型的电源控制函数实现如下:
void rtl8723ds_power_on(int on) { sunxi_wlan_set_power(on); // 控制电源 msleep(100); // 必要延时 if(on) { sunxi_mmc_rescan_card(sunxi_wlan_get_bus_index()); // SDIO扫卡 } }2.2 内核配置调整
修改完驱动后,需要在Kconfig和Makefile中添加配置。我建议先在drivers/net/wireless/Kconfig中添加:
source "drivers/net/wireless/rtl8723ds/Kconfig"然后在对应Makefile中加入:
obj-$(CONFIG_RTL8723DS) += rtl8723ds/执行make kernel_menuconfig时,在Device Drivers → Network device support → Wireless LAN下就能看到新增的选项了。记得勾选为模块编译(M),这样方便调试。
3. 系统级配置实战
3.1 sys_config.fex关键配置
sys_config.fex是Tina平台特有的配置文件,相当于设备树的简化版。Wi-Fi部分配置主要包含三个段:
[wifi_para] wifi_used = 1 wifi_sdc_id = 1 wl_reg_on = port:PL06<1><default><default><0> wl_host_wake = port:PL07<4><default><default><0> [mmc1_para] sdc_used = 1 sdc_detmode = 4 sdc_buswidth = 4 sdc_clk = port:PG00<2><1><1><default> sdc_cmd = port:PG01<2><1><1><default> sdc_d0 = port:PG02<2><1><1><default> sdc_d1 = port:PG03<2><1><1><default> sdc_d2 = port:PG04<2><1><1><default> sdc_d3 = port:PG05<2><1><1><default> [rf_para] module_num = 10 module_power1 = "axp22_dldo1" module_power1_vol = 3300000特别注意wl_reg_on的GPIO配置要与硬件原理图一致。曾经有个项目因为把PL06错配成PL07,调试了两天才发现问题。
3.2 固件与模块配置
在package/firmware/linux-firmware下新建rtl8723ds目录,放入固件文件并创建.mk文件:
define Package/rtl8723ds-firmware SECTION:=firmware CATEGORY:=Firmware TITLE:=RTL8723DS firmware endef然后在target/allwinner/xxx/modules.mk中添加模块定义:
define KernelPackage/net-rtl8723ds SUBMENU:=$(WIRELESS_MENU) TITLE:=RTL8723DS support DEPENDS:=+rtl8723ds-firmware FILES:=$(LINUX_DIR)/drivers/net/wireless/rtl8723ds/8723ds.ko AUTOLOAD:=$(call AutoProbe,8723ds) endef4. 调试技巧与常见问题解决
4.1 驱动加载问题排查
当驱动加载失败时,我通常按照以下步骤排查:
- 检查lsmod确认驱动是否加载
- 查看dmesg | grep wifi过滤内核日志
- 用示波器测量电源和时钟信号
- 验证GPIO配置是否正确
常见错误如"sunxi_mmc_rescan_card undefined",通常是因为没配置MMC驱动。需要在kernel_menuconfig中启用:
Device Drivers → MMC/SD/SDIO card support → Allwinner sunxi SD/MMC Host Controller support4.2 网络接口启动问题
遇到ifconfig wlan0 up失败时,重点检查:
- 驱动是否成功加载(lsmod)
- 固件是否正确安装(检查/lib/firmware)
- 电源管理配置(特别是AXP芯片的LDO输出)
曾经遇到RTL8723DS需要特定上电时序的情况,解决方案是在驱动中添加强制延时:
sunxi_wlan_set_power(1); msleep(50); sunxi_wlan_set_power(0); msleep(20); sunxi_wlan_set_power(1);5. 不同模组的适配要点
5.1 博通(BCM)系列模组
AP6212/AP6255等模组配置相对简单,主要注意固件路径:
make menuconfig Firmware → ap6212-firmware5.2 乐鑫(ESP)系列
ESP8089需要特别注意SPI时钟配置,在sys_config.fex中:
[spi1_para] spi_used = 1 spi_cs_bitmap = 1 spi_cs0 = port:PC0<3><default><default><default> spi_sclk = port:PC1<3><default><default><default> spi_mosi = port:PC2<3><default><default><default> spi_miso = port:PC3<3><default><default><default>5.3 全志(XRADIO)模组
XR829需要特别注意40MHz和26MHz时钟的选择,在menuconfig中要正确选择:
Firmware → xr829-firmware → [*] xr829 with 40M sdd6. 性能优化实战经验
6.1 电源管理优化
通过调整PMU配置可以显著降低功耗。在sys_config.fex中添加:
[power_sply] dc1sw_vol = 3000000 aldo2_vol = 33000006.2 吞吐量提升技巧
修改Wi-Fi驱动中的AMPDU参数可以提升吞吐量:
echo "agg_tx_size=64" > /sys/module/8723ds/parameters/agg_tx_size echo "agg_rx_size=64" > /sys/module/8723ds/parameters/agg_rx_size7. 量产注意事项
批量生产时需要特别注意:
- 固件烧录一致性
- MAC地址写入(建议使用生产工具批量写入)
- RF参数校准(使用全志的xr829_bt_config工具)
一个实用的MAC地址设置命令:
wifimanager -m "00:11:22:33:44:55"