SSC305QE适配sdio wifi aic8800

一.wifi基本原理

1.wifi简介

WiFi(Wireless Fidelity,无线保真)是一套基于IEEE 802.11标准的无线局域网通信技术,利用无线电波,无需网线就能让电脑、手机、摄像头等设备连接网络,实现数据传输与互联网访问。

2.sdio wifi基本原理

一、什么是 SDIO WiFi

SDIO = SD Input/Output,是在标准 SD 存储卡接口基础上扩展的外设传输总线。 SDIO WiFi 模块就是无线 WiFi 芯片 + SDIO 接口控制器的一体化模组,通过主板 / CPU 的 SDIO 总线与主控(单片机、嵌入式 Linux、安卓、车机、摄像头主控)通信,完成 WiFi 数据收发。

常见芯片:AIC8800、RTL8723、RTL8188、BK7256 等嵌入式 WiFi 均大量使用 SDIO 方案。

二、SDIO 总线基础(通信载体)

SDIO 分三种速率模式,WiFi 主要用高速模式:

  1. SDIO 1.0/2.0:最高 50MHz,4 线传输,带宽约 200Mbps;

  2. SDIO 3.0(UHS-I):最高 200MHz,4 线,带宽接近 800Mbps,主流 WiFi 模组标配。

总线信号:

  • CLK:同步时钟;

  • CMD:命令通道,主控下发指令;

  • D0~D3:4 根数据线,传输 WiFi 数据包;

  • VDD/VSS:供电。

主控通过 SDIO 控制器,像读写 SD 卡一样读写 WiFi 模组寄存器、收发网络帧。

二.wifi spec

1.描述

2.特征

3.pin脚定义

4.power

5.芯片

6.时序

三.硬件原理图

1.原理图

2.pinmap

3.checklist

四.代码修改

1.dts sdmmc1节点

iford-ssz029c-s01a-dualos_demo_dualsnr_glasses.dts

sstar_sdmmc1: sstar_sdmmc1 { compatible = "sstar,sdmmc"; bus-width = <4>; max-frequency = <48000000>; non-removable; cap-sd-highspeed; cap-sdio-irq; no-sd; no-mmc; reg = <0x1F008400 0x200>; pll-reg = <0x1F283200 0x200>; cifd-reg = <0x1F008600 0x200>; pwr-save-reg = <0x1F008800 0x200>; ip-order = /bits/ 8 <1>; pad-order = /bits/ 8 <2>; trans-mode = /bits/ 8 <1>; // 0:dma 1:adma default is 1 fake-cdz = /bits/ 8 <1>; rev-cdz = /bits/ 8 <0>; pwr-on-delay = <250>; pwr-off-delay = <250>; support-runtime-pm = /bits/ 8 <0>; // sd/sdio runtime-pm default disable sdio-use-1bit = /bits/ 8 <0>; cifd-mcg-off = /bits/ 8 <0>; // mcg on/off in cifd support-cmd23 = /bits/ 8 <1>; clk-driving = <4>; cmd-driving = <4>; />

2.padmux

iford-ssz029c-s01b-demo-padmux-glasses.dtsi

// SDMMC1 for 114b wifi <PAD_PM_PSPI0_CK PINMUX_FOR_PM_SDIO_MODE_3 MDRV_PUSE_SDIO1_CLK>, <PAD_PM_PSPI0_CZ PINMUX_FOR_PM_SDIO_MODE_3 MDRV_PUSE_SDIO1_CMD>, <PAD_PM_PSPI0_DO PINMUX_FOR_PM_SDIO_MODE_3 MDRV_PUSE_SDIO1_D0>, <PAD_PM_PSPI0_DI PINMUX_FOR_PM_SDIO_MODE_3 MDRV_PUSE_SDIO1_D1>, <PAD_PM_GPIO9 PINMUX_FOR_PM_SDIO_MODE_3 MDRV_PUSE_SDIO1_D2>, <PAD_PM_GPIO10 PINMUX_FOR_PM_SDIO_MODE_3 MDRV_PUSE_SDIO1_D3>,

3.kernel config

aixbot_config

+CONFIG_MAC80211=m +CONFIG_WLAN=y +CONFIG_AIC_WLAN_SUPPORT=y +CONFIG_AIC8800_WLAN_SUPPORT=m +CONFIG_SUPPORT_SDMMC_COMMAND=y +CONFIG_SUPPORT_SDMMC_UT_VERIFY=y

4.driver

1.Makefile

drivers/net/wireless/Makefile

obj-$(CONFIG_AIC_WLAN_SUPPORT) += aic8800/

2.Kconfig

drivers/net/wireless/Kconfig

source "drivers/net/wireless/aic8800/Kconfig"

3.driver

厂商提供的驱动直接放在drivers/net/wireless/aic8800

aic8800_fdrv.ko、aic8800_bsp.ko

aic8800_bsp.ko:模块固件初始化

aic8800_fdrv.ko:Wifi 驱动

4.fw

drivers/net/wireless/aic8800/Kconfig

config AIC_FW_PATH depends on AIC_WLAN_SUPPORT string "Firmware & config file path" default "/etc/wifi/aic8800D80" #default "/lib/firmware/aic8800_sdio" help Path to the firmware & config file.

drivers/net/wireless/aic8800/aic8800_bsp/Makefile

CONFIG_AIC_FW_PATH = "/etc/wifi/aic8800D80"

5.script

board/r1504/fs_overlay/root/etc/init.d/sysconfig.sh

+insmod /lib/modules/5.10.117/external/cfg80211.ko +insmod /lib/modules/5.10.117/external/mac80211.ko

board/r1504/fs_overlay/root/etc/init.d/wifi.sh

#!/bin/sh source /usr/bin/config DEBUG_VERSION_FILE=/data/initialize.sh function wifiload() { echo 54 > /sys/class/gpio/export echo out > /sys/class/gpio/gpio54/direction echo 0 > /sys/class/gpio/gpio54/value sleep 0.2 echo 1 > /sys/class/gpio/gpio54/value sleep 1 echo "1f008400.sstar_sdmmc1" > /sys/bus/platform/drivers/sstar_sdmmc/unbind sleep 1 echo "1f008400.sstar_sdmmc1" > /sys/bus/platform/drivers/sstar_sdmmc/bind sleep 1 modprobe aic8800_bsp sleep 0.5 modprobe aic8800_fdrv } sleep 1 wifiload cnt=1 while [ ${cnt} -le 10 ] do lsmod | grep 8800 if [ $? -eq 0 ]; then break else sleep 0.1 wifiload fi let cnt++ done for i in `seq 1 10` do ifconfig ${WIFI_NODE} mtu 1300 up 2>/dev/null && break sleep 0.2 done log "$0 init ok!!!!"

board/r1504/fs_overlay/root/etc/rc.d/wifi_monitor.sh

reboot_wifi_model() { killall -9 wpa_supplicant killall -9 wifi_manager rm -f /tmp/wifi_ctrl_* rm -f ${WIFI_CONNECT} ${WIFI_DISCONNECT} sleep 1 rmmod aic8800_fdrv sleep 0.2 rmmod aic8800_bsp sleep 1 /etc/init.d/wifi.sh sleep 1 /etc/init.d/wpa_supplicant.sh sleep 2 /etc/rc.d/wifi_manager.sh }

fs_overlay/root/usr/bin/wifi_act.sh

lsmod | grep 8800 if [ $? -eq 0 ]; then rmmod aic8800_fdrv sleep 0.2 rmmod aic8800_bsp sleep 0.2 echo 54 > /sys/class/gpio/export echo out > /sys/class/gpio/gpio54/direction echo 0 > /sys/class/gpio/gpio54/value ret=0 log " aic8800 rmmod ok!!!!" fi

fw文件放到board/r1504/fs_overlay/root/etc/wifi/aic8800D80会打包到固件/etc/wifi/aic8800D80目录。

五.验证

1.开机

[root@r1504_debug:/]#lsmod

aic8800_fdrv 405504 0 - Live 0xbf16d000

aic8800_bsp 73728 1 aic8800_fdrv, Live 0xbf103000

mac80211 339968 0 - Live 0xbf119000

cfg80211 245760 2 aic8800_fdrv,mac80211, Live 0xbf0c6000

2.验证联网

[root@r1504_debug:/]# wifi_connect -f AIXBOT-guest AIXBOT@5678

[root@r1504_debug:/]# ping www.baidu.com

PING www.baidu.com (180.101.49.44): 56 data bytes

64 bytes from 180.101.49.44: seq=0 ttl=52 time=14.882 ms

64 bytes from 180.101.49.44: seq=1 ttl=52 time=9.676 ms

64 bytes from 180.101.49.44: seq=2 ttl=52 time=167.663 ms

64 bytes from 180.101.49.44: seq=3 ttl=52 time=10.042 ms

64 bytes from 180.101.49.44: seq=4 ttl=52 time=9.365 ms

WiFi: Connected SSID: AIXBOT-guest IP: 172.17.114.38 SIGNAL: -75 dBm

[root@r1504_debug:/]#

3.扫描热点

[root@r1504_debug:/]# wpa_cli scan

Selected interface 'wlan0'

OK

[root@r1504_debug:/]# wpa_cli scan_res

Selected interface 'wlan0'

bssid / frequency / signal level / flags / ssid

da:cd:55:9e:f0:2f 5220 -67 [WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS] AIXBOT-guest

da:cd:55:9e:f0:2e 5220 -67 [WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS] AIXBOT-staff

ce:5b:a1:fa:d1:cc 2462 -89 [WPA2-PSK-CCMP][ESS] robot_fct1

94:14:57:05:d4:f8 2412 -94 [ESS] @Sundray-D4F8

[root@r1504_debug:/]#

六.问题

1.怎么看是否识别到wifi?

[root@r1504_debug:/]# ls /sys/bus/mmc/devices

mmc0:0001 mmc1:ce42

[root@r1504_debug:/]# ls /sys/bus/sdio/devices/

mmc1:ce42:1 mmc1:ce42:2

[root@r1504_debug:/]#

mmc0:0001 //emmc

mmc1:ce42 //wifi

mmc1:ce42:1 //wifi

mmc1:ce42:2 //blueteeth

2.cmd52通信fail

aicbsp: aicbsp_set_subsys, subsys: AIC_WIFI, state to: 1

aicbsp: aicbsp_set_subsys, power state change to 1 dure to AIC_WIFI

aicbsp: aicbsp_platform_power_on

LINE_956 SDMMC_1 cmd[52] args(0x80022000) ERR: check SD_STS:0x0F08

[sdmmc_1] Err: #Cmd_52 (0x80022000)=>(E: 0x0008)(S: 0x000010FF)__(L:956)

aicbsp_dummy_sdmmc: probe of mmc1:ce42:1 failed with error 8

LINE_956 SDMMC_1 cmd[52] args(0x80042000) ERR: check SD_STS:0x0F08

[sdmmc_1] Err: #Cmd_52 (0x80042000)=>(E: 0x0008)(S: 0x000010FF)__(L:956)

aicbsp_dummy_sdmmc: probe of mmc1:ce42:2 failed with error 8

aicbsp: aicbsp_set_subsys, fail to set AIC_WIFI power state to 1

AICWFDBG(LOGERROR) rwnx_mod_init, set power on fail!

insmod: can't insert '/customer/sample_code/bin/demos/wifi/aic8800_fdrv.ko': No such device

确认硬件上拉。

3.重新加载为什么要解绑重新绑定设备?

Nand 设备可以直接卸载加载sdmmc.ko

但是emmc设备不可以卸载,所以卸载重新加载wifi驱动时需要解绑重新绑定sdio设备,才能触发扫描识别wifi板卡。

4.clk配的是12MHz,为什么量出来300kHz?

平台默认初始化识别设备300KHz扫卡,等认到设备完成握手动作接换成高速率。

5.怎么读取发送的cmd值?

用逻辑分析仪,解析器配置成sdio,连接对应通道,可以把命令解析出来。