操作过程
0. 准备
树莓派CM4-CMIO套装(目前只有这套装有PCIE接口)
AX200-WIFI6网卡
一台win10电脑用于我的主电脑用来烧写树莓派固件以及修改boot中的config.txt
一台ubuntu20电脑编译树莓派内核
1. 树莓派cm4基本操作
1.1 烧写最新固件到emmc
请看这里:树莓派CM4和CM4IO上手,https://blog.csdn.net/qq_27158179/article/details/113047158?spm=1001.2014.3001.5501
*. 树莓派默认是用32位内核启动,需要修改 boot 分区下的 config.txt[2] 文件(我的树莓派是运行EMMC上的系统,因此使用USB线连接,让其进入BOOT模式,U盘修改config.txt,最后一行添加)
arm_64bit=1 kernel=kernel8.img
1.2 ssh
树莓派和电脑连到同一个路由器
ssh登录树莓派
账号密码是:pi/raspberry
1.3 更新
sudo apt update
更新完毕后关机。
sudo shutdown -h now
2. 连接AX200
硬件连接AX200,重新让树莓派上电。
注意一般不能带电操作
pi@raspberrypi:~ $ lspci
00:00.0 PCI bridge: Broadcom Limited Device 2711 (rev 20)
01:00.0 Network controller: Intel Corporation Device 2723 (rev 1a)
3. 交叉编译生成kernel,开启intel的wifi驱动工具-iwlwifi
默认内核没有这个iwlwifi工具(intel的wifi驱动),需要重新编译内核
<3.1> 首先下载树莓派的内核
https://github.com/raspberrypi/linux
可以直接使用 git clone --depth=1 --branch rpi-5.9.y https://github.com/raspberrypi/linux 来下载 5.9 版本的内核
个人建议从 github 直接下载 zip 包,分支选择5.9.y,最新的5.10.y不知为什么总是下载失败,文件大小约200MB才是正常尺寸。
<3.2> 然后下载交叉编译工具(x86_64 编译 arm64)
https://releases.linaro.org/components/toolchain/binaries/7.5-2019.12/aarch64-linux-gnu/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz
<3.3> 安装依赖项
sudo apt install git bc bison flex libssl-dev make libc6-dev libncurses5-dev
<3.4> 解压操作
首先把内核源码和编译工具放到同一个给文件夹内~/raspberry
unzip linux-rpi-5.9.y.zip linux-rpi-5.9
tar -xvf gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz
mv gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu gcc-linaro
<3.5>、把交叉编译工具添加到环境变量
首先 nvim ~/.bashrc
在 .bashrc 后面加上:export PATH=$PATH:~/gcc-linaro/bin
然后执行 source ~/.bashrc 刷新环境变量
<3.6>、进行编译前的处理
首先进入内核目录
cd ~/raspberry/linux-rpi-5.9
先用默认配置创建.config文件
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- bcm2711_defconfig
再自定义内核
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- menuconfig
加入iwlwifi:
device drivers > network device support > wireless LAN > intel devices > intel wireless wifi next gen agn(iwlwifi)
device drivers > network device support > wireless LAN > intel devices > intel wireless wifi next gen agn(iwlwifi) > intel wireless wifi MVM
这两个
<3.7>、 fix bug1,如果不改这个,ax200会起不来,错误原因疑似检测温度出错,不断复位
cd ~/raspberry/linux-rpi-5.9/drivers/net/wireless/intel/iwlwifi/mvm
打开fw.c
找到并注释掉(大概第1200行):
/* Init RSS configuration */
//- if (mvm->trans->trans_cfg->device_family >= IWL_DEVICE_FAMILY_22000) {
//- ret = iwl_configure_rxq(mvm);
//- if (ret) {
//- IWL_ERR(mvm, "Failed to configure RX queues: %d\n",
//- ret);
//- goto error;
//- }
//- }
//-
<3.8>、启动编译过程
make -j8 ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- Image modules dtbs
整个编译时间可能会比较长,根据编译机器的硬件处理器数量来制定同时使用多少线程编译(-j{n},这里同时使用8个线程)。
<3.9> 使用sshfs复制编译完的内核到板子
*. pi部分-创建root账号并设置密码
sudo su
passwd #设置root密码
修改/etc/ssh/sshd_config
由
PermitRootLogin prohibit-password
改为
PermitRootLogin yes
sudo reboot
重启后可以用root账号登录
*. ubuntu主机Setting up an SSHFS mount
注意我的树莓派IP是192.168.8.130
sudo apt install sshfs
sudo mkdir -p /mnt/pi-ext4
sudo mkdir -p /mnt/pi-fat32
sudo sshfs root@192.168.8.130:/ /mnt/pi-ext4
sudo sshfs root@192.168.8.130:/boot /mnt/pi-fat32
我树莓派重新安装了系统,如果用同一个IP,会出错error: read: Connection reset by peer
开启调试sudo sshfs root@192.168.8.130:/ /mnt/pi-ext4 -o debug -o sshfs_debug
发现原因是主机更改了密钥
ssh-keygen -f "/root/.ssh/known_hosts" -R 192.168.8.130
Install the kernel modules onto the drive:
cd ~/raspberry/linux-rpi-5.9
sudo env PATH=$PATH make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- INSTALL_MOD_PATH=/mnt/pi-ext4 modules_install
Copy the kernel and DTBs onto the drive:
sudo cp arch/arm64/boot/Image /mnt/pi-fat32/kernel8.img
sudo cp arch/arm64/boot/dts/broadcom/*.dtb /mnt/pi-fat32/
sudo cp arch/arm64/boot/dts/overlays/*.dtb* /mnt/pi-fat32/overlays/
sudo cp arch/arm64/boot/dts/overlays/README /mnt/pi-fat32/overlays/
*. Unmount the filesystems:
sudo umount /mnt/pi-ext4
sudo umount /mnt/pi-fat32
Reboot the Pi and voila!, you're done!
4 安装驱动
AX200官方驱动在这里:https://www.intel.com/content/www/us/en/support/articles/000005511/wireless.html
AX200,复制链接
注意驱动要求内核版本大于等于5.1
mkdir wifi6-ax200
cd wifi6-ax200
wget https://wireless.wiki.kernel.org/_media/en/users/drivers/iwlwifi/iwlwifi-cc-46.3cfab8da.0.tgz
tar xzvf iwlwifi-cc-46.3cfab8da.0.tgz
cd iwlwifi-cc-46.3cfab8da.0/
sudo cp *.ucode /lib/firmware
sudo reboot
发现重启后的 ifconfig中wlan0已经正常了。我的CM4没有内置WIFI的,所以这里是wlan0
5. 连接WIFI,并测试
dmesg还是会有错误的,但是可以不用理会。WIFI正常使用了。
连接wifi使用界面操作
sudo apt install iperf3
# Server 端
iperf3 -s
# Client 端
iperf3 -c SERVER_IP
主要是路由器是MT7688,百兆的。
结尾
本文在树莓派CM4上安装了WIFI6-AX200这款网卡的驱动。大部分都是根据参考资料[3]进行的,参考资料[2]的重要之处是点醒了笔者需要修改config.txt让树莓派运行在arm64,而不是32位。要64位的iwlwifi才会在dmesg中打印信息。
参考1、Raspberry Pi Linux Cross-compilation Environment,https://github.com/geerlingguy/raspberry-pi-pcie-devices/tree/master/extras/cross-compile
参考2、编译树莓派 4B Linux 5.9 内核,https://shumeipai.nxez.com/2020/10/18/compile-raspberry-pi-4b-linux-5-9-kernel.html
参考3、https://www.jeffgeerling.com/blog/2020/wifi-6-gets-134-gbps-on-raspberry-pi-cm4