平台 :Forlinx OK3562(Rockchip RK3562J)
内核版本 :Linux 5.10.198
SDK 路径 :~/work/OK3562-linux-source
目标 :将 Realtek RTL8821CU(USB WiFi)驱动以内核模块(.ko)形式集成到系统中,烧录后开发板开机即可加载。
一、背景与目标
RTL8821CU 是一款常见的 USB 接口 WiFi/BT 二合一芯片。在 OK3562 开发板上,该模组通过 USB 总线连接。我们的目标是将驱动源码放入内核树(in-tree),编译为 8821cu.ko,并随 update.img 烧录到开发板,最终能在 /lib/modules/5.10.198/... 下找到该模块。
二、源码准备与目录结构
Forlinx SDK 的内核源码中加入 rtl8821cu源码:
plain
kernel-5.10/drivers/net/wireless/realtek/rtl8821cu/
├── Kconfig
├── Makefile
└── *.c *.h # 驱动源码

打通上级链路:
-
drivers/net/wireless/realtek/Makefile包含:obj-$(CONFIG_RTL8821CU) += rtl8821cu/ -
drivers/net/wireless/realtek/Kconfig包含:source "drivers/net/wireless/realtek/rtl8821cu/Kconfig"


三、移植核心步骤
Step 1:持久化内核配置(defconfig)
配置内核(图形化界面)
bash
cd /path/to/your/kernel
# 打开配置界面
make ARCH=arm64 menuconfig # RK3562 是 ARM64
# 或
make ARCH=arm menuconfig # 如果是 32 位 ARM(如 i.MX6UL)
然后按路径找到:
plain
Device Drivers --->
[*] Network device support --->
[*] Wireless LAN --->
<*> Realtek RTL8821CU USB WiFi support
(或按 M 编为模块,按 * 编进内核)
-
按
M:编译为模块.ko,后续会出现在/lib/modules/xxx/kernel/drivers/net/wireless/realtek/rtl8821CU/8821cu.ko -
按
*:直接编译进内核镜像boot.img,启动后无需insmod/modprobe
保存退出(配置会写入 .config)。

大坑预警 :通过 make menuconfig 修改 .config 是临时 的!一旦执行 make OK3562_Linux_defconfig 或 ./build.sh kernel,.config 会被重新覆盖,修改全部丢失。
正确做法 :直接修改 arch/arm64/configs/OK3562_Linux_defconfig。
bash
cd ~/work/OK3562-linux-source/kernel-5.10
# 先删除已有配置(避免重复或冲突)
sed -i '/CONFIG_RTL8821CU/d' arch/arm64/configs/OK3562_Linux_defconfig
# 追加模块配置(M = 编译为模块)
echo "CONFIG_RTL8821CU=m" >> arch/arm64/configs/OK3562_Linux_defconfig
验证:
bash
grep CONFIG_RTL8821CU arch/arm64/configs/OK3562_Linux_defconfig
# 输出:CONFIG_RTL8821CU=m
Step 2:配置交叉编译环境
RK3562 是 ARM64 架构,必须使用 SDK 自带的交叉编译器,绝对不能直接用宿主机 x86 的 gcc。
在 SDK 根目录搜索:
bash
# 回到 SDK 根目录
cd ~/work/OK3562-linux-source
# 查找 aarch64 交叉编译器
find . -name "aarch64*gcc" -type f 2>/dev/null
# 或者查找常见的工具链目录
ls prebuilts/gcc/linux-x86/aarch64/ 2>/dev/null
ls toolchain/ 2>/dev/null
ls tools/toolchain/ 2>/dev/null

交叉编译器路径:
plain
prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-gcc
设置环境变量(可写入 ~/.bashrc 方便后续使用):
bash
export CROSS_COMPILE=~/work/OK3562-linux-source/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-
Step 3:编译模块
重新加载 defconfig 并编译:
bash
cd ~/work/OK3562-linux-source/kernel-5.10
make ARCH=arm64 ${CROSS_COMPILE} OK3562_Linux_defconfig
# 验证配置已生效
grep CONFIG_RTL8821CU .config
# 应输出:CONFIG_RTL8821CU=m
make ARCH=arm64 ${CROSS_COMPILE} modules -j$(nproc)
#下面是我的完整命令
#make ARCH=arm64 \
CROSS_COMPILE=~/work/OK3562-linux-source/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu- \
modules -j$(nproc)
踩坑:如果内核目录不是 git 仓库,编译时会报错:
plain
fatal: not a git repository (or any of the parent directories): .git
解决:
bash
cd ~/work/OK3562-linux-source/kernel-5.10
git init
git config user.email "Num@example.com"
git config user.name "yourname"
git add -A
git commit -m "init"
编译成功后,检查产物:
bash
ls drivers/net/wireless/realtek/rtl8821cu/8821cu.ko

Step 4:安装模块到 rootfs
注意 :在 kernel-5.10/ 根目录 执行 modules_install,如果在 rtl8821cu/ 子目录执行,会被驱动自带的 out-of-tree Makefile 干扰,导致 INSTALL_MOD_PATH 失效。
bash
cd ~/work/OK3562-linux-source/kernel-5.10
make ARCH=arm64 \
CROSS_COMPILE=~/work/OK3562-linux-source/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu- \
modules_install \
INSTALL_MOD_PATH=~/work/OK3562-linux-source/buildroot/output/OK3562_Linux/target
正确执行后,输出应包含:
plain
INSTALL /home/forlinx/work/OK3562-linux-source/buildroot/output/OK3562_Linux/target/lib/modules/5.10.198/kernel/drivers/net/wireless/realtek/rtl8821cu/8821cu.ko
DEPMOD 5.10.198

DEPMOD 会自动更新 modules.dep,无需手动编辑。
验证安装结果:
bash
ls ~/work/OK3562-linux-source/buildroot/output/OK3562_Linux/target/lib/modules/5.10.198/kernel/drivers/net/wireless/realtek/rtl8821cu/


最终安装进文件系统中
Step 5:打包 update.img
回到 SDK 根目录,重新打包固件:
bash
cd ~/work/OK3562-linux-source
./build.sh updateimg
生成的 rockdev/update.img 即可通过烧录工具写入开发板。