平台:RK3588/Android 12
芯片模组:AP6275HH3
一、kernel层
1、dts驱动配置
/* 蓝牙节点 */
/* 注意下面关于UART的配置:uart4_xfer/uart4_rts/uart4_ctsn
* 每个平台的名字可能不一样,要在对应芯片平台的dts/dtsi里面找下对
* 应的uart写法,比如uart4_ctsn有些平台的名字为uart4_cts.
*/
wireless_bluetooth: wireless-bluetooth {
compatible = "bluetooth-platdata";
clocks = <&at8563>;
clock-names = "ext_clock";
/* 这里要配置对应主控UART的RTS脚 */
uart_rts_gpios = <&gpio4 RK_PC4 GPIO_ACTIVE_LOW>;
pinctrl-names = "default", "rts_gpio";
pinctrl-0 = <&uart9m0_rtsn>, <&bt_reset_gpio>, <&bt_wake_gpio>, <&bt_irq_gpio>;
pinctrl-1 = <&uart9_gpios>;
/* BT_REG_ON 蓝牙电源的开关 这个由ON上GPIO0_C6修改为GPIO0_D3*/
BT,reset_gpio = <&gpio0 RK_PD3 GPIO_ACTIVE_HIGH>;
BT,wake_gpio = <&gpio1 RK_PA1 GPIO_ACTIVE_HIGH>;
BT,wake_host_irq = <&gpio0 RK_PA0 GPIO_ACTIVE_HIGH>;
status = "okay";
};
wireless_wlan: wireless-wlan {
compatible = "wlan-platdata";
wifi_chip_type = "AP6275HH3"; //实际的芯片名称
pinctrl-names = "default";
pinctrl-0 = <&wifi_host_wake_irq>, <&wifi_poweren_gpio>;
/* WIFI_WAKE_HOST: Wi-Fi中断通知主控的PIN脚。
* 特别注意:确认下这个Wi-Fi pin脚跟主控的pin的
* 硬件连接关系,直连的话就是GPIO_ACTIVE_HIGH;
* 如果中间加了一个反向管就要改成低电平GPIO_ACTIVE_LOW触发
*/
WIFI,host_wake_irq = <&gpio1 RK_PB0 GPIO_ACTIVE_HIGH>;
/* 注意USB/PCIE接口的Wi-Fi需要添加此配置,对应Wi-Fi使能脚
*/
WIFI,poweren_gpio = <&gpio1 RK_PA7 GPIO_ACTIVE_HIGH>;
status = "okay";
};
//pinctrl的控制
&pinctrl {
wireless-bluetooth {
uart9_gpios: uart9-gpios {
rockchip,pins = <4 RK_PC4 RK_FUNC_GPIO &pcfg_pull_none>;
};
bt_reset_gpio: bt-reset-gpio {
rockchip,pins = <0 RK_PC6 RK_FUNC_GPIO &pcfg_pull_none>;
};
bt_wake_gpio: bt-wake-gpio {
rockchip,pins = <1 RK_PA1 RK_FUNC_GPIO &pcfg_pull_none>;
};
bt_irq_gpio: bt-irq-gpio {
rockchip,pins = <0 RK_PA0 RK_FUNC_GPIO &pcfg_pull_none>;
};
};
wireless-wlan {
wifi_host_wake_irq: wifi-host-wake-irq {
rockchip,pins = <1 RK_PB0 RK_FUNC_GPIO &pcfg_pull_down>;
};
wifi_poweren_gpio: wifi-poweren-gpio {
rockchip,pins = <1 RK_PA7 RK_FUNC_GPIO &pcfg_pull_up>;
};
};
};
2、RK平台dts解析以及初始化加载
RK平台WiFi驱动加载相关代码如下:
//kernel-5.10/net/rfkill/rfkill-wlan.c
//根据name查找对应的设备节点,并加载驱动
static struct platform_driver rfkill_wlan_driver = {
.probe = rfkill_wlan_probe,
.remove = rfkill_wlan_remove,
.shutdown = rfkill_wlan_shutdown,
.suspend = rfkill_wlan_suspend,
.resume = rfkill_wlan_resume,
.driver = {
.name = "wlan-platdata",
.owner = THIS_MODULE,
.of_match_table = of_match_ptr(wlan_platdata_of_match),
},
};
RK平台BT驱动加载相关代码如下:
static struct platform_driver rfkill_rk_driver = {
.probe = rfkill_rk_probe,
.remove = rfkill_rk_remove,
.driver = {
.name = "rfkill_bt",
.owner = THIS_MODULE,
.pm = &rfkill_rk_pm_ops,
.of_match_table = of_match_ptr(bt_platdata_of_match),
},
};
static int __init rfkill_rk_init(void)
{
int err;
LOG("Enter %s\n", __func__);
err = rfkill_wlan_init();
if (err)
return err;
return platform_driver_register(&rfkill_rk_driver);
}
static void __exit rfkill_rk_exit(void)
{
LOG("Enter %s\n", __func__);
platform_driver_unregister(&rfkill_rk_driver);
rfkill_wlan_exit();
}
module_init(rfkill_rk_init);
module_exit(rfkill_rk_exit);
对应的日志如下:
03-23 03:16:22.216 I/KERNEL: [BT_RFKILL]( 1): Enter rfkill_rk_init
03-23 03:16:22.216 I/KERNEL: [

文章详细描述了在RK3588平台上,针对Android12系统的蓝牙和Wi-Fi驱动加载过程,包括kernel层的dts配置、Wi-FiHAL的初始化以及遇到的GPIO冲突、电源管理、固件加载等问题。在解决过程中,修改了GPIO配置以避免冲突,调整了电源管理设置,并解决了天线导致的通信问题。
最低0.47元/天 解锁文章
1373






