RK3568 Android 13驱动适配-WiFi&BT模块(RTL8822CS)

目录

前言

一、模块功能基础知识

[1.1 RTL8822CS简介](#1.1 RTL8822CS简介)

[1.2 通信接口说明](#1.2 通信接口说明)

[1.3 系统架构](#1.3 系统架构)

二、硬件原理分析

[2.1 供电设计](#2.1 供电设计)

[2.2 控制信号说明](#2.2 控制信号说明)

三、设备树适配

[3.1 SDIO节点配置](#3.1 SDIO节点配置)

[3.2 WiFi平台数据节点](#3.2 WiFi平台数据节点)

[3.3 蓝牙节点配置](#3.3 蓝牙节点配置)

[3.4 外部供电节点](#3.4 外部供电节点)

[3.5 引脚复用配置](#3.5 引脚复用配置)

四、驱动程序移植

[4.1 驱动来源选择](#4.1 驱动来源选择)

[4.2 编译系统配置](#4.2 编译系统配置)

[4.3 模块加载配置](#4.3 模块加载配置)

五、固件与HAL库

[5.1 固件文件](#5.1 固件文件)

[5.2 HAL库问题排查](#5.2 HAL库问题排查)

总结


前言

近期在基于RK3568的Android 13项目上,需要适配RTL8822CS这款WiFi+蓝牙二合一模块。从硬件设计到驱动移植,再到最后的调试优化,整个过程踩了不少坑,也积累了一些经验。本文将完整记录适配过程,希望能给做类似方案的朋友一些参考。

RTL8822CS是一款由瑞昱推出的支持2.4G/5G双频的WiFi+蓝牙组合模块,支持802.11 a/b/g/n/ac协议,蓝牙5.0,在嵌入式Android设备中应用广泛。本文将从硬件原理、设备树配置、驱动移植、调试排障等几个方面展开。


一、模块功能基础知识

1.1 RTL8822CS简介

RTL8822CS支持以下关键特性:

  • WiFi:双频2.4G/5G,MIMO 2x2,最高速率可达867Mbps

  • 蓝牙:BT 5.0,支持BLE

  • 接口:SDIO 3.0(WiFi)/ UART(蓝牙)

  • 封装:LGA-48

模块内部集成了射频前端、PA/LNA、电源管理等单元,对外提供SDIO和UART接口,配合外部天线即可工作。

1.2 通信接口说明

接口 功能 关键信号
SDIO WiFi数据传输 SDIO_CLK, SDIO_CMD, SDIO_D0~D3
UART 蓝牙HCI通信 UART_TX, UART_RX, UART_RTS, UART_CTS
GPIO 电源控制/复位 WL_REG_ON, BT_RESET, BT_WAKE等

1.3 系统架构

在Android系统中,WiFi模块的软件栈大致为:

复制代码
应用层 (Settings/SystemUI)
    ↓
WiFi Framework (WifiManager/WifiServiceImpl)
    ↓
HAL层 (wifi@1.0-service + libwifi-hal-rtk.so)
    ↓
内核驱动层 (8822cs.ko)
    ↓
硬件 (RTL8822CS)

蓝牙部分则通过HCI协议与蓝牙协议栈通信。

二、硬件原理分析

2.1 供电设计

RTL8822CS需要两路主要供电:

  • 3.3V数字/模拟电源:给模块内部数字电路和射频前端供电

  • 1.8V或3.3V IO电源:给SDIO/UART接口电平供电

实际设计中,使用一个3.3V固定稳压器为模块供电,并配合多个10uF电容进行滤波。原理图中可以看到大量10uF/16V的电容并联,这是为了保证射频瞬间大电流时的电源稳定性(这是模块厂家推荐的典型设计)。

2.2 控制信号说明

信号 GPIO 作用
WiFi_EN GPIO2_PB1 WiFi电源使能,高电平有效
BT_RESET GPIO2_PB7 蓝牙复位信号
BT_WAKE GPIO2_PC0 蓝牙唤醒主机信号
3.3V_WIFI_EN GPIO0_PC1 外部LDO使能(控制3.3V供电)

三、设备树适配

设备树是RK平台硬件配置的核心,直接关系到外设能否被正确识别。

3.1 SDIO节点配置

SDIO接口用于WiFi通信,需要在设备树中配置SDIO控制器,并绑定pwrseq(电源时序控制):

复制代码
sdio_pwrseq: sdio-pwrseq {
    compatible = "mmc-pwrseq-simple";
    pinctrl-names = "default";
    pinctrl-0 = <&wifi_enable_h>;
    reset-gpios = <&gpio2 RK_PB1 GPIO_ACTIVE_LOW>;
    post-power-on-delay-ms = <200>;
};

post-power-on-delay-ms 这个参数很关键,它保证了电源稳定后再初始化SDIO总线。

3.2 WiFi平台数据节点

复制代码
wireless_wlan: wireless-wlan {
    compatible = "wlan-platdata";
    rockchip,grf = <&grf>;
    wifi_chip_type = "rtl8822cs";
    WIFI,poweren_gpio = <&gpio2 RK_PB1 GPIO_ACTIVE_HIGH>;
    status = "okay";
};

这里的 wifi_chip_type 会被驱动用来识别芯片型号。

3.3 蓝牙节点配置

蓝牙使用UART1进行HCI通信:

复制代码
wireless_bluetooth: wireless-bluetooth {
    compatible = "bluetooth-platdata";
    uart_rts_gpios = <&gpio2 RK_PB5 GPIO_ACTIVE_LOW>;
    pinctrl-names = "default", "rts_gpio";
    pinctrl-0 = <&uart1m0_rtsn>;
    pinctrl-1 = <&uart1_gpios>;
    BT,reset_gpio = <&gpio2 RK_PB7 GPIO_ACTIVE_HIGH>;
    BT,wake_gpio = <&gpio2 RK_PC0 GPIO_ACTIVE_HIGH>;
    status = "okay";
};

&uart1 {
    pinctrl-names = "default";
    pinctrl-0 = <&uart1m0_xfer &uart1m0_ctsn>;
    status = "okay";
};

3.4 外部供电节点

复制代码
vcc3v3_wifi: vcc3v3-wifi-regulator {
    compatible = "regulator-fixed";
    regulator-name = "vcc3v3_wifi";
    regulator-always-on;
    regulator-boot-on;
    regulator-min-microvolt = <3300000>;
    regulator-max-microvolt = <3300000>;
    gpio = <&gpio0 RK_PC1 GPIO_ACTIVE_HIGH>;
    startup-delay-us = <5000>;
    pinctrl-0 = <&pwr_en_wifi>;
};

3.5 引脚复用配置

复制代码
&pinctrl {
    net-wifi {
        pwr_en_wifi: pwr_en_wifi {
            rockchip,pins = <0 RK_PC1 RK_FUNC_GPIO &pcfg_pull_none>;
        };
        wifi_enable_h: wifi_enable_h {
            rockchip,pins = <2 RK_PB1 RK_FUNC_GPIO &pcfg_pull_none>;
        };
    };
};

四、驱动程序移植

4.1 驱动来源选择

在SDK根目录下执行以下命令搜索当前SDK中,官方是否已适配驱动,

复制代码
find ./ -type d -name "*rtl*" | grep -i 8822

搜索到的结果为:

复制代码
external/wifi_driver/rtl8822cs/(外部驱动)

根据 external/wifi_driver/下的README说明:

自动构建 :在SDK根目录执行 ./build.sh -K 会自动编译所有 external/wifi_driver/ 下的驱动

且README 明确提到:如果驱动同时存在于:

kernel/drivers/net/wireless/rockchip_wlan/rtl8822cs(内核内置)和

external/wifi_driver/rtl8822cs/(外部驱动)

会优先使用 external/wifi_driver/rtl8822cs/的版本

4.2 编译系统配置

在device/rockchip/rk356x/wifi_bt.mk 中指定WiFi芯片型号:

复制代码
BOARD_CONNECTIVITY_VENDOR := RealTek
BOARD_CONNECTIVITY_MODULE := rtl8822cs

然后需要去安卓板中去验证是否已经把驱动打包到SDK中了,

bash 复制代码
rk3568_t:/ # ls -la /vendor/lib/modules/8822cs.ko 
-rw-r--r-- 1 root root 5113464 2026-07-27 17:10 /vendor/lib/modules/8822cs.ko 

可以看到配置好wifi_bt.mk 文件后,已经把驱动打包到SDK中去了。

4.3 模块加载配置

在 device/rockchip/rk356x/init.rk356x.rc 文档末尾处添加自动加载逻辑:

bash 复制代码
on property:sys.boot_completed=1
    insmod /vendor/lib/modules/8822cs.ko

五、固件与HAL库

5.1 固件文件

RTL8822CS需要两个固件文件:

  • rtl8822cs_fw:WiFi/蓝牙共用固件

  • rtl8822cs_config:配置文件

这两个文件需要放置在 /vendor/etc/firmware/ 目录下。

在安卓板上检查确认:

bash 复制代码
rk3568_t:/vendor # find /vendor -name "*8822*" 2>/dev/null 
/vendor/etc/firmware/rtl8822b_config 
/vendor/etc/firmware/rtl8822b_fw 
/vendor/etc/firmware/rtl8822bs_config 
/vendor/etc/firmware/rtl8822bs_fw 
/vendor/etc/firmware/rtl8822c_config 
/vendor/etc/firmware/rtl8822c_fw 
/vendor/etc/firmware/rtl8822cs_config
/vendor/etc/firmware/rtl8822cs_fw 

可以看到官方已经帮我们把固件打包到SDK中去了

5.2 HAL库问题排查

调试时发现,驱动已加载成功,如下,

bash 复制代码
rk3568_t:/ # ls -la /vendor/lib/modules/8822cs.ko 
-rw-r--r-- 1 root root 5113464 2026-07-27 17:10 /vendor/lib/modules/8822cs.ko 
rk3568_t:/ # lsmod | grep 8822cs 
8822cs 3031040 0 

但打开wifi连接上之后,几秒后会自动断开,然后关闭wifi。打印日志如下:

bash 复制代码
07-28 09:07:32.425 F/libc    ( 2148): Fatal signal 11 (SIGSEGV), code 2 (SEGV_ACCERR), fault addr 0xb40000786dd92000
07-28 09:07:32.588 F/DEBUG   ( 2275): pid: 2148, tid: 2148, name: wifi@1.0-servic  >>> /vendor/bin/hw/android.hardware.wifi@1.0-service <<<

崩溃发生在 getLinkLayerStats 调用中,最终定位到 libwifi-hal-rtk.so 版本不兼容。

解决方法是更新rtl8822cs驱动包版本,从瑞芯微官网获取最新的HAL库。更新后,驱动版本信息为:

bash 复制代码
rtl8822cs_v5.14.0.2-0-g45f64d8.20220127_COEX20211210-2727

这里我用的驱动包下载链接,我已经绑定资源了,文章头部可下载。

更新完程序,界面操作连上wifi后,能正常ping通百度,wifi已能正常工作,界面操作蓝牙也能正常连接,适配完成。

bash 复制代码
rk3568_t:/ # ping www.baidu.com 
PING www.a.shifen.com (180.101.51.73) 56(84) bytes of data.
64 bytes from 180.101.51.73: icmp_seq=1 ttl=48 time=26.3 ms 
64 bytes from 180.101.51.73: icmp_seq=2 ttl=48 time=25.2 ms 
64 bytes from 180.101.51.73: icmp_seq=3 ttl=48 time=26.5 ms 
64 bytes from 180.101.51.73: icmp_seq=4 ttl=48 time=23.2 ms 
64 bytes from 180.101.51.73: icmp_seq=5 ttl=48 time=24.7 ms 

总结

以上为RTL8822CS在RK3568 Android 13上的适配过程,整个适配过程虽然曲折,但只要按步骤逐一排查,问题都能找到根源。希望本文能对正在做类似方案的朋友有所帮助。

相关推荐
天空之城--7 小时前
Android逆向安全合规接单指南
android·安全
消失的旧时光-19439 小时前
Android 系统层扫盲 09:AMS、ATMS、WMS、PMS 到底分别管什么?
android·wms·pms·ams·aosp·atms
Godikov9 小时前
Android 系统级设备应用踩坑实录:sharedUserId 签名、SDK 授权失败 -4、开机自启与 U 盘 OTA 升级
android
IT毕设实战小研13 小时前
基于大数据的国内主要农作物产量趋势分析与可视化
android·java·大数据·django·课程设计
企业数字化笔记14 小时前
固定资产历史数据怎么导入系统?Excel模板、字段映射和数据校验
android·java·数据库·后端
龙之叶14 小时前
Android出海系列-GMS认证介绍
android
潮族大Z14 小时前
Android性能优化:启动、内存、卡顿的一站式排查手册
android
事圆则缓16 小时前
从suspend字节码到 Retrofit 协程桥:挂起函数识别与恢复
android·retrofit
杉氧17 小时前
RN 性能调优指南:重渲染(Re-renders)控制与长列表(FlatList)优化
android·前端·react native
Coffeeee17 小时前
claude-video 一个让你的Agent拥有看视频能力的Skill
android·人工智能·aigc