Linux下编译RTL88XX系列芯片驱动

驱动编译环境

安装编译所需环境

1
2
3
4
5
6
7
# 本文是在Debian系统下编译的,其他系统至少需要安装make, gcc, linux-header, git

# Debian 系统下编译所需工具
sudo apt install git build-essential bc libelf-dev linux-headers-`uname -r`

# Raspbian 下编译所需工具,其他系统默认已安装
sudo apt install git bc raspberrypi-kernel-headers

编译RTL8812AU/14AU/21AU驱动

1
2
3
4
5
6
7
git clone https://github.com/aircrack-ng/rtl8812au.git
cd rtl8812au/
make clean
make
sudo make install
sudo modprobe -a 8812au
# 模块所在路径 /lib/modules/`uname -r`/kernel/drivers/net/wireless/8812au.ko

编译RTL8811CU/21CU驱动

1
2
3
4
5
6
git clone https://github.com/brektrou/rtl8821CU.git
cd rtl8821CU
make
sudo make install
sudo modprobe -a 8812au
# 模块所在路径 /lib/modules/`uname -r`/kernel/drivers/net/wireless/realtek/rtl8821cu.ko

配置支持的编译选项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 以RTL8812AU为例,修改源码根目录下Makefile中的选项为你所需要的:

# 更多受支持的芯片请查看 Makefile 中的 WIFI IC,默认全选,可只选一项
CONFIG_RTL8812A = y # 编译RTL8812AU驱动
CONFIG_RTL8821A = n # 编译RTL8821AU驱动
CONFIG_RTL8814A = n # 编译RTL8814AU驱动

# 更多平台支持请自行查看 Makefile 中的 Platform Related
CONFIG_PLATFORM_I386_PC = n # Linux X86平台(默认y,只选一项))
CONFIG_PLATFORM_ARM_RPI = y # 树莓派官方32位系统,构建ARM32驱动程序(只选一项)
CONFIG_PLATFORM_ARM64_RPI = n # 树莓派社区64位系统,构建ARM64驱动程序(只选一项)
CONFIG_PLATFORM_ANDROID_X86 = n # Android X86平台(只选一项)

# 更多选项请查看源码下的Makefile

其他出现的问题

  1. 8812AU不支持iw命令,例如iw dev会显示”nl80211 not found.”。并且rfkill list显示为空

  2. 设备名看起来像是一块有线网卡,一般无线网卡都是wl(Wireless)开头的,它是en(Ethernet)

  3. 加载驱动后如果使用ifconfig找不到网卡,请手动打开网卡

1
2
ifconfig -a		# 查看所有网卡
ifconfig wlan0 up # 手动打开网卡
  1. 树莓派的板载网卡和腾达U12网卡变动,就是wlan0和wlan1对应的物理网卡不固定的解决方法
1
2
3
4
# 这里可以只固定一个网卡,那么另一个网卡也就固定了,防止未插网卡的情况
# 编辑 /etc/udev/rules.d/70-persistent-net.rules 文件添加如下:
SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="dc:a6:32:36:8e:0f", NAME="wlan0"
SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="50:2b:73:d1:47:fd", NAME="wlan1"
  1. 驱动所支持的硬件型号保存在rtl88XX/os_dep/linux/usb_intf.c中
1
2
3
4
5
6
7
8
# 如果该驱动不支持你的硬件,那么请添加硬件ID到usb_intf.c里面你的芯片型号中
# 例如 Tenda U12 和 Linksys WUSB6300 硬件设备的定义
#ifdef CONFIG_RTL8812A
......
{USB_DEVICE(0x2604, 0x0012),.driver_info = RTL8812}, /* Tenda - U12 */
{USB_DEVICE(0x13B1, 0x003F),.driver_info = RTL8812}, /* Linksys WUSB6300 */
......
#endif