ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

RK3568 Android 13驱动适配-WiFiBT模块(RTL8822CS)

RK3568 Android 13驱动适配-WiFiBT模块(RTL8822CS) 目录前言一、模块功能基础知识1.1 RTL8822CS简介1.2 通信接口说明1.3 系统架构二、硬件原理分析2.1 供电设计2.2 控制信号说明三、设备树适配3.1 SDIO节点配置3.2 WiFi平台数据节点3.3 蓝牙节点配置3.4 外部供电节点3.5 引脚复用配置四、驱动程序移植4.1 驱动来源选择4.2 编译系统配置4.3 模块加载配置五、固件与HAL库5.1 固件文件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/5GMIMO 2x2最高速率可达867Mbps蓝牙BT 5.0支持BLE接口SDIO 3.0WiFi/ UART蓝牙封装LGA-48模块内部集成了射频前端、PA/LNA、电源管理等单元对外提供SDIO和UART接口配合外部天线即可工作。1.2 通信接口说明接口功能关键信号SDIOWiFi数据传输SDIO_CLK, SDIO_CMD, SDIO_D0~D3UART蓝牙HCI通信UART_TX, UART_RX, UART_RTS, UART_CTSGPIO电源控制/复位WL_REG_ON, BT_RESET, BT_WAKE等1.3 系统架构在Android系统中WiFi模块的软件栈大致为应用层 (Settings/SystemUI) ↓ WiFi Framework (WifiManager/WifiServiceImpl) ↓ HAL层 (wifi1.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_ENGPIO2_PB1WiFi电源使能高电平有效BT_RESETGPIO2_PB7蓝牙复位信号BT_WAKEGPIO2_PC0蓝牙唤醒主机信号3.3V_WIFI_ENGPIO0_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中了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文档末尾处添加自动加载逻辑on property:sys.boot_completed1 insmod /vendor/lib/modules/8822cs.ko五、固件与HAL库5.1 固件文件RTL8822CS需要两个固件文件rtl8822cs_fwWiFi/蓝牙共用固件rtl8822cs_config配置文件这两个文件需要放置在/vendor/etc/firmware/目录下。在安卓板上检查确认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库问题排查调试时发现驱动已加载成功如下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。打印日志如下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: wifi1.0-servic /vendor/bin/hw/android.hardware.wifi1.0-service 崩溃发生在getLinkLayerStats调用中最终定位到libwifi-hal-rtk.so版本不兼容。解决方法是更新rtl8822cs驱动包版本从瑞芯微官网获取最新的HAL库。更新后驱动版本信息为rtl8822cs_v5.14.0.2-0-g45f64d8.20220127_COEX20211210-2727这里我用的驱动包下载链接我已经绑定资源了文章头部可下载。更新完程序界面操作连上wifi后能正常ping通百度wifi已能正常工作界面操作蓝牙也能正常连接适配完成。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_seq1 ttl48 time26.3 ms 64 bytes from 180.101.51.73: icmp_seq2 ttl48 time25.2 ms 64 bytes from 180.101.51.73: icmp_seq3 ttl48 time26.5 ms 64 bytes from 180.101.51.73: icmp_seq4 ttl48 time23.2 ms 64 bytes from 180.101.51.73: icmp_seq5 ttl48 time24.7 ms总结以上为RTL8822CS在RK3568 Android 13上的适配过程整个适配过程虽然曲折但只要按步骤逐一排查问题都能找到根源。希望本文能对正在做类似方案的朋友有所帮助。
返回列表