本文记录如何根据原理图,配置和调试RK356x(测试用RK3566)主板上wifi/蓝牙模块(测试用AP6212,rkwifibt),使其能正确连网。
1.配置SOC接口
1.1 查看原理图,看看wifi模块用的接口是什么,一般支持sdio,sdmmc,pcie,USB等,参考文档:docs/cn/Linux/Wifibt/Rockchip_Developer_Guide_Linux_WIFI_BT_CN.pdf.
通过原理图,可以知道,我的wifi模块接在sdmmc1上,因此,打开sdmmc1节点,并进行其它参数设置,如下:
&sdmmc1 {max-frequency = <200000000>; //最大频率150或200MHzno-sd; //初始化期间,仅发送SD命令no-mmc; //初始化期间,仅发送MMC命令non-removable; //不可进行热插拔bus-width = <4>; //4线通信//disable-wp;cap-sd-highspeed; //支持高速时序cap-sdio-irq; //使能SDIO中断keep-power-in-suspend; //挂起期间依然保持供电rockchip,default-sample-phase = <90>;mmc-pwrseq = <&sdio_pwrseq>; //使能sdio_pwrseq,只能被一个节点使用pinctrl-names = "default";pinctrl-0 = <&sdmmc1_bus4 &sdmmc1_cmd &sdmmc1_clk>;sd-uhs-sdr104; //支持SD UHS SDR104速度模式status = "okay";
};
特别注意,sdio_pwrseq节点,是关联wifi模块的主节点,只能被一个节点使用。
1.2 配置sdio_pwrseq节点
sdio_pwrseq: sdio-pwrseq {compatible = "mmc-pwrseq-simple";//clocks = <&rk809 1>;//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_PC2 GPIO_ACTIVE_LOW>;
};
这个节点在两个与主板相关的dtsi文件中,都可能有,为了避免一个会覆盖一个,因此,保留最初的一个即可。它最重要的配置是reset-gpios引脚,原理图上这个引脚连到了wifi模块的WL_REG_ON上面,一定要配置正确这个引脚,它在识别模块上非常重要。
同时修改wifi_enable_h节点,使它与reset-gpios对应:
sdio-pwrseq {wifi_enable_h: wifi-enable-h {rockchip,pins = <2 RK_PC2 RK_FUNC_GPIO &pcfg_pull_none>;};
};
1.3 配置wireless_wlan节点,并打开它:
&wireless_wlan {pinctrl-names = "default";pinctrl-0 = <&wifi_host_wake_irq>;WIFI,host_wake_irq = <&gpio2 RK_PC4 GPIO_ACTIVE_HIGH>;status = "okay";
};
注意,在&wireless_wlan修改节点的地方,重要的配置是WIFI,host_wake_irq,它连接到模块的WL_HOST_WAKE引脚上面,我的电路板连的是GPIO2_PC4。同时配置控制节点wifi_host_wake_irq,使之与这里引脚匹配:
wireless-wlan {wifi_host_wake_irq: wifi-host-wake-irq {rockchip,pins = <2 RK_PC4 RK_FUNC_GPIO &pcfg_pull_down>;};
};
在节点 wireless_wlan原始定义文件中,需要配置wifi_chip_type,它是wifi模块的名称,我这里写入ap6212a,同时配置WIFI,poweren_gpio,它连接到模块的WL_REG_ON上(与sdmmc中的reset gpios是一个脚):
wireless_wlan: wireless-wlan {compatible = "wlan-platdata";rockchip,grf = <&grf>;clocks = <&rk809 1>;//clocks = <&hym8563>;clock-names = "ext_clock";wifi_chip_type = "ap6212a1";WIFI,poweren_gpio = <&gpio2 RK_PC2 GPIO_ACTIVE_HIGH>;status = "disabled";
};
1.4 检查接口配置是否正确
如此配置后,烧录到主板上,可以在系统总线上(/sys/bus/mmc/devices),看到sdmmc1产生的设备名称,通过file它,应该可以链接到一个sdmmc1地址相同的文件上:
上图的mmc0对应节点sdhci,它是EMMC的接口,系统烧录进这里面去了,启动必须有这个接口,通过file命令可以查看它实际链接的文件。
而mmc2:0001则对应的就是sdmmc1节点,可以通过file看到它实际链接的设备地址是0xFE2C0000,这个地址正是节点sdmmc1的地址。
这表示,系统总线上已经发现了sdmmc1设备。
2. 配置和测试wifi模块
2.1 配置全局板级文件
首先,在全局板级文件中加入语句:RK_WIFIBT_CHIP="AP6212A1"
其中,AP6212A1可以是:
AP6275/AP6358S/AP6212A1/AP6236...之一
RTL8723DS/RTL8822CS...之一
CYW4354/CYW43438/CYW5557X_PCIE/CYW5557X_PCIE...之一
根据电路板所使用的模块写入。
2.2 执行命令./build.sh wifibt,可能会报错,主要是文件权限问题,造成脚本不能移动某些模块,根据报错,将文件权限修改一下即可。
执行命令./build.sh rootfs编译一下根文件系统
执行命令./build.sh firmware打包成update.img,最后烧录运行
2.3 系统启动后,执行以下命令:
ip a 查看是否有wlan0出现
ip link set wlan0 up 打开wifi
nmcli dev wifi 扫描热点
nmcli dev wifi connect "name" password "xxxxx" 连接热点
ip a 查看wlan0是否有IP地址出现