android11-适配rtl8821cu-wifibluetooth

发布时间:2026/10/28 9:27:00
android11-适配rtl8821cu-wifibluetooth

rtl8821cu-wifi&bluetooth驱动链接见上方

适配rtl8821cu wifi

1. 修改设备树,将默认板载wifi芯片节点sdio_pwrseq和sdmmc2注释掉,添加wireless_wlan节点
diff --git a/arch/arm64/boot/dts/rockchip/OK3568-C-common.dtsi b/arch/arm64/boot/dts/rockchip/OK3568-C-common.dtsi index 31ffd6024..ee36adb40 100644 --- a/arch/arm64/boot/dts/rockchip/OK3568-C-common.dtsi +++ b/arch/arm64/boot/dts/rockchip/OK3568-C-common.dtsi @@ -334,7 +334,7 @@ regulator-off-in-suspend; }; }; - +/* sdio_pwrseq: sdio-pwrseq { compatible = "mmc-pwrseq-simple"; clocks = <&rk809 1>; @@ -342,16 +342,10 @@ pinctrl-names = "default"; pinctrl-0 = <&wifi_enable_h>; - /* - * On the module itself this is one of these (depending - * on the actual card populated): - * - SDIO_RESET_L_WL_REG_ON - * - PDN (power down when low) - */ post-power-on-delay-ms = <200>; reset-gpios = <&gpio3 RK_PD4 GPIO_ACTIVE_LOW>; }; - +*/ vcc2v5_sys: vcc2v5-ddr { compatible = "regulator-fixed"; regulator-name = "vcc2v5-sys"; @@ -553,6 +547,14 @@ >; default-brightness-level = <200>; }; + + wireless_wlan: wireless-wlan { + compatible = "wlan-platdata"; + rockchip,grf = <&grf>; + wifi_chip_type = "RTL8821CU"; //rtl8821cu + WIFI,vbat_gpio = <&gpio3 RK_PA6 GPIO_ACTIVE_LOW>; //电源引脚 + status = "okay"; + }; }; &reserved_memory { @@ -826,7 +828,7 @@ }; }; }; - +/* &sdmmc2 { max-frequency = <150000000>; supports-sdio; @@ -842,7 +844,7 @@ sd-uhs-sdr104; status = "okay"; }; - +*/ &uart8 { status = "okay"; pinctrl-names = "default";
2. 编译驱动成ko模块,将板载wifi芯片驱动注释掉
diff --git a/arch/arm64/configs/OK3568-C-android_defconfig b/arch/arm64/configs/OK3568-C-android_defconfig index 1d2438c84..2b3ab11c6 100644 --- a/arch/arm64/configs/OK3568-C-android_defconfig +++ b/arch/arm64/configs/OK3568-C-android_defconfig @@ -419,10 +419,12 @@ CONFIG_USB_SIERRA_NET=y # CONFIG_WLAN_VENDOR_QUANTENNA is not set CONFIG_WL_ROCKCHIP=y CONFIG_WIFI_BUILD_MODULE=y -CONFIG_MVL88W8987=m +# CONFIG_MVL88W8987=m # CONFIG_MXMWIFIEX is not set CONFIG_RTL8723CS=m -CONFIG_RTL8821CS=m +# CONFIG_RTL8821CS=m +CONFIG_BT_RTKBTUSB=y +CONFIG_RTL8821CU=m CONFIG_RTL8822BS=m CONFIG_LTE=y CONFIG_LTE_RM310=y
3. android层修改
diff --git a/frameworks/opt/net/wifi/libwifi_hal/rk_wifi_ctrl.cpp b/frameworks/opt/net/wifi/libwifi_hal/rk_wifi_ctrl.cpp index 8e2dc3a3db..a99a1552e0 100755 --- a/frameworks/opt/net/wifi/libwifi_hal/rk_wifi_ctrl.cpp +++ b/frameworks/opt/net/wifi/libwifi_hal/rk_wifi_ctrl.cpp @@ -61,6 +61,7 @@ static wifi_device supported_wifi_devices[] = { {"RTL8192DU", "0bda:8194"}, {"RTL8812AU", "0bda:8812"}, {"RTL8821CS", "024c:c821"}, + {"RTL8821CU", "0bda:c820"}, {"RTL8822CU", "0bda:c82c"}, {"RTL8822CS", "024c:c822"}, {"SSV6051", "3030:3030"}, @@ -153,7 +154,7 @@ int check_wifi_chip_type_string(char *type) PLOG(DEBUG) << "PCIE WIFI identify sucess"; else { PLOG(DEBUG) << "maybe there is no usb wifi or sdio or pcie wifi,set default wifi module Brocom APXXX"; - strcpy(recoginze_wifi_chip, "APXXX"); + strcpy(recoginze_wifi_chip, "RTL8821CU"); identify_sucess = 1 ; } } diff --git a/frameworks/opt/net/wifi/libwifi_hal/wifi_hal_common.cpp b/frameworks/opt/net/wifi/libwifi_hal/wifi_hal_common.cpp index 69f3ed3e27..67082398ee 100755 --- a/frameworks/opt/net/wifi/libwifi_hal/wifi_hal_common.cpp +++ b/frameworks/opt/net/wifi/libwifi_hal/wifi_hal_common.cpp @@ -47,6 +47,7 @@ extern "C" int delete_module(const char *, unsigned int); #define RTL8812AU_DRIVER_MODULE_PATH WIFI_MODULE_PATH"8812au.ko" #define RTL8822BE_DRIVER_MODULE_PATH WIFI_MODULE_PATH"8822be.ko" #define RTL8821CS_DRIVER_MODULE_PATH WIFI_MODULE_PATH"8821cs.ko" +#define RTL8821CU_DRIVER_MODULE_PATH WIFI_MODULE_PATH"8821cu.ko" #define RTL8822CU_DRIVER_MODULE_PATH WIFI_MODULE_PATH"8822cu.ko" #define RTL8822CS_DRIVER_MODULE_PATH WIFI_MODULE_PATH"8822cs.ko" #define SSV6051_DRIVER_MODULE_PATH WIFI_MODULE_PATH"ssv6051.ko" @@ -76,6 +77,7 @@ extern "C" int delete_module(const char *, unsigned int); #define RTL8812AU_DRIVER_MODULE_NAME "8812au" #define RTL8822BE_DRIVER_MODULE_NAME "8822be" #define RTL8821CS_DRIVER_MODULE_NAME "8821cs" +#define RTL8821CU_DRIVER_MODULE_NAME "8821cu" #define RTL8822CU_DRIVER_MODULE_NAME "8822cu" #define RTL8822CS_DRIVER_MODULE_NAME "8822cs" #define SSV6051_DRIVER_MODULE_NAME "ssv6051" @@ -158,6 +160,7 @@ wifi_ko_file_name module_list[] = {"RTL8189FS", RTL8189FS_DRIVER_MODULE_NAME, RTL8189FS_DRIVER_MODULE_PATH, UNKKOWN_DRIVER_MODULE_ARG}, {"RTL8822BE", RTL8822BE_DRIVER_MODULE_NAME, RTL8822BE_DRIVER_MODULE_PATH, UNKKOWN_DRIVER_MODULE_ARG}, {"RTL8821CS", RTL8821CS_DRIVER_MODULE_NAME, RTL8821CS_DRIVER_MODULE_PATH, UNKKOWN_DRIVER_MODULE_ARG}, + {"RTL8821CU", RTL8821CU_DRIVER_MODULE_NAME, RTL8821CU_DRIVER_MODULE_PATH, UNKKOWN_DRIVER_MODULE_ARG}, {"RTL8822CU", RTL8822CU_DRIVER_MODULE_NAME, RTL8822CU_DRIVER_MODULE_PATH, UNKKOWN_DRIVER_MODULE_ARG}, {"RTL8822CS", RTL8822CS_DRIVER_MODULE_NAME, RTL8822CS_DRIVER_MODULE_PATH, UNKKOWN_DRIVER_MODULE_ARG}, {"SSV6051", SSV6051_DRIVER_MODULE_NAME, SSV6051_DRIVER_MODULE_PATH, SSV6051_DRIVER_MODULE_ARG}, @@ -353,7 +356,7 @@ int wifi_load_driver() { char* wifi_ko_path = NULL ; char* wifi_ko_arg =NULL; int i = 0; - int count = 100; + //int count = 100; if (is_wifi_driver_loaded()) { return 0; } @@ -378,6 +381,9 @@ int wifi_load_driver() { } if (strstr(wifi_ko_path, CM358_DRIVER_MODULE_NAME)) { insmod(MLAN_DRIVER_MODULE_PATH, ""); + } + if (strstr(wifi_ko_path, RTL8821CU_DRIVER_MODULE_NAME)) { + insmod(RTL8821CU_DRIVER_MODULE_PATH, ""); } if (insmod(wifi_ko_path, wifi_ko_arg) < 0) { @@ -392,12 +398,12 @@ int wifi_load_driver() { if (wifi_change_driver_state(WIFI_DRIVER_STATE_ON) < 0) return -1; #endif - while (count-- > 0) { + while (1) { if (is_wifi_driver_loaded()) { property_set(DRIVER_PROP_NAME, "ok"); return 0; } - usleep(200000); + usleep(1000000); } property_set(DRIVER_PROP_NAME, "timeout"); return -1; @@ -467,10 +473,11 @@ int wifi_change_fw_path(const char *fwpath) { int len; int fd; int ret = 0; - + + return ret; if (wifi_type[0] == 0) check_wifi_chip_type_string(wifi_type); - if (0 != strncmp(wifi_type, "AP", 2)) return ret; + if (0 != strncmp(wifi_type, "RTL", 3)) return ret; if (!fwpath) return ret; fd = TEMP_FAILURE_RETRY(open(WIFI_DRIVER_FW_PATH_PARAM, O_WRONLY)); if (fd < 0) {

适配rtl8821cu蓝牙

1. 驱动源码见资源链接
2. android层修改
diff --git a/device/rockchip/common/init.connectivity.rc b/device/rockchip/common/init.connectivity.rc index 1a345f009c..35c97ae115 100755 --- a/device/rockchip/common/init.connectivity.rc +++ b/device/rockchip/common/init.connectivity.rc @@ -8,6 +8,7 @@ on zygote-start chown bluetooth net_bt /proc/bluetooth/sleep/lpm chown bluetooth net_bt /proc/bluetooth/sleep/btwrite + insmod /vendor/lib/modules/rtk_btusb.ko chmod 0660 /dev/rtk_btusb chown bluetooth net_bt /dev/rtk_btusb chmod 0660 /dev/rtkbt_dev diff --git a/device/rockchip/common/sepolicy/vendor/file_contexts b/device/rockchip/common/sepolicy/vendor/file_contexts index df2a46abdc..ea5db7f235 100644 --- a/device/rockchip/common/sepolicy/vendor/file_contexts +++ b/device/rockchip/common/sepolicy/vendor/file_contexts @@ -204,6 +204,7 @@ /sys/devices/virtual/power_supply(/.*)? u:object_r:sysfs_power:s0 /dev/rtkbt_dev u:object_r:rtkbt_device:s0 +/dev/rtk_btusb u:object_r:rtkbt_device:s0 #weaver hal /vendor/bin/hw/android\.hardware\.weaver@1\.0-service u:object_r:weaver-hal-1-0_exec:s0 diff --git a/device/rockchip/common/wifi_bt_common.mk b/device/rockchip/common/wifi_bt_common.mk index d446b9cb3a..92f2ef90e4 100644 --- a/device/rockchip/common/wifi_bt_common.mk +++ b/device/rockchip/common/wifi_bt_common.mk @@ -20,7 +20,7 @@ endif # bluetooth support ifeq ($(strip $(BOARD_CONNECTIVITY_VENDOR)), Broadcom) BOARD_HAVE_BLUETOOTH := true -BOARD_HAVE_BLUETOOTH_BCM := true +BOARD_HAVE_BLUETOOTH_BCM := false BOARD_BLUETOOTH_BDROID_BUILDCFG_INCLUDE_DIR ?= device/rockchip/$(TARGET_BOARD_PLATFORM)/bluetooth ifeq ($(strip $(PRODUCT_BUILD_MODULE)), px5car) @@ -40,7 +40,7 @@ endif BOARD_HAVE_BLUETOOTH_RTK := true BOARD_CONNECTIVITY_VENDOR:= nxp -BOARD_HAVE_BLUETOOTH_NXP := true +BOARD_HAVE_BLUETOOTH_NXP := false BOARD_WLAN_DEVICE := nxp ifeq ($(strip $(BOARD_CONNECTIVITY_VENDOR)), nxp) BOARD_HAVE_BLUETOOTH_NXP := true diff --git a/device/rockchip/rk356x/bluetooth/bdroid_buildcfg.h b/device/rockchip/rk356x/bluetooth/bdroid_buildcfg.h index a3d1e28900..e9d183d9d6 100644 --- a/device/rockchip/rk356x/bluetooth/bdroid_buildcfg.h +++ b/device/rockchip/rk356x/bluetooth/bdroid_buildcfg.h @@ -17,7 +17,7 @@ #ifndef _BDROID_BUILDCFG_H #define _BDROID_BUILDCFG_H -#define BTM_DEF_LOCAL_NAME "rk3566" +#define BTM_DEF_LOCAL_NAME "rk3568" #define BTA_DM_COD {0x1A, 0x01, 0x10} #define BLE_PRIVACY_SPT FALSE diff --git a/hardware/realtek/rtkbt/code/libbt-vendor/src/bt_vendor_rtk.c b/hardware/realtek/rtkbt/code/libbt-vendor/src/bt_vendor_rtk.c index b14a297d41..16ab8c4594 100755 --- a/hardware/realtek/rtkbt/code/libbt-vendor/src/bt_vendor_rtk.c +++ b/hardware/realtek/rtkbt/code/libbt-vendor/src/bt_vendor_rtk.c @@ -255,7 +255,7 @@ static void load_rtkbt_conf() FILE *fp = fopen(RTKBT_CONF_FILE, "rt"); if (!fp) { ALOGE("%s unable to open file '%s': %s", __func__, RTKBT_CONF_FILE, strerror(errno)); - strcpy(rtkbt_device_node,"/dev/rtkbt_dev"); + strcpy(rtkbt_device_node,"/dev/rtk_btusb"); return; } @@ -272,7 +272,7 @@ static void load_rtkbt_conf() split = strchr(line_ptr, '='); if (!split) { ALOGE("%s no key/value separator found on line %d.", __func__, line_num); - strcpy(rtkbt_device_node,"/dev/rtkbt_dev"); + strcpy(rtkbt_device_node,"/dev/rtk_btusb"); fclose(fp); return; } @@ -289,7 +289,7 @@ static void load_rtkbt_conf() if(rtkbt_device_node[0]=='?'){ /*1.Scan_Usb_Device*/ if(Scan_Usb_Devices_For_RTK(USB_DEVICE_DIR) == 0x01) { - strcpy(rtkbt_device_node,"/dev/rtkbt_dev"); + strcpy(rtkbt_device_node,"/dev/rtk_btusb"); } else{ int i = 0; @@ -309,18 +309,22 @@ static void load_rtkbt_conf() rtkbt_transtype |= RTKBT_TRANS_H4; } } - else if(strcmp(rtkbt_device_node, "/dev/rtkbt_dev")) { + else if(strcmp(rtkbt_device_node, "/dev/rtk_btusb")) { //default use h5 rtkbt_transtype |= RTKBT_TRANS_H5; } - if(strcmp(rtkbt_device_node, "/dev/rtkbt_dev")) { + if(strcmp(rtkbt_device_node, "/dev/rtk_btusb")) { rtkbt_transtype |= RTKBT_TRANS_UART; } else { rtkbt_transtype |= RTKBT_TRANS_USB; rtkbt_transtype |= RTKBT_TRANS_H4; } + if(!strcmp(rtkbt_device_node, "/dev/rtk_btusb")) { + rtkbt_transtype |= RTKBT_TRANS_USB; + rtkbt_transtype |= RTKBT_TRANS_H4; + } } static void byte_reverse(unsigned char* data, int len) diff --git a/hardware/realtek/rtkbt/rtkbt.mk b/hardware/realtek/rtkbt/rtkbt.mk index 620a0f298a..68b9a93400 100755 --- a/hardware/realtek/rtkbt/rtkbt.mk +++ b/hardware/realtek/rtkbt/rtkbt.mk @@ -16,7 +16,8 @@ PRODUCT_COPY_FILES += \ else PRODUCT_COPY_FILES += \ - $(CUR_PATH)/vendor/etc/bluetooth/rtkbt.conf:vendor/etc/bluetooth/rtkbt.conf + $(CUR_PATH)/vendor/etc/bluetooth/rtkbt.conf:vendor/etc/bluetooth/rtkbt.conf \ + $(CUR_PATH)/vendor/etc/bluetooth/rtk_btusb.ko:vendor/lib/modules/rtk_btusb.ko endif diff --git a/hardware/realtek/rtkbt/vendor/etc/bluetooth/rtk_btusb.ko b/hardware/realtek/rtkbt/vendor/etc/bluetooth/rtk_btusb.ko new file mode 100755 index 0000000000..4e61567375 Binary files /dev/null and b/hardware/realtek/rtkbt/vendor/etc/bluetooth/rtk_btusb.ko differ diff --git a/hardware/realtek/rtkbt/vendor/etc/bluetooth/rtkbt.conf b/hardware/realtek/rtkbt/vendor/etc/bluetooth/rtkbt.conf index a1e9b39361..6de4399b2c 100755 --- a/hardware/realtek/rtkbt/vendor/etc/bluetooth/rtkbt.conf +++ b/hardware/realtek/rtkbt/vendor/etc/bluetooth/rtkbt.conf @@ -8,8 +8,8 @@ DevClassMajorClass=0x01 DevClassMinorClass=0x1C #Indicate USB or UART driver bluetooth -#BtDeviceNode=/dev/rtkbt_dev -BtDeviceNode=?/dev/ttyS1:H5 +BtDeviceNode=/dev/rtk_btusb +#BtDeviceNode=?/dev/ttyS1:H5 # BtSnoop log output file BtSnoopFileName=/data/misc/bluedroid/btsnoop_hci.cfa