SSC305QE适配sdio wifi aic8800 一.wifi基本原理1.wifi简介WiFiWireless Fidelity无线保真是一套基于IEEE 802.11标准的无线局域网通信技术利用无线电波无需网线就能让电脑、手机、摄像头等设备连接网络实现数据传输与互联网访问。2.sdio wifi基本原理一、什么是 SDIO WiFiSDIO 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最高 50MHz4 线传输带宽约 200MbpsSDIO 3.0UHS-I最高 200MHz4 线带宽接近 800Mbps主流 WiFi 模组标配。总线信号CLK同步时钟CMD命令通道主控下发指令D0~D34 根数据线传输 WiFi 数据包VDD/VSS供电。主控通过 SDIO 控制器像读写 SD 卡一样读写 WiFi 模组寄存器、收发网络帧。二.wifi spec1.描述2.特征3.pin脚定义4.power5.芯片6.时序三.硬件原理图1.原理图2.pinmap3.checklist四.代码修改1.dts sdmmc1节点iford-ssz029c-s01a-dualos_demo_dualsnr_glasses.dtssstar_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.padmuxiford-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 configaixbot_configCONFIG_MAC80211m CONFIG_WLANy CONFIG_AIC_WLAN_SUPPORTy CONFIG_AIC8800_WLAN_SUPPORTm CONFIG_SUPPORT_SDMMC_COMMANDy CONFIG_SUPPORT_SDMMC_UT_VERIFYy4.driver1.Makefiledrivers/net/wireless/Makefileobj-$(CONFIG_AIC_WLAN_SUPPORT) aic8800/2.Kconfigdrivers/net/wireless/Kconfigsource drivers/net/wireless/aic8800/Kconfig3.driver厂商提供的驱动直接放在drivers/net/wireless/aic8800aic8800_fdrv.ko、aic8800_bsp.koaic8800_bsp.ko模块固件初始化aic8800_fdrv.koWifi 驱动4.fwdrivers/net/wireless/aic8800/Kconfigconfig 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/MakefileCONFIG_AIC_FW_PATH /etc/wifi/aic8800D805.scriptboard/r1504/fs_overlay/root/etc/init.d/sysconfig.shinsmod /lib/modules/5.10.117/external/cfg80211.ko insmod /lib/modules/5.10.117/external/mac80211.koboard/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 cnt1 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.shreboot_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.shlsmod | 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 ret0 log aic8800 rmmod ok!!!! fifw文件放到board/r1504/fs_overlay/root/etc/wifi/aic8800D80会打包到固件/etc/wifi/aic8800D80目录。五.验证1.开机[rootr1504_debug:/]#lsmodaic8800_fdrv 405504 0 - Live 0xbf16d000aic8800_bsp 73728 1 aic8800_fdrv, Live 0xbf103000mac80211 339968 0 - Live 0xbf119000cfg80211 245760 2 aic8800_fdrv,mac80211, Live 0xbf0c60002.验证联网[rootr1504_debug:/]# wifi_connect -f AIXBOT-guest AIXBOT5678[rootr1504_debug:/]# ping www.baidu.comPING www.baidu.com (180.101.49.44): 56 data bytes64 bytes from 180.101.49.44: seq0 ttl52 time14.882 ms64 bytes from 180.101.49.44: seq1 ttl52 time9.676 ms64 bytes from 180.101.49.44: seq2 ttl52 time167.663 ms64 bytes from 180.101.49.44: seq3 ttl52 time10.042 ms64 bytes from 180.101.49.44: seq4 ttl52 time9.365 msWiFi: Connected SSID: AIXBOT-guest IP: 172.17.114.38 SIGNAL: -75 dBm[rootr1504_debug:/]#3.扫描热点[rootr1504_debug:/]# wpa_cli scanSelected interface wlan0OK[rootr1504_debug:/]# wpa_cli scan_resSelected interface wlan0bssid / frequency / signal level / flags / ssidda:cd:55:9e:f0:2f 5220 -67 [WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS] AIXBOT-guestda:cd:55:9e:f0:2e 5220 -67 [WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS] AIXBOT-staffce:5b:a1:fa:d1:cc 2462 -89 [WPA2-PSK-CCMP][ESS] robot_fct194:14:57:05:d4:f8 2412 -94 [ESS] Sundray-D4F8[rootr1504_debug:/]#六.问题1.怎么看是否识别到wifi?[rootr1504_debug:/]# ls /sys/bus/mmc/devicesmmc0:0001 mmc1:ce42[rootr1504_debug:/]# ls /sys/bus/sdio/devices/mmc1:ce42:1 mmc1:ce42:2[rootr1504_debug:/]#mmc0:0001 //emmcmmc1:ce42 //wifimmc1:ce42:1 //wifimmc1:ce42:2 //blueteeth2.cmd52通信failaicbsp: aicbsp_set_subsys, subsys: AIC_WIFI, state to: 1aicbsp: aicbsp_set_subsys, power state change to 1 dure to AIC_WIFIaicbsp: aicbsp_platform_power_onLINE_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 8LINE_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 8aicbsp: aicbsp_set_subsys, fail to set AIC_WIFI power state to 1AICWFDBG(LOGERROR) rwnx_mod_init, set power on fail!insmod: cant 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,连接对应通道可以把命令解析出来。