SDIO WiFi模组调试经验案例 您所在的位置:网站首页 mt6620驱动 SDIO WiFi模组调试经验案例

SDIO WiFi模组调试经验案例

2023-07-05 10:06| 来源: 网络整理| 查看: 265

由于市面上大部分WiFi模组都只有Linux下的驱动,为了快速验证板子上的WiFi功能,直接使用V833开发板上的WiFi芯片XR819,因为V833开发板提供了RTOS下的XR819驱动,虽然是以lib库的形式提供,但也可以大大节省驱动移植的时间成本了。

一、原理图

二、Layout

这里使用了一个技巧,就是将IPX天线的座子和R1电阻重合在了一起,当需要使用PCB天线时,IPX座子不焊,焊接R1电阻;当需要使用IPX外接天线时,R1电阻不焊。

三、驱动修改

XR819的引脚可分为3类:电源、SDIO、reset和wake up信号。电源即3.3V和GND,XR819小板上有3.3V转1.8V的芯片,因此1.8V的电源无需关心;SDIO信号即SDIO_D0 ~ SDIO_D3、SDIO_CMD和SDIO_CLK;RESET引脚用于SOC复位XR819,低电平有效;WAKE UP引脚用于XR819唤醒SOC。

3.1 GPIO适配

XR819的reset引脚我们使用GPIO_PA0,wake up引脚使用GPIO_PA1。下面分别是reset引脚和wake up引脚的说明。

3.1.1 reset

wifi使能的使用,libxr819.a会调用xradio_wlan_gpio_power函数拉高reset引脚,但我们使用late_initcall在板子上电时主动调用wifi_power_on使能xr819模组,因为我们扫卡的逻辑和V833不一样,V833是在执行wifi相关的命令行时使能xr819并进行SDIO扫卡,而我们是上电就会扫卡,因此把使能的过程也放在了上电时,所以调用xradio_wlan_gpio_power函数时xr819已经使能,这里就不用再重复复位了。

#define WIFI_PWR_PIN VC_GPIO_PA0 static void wlan_power_gpio_init(void) { hal_gpio_set_pull(WIFI_PWR_PIN, GPIO_PULL_UP); hal_gpio_set_direction(WIFI_PWR_PIN, GPIO_DIRECTION_OUTPUT); hal_gpio_set_driving_level(WIFI_PWR_PIN, GPIO_DRIVING_LEVEL2); } int xradio_wlan_gpio_power(int on) { if(on) { __log("already powered\n"); } else { hal_gpio_set_data(WIFI_PWR_PIN, GPIO_DATA_LOW); XR_OS_MSleep(50); } return 0; } int wifi_power_on(void) { wlan_power_gpio_init(); hal_gpio_set_data(WIFI_PWR_PIN, GPIO_DATA_HIGH); udelay(10000); hal_gpio_set_data(WIFI_PWR_PIN, GPIO_DATA_LOW); udelay(20000); hal_gpio_set_data(WIFI_PWR_PIN, GPIO_DATA_HIGH); udelay(100000); return 0; } late_initcall(wifi_power_on); 3.1.2 wake up

wake up是xr819唤醒soc的引脚,当fw下载完成时,或有数据到来时,xr819通过这个引脚主动通知soc。同样的,libxr819.a会主动调用以下函数,我们只需要实现这些函数即可。

#define WIFI_WAKE_PIN VC_GPIO_PA1 void xr_wlan_irq_subscribe(void *func) { uint32_t irq_num; hal_gpio_pinmux_set_function(WIFI_WAKE_PIN, GPIO_MUXSEL_FUNCTION3); hal_gpio_set_pull(WIFI_WAKE_PIN, GPIO_PULL_UP); hal_gpio_set_direction(WIFI_WAKE_PIN, GPIO_DIRECTION_INPUT); hal_gpio_set_driving_level(WIFI_WAKE_PIN, GPIO_DRIVING_LEVEL2); hal_gpio_to_irq(WIFI_WAKE_PIN, &irq_num); hal_gpio_irq_request(irq_num, func, IRQ_TYPE_EDGE_RISING, (void *)NULL); hal_gpio_irq_enable(irq_num); } void xr_wlan_irq_enable(void) { uint32_t irq_num; hal_gpio_to_irq(WIFI_WAKE_PIN, &irq_num); hal_gpio_irq_enable(irq_num); } void xr_wlan_irq_enable_clr(void) { } void xr_wlan_irq_disable(void) { uint32_t irq_num; hal_gpio_to_irq(WIFI_WAKE_PIN, &irq_num); hal_gpio_irq_disable(irq_num); } void xr_wlan_irq_unsubscribe(void *func) { uint32_t irq_num; hal_gpio_to_irq(WIFI_WAKE_PIN, &irq_num); hal_gpio_irq_free(irq_num); } 3.2 SDIO适配 3.2.1 SDIO扫卡逻辑

SD卡和SDIO卡是完全不同的两个东西,SD卡是指SD存储卡,而SDIO卡一般是指支持SDIO协议的设备,例如SDIO WiFi网卡等;SD协议和SDIO协议也不是一回事,SDIO协议是由SD卡的协议演化升级而来的,很多地方保留了SD卡的读写协议,同时SDIO协议又在SD卡协议之上添加了CMD52命令(SD_IO_RW_DIRECT,用于单块数据读写和寄存器操作,方向为HOST->DEVICE)和CMD53命令(SD_IO_RW_EXTENDED,用于多块数据读写,方向是双向的),SDIO网卡充分使用了CMD52和CMD53两个命令。

SDIO协议是在SDSDIO总线设备统一在mmcsd_detect线程中扫描,由于SDIO总线上可能接TF卡,也可能接SDIO WiFi模组等设备,因此会有一个识别卡的逻辑,核心原理就是一些特定的命令只对特定类型的设备有效, 例如SDIO的CMD5,只对SDIO设备(例如SDIO WiFi、SDIO 蓝牙模组)等有效,TF卡是不会响应CMD5命令的,由此来识别是否是SDIO设备;通过发送CMD41和CMD1命令来区分是SD卡还是MMC卡,SD卡会响应CMD41命令,MMC卡会响应CMD1命令。代码如下:

3.2.2 SDIO初始化时序

初始化SDIO网卡的时序如下所示:

四、WiFi相关命令 4.1命令介绍

在串口输入“wifi”后敲回车,会弹出wifi相关的命令提示,如下所示:

wifi -o命令用于选择模组的模式,wifi -o 0对应STA模式,wifi -o 1对应AP模式;wifi -s命令用于开启wifi扫描,随后会将扫描到的AP列表打印在控制台;wifi -c命令用于连接目标AP;wifi -d命令用于断开与AP的连接;wifi -f命令用于关闭wifi功能。 4.2初始化模组

xr819模组在初始化时需要加载固件,因此需要将xr819的固件放在/data/目录下,路径分别是

/data/xr_wifi.conf

/data/firmware/boot_xr819.bin

/data/firmware/fw_xr819.bin

/data/firmware/sdd_xr819.bin

其中,xr_wifi.conf存放的是wifi的mac地址,如果需要修改mac地址,修改这个文件即可。

/data/目录是板子的nand flash挂载路径,开发板上电会自动挂载,如果没有挂载成功,可能是这块区域还没有被格式化过,需要格式化一下。

初始的/data目录是空的,上述的四个文件可以通过TFTP下载到nand flash里:先cd到/data目录,tftp下载xr_wifi.conf,然后创建firmware目录,cd到/data/firmware目录,tftp下载剩余的3个bin文件。

 上面的firmware放置完成后,通过wifi -o 0命令即可使能wifi,打印出wifi up即说明wifi已经使能成功了。

4.3扫描AP

输入wifi -s命令即可启动wifi扫描,如下所示:

4.4连接AP

输入wifi -c dokin 19930408即可连接名为“dokin”的AP,19930408是这个ap的密码,连接成功后会自动进行dhcp获取ip地址,如下所示:

 

五、WiFi测试步骤

wifi的测试方法和emac一样,也是通过iperf测吞吐速率和稳定性,要求更高的,可以通过iperf进行拉距测试,从而测试wifi通信的极限距离。需要注意的是wifi iperf测试的物理连接,拓扑图如下所示,实际上只需要注意一点,就是PC与路由器必须是网线直连,否则如果PC和路由器也是通过WiFi连接,测出来的数据会不准,因为有线直连不存在干扰,而如果PC使用WiFi连接路由器,一是占用了wifi 带宽,二是会引入无线干扰。

最终测试出来的WiFi TCP上行和下行数据如下,都在28Mbps作左右,理论上在屏蔽箱里测试的速率才是最真实的极限吞吐速率。

TCP上行速率 TCP下行速率



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

      专题文章
        CopyRight 2018-2019 实验室设备网 版权所有