AP6256是正基的一款集成WIFI和BT的IC。支持WIFI5.
一、WIFI调试
WIFI通信原理:
WIFI通信,既然是通信那么必然是俩个物体以上。这里指的是我们的WIFIIC和主机通信。WIFI通过接受无线网络的某个频段的信号,然后发送给我们的主板。根据连接WIFIIC和主板之间的数据通道分成SDIO WIFI、USB WIFI 、PCIe WIFI。我们这里采用的是SDIO。
调试过程:
1、配置好SDIO通道,确定能读到卡,这样WIFI就能读到数据。
2、把正基提供的固件刷到我们的IC。这样我们的IC就可以正常工作。
3、确保这俩点之后,就检查各个电压以及时钟是否正确。
一、我们的使用的是SDIO1,共六个管脚。4路dataBUS,一个CMD,一个CLK。
我们要配置他们在正确的状态
/* AI3566 add by wzf */
&sdmmc1 {
max-frequency = <150000000>;
supports-sdio; //使用的是SDIO通道,如果sdmmc是做连接SD卡使用这里写supports-sd;
bus-width = <4>; //使用4路通道,可以写1只使用1路最大是4
disable-wp;
cap-sd-highspeed;
cap-sdio-irq;
keep-power-in-suspend;
mmc-pwrseq = <&sdio_pwrseq>; //个支持睡眠不断电 此项是 SDIO 外设(一般是 Wifi)的电源控制。为必须项,否则 Wifi 无法上电工作
non-removable;
pinctrl-names = "default";
pinctrl-0 = <&sdmmc1_bus4 &sdmmc1_cmd &sdmmc1_clk>; //sdmmc1 4路data cmd clk分别应我们使用的通道
sd-uhs-sdr104;
status = "okay";
* AI 3566 WIFI SDIO */
/* sdmmc1 这个支持睡眠不断电 此项是 SDIO 外设(一般是 Wifi)的电源控制。为必须项,否则 Wifi 无法上电工作 */
sdio_pwrseq: sdio-pwrseq {
compatible = "mmc-pwrseq-simple";
clocks = <&rk809 1>; //我们使用外部时钟32k,是从rk809出来
clock-names = "ext_clock";
pinctrl-names = "default";
pinctrl-0 = <&wifi_enable_h>;
/*
* On the module itself this is one of these (depending
* on the actual card populated):
* - SDIO_RESET_L_WL_REG_ON
* - PDN (power down when low)
*/
post-power-on-delay-ms = <200>;
reset-gpios = <&gpio2 RK_PB1 GPIO_ACTIVE_LOW>; //WIFI_REG_ON_H
};
};
这样配置之后我们就能识别到卡了。但是我们这里出了一点问题。
我们的外部时钟32k是由俩个地方提供一个是RTC一个是rk809.这样导致我们控不到这个32koutclk.至于为什么reset-gpios写LOW触发,实际是HIGH触发,可以改掉驱动的时序。
还有就是有的地方不能随便打印。我在上电的时候加打印后发现不能识别到卡。
2、找正基要到AP6256的固件放到vendor/rockchip/common/wifi/fremwre/下。
还要配置一下config.txt 如果没有这个目录就自己加一个。
vendor/rockchip/common/wifi/fremwre/config.txt
ccode=CN 区域是CN 代表我们可以使用的频段
regrev=38
config_msg_level=0xf
dump_msg_level=0xf
android_msg_level=0x5
wl_dbg_level=0x9 加这就可以打印一些WIFI dug的log
这样我们在打开WIFI的时候就可以看的open 这些文件
[ 89.351333] Final conf_path=/vendor/etc/firmware/config.txt
[ 89.351809] dhd_os_open_image: /vendor/etc/firmware/fw_bcm43456c5_ag.bin (605647 bytes) open success
[ 89.399527] dhd_os_open_image: /vendor/etc/firmware/nvram_ap6256.txt (2732 bytes) open success
[ 89.400006] NVRAM version: AP6256_NVRAM_V1.4_06112021
[ 89.400440] dhdsdio_write_vars: Download, Upload and compare of NVRAM succeeded.
表示AP6256吃到这些固件了。此时正常的话WIFI就可以打开然后scan 到无线网络了。
但是这里:我们可以打开WIFI也识别到卡了。但是就是扫描不到无线网络。
* SDIO 接口的模块
对于sdio接口的模块,执行” echo 1 > /sys/class/rkwifi/driver”命令 ,正常情况下 sdio_clk 和sdio_cmd 能够测量到相关波形,内核打印上能够看到如下打印,如果没有测量到波形也没有看到如下打印,根据配置文档检查是否正确配置sdio;
Wifi驱动会根据扫描到的sdio模块的vid pid 进行驱动匹配,rtl的驱动会根据读取到的vid,pid进行驱动匹配;其中正基系列的模块会根据后面从data数据线上读取到F1 function 读取的数值进行 驱动与固件匹配(正基目前的驱动兼容所有sdio接口正基模块,根据F1 function 读取的值 匹配固件);
如果能够扫描模块但是初始化过程看到data fifo error,检查下 sdio接口电平是否一致;方法如下:
echo 1 > /sys/class/rkwifi/power
测量 VDDIO sdio_clk sdio_cmd sdio_data0~sdio_data3 的电压;正常情况下 sdio_clk 为 0V,sdio其他五根线与vddio电压一致;
如果电压不一致:312x平台确认下 sdio接口的内部上下拉是否禁掉,参看文档RK Kernel 3.10平台WiFi BT不工作异常排查.pdf Part C;其他平台考虑加外部上拉(注clk绝对不要加外部上拉);
同时测量执行echo 1 > /sys/class/rkwifi/driver 时 外部晶体是否有起振,如果扫描时没有起振检查下硬件;同时建议测量外部晶体频偏,频偏比较大情况下,会出现能扫描到模块但是初始化失败;除检查晶振外,正基系列还需要外部32k,测量32k的峰峰值(峰峰值>=0.7*VDDIO && 峰峰值 <= 1*VDDIO);【注:频偏和峰峰值一定要测量检查,频偏过大峰峰值不对会影响wifi(扫描连接热点)和蓝牙(扫描连接设备))】
电压一致情况下,晶振频偏和32k的峰峰值没有问题(正基系列的要考虑晶振频偏与32k峰峰值,具体结合自己电路实际情况)但是初始化依然出问题;
考虑降低sdio_clk ,重新测试;如果降低clk可以,考虑硬件上走线;
如果降低clk依然不行,考虑使用sdio单线模式方法如下
参考这位网友我们检查了峰峰值以及晶振的频偏。发现要使用34.7M的晶振,而我们的使用的是26M 的这硬件做的正拉跨(外包出去的)。改了晶振之后就好了。
---------------–附上这位网友的参考链接—------------------------
二:BT
明天调