RK3588平台正基AP6275HH3芯片Bring Up

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

平台: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: [
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GitFranc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值