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

相关推荐
美狐美颜SDK开放平台1 小时前
直播APP源码如何实现美颜功能?视频美颜SDK开发方案详解
android·大数据·人工智能·计算机视觉·直播美颜sdk
pengyu1 小时前
【Kotlin 协程修仙录 · 化神境 · 后阶】 | 异常天劫:Flow 异常处理的终极奥义与重试之道
android·kotlin
DevHub1 小时前
STM32 USB HID 教程:TinyUSB 实现键盘设备,从描述符到枚举
arm开发·stm32·单片机·嵌入式硬件·mcu·计算机外设
又见情义1 小时前
RK3568 Android 13 LED指示灯适配实战
android·驱动开发
pengyu1 小时前
【Kotlin 协程修仙录 · 化神境 · 中阶】 | 多播奥义:SharedFlow 高级配置与 Channel 的抉择之道
android·kotlin
码云数智-园园1 小时前
PHP 性能优化实战:从 3s 到 300ms,我是怎么优化一个接口的?
android·adb
蓝速科技2 小时前
蓝速鸿蒙信创终端长效流畅性深度评测
arm开发·华为·harmonyos
永不复还2 小时前
Windows驱动开发:IRP、完成例程与 MDL 生命周期深度解析
windows·驱动开发
Dovis(誓平步青云)2 小时前
番茄钟真正难的不是倒计时:启动、暂停、重置与页面销毁
android·服务器·前端