将驱动编译成模块并安装到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 即可通过烧录工具写入开发板。

相关推荐
刚入门的大一新生28 分钟前
Linux-线程概念
linux·jvm
H.莓飛37 分钟前
【数据结构】排序总结与规模实测
linux·服务器·开发语言·数据结构·visual studio·1024程序员节
Zenova EdgeOS1 小时前
Linux 日志实战:用 journalctl 精准检索与治理工业边缘日志
linux·运维·chrome
weixin_404380631 小时前
MQTT 上云验收:ESP32-S3 从局域网控灯到远程网页控制
物联网·mqtt·esp32
Dxy12393102161 小时前
Linux 压缩解压相关命令介绍
linux·运维·服务器
eleven_4u1 小时前
QPS如何计算,如何部署架构
java·linux·运维·jvm·中间件
阿乔外贸日记2 小时前
外贸风控|美国市场7大类欺诈模式解析与风控框架
大数据·人工智能·物联网·microsoft·智能手机
东城居士2 小时前
理解Linux RTC驱动
linux·嵌入式系统
蘑菇小白2 小时前
Linux多线程开发
linux·开发语言·线程
rtu遥测终端机2 小时前
四信全力支撑首批136项重大应用场景落地验证
物联网