基本信息
硬件平台 : RK3568、RK3588
操作系统: Android11/12
一、硬件原理图
二、修改源码
步骤1:修改DTS
根据硬件可以,使用USB wifi,USB wifi 不需要配置wifi_chip_type,故配置为空,电源没有控制脚,暂时注释掉。
wireless_wlan: wireless-wlan {
compatible = "wlan-platdata";
rockchip,grf = <&grf>;
wifi_chip_type = ""; //rtl8822cu
#WIFI,vbat_gpio = <&gpio0 RK_PC1 GPIO_ACTIVE_LOW>; //V10 无电源控制脚
status = "okay";
};
步骤2 :添加驱动文件并修改相关文件,如下。
驱动源码的获取,最好通过FAE获取对应android版本最新的源码,以减少在移植过程中不必要的麻烦。
1、copy relteck提供的驱动代码 rtl88x2CU_WiFi_linux_v5.14.0.3-2-gba458274c.20220418_COEX20211210-2727.tar.gz 到
kernel/drivers/net/wireless/rockchip_wlan/下面 ,
2、解压,改目录名:
rtl88x2cu
3、修改Kconfig and Makefile
文件:kernel/drivers/net/wireless/rockchip_wlan/Kconfig
添加
source "drivers/net/wireless/rockchip_wlan/rtl88x2cu/Kconfig"
同时测试了rtl88x2bu。
文件:kernel/drivers/net/wireless/rockchip_wlan/Makefile
添加
obj-$(CONFIG_RTL8822CU) += rtl88x2cu/
4、修改kernel配置文件
文件:arch/arm64/configs/rk3568_xx.config
CONFIG_RTL8822CU=m
5、修改Makefile 配置项
去掉x86选择,选择rk3188.
注释掉 DRTW_ENABLE_WIFI_CONTROL_FUNC
模块名 8822cu
--3、添加android 11等配置项
# CONFIG_RTW_ANDROID - 0: no Android, 4/5/6/7/8/9/10/11 : Android version
CONFIG_RTW_ANDROID = 11
6、修改文件
drivers/net/wireless/rockchip_wlan/rtl88x2cu/os_dep/linux/usb_intf.c
修改1、
将 static int __init rtw_drv_entry(void) {
修改为 static int rtw_drv_entry(void) {
修改2、
将 static void __exit rtw_drv_halt(void) {
修改为 static void rtw_drv_halt(void) {
修改3、注释掉模块的初始化和退出
//module_init(rtw_drv_entry);
//module_exit(rtw_drv_halt);
修改4 ,增加rockchip接口函数
在该文件末尾添加 完整代码 如下:
#ifdef CONFIG_INTEL_PROXIM
_adapter *rtw_usb_get_sw_pointer(void)
{
return rtw_sw_export;
}
EXPORT_SYMBOL(rtw_usb_get_sw_pointer);
#endif /* CONFIG_INTEL_PROXIM */
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 1, 0))
#include <linux/rfkill-wlan.h>
extern int get_wifi_chip_type(void);
#else
extern int rk29sdk_wifi_power(int on);
#endif
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 1, 0))
int rockchip_wifi_init_module_rtkwifi(void)
#else
int rockchip_wifi_init_module(void)
#endif
{
#ifdef CONFIG_WIFI_LOAD_DRIVER_WHEN_KERNEL_BOOTUP
int type = get_wifi_chip_type();
if (type < WIFI_AP6XXX_SERIES || type == WIFI_ESP8089) return 0;
#endif
printk("\n");
printk("=======================================================\n");
printk("==== Launching Wi-Fi driver! (Powered by Rockchip) ====\n");
printk("=======================================================\n");
printk("Realtek 8822BU USB WiFi driver (Powered by Rockchip) init.\n");
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 1, 0))
//rockchip_wifi_power(1); /* 因硬件上没有电源控制,去掉,如果硬件上有电源可以增加该项*/
#else
rk29sdk_wifi_power(1);
#endif
return rtw_drv_entry();
}
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 1, 0))
void rockchip_wifi_exit_module_rtkwifi(void)
#else
void rockchip_wifi_exit_module(void)
#endif
{
#ifdef CONFIG_WIFI_LOAD_DRIVER_WHEN_KERNEL_BOOTUP
int type = get_wifi_chip_type();
if (type < WIFI_AP6XXX_SERIES || type == WIFI_ESP8089) return;
#endif
printk("\n");
printk("=======================================================\n");
printk("==== Dislaunching Wi-Fi driver! (Powered by Rockchip) ====\n");
printk("=======================================================\n");
printk("Realtek 8822BU USB WiFi driver (Powered by Rockchip) init.\n");
rtw_drv_halt();
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 1, 0))
//rockchip_wifi_power(0); /* 因硬件上没有电源控制,去掉,如果硬件上有电源可以增加该项*/
#else
rk29sdk_wifi_power(0);
#endif
}
#ifdef CONFIG_WIFI_BUILD_MODULE
module_init(rockchip_wifi_init_module_rtkwifi);
module_exit(rockchip_wifi_exit_module_rtkwifi);
#else
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 1, 0))
#ifdef CONFIG_WIFI_LOAD_DRIVER_WHEN_KERNEL_BOOTUP
late_initcall(rockchip_wifi_init_module_rtkwifi);
module_exit(rockchip_wifi_exit_module_rtkwifi);
#else
module_init(rockchip_wifi_init_module_rtkwifi);
module_exit(rockchip_wifi_exit_module_rtkwifi);
#endif
#else
#ifdef CONFIG_ANDROID_4_2
module_init(rockchip_wifi_init_module);
module_exit(rockchip_wifi_exit_module);
#else
EXPORT_SYMBOL(rockchip_wifi_init_module);
EXPORT_SYMBOL(rockchip_wifi_exit_module);
#endif
#endif
#endif
步骤3,android源码修改
路径: frameworks/opt/net/wifi/libwifi_hal/rk_wifi_ctrl.cpp
wifi控制文件,主要添加设备型号的 PID VID,当系统启动时,查到有设备的VID,PID匹配时,即可加载对应的设备驱动。
在调试时,可以通过系统启动完成后,输入lsmod 查看相应的ko 是否加载,当加载成功,表明该文件修改成功。
static wifi_device supported_wifi_devices[] = {
{"RTL8188EU", "0bda:8179"},
{"RTL8188EU", "0bda:0179"},
{"RTL8723BU", "0bda:b720"},
{"RTL8723BS", "024c:b723"},
{"RTL8822BS", "024c:b822"},
{"RTL8723CS", "024c:b703"},
{"RTL8723DS", "024c:d723"},
{"RTL8188FU", "0bda:f179"},
{"RTL8822BU", "0bda:b82c"},
{"RTL8189ES", "024c:8179"},
{"RTL8189FS", "024c:f179"},
{"RTL8192DU", "0bda:8194"},
{"RTL8812AU", "0bda:8812"},
{"RTL8821CS", "024c:c821"},
{"RTL8822CU", "0bda:c82c"}, 已经支持该芯片,不用添加
步骤4
路径:.frameworks\opt\net\wifi\libwifi_hal\wifi_hal_common.cpp
#define WIFI_MODULE_PATH "/vendor/lib/modules/"
添加:
#define RTL8822CU_DRIVER_MODULE_PATH WIFI_MODULE_PATH"8822cu.ko"
#define RTL8822CU_DRIVER_MODULE_NAME "8822cu"
编译完成后,自动copy到目标位置
wifi_ko_file_name module_list[] =
{
{"RTL8822CU", RTL8822CU_DRIVER_MODULE_NAME, RTL8822CU_DRIVER_MODULE_PATH, UNKKOWN_DRIVER_MODULE_ARG},
步骤5:修改加载设备节点
因源码基本上都是支持的SDIO wifi,所以bt都是通过串口实现,当USB WIFI/BT模块时,需要修改为rtkbt_dev
文件:hardware\realtek\rtkbt\vendor\etc\bluetooth\rtkbt.conf
#Indicate USB or UART driver bluetooth
+BtDeviceNode=/dev/rtkbt_dev
+#BtDeviceNode=?/dev/ttyS1:H5
步骤6:本机蓝牙设备名称:(默认为rk3566,更改为rk3568:)
文件:device\rockchip\rk356x\bluetooth\bdroid_buildcfg.h
+ //#define BTM_DEF_LOCAL_NAME "rk3566"
+ #define BTM_DEF_LOCAL_NAME "rk3568"
步骤7:测试
android整体编译,烧录测试,在android界面打开wifi开关,可以看到搜索到热点,选择热点,输入密码即可实现联网工作。
参考资料 :
Rockchip_Introduction_REALTEK_WIFI_Driver_Porting_CN&EN.pdf
Rockchip_Introduction_WIFI_Configuration_CN&EN.pdf
https://bbs.elecfans.com/jishu_2254463_1_1.html