RK3568------Openharmony 4.0-Release WIFI/BT模组(ap6236)适配
文章目录
- RK3568------Openharmony 4.0-Release WIFI/BT模组(ap6236)适配
- 前言
- 一、驱动移植
- 二、设备树配置
- 三 、内核配置
- 四、遇到的问题
- 五、效果展示
- 总结
前言
随着RK3568适配工作的推进,整体适配工作已经接近结束,本篇文章将讲解最后一个驱动适配,正 wi-fi/BT适配
一、驱动移植
市面上常用的WI-FI/BT模组有3款,正基、海华、realtek。正基的模组驱动在鸿蒙RK3568中,已经通过补丁的形式移植进去了,这里我不在赘述。讨论群里也有群友使用的是realtek模组,提供的相关驱动补丁realtek模组驱动
以上驱动的路径为:
kernel/drivers/net/wireless/rockchip_wlan/
kernel/drivers/net/wireless/rockchip_wlan/rkwifibt/ #正基模组
kernel/drivers/net/wireless/rockchip_wlan/cywdhd/ #cypress海华模组
kernel/drivers/net/wireless/rockchip_wlan/rtlxxx #realtek模组
二、设备树配置
设备树配置:
Wi-Fi/BT硬件管脚的配置主要有以下几点:
切记一定要对照原理图进行配置,且确保使用的dts/dtsi里面包含以下节点
/* WIFI_REG_ON: Wi-Fi的电源PIN脚 */
sdio_pwrseq: sdio-pwrseq {
compatible = "mmc-pwrseq-simple";
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 = <20>;
/* 这里的电平状态恰好跟使能状态相反,比如REG_ON高有效,则这里为LOW;如果REG_ON低有效,则填HIGH */
reset-gpios = <&gpio3 RK_PD4 GPIO_ACTIVE_LOW>;
status = "okay";
};
&pinctrl {
sdio-pwrseq {
wifi_enable_h: wifi-enable-h {
rockchip,pins =
/* 对应上面的WIFI_REG_ON */
rockchip,pins = <3 RK_PD4 RK_FUNC_GPIO &pcfg_pull_none>;
};
};
};
/* 打开SDIO接口 */
&sdio {
max-frequency = <150000000>; /* sdio接口的最大频率,可调整 */
bus-width = <4>; /* 4线模式 */
sd-uhs-sdr104; /* 支持SDIO3.0 */
… …
status = "okay";
};
/* WIFI_WAKE_HOST: Wi-Fi唤醒主控的PIN脚 */
wireless-wlan {
compatible = "wlan-platdata";
rockchip,grf = <&grf>;
/* 注意:下面的clock属性是开启PMU的32.768k的,请按照实际使用的型号填写,否在SDIO/WiFi无法使用 */
rockchip,grf = <&grf>;
clocks = <&rk809 1>;
/* 海华/正基模组兼容可以不用修改此名称,realtek需要按实际填写 */
wifi_chip_type = "ap6255";
/* WIFI_WAKE_HOST GPIO_ACTIVE_HIGH特别注意:确认下这个wifi pin脚跟主控的连接关系,
直连的话就是HIGH, 如果中间加了一个反向管就要改成低电平LOW触发 */
WIFI,host_wake_irq = <&gpio0 RK_PA0 GPIO_ACTIVE_HIGH>;
/* 注意USB接口的Wi-Fi需要添加此配置,对应WIFI_REG_ON PIN, 且无需sdio_pwrseq/sdio等
节点 */
WIFI,poweren_gpio = <&gpio0 RK_PA2 GPIO_ACTIVE_HIGH>;
status = "okay";
};
/* pinctrl的配置 */
wireless-wlan {
/omit-if-no-ref/
wifi_wake_host: wifi-wake-host {
/* 注意一般Wi-Fi的wake up pin都是高电平触发,所以默认这里要配置为下拉,如果客户的
是硬件设计是反向的则要改为上拉,总之要初始化为与触发电平相反的状态*/
rockchip,pins = <0 RK_PA0 0 &pcfg_pull_down>;
};
};
!!!!!!!!!!!!!!!!设备树配置这里有几个注意事项:
- IO电源域的配置
说明:外部电源比如VCCIO_SDIO(3.3/1.8v)会同时给芯片的IO和Wi-Fi模组的IO供电,以保证它
们之间的电压匹配,而主芯片的IO需要设置电源域寄存器以匹配外部的供电电压,所以dts里面需
要特定配置告诉驱动支持SDIO3.0的模组IO一定要接1.8v,SDIO2.0 3.3v/1.8v都可以,但切记要匹
配,不能出现供电1.8而配置3.3或者反之。
查看上面原理图,找到Wi-Fi对应的sdio接口部分,图中有标注VCCIOX(有些芯片组名字为:APIOX
或者其它),比如这个是VCCIO1,则给VCCIO1供电的是VCCIO_SDIO,查找VCCIO_SDIO连接的网络
是3.3v还是1.8v,如果硬件是3.3v,按照对应关系进行修改,切记不能出现不匹配的问题。
- 32.768K的配置
正基/海华的模组都是要外供32.768k,而Realtek的模组都是内部封装好的,只有COB芯片才会外供。
如果Wi-Fi模组需要外部供这个频率,则有两种情况:
- 从原理图可以看到RK8XX型号的PMU会给Wi-Fi供32k,一般PMU默认打开32k,如果没有打开则需
要添加如下配置:
注意:如果用的不是RK的PMU,则不能这样配置;看下原理图的32k是如何供的,然后根据实际情况打
开32k。 - 如果需要CPU去供32K,则dts需要添加如下配置(不建议使用这种方式):
硬件连接如下图所示:
三 、内核配置
ap6236:
CONFIG_AP6XXX_WIFI6
CONFIG_BCMDHD
CONFIG_WL_ROCKCHIP
CONFIG_WLAN
rtl8733:
CONFIG_RTL8733BU=y
四、遇到的问题
1.启动后ifconfig找不到网卡
我移植后,ifconfig后找不到网卡,我查找问题的思路有以下几个点:
- 模组本身有问题
- 设备树没有正确配置,导致驱动加载失败
有问题先排查硬件,我更换了一个底板以后,还是找不到网卡,并且测量电源是正确的。排除模组本身问题;接着查看内核打印,查看驱动加载情况
追加了一个打印,发现驱动加载成功,并且也成功分配了wlan0的MAC地址,说明驱动加载成功了。
最后判断应该是查找网卡出现了问题,使用ifconfig -a 以后,wlan0存在
2.找到网卡但是不能正常运行
追加驱动源码的打印:
芯片需要的固件错误,于供应商沟通更换固件
3.运行后搜索不到热点
首先排查硬件,发现没有安装天线
五、效果展示
WIFI展示
总结
本人之前一直从事应用开发,借着这次电鸿的契机进行系统级开发的学习,将我在工作中的遇到的问题及解决思路记录并分享,希望可以与诸君共勉
目前网上技术讨论群大都是鸿蒙的应用开发,总结此类文章也是希望将同样进行鸿蒙设备开发的同僚召集到一起,一起讨论学习。如果有同样在进行鸿蒙设备开发的朋友,可以加我的联系方式,期待您的消息
个人微信