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

相关推荐
honsor11 分钟前
以太网温湿度传感器:RJ45直连机房的环境监控新方案
运维·网络·数据库·物联网·安全·云计算·github
电子科技圈1 小时前
芯科科技扩展 AI 开发者平台,简化物联网开发并拓展边缘智能
人工智能·科技·物联网
北风催呀催1 小时前
HuggingFace下载镜像加速技巧
linux·huggingface
MicrosoftCloud1 小时前
性能排查 02|vmstat、iostat、mpstat、sar 怎么读?性能四件套的分工与判读阈值
linux·ubuntu·vmstat·性能监控·iostat·sysstat
AR-26710-2 小时前
Linux Day16——日志
linux·运维
小HANN2 小时前
华为云企业网站上云实战|从零搭建高可用WordPress(ECS+RDS+ELB+弹性伸缩+云监控全流程落地)
linux·运维·服务器·经验分享
susplus3 小时前
【IMX6ULL Linux系统移植】SD卡分区 | uboot详解
linux·arm·u-boot
@三十一Y3 小时前
Linux:实现简易的shell
linux
2301_777998343 小时前
TCP连接断开:进程终止、主机断电与网络断开
linux·服务器·网络·tcp/ip