网卡驱动RTL8821CU移植

针对环境(Linux + RTL8821CU)的完整移植方案


一、驱动源码获取

推荐:使用 lwfinger/rtl8821cu(对老内核兼容性较好)

bash

复制代码
# 在宿主机(Ubuntu/CentOS)上执行
git clone https://github.com/lwfinger/rtl8821cu.git
cd rtl8821cu

#如果github无法拉下来,或者网速太慢,可以找一个国内镜像源

备选:Realtek 官方老版本驱动

向你的 WiFi 模块供应商索取:

  • 明确说明:Linux kernel 版本, ARM 芯片平台, USB还是SDIO接口

  • 索取 RTL8821CU_Linux_v5.x.x 或更早版本的驱动包


二、交叉编译环境准备

1. 确认你的交叉编译工具链

bash

复制代码
# 在你的宿主机上检查
which arm-linux-gnueabihf-gcc
# 或
which arm-poky-linux-gnueabi-gcc  # 如果是 Yocto 环境

# 1. 找交叉编译器
which arm-linux-gnueabihf-gcc || which arm-none-linux-gnueabi-gcc || find /opt /usr -name "*gcc" -path "*arm*" 2>/dev/null | head -5

2. 确认内核源码路径

你需要有与目标板完全一致的内核源码

bash

复制代码
# 典型路径,根据你的 SDK 调整
KSRC=/path/to/imx6ul-bsp/linux-imx
# 例如 Yocto 环境:
KSRC=/opt/fsl-imx-fb/3.14.38-6UL_ga/sysroots/cortexa7hf-vfp-neon-poky-linux-gnueabi/usr/src/kernel

# 2. 找内核源码
find /home /opt /root -maxdepth 4 -type d -name "linux-*imx*" 2>/dev/null | head -5

3. 确认目标内核版本

bash 复制代码
uname -r   # 如果在目标板上执行

三、驱动移植与编译

1. 修改 Makefile

bash

复制代码
cd rtl8821cu
vim Makefile

针对IMX6UL,你需要这样做:

① 在平台选择区,添加IMX6UL的配置(如果没有现成的ARM平台可用):

makefile

复制代码
CONFIG_PLATFORM_I386_PC     = n    # 关闭PC平台
CONFIG_PLATFORM_ARM_IMX6UL  = y    # 新增你的平台
...其他所有平台 = n

② 在平台设置区,添加IMX6UL的编译参数:

makefile

复制代码
ifeq ($(CONFIG_PLATFORM_ARM_IMX6UL), y)
EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN
ARCH := arm
CROSS_COMPILE := /你的交叉编译器路径/bin/arm-linux-gnueabihf-
KSRC := /你的内核源码路径/linux-imx6ul
MODULE_NAME := 8821cu
endif

参数说明:

表格

参数 含义 你的值
EXTRA_CFLAGS 额外编译标志 -DCONFIG_LITTLE_ENDIAN(ARM都是小端)
ARCH CPU架构 arm
CROSS_COMPILE 交叉编译器前缀 你的工具链路径,如 /opt/fsl-imx-x11/.../bin/arm-linux-gnueabihf-
KSRC 内核源码路径 你的IMX6UL内核源码绝对路径
MODULE_NAME 生成的模块名 8821cu

四、集成驱动到Linux内核树

表格

步骤 操作
1 复制驱动源码到 drivers/net/wireless/rtl8821CU
2 修改 drivers/net/wireless/Makefile,添加 obj-$(CONFIG_RTL8821CU) += rtl8821CU/
3 修改 drivers/net/wireless/Kconfig,添加 source "drivers/net/wireless/rtl8821CU/Kconfig"
4 方法A:make menuconfig 配置内核,选择 ym。方法B:直接修改 defconfig 文件(步骤如下)
5 make 编译内核

.config文件中增加"CONFIG_RTL8821CU=m"

配置内核,启用 RTL8821CU 驱动

bash

bash 复制代码
# 方法A:用 menuconfig 图形界面(推荐)
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig

# 方法B:直接修改 defconfig 文件

如果用 menuconfig:

  1. 进入 Device DriversNetwork device supportWireless LAN

  2. 找到 Realtek 8821C USB WiFi(或类似名称)

  3. M 键设为模块(<M>),或按 Y 键编译进内核(<*>

  4. Esc 退出,保存配置

如果直接改 defconfig:

bash

bash 复制代码
# 找到你的 defconfig 文件
find arch/arm/configs -name "*imx*"

# 编辑,添加配置
echo "CONFIG_RTL8821CU=m" >> arch/arm/configs/imx_v7_defconfig
# 或者编译进内核
# echo "CONFIG_RTL8821CU=y" >> arch/arm/configs/imx_v7_defconfig

3. 编译驱动

方式A:在驱动源码目录独立编译(推荐,调试方便)

bash

复制代码
cd rtl8821CU/
make

编译成功后生成:8821cu.ko

方式B:在内核树中编译

bash

复制代码
cd <kernel_source>
make modules

五、目标板部署

1. 复制驱动

bash

复制代码
# 宿主机执行
scp 8821cu.ko root@imx6ul:/lib/modules/3.14.38-6UL_ga/kernel/drivers/net/wireless/
scp rtl8821cu_fw.bin root@imx6ul:/lib/firmware/rtlwifi/
scp rtl8821cu_config.bin root@imx6ul:/lib/firmware/rtlwifi/

2. 目标板加载

bash

复制代码
# 在 IMX6UL 上执行
depmod -a
modprobe 8821cu

# 查看日志
dmesg | tail -20

# 确认接口
ifconfig -a  # 或 ip link

六、5G 频段配置

1. 设置国家码

bash

bash 复制代码
# 临时设置
iw reg set CN

# 永久设置(写入配置文件)
echo 'REGDOMAIN=CN' > /etc/default/crda

2. 验证 5G 支持

bash

复制代码
# 查看支持的频率
iwlist wlan0 frequency

# 扫描 5G AP
iw dev wlan0 scan | grep "SSID\|freq: 5"

七、可能遇到的硬件问题

表格

现象 排查
插入模块后 lsusb 无变化 检查 USB 焊接、供电(需 3.3V 或 5V)、模块是否损坏
lsusb 显示 0bda:c811 但加载驱动失败 固件缺失,检查 /lib/firmware/
能识别但 ifconfig 无 wlan0 检查 cfg80211mac80211 是否编译进内核
只能连 2.4G,看不到 5G 国家码未设置,或 regdb 数据库缺失
5G 信号弱 检查模块天线接口是否接好,5G 衰减大需要好的天线

八、快速验证流程

bash

bash 复制代码
# 1. 硬件识别
lsusb | grep -i "0bda:c811\|Realtek"

# 2. 驱动加载
lsmod | grep 8821cu
dmesg | grep 8821cu

#或者
insmod /lib/modules/3.14.38-6UL_ga+ge4944a5/kernel/drivers/net/wireless/realtek/rtl8821CU/8821cu.ko


# 3. 网络接口
# 查看驱动是否加载
lsmod | grep 8821cu

# 查看无线接口是否出现
ip link show wlan0

#启用无线接口
ifconfig wlan0 up

# 4. 5G 频段支持
iw phy phy0 info | grep -A 10 "Band 2"  # 5G 是 Band 2

# 5. 扫描测试
iw dev wlan0 scan | grep SSID | head -10

# 6.创建 wpa_supplicant 配置文件
cat > /etc/wpa_supplicant.conf << 'EOF'
network={
    ssid="你的WiFi名称"
    psk="你的WiFi密码"
}
EOF

# 7.连接 WiFi
# 后台运行 wpa_supplicant
wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant.conf

获取 IP 地址
udhcpc -i wlan0

# 8.确认连接成功
# 查看 IP 地址
ifconfig wlan0

# 查看连接信息
iwconfig wlan0

# 测试网络
ping -c 4 8.8.8.8

到这一步就表明连接成功了!