当前位置:   article > 正文

SDIO WiFi模组调试经验案例

sdio wifi

由于市面上大部分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已经使能,这里就不用再重复复位了。

  1. #define WIFI_PWR_PIN VC_GPIO_PA0
  2. static void wlan_power_gpio_init(void)
  3. {
  4. hal_gpio_set_pull(WIFI_PWR_PIN, GPIO_PULL_UP);
  5. hal_gpio_set_direction(WIFI_PWR_PIN, GPIO_DIRECTION_OUTPUT);
  6. hal_gpio_set_driving_level(WIFI_PWR_PIN, GPIO_DRIVING_LEVEL2);
  7. }
  8. int xradio_wlan_gpio_power(int on)
  9. {
  10. if(on)
  11. {
  12. __log("already powered\n");
  13. }
  14. else
  15. {
  16. hal_gpio_set_data(WIFI_PWR_PIN, GPIO_DATA_LOW);
  17. XR_OS_MSleep(50);
  18. }
  19. return 0;
  20. }
  21. int wifi_power_on(void)
  22. {
  23. wlan_power_gpio_init();
  24. hal_gpio_set_data(WIFI_PWR_PIN, GPIO_DATA_HIGH);
  25. udelay(10000);
  26. hal_gpio_set_data(WIFI_PWR_PIN, GPIO_DATA_LOW);
  27. udelay(20000);
  28. hal_gpio_set_data(WIFI_PWR_PIN, GPIO_DATA_HIGH);
  29. udelay(100000);
  30. return 0;
  31. }
  32. late_initcall(wifi_power_on);

3.1.2 wake up

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

  1. #define WIFI_WAKE_PIN VC_GPIO_PA1
  2. void xr_wlan_irq_subscribe(void *func)
  3. {
  4. uint32_t irq_num;
  5. hal_gpio_pinmux_set_function(WIFI_WAKE_PIN, GPIO_MUXSEL_FUNCTION3);
  6. hal_gpio_set_pull(WIFI_WAKE_PIN, GPIO_PULL_UP);
  7. hal_gpio_set_direction(WIFI_WAKE_PIN, GPIO_DIRECTION_INPUT);
  8. hal_gpio_set_driving_level(WIFI_WAKE_PIN, GPIO_DRIVING_LEVEL2);
  9. hal_gpio_to_irq(WIFI_WAKE_PIN, &irq_num);
  10. hal_gpio_irq_request(irq_num, func, IRQ_TYPE_EDGE_RISING, (void *)NULL);
  11. hal_gpio_irq_enable(irq_num);
  12. }
  13. void xr_wlan_irq_enable(void)
  14. {
  15. uint32_t irq_num;
  16. hal_gpio_to_irq(WIFI_WAKE_PIN, &irq_num);
  17. hal_gpio_irq_enable(irq_num);
  18. }
  19. void xr_wlan_irq_enable_clr(void)
  20. {
  21. }
  22. void xr_wlan_irq_disable(void)
  23. {
  24. uint32_t irq_num;
  25. hal_gpio_to_irq(WIFI_WAKE_PIN, &irq_num);
  26. hal_gpio_irq_disable(irq_num);
  27. }
  28. void xr_wlan_irq_unsubscribe(void *func)
  29. {
  30. uint32_t irq_num;
  31. hal_gpio_to_irq(WIFI_WAKE_PIN, &irq_num);
  32. hal_gpio_irq_free(irq_num);
  33. }

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下行速率

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/301916
推荐阅读
相关标签
  

闽ICP备14008679号