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 主要用高速模式:
SDIO 1.0/2.0:最高 50MHz,4 线传输,带宽约 200Mbps;
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,连接对应通道,可以把命令解析出来。