5 块包邮,挂到 x86_64 debian 12 虚拟机,实测下载能到 22Mbps,也可能就2Mbps,上传能到 40Mbps
关键词:
rtl8xxxu、rtl8xxxu.ko、rtl8xxxu_8188f.c、mac80211.h、cfg80211.ko、sudo modinfo rtl8xxxu.ko | grep depend、sudo modprobe mac80211、sudo modprobe cfg80211
/lib/modules/6.1.0-20-amd64/kernel/net/mac80211/mac80211.ko
/lib/modules/6.1.0-20-amd64/kernel/net/wireless/cfg80211.ko
实际上电脑系统里有/lib/modules/6.1.0-20-amd64/kernel/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.ko
,但是用不了rtl8188ftv
,而且文件大小远小于自己编译的,可能是官方系统编译时 linux 还没有加入rtl8188ftv
的驱动
这里编译成模块,可挂载模块直接测试,不用重启系统
主要依赖 rtl8xxxu.ko
,其代码在linux/drivers/net/wireless/realtek/rtl8xxxu
里,不同的内核版本的代码也会变化,一份代码不可通用,应理解方法自行编译。
主要变化的是系统 api,不重要的就直接注释掉,有的则是结构体成员又包了一层,需要把包了一层的名字加上去,也可以从同一版本的linux内核代码里找,就不改代码。都可以试试
我的 x86_64 debian 12 是 linux 6.1.0-20-amd64,但我是从 linux 6.6 里拿的代码,看起来还支持一些其他型号
这是 Makefile
编译成模块
把 rtl8xxxu
文件夹单独复制出来编译
x86_64 debian 12:
sudo apt install linux-headers-`uname -r` # 安装头文件,也可能系统已经自带
make CONFIG_RTL8XXXU=m -C /lib/modules/`uname -r`/build M=`pwd` modules # -C 后面的路径还可以是 /usr/src/linux-headers-6.1.0-20-common,都是进到 /usr/src/linux-headers-6.1.0-20-common 里
如果编译出现错误,那就是 api 变了。我这次遇到的问题是这个rtl8xxxu_core.c
里的ieee80211_handle_wake_tx_queue
变了,就直接注释了,再编译一次就好了,然后编译出了rtl8xxxu.ko
测试:
$ sudo insmod rtl8xxxu.ko
insmod: ERROR: could not insert module rtl8xxxu.ko: Unknown symbol in module
是因为这个模块还依赖其他模块,查看这个模块依赖哪些东西:
$ sudo modinfo rtl8xxxu.ko | grep depend
depends: usbcore,mac80211,cfg80211
修复:
sudo modprobe cfg80211
sudo modprobe mac80211
sudo insmod rtl8xxxu.ko
没有任何输出就对了
查看模块挂载信息:
$ lsmod | grep rtl
rtl8xxxu 233472 0
mac80211 1175552 1 rtl8xxxu
cfg80211 1142784 2 mac80211,rtl8xxxu
usbcore 348160 12 xhci_hcd,ehci_pci,usbnet,usbhid,usb_storage,rndis_host,ehci_hcd,xhci_pci,cdc_ether,rtl8xxxu,uas,uhci_hcd
把 rtl8188ftv 插上电脑就能看到 wifi 出现了,然后就好了
自动挂载模块:
sudo cp rtl8xxxu.ko /lib/modules/`uname -r`/kernel/drivers/net/wireless/realtek/rtl8xxxu/ # 覆盖原模块
sudo depmod
依靠depmod
扫描 /lib/modules/`uname -r`/
下所有模块生成并生成 modules.xxx
实现自动挂载,在 /lib/modules/6.1.0-20-amd64/
下的 modules.dep
里搜索一下 rtl8xxxu
就明白了。如果有多个同名模块会选择其中一个,所以建议depmod
之后检查一遍modules.dep
不需要重启系统就能自动挂载模块,如果没什么问题就不用测试,直接走自动挂载路线。如果没能自动挂载,也就是插上设备后lsmod | grep rtl
看不到,就看看modules.dep
文件里的模块路径是不是用了系统自带的那个用不起来的同名模块
其实这个还依赖一个配置文件/lib/firmware/rtlwifi/rtl8188fufw.bin
,这个文件是通用的,不区分架构,网上或者 x86_64 debian 里也有,都是这个固定位置
其他架构
比如 jh7110
不要把rtl8xxxu
编译进内核,而是作为模块,因为 rtl8188ftv 要加载rootfs
里的rtl8188fufw.bin
,编译进内核会过早挂载,rootfs
还没启动,会报找不到rtl8188fufw.bin
,内核启动参数添加rootwait
也不行
sudo apt install gcc-riscv64-linux-gnu
make ARCH=riscv CROSS_COMPILE=riscv64-linux-gnu- CONFIG_RTL8XXXU=m -C /media/xiaguangbo/linux_data/data/jh7110/source/linux M=`pwd` modules # -C 后面的路径也可以是其他芯片的 linux 源码
mac80211
cfg80211
编译进内核
比如搜索mac80211
,显示搜索结果,这里已经选中了,所以Symbol: MAC80211 [=y]
会显示[=y]
,没选中的会显示[=n]
,显示效果是立即生效的,但最后要保存
菜单里:按下 y 就显示 *,是编译到内核里,自动挂载。按下 m 显示 M ,是模块,需要把 .ko 复制到 rootfs 里,后面就手动设置一遍自动挂载。n 就是取消选择,框里显示空白
搜索结果里:y 的显示 y,m 的显示 m,没有配置的显示 n
Prompt:
此配置在菜单里显示的名字
Depends on:
依赖的配置和其当前的状态
Selects:
选择此配置就会自动选择的配置和其当前的状态
Location:
此配置的菜单层次路径
(1)、(2)
数字会在 1 到 9 循环,数字所在的菜单层次的那一行是菜单能显示的最后一个层次,后面的还没展开,去菜单里找的时候就找这一行,打开之后后面的层级才会展开
具体的看下linux/net/mac80211/Kconfig
这个文件就明白了
要先打开depends
列出的东西,不然菜单里 rtl 选项不显示。在menuconfig
菜单里按下/
打开搜索,挨个搜索并打开depends
列出的东西,字母大小写都行。RTL8XXXU
在菜单里显示出来的字符串是Realtek 802.11n USB wireless chips support
将rtl8xxxu.ko
放到rootfs
里的 /lib/modules/`uname -r`/
。
一般制作的 rootfs 没有此目录,需要先在开发板上先运行一次 depmod
,会提示找不到/lib/modules/xxx
,然后mkdir -p /lib/modules/`uname -r`/
,再执行一次depmod
,会生成一些.alies .dep
文件,提示警告找不到xxx.order
什么的不用管。
还需要复制一份通用配置文件rtl8188fufw.bin
到rootfs
的/lib/firmware/rtlwifi/
下,没有相应文件夹就新建,因为路径是固定的。如果没有这个配置文件挂载模块就会报找不到rtlwifi/rtl8188fufw.bin
。
复制文件示例:
sudo mount /dev/sdc4 /mnt/ # sdc4 是开发板的 rootfs 所在的分区
sudo mkdir /mnt/lib/modules/6.6.0-g076ede06c00a/module
sudo cp linux/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.ko /mnt/lib/modules/6.6.0-g076ede06c00a/module/
sudo mkdir /mnt/lib/firmware/rtlwifi
sudo cp rtl8188fufw.bin /mnt/lib/firmware/rtlwifi/
sudo umount /mnt
复制好文件后,启动开发板后执行一次depmod
成功:
root@debian:~# usb 1-1.2: new high-speed USB device number 3 using xhci_hcd
usb 1-1.2: RTL8188FU rev B (SMIC) romver 0, 1T1R, TX queues 2, WiFi=1, BT=0, GPS=0, HI PA=0
usb 1-1.2: RTL8188FU MAC: 90:de:80:20:eb:6f
usb 1-1.2: rtl8xxxu: Loading firmware rtlwifi/rtl8188fufw.bin
usb 1-1.2: Firmware revision 4.0 (signature 0x88f1)
rtl8xxxu 1-1.2:1.0 wlx90de8020eb6f: renamed from wlan0
root@debian:~# lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub
Bus 001 Device 003: ID 0bda:f179 Realtek Semiconductor Corp. RTL8188FTV 802.11b/g/n 1T1R 2.4G WLAN Adapter
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
root@debian:~# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host noprefixroute
valid_lft forever preferred_lft forever
2: end0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 6c:cf:39:00:6d:d6 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.71/24 brd 192.168.1.255 scope global dynamic noprefixroute end0
valid_lft 259180sec preferred_lft 259180sec
inet6 240e:3a1:ef0:6c60:4576:3a89:df07:6ad5/64 scope global dynamic noprefixroute
valid_lft 7179sec preferred_lft 3579sec
inet6 fe80::cfaa:6af3:a323:4950/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: end1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN group default qlen 1000
link/ether 6c:cf:39:00:6d:d7 brd ff:ff:ff:ff:ff:ff
4: wlx90de8020eb6f: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
link/ether c2:8b:09:9c:5f:c2 brd ff:ff:ff:ff:ff:ff permaddr 90:de:80:20:eb:6f
root@debian:~# nmcli r wifi on # 打开 wifi
root@debian:~# nmcli dev wifi # 扫描 wifi,按 q 退出页面
IN-USE BSSID SSID MODE CHAN RATE SIGNAL BAR>
2C:61:04:F9:FD:4E 360WiFi-F9FD4E Infra 11 130 Mbit/s 70 ▂▄▆>
10:39:4E:1C:45:F9 ChinaNet-45F7 Infra 11 270 Mbit/s 57 ▂▄▆>
C0:B1:01:1F:28:CA 1205 Infra 3 270 Mbit/s 40 ▂▄_>
root@debian:~# nmcli dev wifi connect "ChinaNet-45F7" password "12345678"
wlx90de8020eb6f: authenticate with 10:39:4e:1c:45:f9
wlx90de8020eb6f: send auth to 10:39:4e:1c:45:f9 (try 1/3)
wlx90de8020eb6f: authenticated
wlx90de8020eb6f: associate with 10:39:4e:1c:45:f9 (try 1/3)
wlx90de8020eb6f: RX AssocResp from 10:39:4e:1c:45:f9 (capab=0x1431 status=0 aid=18)
usb 1-1.2: rtl8xxxu_bss_info_changed: HT supported
wlx90de8020eb6f: associated
Device 'wlx90de8020eb6f' successfully activated with 'd0c8f546-cc5e-42e4-b57a-a36a3a62d096'.
root@debian:~# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host noprefixroute
valid_lft forever preferred_lft forever
2: end0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 6c:cf:39:00:6d:d6 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.71/24 brd 192.168.1.255 scope global dynamic noprefixroute end0
valid_lft 258880sec preferred_lft 258880sec
inet6 240e:3a1:ef0:6c60:4576:3a89:df07:6ad5/64 scope global dynamic noprefixroute
valid_lft 7190sec preferred_lft 3590sec
inet6 fe80::cfaa:6af3:a323:4950/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: end1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN group default qlen 1000
link/ether 6c:cf:39:00:6d:d7 brd ff:ff:ff:ff:ff:ff
4: wlx90de8020eb6f: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 90:de:80:20:eb:6f brd ff:ff:ff:ff:ff:ff
inet 192.168.1.73/24 brd 192.168.1.255 scope global dynamic noprefixroute wlx90de8020eb6f
valid_lft 259188sec preferred_lft 259188sec
inet6 240e:3a1:ef0:6c60:f781:6626:fa4:9f43/64 scope global dynamic noprefixroute
valid_lft 7190sec preferred_lft 3590sec
inet6 fe80::4a36:54:6075:a6d3/64 scope link noprefixroute
valid_lft forever preferred_lft forever
root@debian:~#