1.1 开发环境的安装
目前我是在 Ubuntu 16 的虚拟机环境下做树莓派相关的开发,以下命令用来安装开发必需的环境
接下来,我会在用户目录下创建raspberry目录来存放内核源码以及编译工具
mkdir ~/raspberry
cd ~/raspberry
1.2 获取树莓派内核源码和交叉编译工具链
可以从GitHub上下载,这里我已经下载好了在云盘里:
https://pan.baidu.com/s/1XRwL05QBGtxuddEtrlXIdQ 提取码:dtk3
将下载好的源码和交叉编译工具链拷贝到raspberry文件夹里面,使用unzip ***命令进行解压,解压后如下
1.3 修改环境变量,以便使用编译工具
编辑用户目录下的 .bashrc,把编译工具的执行路径加入到 PATH变量中,即在文件末尾加入以下两行:因为是64位机,所有这里选择X64,如果是32位机就选择不到X64的32位交叉编译工具链
为使环境变量即时生效,可执行:
1.4 内核配置
当你用树莓派的GPIO连接外设时,通过修改设备树,可以把相关的硬件信息“传给”内核驱动。
树莓派3b+的设备树文件为:
arch/arm/boot/dts/bcm2710-rpi-3-b-plus.dts
首先,可以对内核进行默认的配置
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2709_defconfig
在此基础上,如果你想要做进一步的配置,可执行:
在配置界面进行配置并保存退出即可
1.5 编译内核镜像/模块/设备树
编译好的内核进行zImage存放在 源码目录下arch/arm/boot/zImage
1.6 替换树莓派系统的内核镜像/设备树/模块安装
1.6.1 虚拟机上挂载SD卡
首先需要一张已经写入树莓派系统的内存卡,我们将在内存卡上替换相关的镜像或者文件。
查看SD卡的对应的dev节点:这里对应的节点分别是sdb1和sdb2
在挂载之前需要先建立两个挂接点:
sudo mkdir /mnt/rpi
sudo mkdir /mnt/rpi/fat32
sudo mkdir /mnt/rpi/ext4
接下来把SD卡挂接到虚拟机系统中,挂载完成之后就可以在挂载的文件夹下操作SD卡里面不同分区的内容了,这里可以先查看一下不同分区的内容
1.6.2 打包内核镜像并体会掉SD卡上的内核镜像
内核镜像更新替换前:
打包内核镜像并体会掉SD卡上的内核镜像,打包并替换之前需要进入到树莓派源码目录里面:
cd raspberry/linux-rpi-4.9.y
内核镜像更新替换后:
1.6.3 设备树相关文件替换
sudo cp arch/arm/boot/dts/.dtb /mnt/rpi/fat32/
sudo cp arch/arm/boot/dts/overlays/.dtb* /mnt/rpi/fat32/overlays/
sudo cp arch/arm/boot/dts/overlays/README /mnt/rpi/fat32/overlays/
1.6.4 内核模块安装
sudo make ARCH=arm INSTALL_MOD_PATH=/mnt/rpi/ext4 modules_install
1.6.5 取消SD卡的挂载
1.7 上机测试
内核已经成功更新到4.9版本了