树莓派3B+内核编译

  • 获取内核源码,https://github.com/raspberrypi。

选着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/

  • 替换内核文件kernel7.img

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  mtu 65536

        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  mtu 1500

        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的节点。

树莓派3B+内核编译_第1张图片

然后重新编译dts,生成dtb文件,替换原来文件bcm2710-rpi-3-b-plus.dtb。保存,重启。

再次查看网卡,发现有线网卡已经正常。

你可能感兴趣的:(学习)