目录
[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 模块加载配置)
[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上的适配过程,整个适配过程虽然曲折,但只要按步骤逐一排查,问题都能找到根源。希望本文能对正在做类似方案的朋友有所帮助。