百度 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
加载中...

(。・∀・)ノ゙嗨,欢迎来到 lookas 的小站!

这里是 lookas 记录一些事情的地方,可能不时会有 lookas 的一些神奇的脑洞或是一些不靠谱的想法。

总之多来看看啦。