选着linux工程代码,https://github.com/raspberrypi/linux,版本分支选择rpi-4.14.y
如果已经有内核配置文件则不需要此步骤。
在当前运行系统中执行如下命令可以获取config.gz配置文件,
pi@raspberrypi:~$ sudo modprobe configs
pi@raspberrypi:~$ ls /proc/con*
/proc/config.gz /proc/consoles
pi@raspberrypi:~$ zcat /proc/config.gz > board.config
将获得的内核配置文件取出,用作rpi-4.14.y的配置文件。
确认交叉编译工具链,可以从github取得,https://github.com/raspberrypi/tools。
本文档使用的交叉编译工具:tools-master/arm-bcm2708/arm-rpi-4.9.3-linux-gnueabihf
进入从github取得的内核目录,
??/linux-rpi-4.14.y
生成.config文件,
cp board.config .config
查看内核配置,并确认生成.config,
make menuconfig ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
接着安装模块到指定目录,
make modules_install ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=??/modules
将内核和打包好的安装模块,拷贝到树莓派单板上(测试Ip设为了192.168.1.11)。
tar -zcf modules.tar.gz modules/
scp modules.tar.gz pi@192.168.1.11:~/
scp arch/arm/boot/zImage pi@192.168.1.11:~/
将modules.tar.gz解压,放到正确的目录,
pi@raspberrypi:~$ tar -zxf modules.tar.gz
pi@raspberrypi:~$ sudo cp modules/lib/modules/4.14.93-v7 /lib/modules/
pi@raspberrypi:~$ sudo cp zImage /boot/kernel7.img
pi@raspberrypi:~$ sync
pi@raspberrypi:~$ sudo reboot
重启,查看各驱动模块是否正常。如下:
pi@raspberrypi:~$ lsusb
Bus 001 Device 005: ID 1c4f:0002 SiGma Micro Keyboard TRACER Gamma Ivory
Bus 001 Device 004: ID 093a:2510 Pixart Imaging, Inc. Optical Mouse
Bus 001 Device 006: ID 0424:7800 Standard Microsystems Corp.
Bus 001 Device 003: ID 0424:2514 Standard Microsystems Corp. USB 2.0 Hub
Bus 001 Device 002: ID 0424:2514 Standard Microsystems Corp. USB 2.0 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
还可以观察桌面图标是否正常,鼠标键盘是否正常。
直到上一步,基本上没什么大问题。几乎所有外设都能正常使用,除了网卡。
pi@raspberrypi:~$ ifconfig -a
lo: flags=73
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
wlan0: flags=4099
ether b8:27:eb:b9:48:0a txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
可以看到eth0网卡并没有显示出来。
跟踪内核源码,或者查看dmesg信息,可以发现问题所在。文件lan78xx.c,
node = of_get_child_by_name(dev->udev->dev.of_node, "mdio");获取设备树的mdio节点失败。
将原设备树目标文件反编译出来查看,
pi@raspberrypi:~$ dtc -I dtb -O dts -o rasp.dts /boot/bcm2710-rpi-3-b-plus.dtb
发现usb节点下面没有mdio相关子节点,相反,它使用了phandle的方式,新编译进去的内核由于版本的差异,无法解析phandle指向的地址。所以网卡没有驱动成功是当前设备树配置的问题。
由于bcm2710-rpi-3-b-plus.dtb文件不能删除,或者更名,否则单板启动失败。只能在原基础上修改设备树。编辑之前反编译出来的rasp.dts文件。作如下修改,可以再源码里面找到bcm283x-rpi-lan7515.dtsi这个文件,找到mdio的节点。
然后重新编译dts,生成dtb文件,替换原来文件bcm2710-rpi-3-b-plus.dtb。保存,重启。
再次查看网卡,发现有线网卡已经正常。