游乐游手机版
首页/AI热点日报/热点详情

迅为RK3399开发板如何基于RTL8822CS模块实现Android7 WiFi移植详细教程

类型:热点整理2026-07-13
基于Android7 0系统,在iTOP-3399开发板上移植RTL8822CSWiFi模块,需完成设备树节点配置、内核驱动修改及HAL层调整,包括修改设备树、驱动文件、Kconfig和wifi控制代码,确保模块名称与HAL层一致,并解决常见编译与注册问题。

本指南详细阐述了如何将 RTL8822CS WiFi 模块无缝移植到 iTOP-3399 开发板,并基于 Android 7.0 系统成功启用无线网络功能。整个流程涵盖设备树节点配置、内核驱动适配、HAL 层调整以及常见故障排查,旨在帮助开发者高效完成移植任务,提升项目落地效率。

移植环境

  • 硬件平台:iTOP-3399 开发板 + RTL8822CS 模块
  • 系统版本:Android 7.0
  • 开发环境:Ubuntu 16.04 64Bit(已搭建好编译环境)

移植步骤

80.3.1 增加设备树节点

在设备树文件 /home/topeet/rk3399_7.1_industry/kernel/arch/arm64/boot/dts/rockchip/rk3399-topeet.dtsi 中新增 WiFi 节点,具体添加位置参考下图:

注意:必须将 wifi_chip_type 属性值设为 "rtl8822cs",以此指定 WiFi 芯片型号。

同时,找到 sdio0 节点,并将以下语句注释掉(否则 SDIO 设备注册会失败):

80.3.2 修改内核驱动

驱动修改思路:

  1. 将驱动文件复制到内核源码目录中
  2. 在内核配置中启用并加载该驱动
  3. 关键前提:WiFi 固件配置通常在 drivers/net/wireless/rockchip_wlan/rkwifi/rk_wifi_config.c,WiFi 模块驱动则位于 net/rfkill/rfkill-wlan.c

第一步:将光盘资料中的驱动压缩包 RTL8822CS_WiFi_linux_v5.12.1.1-0.20210125.tar.gz(路径为 iTOP-3399 开发板\2_iTOP-3399 开发资料汇总(不含光盘内容)\13_嵌入式 Linux 开发指南(RK3399)手册配套资料\6.Android 底层驱动\Android7\wifi 移植原厂 wifi 驱动)拷贝到内核目录 drivers/net/wireless/rockchip_wlan/ 下,并将其重命名为 rtl8822cs,如下图所示:

第二步:修改以下文件:

  • drivers/net/wireless/rockchip_wlan/Makefile:插入一行 obj-$(CONFIG_RTL8822CS) += rtl8822cs/
  • drivers/net/wireless/rockchip_wlan/Kconfig:添加 source "drivers/net/wireless/rockchip_wlan/rtl8822cs/Kconfig"
  • drivers/net/wireless/rockchip_wlan/rtl8822cs/Makefile:调整两个配置项:
    • CONFIG_PLATFORM_I386_PC 的值改为 n
    • CONFIG_PLATFORM_ARM_RK3188 的值改为 y

    同时将 MODULE_NAME 修改为 8822cs,如下图所示:

    可根据实际需要开启或关闭 debug 信息(下图所示):

  • drivers/net/wireless/rockchip_wlan/rtl8822cs/Kconfig:将第一行的 RTL8822BS 改为 RTL8822CS(厂家源码笔误,若不修改则该目录不会被编译)

第三步:在内核目录(kernel)下执行以下命令,配置并加载驱动:

第四步:将生成的 .config 文件复制并替换默认的内核 defconfig 文件:

cp .config arch/arm64/configs/rockchip_defconfig

第五步:修改 /home/topeet/rk3399_7.1_industry/kernel/net/rfkill/rfkill-wlan.c 文件,添加如下代码段:

} else if (strcmp(wifi_chip_type_string, "rtl8822cs") == 0) {
    type = WIFI_RTL8822CS;
}

第六步:修改 /home/topeet/rk3399_7.1_industry/kernel/include/linux/rfkill-wlan.h 文件,添加 WIFI_RTL_8822CS 枚举定义,如下图所示:

80.3.3 修改 HAL 层

  • 修改 /home/topeet/rk3399_7.1_industry/hardware/libhardware_legacy/wifi/rk_wifi_ctrl.c:添加如下代码:
    {"RTL8822CS", "024c:c822"}
  • 注释掉以下代码:strcpy(recoginze_wifi_chip, "APXXX"); 并替换为:
    strcpy(recoginze_wifi_chip, "RTL8822CS");
  • 修改 /home/topeet/rk3399_7.1_industry/hardware/libhardware_legacy/wifi/wifi.c:添加以下代码:
    #define RTL8822CS_DRIVER_MODULE_PATH "/system/lib/modules/8822cs.ko"

    添加模块名称定义:

    #define RTL8822CS_DRIVER_MODULE_NAME "8822cs"

    添加驱动信息数组:

    {"RTL8822CS", RTL8822CS_DRIVER_MODULE_NAME, UNKKOWN_DRIVER_MODULE_ARG},

80.3.4 APP 层

Android 桌面“设置”应用中用于连接 WiFi 的程序位于源码 packages/apps/Settings/src/com/android/settings/wifi/ 目录下,此部分无需修改。

完成上述所有修改后,重新编译 Android 7 源码,将镜像烧录至开发板,即可进行调试验证。

小提示

  • 修改设备树时,务必确认 sdio0 节点没有被其他外设占用,否则会导致注册失败。
  • 编译内核前建议先执行 make mrproper 清理旧配置,然后重新生成 .config。
  • 驱动文件中的 MODULE_NAME 必须与 HAL 层中定义的 RTL8822CS_DRIVER_MODULE_NAME 保持一致(即 8822cs)。
  • 如果编译时出现 RTL8822CS 未定义错误,请检查内核头文件 rfkill-wlan.h 是否已添加枚举值。

常见问题(FAQ)

  • Q:编译内核时提示 "drivers/net/wireless/rockchip_wlan/rtl8822cs/Kconfig:1: syntax error" 怎么办?

    A:这是因为 Kconfig 文件中第一行仍然是 RTL8822BS,请按照教程将其修改为 RTL8822CS。修改后重新执行 make menuconfig 进行配置。

  • Q:烧写镜像后 WiFi 无法开启,日志显示 "sdio card not found"?

    A:请检查设备树中 sdio0 节点是否被错误注释,或硬件连接(如 SDIO 时钟、数据线)是否存在问题。同时确认 wifi_chip_type 属性值是否为 "rtl8822cs"。

  • Q:驱动已编译成模块,但 insmod 时提示 "Unknown symbol" 或 "module not found"?

    A:确保模块路径 /system/lib/modules/8822cs.ko 正确,且内核版本与模块版本一致。如果内核存在符号依赖,需先加载依赖模块(如 cfg80211、mac80211)。

  • Q:HAL 层修改后,WiFi 扫描不到任何网络?

    A:检查 rk_wifi_ctrl.c 中添加的 VID/PID 是否与硬件匹配(024c:c822 是 RTL8822CS 的默认 USB ID,但若使用 SDIO 接口,此配置可能不生效,需确认实际接口类型)。若为 SDIO 接口,请确保内核中 SDIO 驱动已正确配置。

来源:https://m.elecfans.com/article/2123761.html

相关热点

继续查看同栏目近期热点。

延伸阅读

补充最近整理过的热点入口。