平台: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>;
//};