将驱动编译成模块并安装到rootfs

平台 :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 即可通过烧录工具写入开发板。

相关推荐
ltl40 分钟前
io_uring 在生产环境翻车实录:内核 bug、资源泄漏和你不知道的限制
linux
ltl42 分钟前
内存分配器擂台:jemalloc vs tcmalloc vs mimalloc vs glibc
linux
ltl44 分钟前
Zero Copy 的肮脏秘密:在什么时候反而更慢
linux
数据知道1 小时前
宽字节注入、二次注入、堆叠注入:高级 SQLi 专题
linux·运维·安全·网络安全
童槿顏丶2 小时前
GitLab部署到Linux
linux·运维·gitlab
单片机杂货铺5 小时前
基于单片机的智能粮仓控制系统设计与实现
stm32·单片机·嵌入式硬件·物联网·计算机外设·51单片机·课程设计
指尖的爷5 小时前
RKNN转化环境搭建(rknn_toolkit2新版本)
嵌入式硬件·深度学习·物联网·目标检测
空堂与归5 小时前
Linux 命令实战:AI 开发者必备的终端操作手册
linux
老孙讲技术5 小时前
周界枪响了、电梯脸却进了物业群:一个 callback,怎么把 alarm 和 faceAnalysis 拆成两条值班线?
后端·物联网