由于墙挡住了路由器WIFI信号,虽然5G频率的WIFI传输速率很快,但是信号衰减。WIFI无线通信是双方向的,就算路由信号能覆盖到,但考虑到手机或笔记本功率和天线的限制,难保证信号稳定。所以在淘宝上买了一个功能还算强大的无线网卡ComFast 926AC v2,双频WIFI外置双天线。没提前研究,“号称免驱动",结果拿回来就懵了。
安装驱动
设备: Comfast 926AC v2 系统: Ubuntu 18.04
因为是联发科的芯片,通常都是在同一份驱动代码上改改完成的。故从github上寻找了下面两个仓库的代码。
ulli-kroll/mt7612u, jurobystricky/Netgear-A6210 官方驱动
上面两驱动实际是在官方源码上改写的,但编译后,三个都不能正常工作。
后来在openwrt/linux
项目下发现该设备驱动的相关issue, 并已有大牛正在mt76驱动项目下加入该芯片的支持。故转用mt76的设备。查询linux主仓库代码发现,该驱动已随Linux内核5.0发布。因此直接下载linux 5.0内核包安装就行了。
# 5.0: https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.0/
linux-headers-5.0.0-050000_5.0.0-050000.201903032031_all.deb
linux-headers-5.0.0-050000-generic_5.0.0-050000.201903032031_amd64.deb
linux-image-unsigned-5.0.0-050000-generic_5.0.0-050000.201903032031_amd64.deb
linux-modules-5.0.0-050000-generic_5.0.0-050000.201903032031_amd64.deb
手动升级内核后测试能使用, 并支持AP:
iwconfig
wlx40a5eff2b655 IEEE 802.11 ESSID:off/any
Mode:Managed Access Point: Not-Associated Tx-Power=19 dBm
Retry short limit:7 RTS thr:off Fragment thr:off
Power Management:off
- 网卡识别为存储设备的问题
mt76还未对这款comfast网卡适配,所以默认会被系统识别为存储设备,可以手动切换过来:
sudo usb_modeswitch -KW -v 0e8d -p 2870
或者修改/lib/udev/rules.d/40-usb_modeswitch.rules
文件自动切换(目前未成功)
# MT7612U
ATTR{idVendor}=="0e8d", ATTR{idProduct}=="2870", RUN+="usb_modeswitch '%b/%k'"
- USB底座接触不良的问题
一起买的底座有点问题,开始还以为也要装什么驱动。检查后发现是接触不良的问题,因为USB口没有固定住,所以网卡很容易没有插入到底座中。解决办法比较简单,拆卸底座,然后填充底座中空部分,固定住USB接口。
- 其他适配问题
网卡的LED灯不能正常工作。
pi@raspberrypi:~ $ sudo ifconfig wlan1 down
pi@raspberrypi:~ $ sudo ifconfig wlan1 hw ether 00:28:C7:0A:42:A2
pi@raspberrypi:~ $ sudo ifconfig wlan1 up
尝试在树梅派上编译驱动
4.19.y已经加入mt7612u的支持,但是经过测试,并不能使用。[更新] 在5.1.y上编译可以正常使用(STA模式), 注意默认缺失了/lib/firmware/mt7662.bin /lib/firmware/mt7662_rom_patch.bin
两个文件,可以从其它系统拷贝或网络下载到树梅派。
[ 247.230807] usb 1-1.5: new high-speed USB device number 5 using dwc_otg
[ 247.362296] usb 1-1.5: New USB device found, idVendor=0e8d, idProduct=7612, bcdDevice= 1.00
[ 247.362311] usb 1-1.5: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 247.362321] usb 1-1.5: Product: 802.11ac WLAN
[ 247.362331] usb 1-1.5: Manufacturer: MediaTek Inc.
[ 247.362342] usb 1-1.5: SerialNumber: 000000000
[ 247.620811] usb 1-1.5: reset high-speed USB device number 5 using dwc_otg
[ 247.752088] mt76x2u 1-1.5:1.0: ASIC revision: 76120044
[ 247.773734] mt76x2u: probe of 1-1.5:1.0 failed with error -22
[ 247.773857] usbcore: registered new interface driver mt76x2u
安装过程:
- 首先更新内核版本 高版本内核可能要求4.15以上才可以直接升级,所以先使用rpi-update升级到最新版本内核(4.19.y)
# 这里也把rpi-update一起装了
sudo apt-update && sudo apt install -y rpi-update rpi-source
# 执行升级
sudo rpi-update
# 如果使用rpi-update升级后又回退过,可能不能再次使用rpi-update升级回来
# Trick: 更改/boot/.firmware_revision然后,再次执行rpi-update
sudo reboot
- 拉取源码
rpi-source
# 链接到build
sudo ln -s `pwd`/linux-789277d012f4a9ba1b032c298c3ebe2db5d91835 /lib/modules/$(uname -r)/build
- 安装工具
sudo apt-get install git bison flex libssl-dev bc libncurses5-dev
- 生成编译配置
KERNEL=kernel7
make bcm2709_defconfig
# menuconfig来配置,默认disable了mt76x2, (先用斜杠搜索mt76菜单,再进入,可以上下翻页)
make menuconfig
- 开始编译
#-j4 分配到4个核来编译
make -j4 zImage modules dtbs
- 安装
sudo make modules_install
sudo cp arch/arm/boot/dts/*.dtb /boot/
sudo cp arch/arm/boot/dts/overlays/*.dtb* /boot/overlays/
sudo cp arch/arm/boot/dts/overlays/README /boot/overlays/
sudo cp arch/arm/boot/zImage /boot/$KERNEL.img
# reboot
Tips: 编译来自三方源码的驱动:
cd <PATH-TO-DRIVER-SRC>
make -C /lib/modules/$(uname -r)/build M=$pwd modules
其他问题解决
dhcp, 使用时碰到了无法从路由器获取ipv4地址的情况,可以设置dhcp加入新的wlan1
网络接口,并注意设置好DNS,否则会影响上网
- ip route
默认的ip route可能会出错或者wlan1优先级低而不能正常接入网络作中继。参考以下可以工作的配置
pi@raspberrypi:~ $ ip route show
default via 192.168.0.1 dev wlan1 src 192.168.0.129 metric 305
192.168.0.0/24 dev wlan1 proto kernel scope link src 192.168.0.129 metric 305
192.168.21.0/24 dev wlan0 proto kernel scope link src 192.168.21.1 metric 303
设置iptables
sudo iptables -t nat -A POSTROUTING -o wlan1 -j MASQUERADE
这里我使用网络中继的主要原因是只将只能设备接入树梅派发射的局域网而不是直接接入到路由器上。