Rockchip Android13 x3588蓝牙wifi/bt调试心得

x3588的wifi/bt使用的是外挂双模模块,根据数据通信接口的差异分为PCIE和SDIO两种。

x3588使用的是SDIO接口双模模块:AP6398S。

DTS参考配置:

参考rockchip android13: rk3588-x3588-sdk.dts

  • 蓝牙配置:

wireless_bluetooth: wireless-bluetooth {
        compatible = "bluetooth-platdata";
        clocks = <&hym8563>;  // 外部时钟
        clock-names = "ext_clock"; 
        uart_rts_gpios = <&gpio4 RK_PC4 GPIO_ACTIVE_LOW>; //uart的rts脚
        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,wake_gpio     = <&gpio0 RK_PC5 GPIO_ACTIVE_HIGH>; //CPU唤醒蓝牙模块的GPIO
        BT,wake_host_irq = <&gpio0 RK_PA0 GPIO_ACTIVE_HIGH>; //蓝牙模块唤醒CPU的GPIO
        status = "okay";
 };
  • uart的rts脚:UART_CTS_N

  • 复位脚:BT_REG_ON->BT_REG_ON_S->BT_REG_ON_H

  • CPU唤醒蓝牙GPIO:脚:BT_WAKE

  • 蓝牙唤醒CPU模块的GPIO:脚BT_HOST_WAKE

  • WIFI配置:

wireless_wlan: wireless-wlan {
        compatible = "wlan-platdata";
        wifi_chip_type = "ap6398s";  // 模块名称
        pinctrl-names = "default";
        pinctrl-0 = <&wifi_host_wake_irq>;  ///<&wifi_poweren_gpio>;
        WIFI,host_wake_irq = <&gpio0 RK_PB2 GPIO_ACTIVE_HIGH>; // wifi模块唤醒CPU
        WIFI,poweren_gpio = <&gpio0 RK_PC4 GPIO_ACTIVE_HIGH>;  // 控制wifi模块电源
        status = "okay";
};
  • wifi唤醒CPU:脚:WL_HOST_WAKE

  • 控制wifi模块电源:脚WL_REG_ON

  • SDIO配置:

&sdio {
    max-frequency = <150000000>;
    no-sd;
    no-mmc;
    bus-width = <4>;
    disable-wp;
    cap-sd-highspeed;
    cap-sdio-irq;
    keep-power-in-suspend;
    mmc-pwrseq = <&sdio_pwrseq>;
    non-removable;
    pinctrl-names = "default";
    pinctrl-0 = <&sdiom0_pins>;
    sd-uhs-sdr104;
    status = "okay";
};

驱动软件配置:

  • 确认defconfig是将wifi驱动编译成ko modules的配置。

上面配置好后编译内核时会自动编译wifi ko文件。

  • 编译android的时候会自动把ko文件和wifi固件编译到vendor.img,存放在vendor/lib/modules目录下。

vendor/rockchip/common/wifi/wifi.mk

WIFI_KO_FILES := $(shell find $(TOPDIR)$(PRODUCT_KERNEL_PATH)/drivers/net/wireless/rockchip_wlan -name "*.ko" -type f)
  
BOARD_VENDOR_KERNEL_MODULES += \
        $(foreach file, $(WIFI_KO_FILES), $(file))

WifiFirmwareFile := $(shell ls $(CUR_PATH)/wifi/firmware)
PRODUCT_COPY_FILES += \
        $(foreach file, $(WifiFirmwareFile), $(CUR_PATH)/wifi/firmware/$(file):$(TARGET_COPY_OUT_VENDOR)/etc/firmware/$(file))
~                                                                                                                              

这个脚本有两个功能:

  1. 把内核的ko文件(正基模块:bcmdhb.ko)安装到vendor/lib/modules目录:

  1. 把vendor/rockchip/common/wifi/firmware/目录下的蓝牙固件文件安装到固件的vendor/etc/firmware/目录下.

所以要把蓝牙模块的固件放在此目录下编译

  • wifi芯片识别流程:

  1. 开机对wifi模块上电,并自动进行扫描sdio操作。

  1. 系统打开wifi后,分别对系统sys/bus/sdio(sdio wifi)下的uevent进行读取,

软件会根据读取的pid和vid识别蓝牙芯片模块。

查看pid,vid:

rk3588_t:/sys/bus/sdio/devices/mmc0:0001:1 # cat uevent
DRIVER=bcmsdh_sdmmc
SDIO_CLASS=00
SDIO_ID=02D0:AAE8   // pid(02d0), vid(aae8)
SDIO_REVISION=0.0
MODALIAS=sdio:c00v02D0dAAE8
rk3588_t:/sys/bus/sdio/devices/mmc0:0001:1 #
  1. 根据wifi/bt芯片vid和pid加载对应的ko和蓝牙驱动:

代码加载位置:frameworks/opt/net/wifi/libwifi_hal:

在配置表中supported_wifi_devices[]和module_list[]加上我们的蓝牙模块名称,此名称可以板子上贴片信息:AP6275S,pid:vid(这里"02d0:aae8")一定对应正确。通过/sys/bus/sdio/devices/mmc0:0001:1 # cat uevent查看。

hardware/broadcom/libbt下的修改配置:

注意:对照硬件图修改蓝牙模块用的uart串口,sdk默认是ttyS8

我们芯片是串口9,所以要改成ttyS9。

device/rockchip/rk3588/rk3588_t/BoardConfig.mk:

4.识别到wifi类型后加载不同的wpa_supplicant参数启动wifi。

核心代码目录:

android /frameworks/opt/net/wifi

kernel/net/rfkill/rfkill-wlan.c

hardware/broadcom

external/wpa_supplicant_8/wpa_supplicant/main.c

  • 参考:

https://blog.csdn.net/weixin_43245753/article/details/123999080

RKDocs/android/wifi/Rockchip_Introduction_WIFI_Configuration_CN&EN.pdf

猜你喜欢

转载自blog.csdn.net/zhoudidong/article/details/129763290