百度 Edgeboard (Alinx) FZ3B 上 Ubuntu 18.04 安装 RT5370 无线网卡驱动
2022-05-13
很悲伤的是,系统内并没有直接提供这个无线网卡的驱动,但是好在这个设备在内核中有支持,所以,我们还可以通过手动编译内核,将驱动编译成模块的方式在不替换内核的前提下,添加这个设备的支持。
关于官方提供的驱动程序
官方提供的驱动程序需要在 /lib/module/`uname -r`/build
下有 Linux 源代码来编译模块,在一般的发行版中可以通过执行 apt install linux-headers-`uname -r`
来在这个目录中安装需要的文件,但是我们的内核是百度使用 xilinx 提供的代码自己编译的,同时也没有提供这个文件。
获取源代码树
不过我们可以自己获取编译所需要的代码。同时发现在这个代码库里也有我们需要的代码:
linux-xlnx/Kconfig at 17d102b6645ddeb6ea963f92290f52a343c336df · Xilinx/linux-xlnx
wget https://github.com/Xilinx/linux-xlnx/archive/refs/tags/xilinx-v2018.3.zip
unzip xilinx-v2018.3.zip
cd linux-xlnx-xilinx-v2018.3
Ref:
提取 config
官方系统并没有在 boot 目录里放上我们需要的 config,不过好在 /proc
里有我们需要的
cp /proc/config.gz .
gunzip config.gz
mv config .config
安装编译所需要的环境
menuconfig 需要系统中存在 curses,且编译过程中需要 bc
apt install libncurses5-dev bc -y
开始编译
在 menuconfig 中可以通过 /
来搜索我们想要的选项的位置
# Enable the rt2x00 module
# Device Drivers > Network device support > Wireless LAN > Ralink driver support: [M]
# ... > Ralink driver support > Ralink rt27xx/rt28xx/rt30xx (USB) support: [M]
# ... > Ralink driver support > Ralink rt27xx/rt28xx/rt30xx (USB) support > rt2800usb - Include support for rt53xx devices (EXPERIMENTAL): [*]
# ... > Ralink driver support > Ralink rt27xx/rt28xx/rt30xx (USB) support > rt2800usb - Include support for rt33xx devices: [ ] unselected
# ... > Ralink driver support > Ralink rt27xx/rt28xx/rt30xx (USB) support > rt2800usb - Include support for rt35xx devices (EXPERIMENTAL): [ ] unselected
make menuconfig
make prepare
make modules_prepare
make SUBDIRS=scripts/mod
make SUBDIRS=drivers/net/wireless/ralink/rt2x00 modules
make SUBDIRS=drivers/net/wireless/ralink/rt2x00 modules_install
Ref: How do I build a single in-tree kernel module? - Ask Ubuntu
解决 Unknown symbol crc_ccitt
错误
手动编译 crc_ccitt 模块(在选择驱动的时候,这个已经被选择了,但是后面并没有编译,所以需要手动编译一下)
make SUBDIRS=lib modules
make SUBDIRS=lib modules_install
Ref: ppp_async: Unknown symbol crc_ccitt_table (err 0) - 紫枫术河 - 博客园
解决 rt2x00lib_request_firmware: Error - Failed to request Firmware
错误
一些设备会将运行需要的代码数据等,以二进制形式放在主机系统里。在设备运行时,由驱动加载到设备中。对于这部分代码,Linux 叫做 firmware,需要安装:
apt install linux-firmware
解决 could not insert module rt2800lib.ko: Unknown symbol in module
错误
使用 modprobe
可以自动解决依赖问题,如果还存在问题,可以通过 dmesg
查看内核以及模块产生的错误。
解决 Module xxx not found in directory
错误
需要在安装模块后更新模块依赖表。
modprobe 会根据 depmod 所产生的相依关系,决定要载入哪些模块。
depmod
Ref: xubuntu - Can't Install Ralink RT3290 Driver on Ubuntu 18.10 - Ask Ubuntu
启用模块并清理环境
modprobe rt2800usb
nmtui # connect to wifi
cd ..
rm -r linux-xlnx-xilinx-v2018.3 xilinx-v2018.3.zip
Ref: How to Connect to WiFi from Terminal on Ubuntu 20.04
解决网络卡顿问题
vi /etc/NetworkManager/conf.d/default-wifi-powersave-on.conf
# wifi.powersave = 3 -> 2