背景

  • Platform: RK3399
  • OS: Android7.1.2
  • Kernel: v4.4.103

这里主要调试的是AP6236AP6256,SDIO接口

检查硬件:

电源: VDDIO,VBAT
时钟:LPO(32.768K) , AXTAL(26M)

检查WL_REG_ON引脚,不能下拉到地
检查WIFI_WAKE_HOST引脚,信号与电平

  • 检查SDIO相关信号
    sdio3.0 VDDIO->1.8V
    检查SDIO SDIO_CLK、 SDIO_CMD电平及波形
    测量 VDDIO sdio_clk、 sdio_cmd、 sdio_data0~sdio_data3 的电压;正常情况下 sdio_clk 为 0V,sdio其他五根线与vddio电压一致
    sdio_clk clk绝对不要加外部上拉,它内部为开漏

硬件OK就能够扫描到模块硬件, 在sys/bus/sdio/devices查看到相应设备,VID和PID也可以在这里找到

添加固件

  • WIFI
    路径:./external/wlan_loader/firmware/
    添加配置nvram_ap6236.txt
    添加固件firmware:fw_bcm43436b0.binfw_bcm43436b0_apsta.bin
  • 蓝牙
    路径:./vendor/rockchip/common/bluetooth/lib/firmware/

DTS配置:

SDIO的速率等设置:

&sdio0 {
	clock-frequency = </*208000000*/150000000>;
	clock-freq-min-max = <200000 /*208000000*/150000000>;
	supports-sdio;
	bus-width = <4>;
	disable-wp;
	cap-sd-highspeed;
	/*cap-sdio-irq;*/
	keep-power-in-suspend;
	mmc-pwrseq = <&sdio_pwrseq>;
	non-removable;
	num-slots = <1>;
	pinctrl-names = "default";
	pinctrl-0 = <&sdio0_bus4 &sdio0_cmd &sdio0_clk>;
	sd-uhs-sdr104;
	status = "okay";
};

添加对应的VID,PID:
路径:souce_code/hardware/libhardware_legacy/wifi/
rk_wifi_ctrl.c
wifi.c

内核驱动:

kernel/net/rfkill/rfkill-wlan.c
kernel/drivers/net/wireless/rockchip_wlan/

#/sys/class/rkwifi/
echo 1 > /sys/class/rkwifi/driver
echo 1 > /sys/class/rkwifi/power
  • DTS中SDIO的配置cap-sdio-irq;
    此配置标识该 SDIO 外设(通常是 Wifi)是否支持 sdio 中断,如果你的外设是 OOB(out-of-band)中断,请不要加入此项

  • 添加固件名称等
    kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_config.c
    dhd_conf_set_fw_name_by_chip函数
    确保CHIP_ID及配置文件名都有对应的,没有则需要添加
    FW_PATH_AUTO_SELECT
    根据CHIP_ID自动获取固件名称等

  • 注意修改内核后需重新编译KO

    if [ -f "device/rockchip/common/build_wifi_ko.sh" ]; then
    	echo "start build wifi driver ko"
    	source device/rockchip/common/build_wifi_ko.sh
    fi

问题

  • dhdsdio_htclk: HT Avail timeout
    dhd_bus_init: clock state is wrong

    时钟问题,检查LPO(32768)时钟

  • dhd_bus_rxctl: resumed on timeout, INT status=0x208000C0

    检查WIFI_WAKE_HOST引脚

扩展

  • Firmware:
    WiFi芯片内部有一个小系统,用来运行802.11协议,此部分代码就叫Firmware。有些芯片(例如 broadcom)的Firmware是以文件的形式存放的,有些芯片(例如 realteck)的Firmware是做到驱动代码中的。

  • Nvram:
    WiFi芯片需要作相应的RF参数校准,校准值等信息一般放到到Nvram中。例如,同一个芯片bcm4330,做成不同的模块时,需要不同的Nvram。另外,有些芯片(例如realtek)将RF参数校准等信息写到芯片的EEPROM中,这部分工作在模块出厂时完成。
    WiFi芯片工作前,需要host先下载Firmware文件到WiFi芯片中,此部分工作在WiFi驱动中完成。