RK3588平台正基AP6275HH3芯片Bring Up

平台: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: [WLAN_RFKILL](    1): Enter rfkill_wlan_init
03-23 03:16:22.217 I/KERNEL: [WLAN_RFKILL](    1): Enter rfkill_wlan_probe
03-23 03:16:22.217 I/KERNEL: [WLAN_RFKILL](    1): can't find rockchip,grf property
03-23 03:16:22.217 I/KERNEL: [WLAN_RFKILL](    1): wlan_platdata_parse_dt: wifi_chip_type = AP6275HH3
03-23 03:16:22.217 I/KERNEL: [WLAN_RFKILL](    1): wlan_platdata_parse_dt: enable wifi power control.
03-23 03:16:22.217 I/KERNEL: [WLAN_RFKILL](    1): wlan_platdata_parse_dt: wifi power controled by gpio.
03-23 03:16:22.217 I/KERNEL: [WLAN_RFKILL](    1): wlan_platdata_parse_dt: WIFI,poweren_gpio = 39 flags = 0.
03-23 03:16:22.217 I/KERNEL: [WLAN_RFKILL](    1): wlan_platdata_parse_dt: WIFI,host_wake_irq = 40, flags = 0.
03-23 03:16:22.217 I/KERNEL: [WLAN_RFKILL](    1): wlan_platdata_parse_dt: The ref_wifi_clk not found !
03-23 03:16:22.217 I/KERNEL: [WLAN_RFKILL](    1): rfkill_wlan_probe: init gpio
03-23 03:16:22.217 I/KERNEL: [WLAN_RFKILL](    1): rfkill_set_wifi_bt_power: 1
03-23 03:16:22.217 I/KERNEL: [WLAN_RFKILL](    1): Exit rfkill_wlan_probe
03-23 03:16:22.218 I/KERNEL: [BT_RFKILL](    1): bluetooth_platdata_parse_dt: get property: uart_rts_gpios = 148.
03-23 03:16:22.218 I/KERNEL: [BT_RFKILL](    1): bluetooth_platdata_parse_dt: get property: BT,reset_gpio = 22.
03-23 03:16:22.218 I/KERNEL: [BT_RFKILL](    1): bluetooth_platdata_parse_dt: get property: BT,wake_gpio = 33.
03-23 03:16:22.218 I/KERNEL: [BT_RFKILL](    1): bluetooth_platdata_parse_dt: get property: BT,wake_host_irq = 0.
03-23 03:16:22.218 I/KERNEL: [BT_RFKILL](    1): Request irq for bt wakeup host
03-23 03:16:22.218 I/KERNEL: [BT_RFKILL](    1): ** disable irq
03-23 03:16:22.218 I/KERNEL: [BT_RFKILL](    1): bt_default device registered.

二、WiFi hal的初始化,加载芯片模组的驱动

代码如下:

//hardware/interfaces/wifi/1.5/default/service.cpp
int main(int /*argc*/, char** argv) {
    
    
    signal(SIGPIPE, SIG_IGN);
    android::base::InitLogging(
        argv, android::base::LogdLogger(android::base::SYSTEM));
    LOG(INFO) << "Wifi Hal is booting up...";

    wifi_load_driver();
    .....
    LOG(INFO) << "Wifi Hal is terminating...";
    return 0;
}


//frameworks/opt/net/wifi/libwifi_hal/wifi_hal_common.cpp
int wifi_load_driver() {
    
    
#ifdef WIFI_DRIVER_MODULE_PATH
    //获取module的路径和参数
	const char* wifi_ko_path = get_wifi_module_path();
	const char* wifi_ko_arg = get_wifi_module_arg();
	int count = 100;
	if (is_wifi_driver_loaded()) {
    
    
		return 0;
	}
	if (wifi_ko_path == NULL) {
    
    
		PLOG(ERROR) << "falied to find wifi driver for type=" << wifi_type;
		return -1;
	}

	if (strstr(wifi_ko_path, MVL_DRIVER_MODULE_NAME)) {
    
    
		insmod(MLAN_DRIVER_MODULE_PATH, "");
	}

	if (strstr(wifi_ko_path, BCM_DRIVER_MODULE_NAME)) {
    
    
		insmod(BCM_STATIC_BUF_MODULE_PATH, "");
	}

  if (insmod(wifi_ko_path, wifi_ko_arg) < 0) {
    
    
	  return -1;
  }
#endif
  .....
}

对应日志如下:

03-27 09:02:51.101 I/[email protected](  469): Wifi Hal is booting up...
03-27 09:02:51.103 E/[email protected](  469): check_wifi_chip_type_string : APXXX: Permission denied
03-27 09:02:51.103 E/[email protected](  469): matched wifi_module_path: /vendor/lib/modules/bcmdhd.ko: Permission denied

//加载芯片模组的驱动
03-27 09:02:52.675 E/KERNEL: [dhd] _dhd_module_init(  469): in Dongle Host Driver, version 101.10.361.25 (wlan=r892223-20220926-1)(20220929-1)
03-27 09:02:52.675 E/KERNEL: (  469): drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd compiled on Mar 27 2023 at 16:24:21
03-27 09:02:52.675 W/KERNEL: (  469): [dhd] ANDROID_VERSION = 11
03-27 09:02:52.675 I/KERNEL: [WLAN_RFKILL](  469): rockchip_wifi_get_oob_irq: Enter
03-27 09:02:52.675 W/KERNEL: [dhd] dhd_wlan_init_gpio(  469): WL_HOST_WAKE=-1, oob_irq=166, oob_irq_flags=0x4
03-27 09:02:52.675 W/KERNEL: [dhd] dhd_wlan_init_gpio(  469): WL_REG_ON=-1
03-27 09:02:52.675 E/KERNEL: (  469): [dhd] STATIC-MSG) dhd_static_buf_init : 101.10.361.24 (wlan=r892223-20220916-1)
03-27 09:02:52.675 E/KERNEL: (  469): [dhd] STATIC-MSG) dhd_init_wlan_mem : prealloc ok for index 0: 8137728(7947K)
03-27 09:02:52.675 W/KERNEL: [dhd] dhd_wifi_platform_load(  469): Enter
03-27 09:02:52.675 W/KERNEL: [dhd] dhdpcie_pci_probe(  469): no mutex held
03-27 09:02:52.675 W/KERNEL: [dhd] dhdpcie_pci_probe(  469): set mutex lock
03-27 09:02:52.675 W/KERNEL: [dhd] PCI_PROBE(  469): bus 41, slot 0,vendor 14E4, device 4475(good PCI location)
03-27 09:02:52.675 W/KERNEL: [dhd] dhdpcie_init(  469): found adapter info 'DHD generic adapter'
03-27 09:02:52.675 E/KERNEL: (  469): [dhd] STATIC-MSG) dhd_wlan_mem_prealloc : section 3, size 139264
03-27 09:02:52.675 W/KERNEL: (  469): [dhd] succeed to alloc static buf
03-27 09:02:52.675 E/KERNEL: (  469): [dhd] STATIC-MSG) dhd_wlan_mem_prealloc : section 4, size 0
03-27 09:02:52.675 I/KERNEL: pcieh 0004(  469): 41:00.0: enabling device (0000 -> 0002)
03-27 09:02:52.676 W/KERNEL: (  469): [dhd] Disable CTO
03-27 09:02:52.676 W/KERNEL: (  469): [dhd] ******** Perform FLR ********

//确认对应固件和config路径
03-27 09:02:52.761 W/KERNEL: [dhd] dhdpcie_bus_attach(  469): making DHD_BUS_DOWN
03-27 09:02:52.761 W/KERNEL: [dhd] dhdpcie_init(  469): rc_dev from dev->bus->self (1d87:3588) is 0000000000000000
03-27 09:02:52.761 W/KERNEL: [dhd] dhdpcie_init(  469): rc_ep_aspm_cap: 1 rc_ep_l1ss_cap: 1
03-27 09:02:52.761 W/KERNEL: [dhd] dhdpcie_request_irq(  469): INTx enabled, irq=143
03-27 09:02:52.761 W/KERNEL: [dhd] dhdpcie_bar1_window_switch_enab(  469): bar1_switch_enab=0 ramstart=0x170000 ramend=0x2fffff bar1_size=0x400000
03-27 09:02:52.761 W/KERNEL: [dhd] dhd_bus_download_firmware(  469): firmware path=/vendor/etc/firmware/fw_bcmdhd.bin, nvram path=/vendor/etc/firmware/nvram.txt
03-27 09:02:52.761 W/KERNEL: [dhd] dhdpcie_dump_resource(  469): BAR0(VA): 0x0000000000000000, BAR0(PA): 0x00000000f4200000, SIZE: 32768
03-27 09:02:52.761 W/KERNEL: [dhd] dhdpcie_dump_resource(  469): BAR1(VA): 0x0000000000000000, BAR1(PA): 0x00000000f4400000, SIZE: 4194304
03-27 09:02:52.761 W/KERNEL: [dhd] dhd_conf_set_path_params(  469): Final fw_path=/vendor/etc/firmware/fw_bcm4375b4_pcie_ag.bin
03-27 09:02:52.761 W/KERNEL: [dhd] dhd_conf_set_path_params(  469): Final nv_path=/vendor/etc/firmware/nvram.txt
03-27 09:02:52.761 W/KERNEL: [dhd] dhd_conf_set_path_params(  469): Final clm_path=/vendor/etc/firmware/clm_bcm4375b4_pcie_ag.blob
03-27 09:02:52.761 W/KERNEL: [dhd] dhd_conf_set_path_params(  469): Final conf_path=/vendor/etc/firmware/config.txt
03-27 09:02:52.761 W/KERNEL: [dhd] dhd_os_open_image1(  469): /vendor/etc/firmware/config.txt (176 bytes) open success
03-27 09:02:52.763 W/KERNEL: [dhd] dhdpcie_download_code_file(  469): download firmware /vendor/etc/firmware/fw_bcm4375b4_pcie_ag.bin
03-27 09:02:52.763 W/KERNEL: [dhd] dhd_os_open_image1(  469): /vendor/etc/firmware/fw_bcm4375b4_pcie_ag.bin (1068897 bytes) open success

03-27 09:02:52.883 W/KERNEL: [dhd] dhd_os_open_image1(  469): /vendor/etc/firmware/nvram.txt (10299 bytes) open success

03-27 09:02:52.910 W/KERNEL: [dhd] dhdpcie_bus_write_vars(  469): Download, Upload and compare of NVRAM succeeded.
03-27 09:02:52.910 W/KERNEL: [dhd] dhd_bus_aer_config(  469): Configure AER registers for EP
03-27 09:02:52.910 W/KERNEL: [dhd] dhd_bus_aer_config(  469): Configure AER registers for RC

//芯片模组加载成功后,先断点,后面wifi enable时候再上电
03-27 09:02:53.661 W/KERNEL: (  469): [dhd] Dongle Host Driver, version 101.10.361.25 (wlan=r892223-20220926-1)(20220929-1)
03-27 09:02:53.661 W/KERNEL: (  469): drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd compiled on Mar 27 2023 at 16:24:21
03-27 09:02:53.672 W/KERNEL: (  469): [dhd] Register interface [wlan0]  MAC: 50:41:1c:07:40:d8
03-27 09:02:53.672 W/KERNEL: [dhd] dhd_tcpack_suppress_set(  469): TCP ACK Suppress mode 3 -> mode 0
03-27 09:02:53.672 W/KERNEL: [dhd] dhd_tcpack_suppress_set(  469): TCPACK_INFO_MAXNUM=10, TCPDATA_INFO_MAXNUM=10
03-27 09:02:53.672 W/KERNEL: (  469): [dhd] [wlan0] wl_android_wifi_off : in g_wifi_on=1, on_failure=1
03-27 09:02:53.672 W/KERNEL: [dhd] dhd_rtt_deinit(  469): ENTER
03-27 09:02:53.672 W/KERNEL: [dhd] dhd_rtt_deinit(  469): EXIT, err = 0
03-27 09:02:53.672 W/KERNEL: [dhd] dhd_bus_devreset(  469): == Power OFF ==
03-27 09:02:53.673 W/KERNEL: [dhd] dhd_bus_stop(  469): making DHD_BUS_DOWN
03-27 09:02:53.673 W/KERNEL: [dhd] dhd_dpc_kill(  469): tasklet disabled
03-27 09:02:53.675 W/KERNEL: [dhd] dhd_bus_devreset(  469): making DHD_BUS_DOWN
03-27 09:02:53.675 W/KERNEL: [dhd] dhd_bus_devreset(  469): WLAN OFF Done
03-27 09:02:53.675 W/KERNEL: (  469): [dhd] wifi_platform_set_power = 0, delay: 0 msec
03-27 09:02:53.675 W/KERNEL: (  469): [dhd] ======== PULL WL_REG_ON(-1) LOW! ========
03-27 09:02:53.675 I/KERNEL: [WLAN_RFKILL](  469): rockchip_wifi_power: 0
03-27 09:02:53.675 I/KERNEL: [BT_RFKILL](  469): rfkill_get_bt_power_state: rfkill-bt driver has not Successful initialized
03-27 09:02:53.675 W/KERNEL: (  469): wifi power off

三、遇到问题

1、BT配置GPIO冲突
//这里GPIO0-22对应GPIO0_C6,对应硬件应该为GPIO0_D3
[2023/3/27 10:54:27] [    3.366091][    T1] rockchip-pinctrl pinctrl: pin gpio0-22 already requested by 4-0020; cannot claim for wireless-bluetooth
[2023/3/27 10:54:27] [    3.366097][    T1] rockchip-pinctrl pinctrl: pin-22 (wireless-bluetooth) status -22
[2023/3/27 10:54:27] [    3.366103][    T1] rockchip-pinctrl pinctrl: could not request pin 22 (gpio0-22) from group bt-reset-gpio  on device rockchip-pinctrl
[2023/3/27 10:54:27] [    3.366107][    T1] rfkill_bt wireless-bluetooth: Error applying setting, reverse things back
[2023/3/27 10:54:27] [    3.366122][    T1] rfkill_bt: probe of wireless-bluetooth failed with error -22

对应硬件原理图,将GPIO0_C6修改为GPIO0_D3。

cfliu@sw-eng-dten2:RKOverlay$ gd kernel-5.10/arch/arm64/boot/dts/rockchip/rk3588-ribeye_bar-evt2.dts
diff --git a/kernel-5.10/arch/arm64/boot/dts/rockchip/rk3588-ribeye_bar-evt2.dts b/kernel-5.10/arch/arm64/boot/dts/rockchip/rk3588-ribeye_bar-evt2.dts
index 55891f93..7dd442b4 100755
--- a/kernel-5.10/arch/arm64/boot/dts/rockchip/rk3588-ribeye_bar-evt2.dts
+++ b/kernel-5.10/arch/arm64/boot/dts/rockchip/rk3588-ribeye_bar-evt2.dts 
@@ -342,7 +343,7 @@
                pinctrl-names = "default", "rts_gpio";
                pinctrl-0 = <&uart9m0_rtsn>, <&bt_reset_gpio>, <&bt_wake_gpio>, <&bt_irq_gpio>;
                pinctrl-1 = <&uart9_gpios>;
-               BT,reset_gpio    = <&gpio0 RK_PC6 GPIO_ACTIVE_HIGH>;
+               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";
@@ -963,7 +964,7 @@
                };
 
                bt_reset_gpio: bt-reset-gpio {
-                       rockchip,pins = <0 RK_PC6 RK_FUNC_GPIO &pcfg_pull_none>;
+                       rockchip,pins = <0 RK_PD3 RK_FUNC_GPIO &pcfg_pull_none>;
                };
 
                bt_wake_gpio: bt-wake-gpio {
2、VCC3V3_PCIEWL_VBAT电路电压为0

需要将WIFI_POWER_EN对应的GPIO默认拉高,对应修改代码如下。最后确认VCC3V3_PCIEWL_VBAT为3.3V,VCCIO_WL为1.8V

diff --git a/kernel-5.10/arch/arm64/boot/dts/rockchip/rk3588-ribeye_bar-evt2.dts b/kernel-5.10/arch/arm64/boot/dts/rockchip/rk3588-ribeye_bar-evt2.dts
index 55891f93..fc9ed666 100755
--- a/kernel-5.10/arch/arm64/boot/dts/rockchip/rk3588-ribeye_bar-evt2.dts
+++ b/kernel-5.10/arch/arm64/boot/dts/rockchip/rk3588-ribeye_bar-evt2.dts
@@ -71,6 +71,7 @@
                mux-chip-en-gpios = <&gpio3 RK_PB2 GPIO_ACTIVE_HIGH>;
                hdmi-sw-pd1-gpios = <&gpio3 RK_PB1 GPIO_ACTIVE_HIGH>;
                gsensor-irq-gpios = <&gpio4 RK_PB3 GPIO_ACTIVE_HIGH>;
+               wifi-on-gpios = <&gpio3 RK_PA4 GPIO_ACTIVE_HIGH>;
                hwver = "BAR.EVT2";
        };
 
@@ -342,7 +343,7 @@
                pinctrl-names = "default", "rts_gpio";
                pinctrl-0 = <&uart9m0_rtsn>, <&bt_reset_gpio>, <&bt_wake_gpio>, <&bt_irq_gpio>;
                pinctrl-1 = <&uart9_gpios>;
-               BT,reset_gpio    = <&gpio0 RK_PC6 GPIO_ACTIVE_HIGH>;
+               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";
diff --git a/kernel-5.10/drivers/misc/dten_hw_conf_ribeye.c b/kernel-5.10/drivers/misc/dten_hw_conf_ribeye.c
index ddd9af3d..08da99f4 100755
--- a/kernel-5.10/drivers/misc/dten_hw_conf_ribeye.c
+++ b/kernel-5.10/drivers/misc/dten_hw_conf_ribeye.c
@@ -59,6 +59,7 @@ struct dten_hwctrl{
        struct gpio_desc *motor_en_gpio;
        struct gpio_desc *motor_ph_gpio;
        struct gpio_desc *gsensor_irq_gpio;
+       struct gpio_desc *wifi_on_gpios; //add by cfliu for wifi power
        unsigned long duty;
        unsigned long period;
        unsigned int motor_ctrl;
@@ -159,6 +160,14 @@ static void dten_bar_gpio_init(struct dten_hwctrl *hwctrl)
                dev_warn(hwctrl->dev, "Could not get gsensor_irq_gpio!\n");
                hwctrl->gsensor_irq_gpio = NULL;
        }
+
+       hwctrl->wifi_on_gpios = devm_gpiod_get_optional(hwctrl->dev,
+                                                        "wifi-on", GPIOD_OUT_HIGH);
+       if (IS_ERR(hwctrl->wifi_on_gpios)) {
+               dev_warn(hwctrl->dev, "Could not get wifi_on_gpios!\n");
+               hwctrl->wifi_on_gpios = NULL;
+       }
+
 }
3、调用getLinkLayerStats_1_5接口超时

经过验证是因为天线的问题,使用原装天线没有在出现该问题。

03-28 16:51:24.152 E/WifiThreadRunner(  817): WifiThreadRunner.call() timed out!
03-28 16:51:24.152 E/WifiThreadRunner(  817): java.lang.Throwable: Caller thread Stack trace:
03-28 16:51:24.152 E/WifiThreadRunner(  817): 	at com.android.server.wifi.WifiThreadRunner.call(WifiThreadRunner.java:85)
03-28 16:51:24.152 E/WifiThreadRunner(  817): 	at com.android.server.wifi.WifiServiceImpl.getPrimaryClientModeManagerBlockingThreadSafe(WifiServiceImpl.java:878)
03-28 16:51:24.152 E/WifiThreadRunner(  817): 	at com.android.server.wifi.WifiServiceImpl.getWifiEnabledState(WifiServiceImpl.java:1011)
03-28 16:51:24.152 E/WifiThreadRunner(  817): 	at android.net.wifi.IWifiManager$Stub.onTransact(IWifiManager.java:913)
03-28 16:51:24.152 E/WifiThreadRunner(  817): 	at android.os.Binder.execTransactInternal(Binder.java:1179)
03-28 16:51:24.152 E/WifiThreadRunner(  817): 	at android.os.Binder.execTransact(Binder.java:1143)
03-28 16:51:24.152 E/WifiThreadRunner(  817): WifiThreadRunner.call() timed out!
03-28 16:51:24.152 E/WifiThreadRunner(  817): java.lang.Throwable: Wifi thread Stack trace:
03-28 16:51:24.152 E/WifiThreadRunner(  817): 	at android.os.HwRemoteBinder.transact(Native Method)
03-28 16:51:24.152 E/WifiThreadRunner(  817): 	at com.android.wifi.x.android.hardware.wifi.V1_5.IWifiStaIface$Proxy.getLinkLayerStats_1_5(IWifiStaIface.java:970)
03-28 16:51:24.152 E/WifiThreadRunner(  817): 	at com.android.server.wifi.WifiVendorHal.getWifiLinkLayerStats_1_5_Internal(WifiVendorHal.java:1190)
03-28 16:51:24.152 E/WifiThreadRunner(  817): 	at com.android.server.wifi.WifiVendorHal.getWifiLinkLayerStats(WifiVendorHal.java:1127)
03-28 16:51:24.152 E/WifiThreadRunner(  817): 	at com.android.server.wifi.WifiNative.getWifiLinkLayerStats(WifiNative.java:3221)
03-28 16:51:24.152 E/WifiThreadRunner(  817): 	at com.android.server.wifi.ClientModeImpl.getWifiLinkLayerStats(ClientModeImpl.java:1210)
03-28 16:51:24.152 E/WifiThreadRunner(  817): 	at com.android.server.wifi.ClientModeImpl.updateLinkLayerStatsRssiSpeedFrequencyCapabilities(ClientModeImpl.java:2181)
03-28 16:51:24.152 E/WifiThreadRunner(  817): 	at com.android.server.wifi.ClientModeImpl.access$11900(ClientModeImpl.java:173)
03-28 16:51:24.152 E/WifiThreadRunner(  817): 	at com.android.server.wifi.ClientModeImpl$L2ConnectedState.updateLinkLayerStatsRssiDataStallScoreReport(ClientModeImpl.java:5209)
03-28 16:51:24.152 E/WifiThreadRunner(  817): 	at com.android.server.wifi.ClientModeImpl$L2ConnectedState.processMessage(ClientModeImpl.java:5046)
03-28 16:51:24.152 E/WifiThreadRunner(  817): 	at com.android.wifi.x.com.android.internal.util.StateMachine$SmHandler.processMsg(StateMachine.java:993)
03-28 16:51:24.152 E/WifiThreadRunner(  817): 	at com.android.wifi.x.com.android.internal.util.StateMachine$SmHandler.handleMessage(StateMachine.java:810)
03-28 16:51:24.152 E/WifiThreadRunner(  817): 	at android.os.Handler.dispatchMessage(Handler.java:106)
03-28 16:51:24.152 E/WifiThreadRunner(  817): 	at android.os.Looper.loopOnce(Looper.java:201)
03-28 16:51:24.152 E/WifiThreadRunner(  817): 	at android.os.Looper.loop(Looper.java:288)
03-28 16:51:24.152 E/WifiThreadRunner(  817): 	at android.os.HandlerThread.run(HandlerThread.java:67)
4、有板子开机pcie 共享地址读取失败

目前验证18个板子出现2个板子有问题,WIFI_POWER_EN对应的GPIO已经拉高,VCC3V3_PCIEWL_VBAT量为3.3V,VCCIO_WL量为1.8V。

//PCIE的获取芯片信息
01-01 00:00:02.505 I/KERNEL: pci 0004(  141): 41:00.0: [14e4:4475] type 00 class 0x028000
01-01 00:00:02.505 I/KERNEL: pci 0004(  141): 41:00.0: reg 0x10: [mem 0x00000000-0x0000ffff 64bit]
01-01 00:00:02.505 I/KERNEL: pci 0004(  141): 41:00.0: reg 0x18: [mem 0x00000000-0x003fffff 64bit]
01-01 00:00:02.505 I/KERNEL: pci 0004(  141): 41:00.0: supports D1 D2
01-01 00:00:02.505 I/KERNEL: pci 0004(  141): 41:00.0: PME# supported from D0 D1 D2 D3hot D3cold
01-01 00:00:02.525 I/KERNEL: pci_bus 0004(  141): 41: busn_res: [bus 41-4f] end is updated to 41
01-01 00:00:02.525 I/KERNEL: pci 0004(  141): 41:00.0: BAR 2: assigned [mem 0xf4400000-0xf47fffff 64bit]
01-01 00:00:02.525 I/KERNEL: pci 0004(  141): 41:00.0: BAR 0: assigned [mem 0xf4200000-0xf420ffff 64bit]
01-01 00:00:07.962 W/KERNEL: [dhd] PCI_PROBE(  460): bus 41, slot 0,vendor 14E4, device 4475(good PCI location)

//读取pcie共享地址失败
01-01 00:00:10.424 W/KERNEL: [dhd] dhdpcie_readshared(  460): address (0xf77f0880) of pciedev_shared invalid
01-01 00:00:10.424 W/KERNEL: [dhd] dhdpcie_readshared(  460): Waited 2000000 usec, dongle is not ready
01-01 00:00:10.424 W/KERNEL: [dhd] dhd_bus_init(  460): Shared area read failed
01-01 00:00:10.424 W/KERNEL: (  460): [dhd] dhd_bus_start, dhd_bus_init failed -1
01-01 00:00:10.424 W/KERNEL: [dhd] dhdpcie_init(  460): dhd_bus_start() failed
01-01 00:00:10.424 W/KERNEL: [dhd] dhdpcie_bus_remove_prep(  460): making DHD_BUS_DOWN
01-01 00:00:10.424 W/KERNEL: [dhd] dhd_detach(  460): making dhdpub up FALSE
01-01 00:00:10.424 W/KERNEL: [dhd] dhdpcie_oob_intr_unregister(  460): irq is not registered
01-01 00:00:10.424 W/KERNEL: [dhd] dhd_detach()(  460): thread:dhd_watchdog_thread:24d wait for terminate
01-01 00:00:10.424 W/KERNEL: [dhd] dhd_detach()(  460): thread:dhd_watchdog_thread:24d terminated OK
01-01 00:00:10.472 W/KERNEL: (  460): [dhd] dhd_flow_rings not initialized!
01-01 00:00:10.481 E/KERNEL: (  460): [dhd] STATIC-MSG) dhd_wlan_mem_prealloc : section 7, size 0
01-01 00:00:10.481 W/KERNEL: [dhd] dhdpcie_pci_probe(  460): PCIe Enumeration failed
01-01 00:00:10.481 W/KERNEL: [dhd] dhdpcie_pci_probe(  460): mutex is released.
01-01 00:00:10.482 W/KERNEL: [dhd] dhdpcie_bus_register(  460): dhdpcie initialize failed.
01-01 00:00:10.482 W/KERNEL: [dhd] dhd_wifi_platform_load_pcie(  460): pcie_register_driver failed
01-01 00:00:10.482 W/KERNEL: (  460): [dhd] unregister wifi platform drivers
01-01 00:00:10.482 W/KERNEL: (  460): [dhd] wifi_platform_bus_enumerate device present 0
01-01 00:00:10.482 W/KERNEL: (  460): [dhd] ======== Card detection to remove PCIE card! ========
01-01 00:00:10.482 E/KERNEL: (  460): [dhd] STATIC-MSG) dhd_static_buf_exit : Enter
01-01 00:00:10.483 W/KERNEL: [dhd] dhd_wlan_deinit_gpio(  460): gpio_free(WL_HOST_WAKE 0)
01-01 00:00:10.483 W/KERNEL: [dhd] _dhd_module_init(  460): Failed to load the driver, try cnt 0
01-01 00:00:10.484 W/KERNEL: [dhd] _dhd_module_init(  460): Failed to load driver max retry reached**
01-01 00:00:10.484 W/KERNEL: [dhd] _dhd_module_init(  460): Exit err=-1
5、GPIO冲突导致WiFi没有上电

对比验证发现是4月4日的一个修改导致,根据该修改怀疑是GPIO冲突导致。

//PCI 异常can't change power state from D3hot to D0 
04-09 02:28:40.339 E/KERNEL: pcieh 0004(  475): 41:00.0: of_irq_parse_pci: failed with rc=134
04-09 02:28:38.796 E/[email protected](  475): Wifi driver is not ready.: No such file or directory
04-09 02:28:40.339 W/KERNEL: [dhd] dhdpcie_pci_probe(  475): no mutex held
04-09 02:28:40.339 W/KERNEL: [dhd] dhdpcie_pci_probe(  475): set mutex lock
04-09 02:28:40.339 W/KERNEL: [dhd] PCI_PROBE(  475): bus 41, slot 0,vendor 14E4, device 4475(good PCI location)
04-09 02:28:40.339 W/KERNEL: [dhd] dhdpcie_init(  475): found adapter info 'DHD generic adapter'
04-09 02:28:40.339 E/KERNEL: (  475): [dhd] STATIC-MSG) dhd_wlan_mem_prealloc : section 3, size 139264
04-09 02:28:40.339 W/KERNEL: (  475): [dhd] succeed to alloc static buf
04-09 02:28:40.339 E/KERNEL: (  475): [dhd] STATIC-MSG) dhd_wlan_mem_prealloc : section 4, size 0
04-09 02:28:40.339 E/KERNEL: pcieh 0004(  475): 41:00.0: can't change power state from D3hot to D0 (config space inaccessible)
04-09 02:28:40.339 W/KERNEL: (  475): [dhd] Disable CTO
04-09 02:28:40.339 W/KERNEL: [dhd] dhdpcie_dongle_attach(  475): failed to read PCI configuration space!
04-09 02:28:40.339 W/KERNEL: (  475): [dhd] status_cmd(0x4)=0xffffffff, pmcsr(0x4c)=0xffffffff base_addr0(0x10)=0xffffffff base_addr1(0x18)=0xffffffff linkctl(0xbc)=0xffffffff l1ssctrl(0x248)=0xffffffff devctl(0xb4)=0xffffffff devctl2(0xd4)=0xffffffff
04-09 02:28:40.339 W/KERNEL: [dhd] dhdpcie_bus_attach(  475): dhdpcie_probe_attach failed
04-09 02:28:40.339 W/KERNEL: [dhd] dhdpcie_init(  475): dhdpcie_bus_attach() failed
04-09 02:28:40.339 W/KERNEL: [dhd] dhdpcie_pci_probe(  475): PCIe Enumeration failed
04-09 02:28:40.339 W/KERNEL: [dhd] dhdpcie_pci_probe(  475): mutex is released.
04-09 02:28:40.340 W/KERNEL: [dhd] dhdpcie_bus_register(  475): dhdpcie initialize failed.
04-09 02:28:40.340 W/KERNEL: [dhd] dhd_wifi_platform_load_pcie(  475): pcie_register_driver failed
04-09 02:28:40.340 W/KERNEL: (  475): [dhd] unregister wifi platform drivers
04-09 02:28:40.340 W/KERNEL: (  475): [dhd] wifi_platform_bus_enumerate device present 0
04-09 02:28:40.340 W/KERNEL: (  475): [dhd] ======== Card detection to remove PCIE card! ========
04-09 02:28:40.340 E/KERNEL: (  475): [dhd] STATIC-MSG) dhd_static_buf_exit : Enter
04-09 02:28:40.340 W/KERNEL: [dhd] dhd_wlan_deinit_gpio(  475): gpio_free(WL_HOST_WAKE 0)
04-09 02:28:40.340 W/KERNEL: [dhd] _dhd_module_init(  475): Failed to load the driver, try cnt 0
04-09 02:28:40.340 W/KERNEL: [dhd] _dhd_module_init(  475): Failed to load driver max retry reached**

对比正常开机和异常开的的GPIO状态: adb shell cat /sys/kernel/debug/gpio

gpiochip0: GPIOs 0-31, parent: platform/fd8a0000.gpio, gpio0:
 gpio-22  (                    |typec-insert-det    ) in  lo
 gpio-27  (                    |bt_default_reset    ) out lo

gpiochip1: GPIOs 32-63, parent: platform/fec20000.gpio, gpio1:
 gpio-33  (                    |bt_default_wake     ) out lo
 gpio-43  (                    |hdmirx-det          ) in  hi ACTIVE LOW
 gpio-54  (                    |apmen_gpio          ) out hi
 gpio-61  (                    |micen_gpio          ) out hi

gpiochip2: GPIOs 64-95, parent: platform/fec30000.gpio, gpio2:
 gpio-71  (                    |reset               ) out hi
 gpio-72  (                    |motor-opt-out1      ) in  hi
 gpio-73  (                    |motor-opt-out2      ) in  hi
 gpio-75  (                    |vcc12v-dcin         ) out hi
 gpio-78  (                    |motor-en            ) out lo
 gpio-81  (                    |mmw-poweren         ) out hi

gpiochip3: GPIOs 96-127, parent: platform/fec40000.gpio, gpio3:
 gpio-96  (                    |typec-host-det      ) in  lo
 gpio-100 (                    |wifi-on             ) out lo
 gpio-103 (                    |hub-rst             ) out lo
 gpio-105 (                    |hdmi-sw-pd          ) out hi
 gpio-106 (                    |mux-chip-en         ) out hi
 gpio-109 (                    |typec-cc-det        ) in  lo
 gpio-110 (                    |typec-mux-reset     ) out hi
 gpio-111 (                    |hdmi-port-sw        ) out lo
 gpio-115 (                    |dp-pd               ) out hi
 gpio-125 (                    |power-led           ) out lo

gpiochip4: GPIOs 128-159, parent: platform/fec50000.gpio, gpio4:
 gpio-130 (                    |reset               ) out hi
 gpio-131 (                    |motor-poweren       ) out lo
 gpio-132 (                    |typec-reset         ) out hi
 gpio-134 (                    |sbu1-dc             ) out lo
 gpio-135 (                    |sbu2-dc             ) out hi
 gpio-136 (                    |vcc5v0-host         ) out hi
 gpio-138 (                    |enable              ) out hi
 gpio-139 (                    |gsensor-irq         ) in  hi
 gpio-141 (                    |typec-cc-connect-ok ) in  lo
 gpio-142 (                    |usbcamera-power     ) out lo
 gpio-148 (                    |bt_default_rts      ) out hi
 gpio-150 (                    |motor-ph            ) out lo
 gpio-153 (                    |buzzer_gain0        ) in  lo
 gpio-154 (                    |buzzer_en           ) out lo
 gpio-155 (                    |buzzer_gain1        ) out lo

gpiochip5: GPIOs 509-511, parent: platform/rk806-pinctrl.6.auto, rk806-gpio, can sleep:

正常Bring Up的gpio状态:

gpiochip0: GPIOs 0-31, parent: platform/fd8a0000.gpio, gpio0:
 gpio-0   (                    |bt_default_wake_host) in  lo
 gpio-22  (                    |typec-insert-det    ) in  lo
 gpio-27  (                    |bt_default_reset    ) out hi

gpiochip1: GPIOs 32-63, parent: platform/fec20000.gpio, gpio1:
 gpio-33  (                    |bt_default_wake     ) out lo
 gpio-43  (                    |hdmirx-det          ) in  hi ACTIVE LOW
 gpio-54  (                    |apmen_gpio          ) out hi
 gpio-61  (                    |micen_gpio          ) out hi

gpiochip2: GPIOs 64-95, parent: platform/fec30000.gpio, gpio2:
 gpio-71  (                    |reset               ) out hi
 gpio-72  (                    |motor-opt-out1      ) in  hi
 gpio-73  (                    |motor-opt-out2      ) in  hi
 gpio-74  (                    |mmw-int             ) in  hi
 gpio-75  (                    |vcc12v-dcin         ) out hi
 gpio-78  (                    |motor-en            ) out lo
 gpio-81  (                    |mmw-poweren         ) out lo

gpiochip3: GPIOs 96-127, parent: platform/fec40000.gpio, gpio3:
 gpio-96  (                    |typec-host-det      ) in  lo
 gpio-100 (                    |wifi-on             ) out hi
 gpio-103 (                    |hub-rst             ) out lo
 gpio-105 (                    |hdmi-sw-pd          ) out hi
 gpio-106 (                    |mux-chip-en         ) out hi
 gpio-109 (                    |typec-cc-det        ) in  lo
 gpio-110 (                    |typec-mux-reset     ) out hi
 gpio-111 (                    |hdmi-port-sw        ) out lo
 gpio-115 (                    |dp-pd               ) out hi
 gpio-125 (                    |power-led           ) out lo

gpiochip4: GPIOs 128-159, parent: platform/fec50000.gpio, gpio4:
 gpio-130 (                    |reset               ) out hi
 gpio-131 (                    |motor-poweren       ) out lo
 gpio-132 (                    |typec-reset         ) out hi
 gpio-135 (                    |vcc5v0-usb20-host   ) out hi
 gpio-136 (                    |vcc5v0-host         ) out hi
 gpio-138 (                    |enable              ) out hi
 gpio-139 (                    |gsensor-irq         ) in  hi
 gpio-141 (                    |typec-cc-connect-ok ) in  lo
 gpio-142 (                    |usbcamera-power     ) out lo
 gpio-148 (                    |bt_default_rts      ) out lo
 gpio-150 (                    |motor-ph            ) out lo
 gpio-153 (                    |buzzer_gain0        ) in  lo
 gpio-154 (                    |buzzer_en           ) out lo
 gpio-155 (                    |buzzer_gain1        ) out lo

发现异常时候gpio-100(wifi-on)没有拉高,该GPIO是GPIO3 A4,而该GPIO被I2S3_SDI占用。
修改方案如下:

diff --git a/kernel-5.10/arch/arm64/boot/dts/rockchip/rk3588-ribeye_bar-evt2.dts b/kernel-5.10/arch/arm64/boot/dts/rockchip/rk3588-ribeye_bar-evt2.dts
index e9c0a77a..6bd78072 100755
--- a/kernel-5.10/arch/arm64/boot/dts/rockchip/rk3588-ribeye_bar-evt2.dts
+++ b/kernel-5.10/arch/arm64/boot/dts/rockchip/rk3588-ribeye_bar-evt2.dts
@@ -846,7 +846,6 @@
         rockchip,bclk-fs = <32>;
                pinctrl-0 = <&i2s3_lrck
                             &i2s3_sclk
-                            &i2s3_sdi
                             &i2s3_sdo>;
 };
//kernel-5.10/arch/arm64/boot/dts/rockchip/rk3588s-pinctrl.dtsi
/omit-if-no-ref/
		//i2s3_sdi: i2s3-sdi {
		//	rockchip,pins =
		//		/* i2s3_sdi */
		//		<3 RK_PA4 3 &pcfg_pull_none>;
		//};

image.png

猜你喜欢

转载自blog.csdn.net/franc521/article/details/130103928
今日推荐