一、前言
为什么要进行树莓派的源码配置呢?
- 驱动代码的编译需要一个提前编译好的内核
- 编译内核就必须配置,配置的最终目标会生成 .config文件,该文件指导Makefile去把有用的东西组织成内核
3种配置方式
- cp 厂家.config .config
- make menuconfig 一项项手动选择配置,通常是基于厂家的config来配置
- 完全自己来
二、需要安装的库
sudo apt-get install bc
sudo apt-get install libncurses5-dev libncursesw5-dev
sudo apt-get install zlib1g:i386
sudo apt-get install libc6-i386 lib32stdc++6 lib32gcc1 lib32ncurses5
三、获取交叉编译工具和树莓派源码
交叉编译工具
https://blog.csdn.net/weixin_54178481/article/details/118890820
树莓派内核源码
https://blog.csdn.net/weixin_54178481/article/details/118934179
四、配置config
linux源码中有很多工程可以通过find指令查看:
find . -name *_defconfig
树莓派1的工程是bcmrpi_defconfig
树莓派2、3的工程是bcm2709_defconfig
1. 方式一
cp 厂家.config .config
进入树莓派源码文件夹 linux-rpi-4.14.y
获取bcm2709_defconfig的配置到 .config里 指令:
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make bcm2709_defconfig
- ARCH=arm 是指定ARM架构
- CROSS_COMPILE=arm-linux-gnueabihf- 是指定编译器
- KERNEL=kernel7 是树莓派内核
- make bcm2709_defconfig 是主要核心指令
2. 方式二
make menuconfig 一项项手动选择配置,通常是基于厂家的config来配置
进入树莓派源码文件夹 linux-rpi-4.14.y
输入指令进入配置页面
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make menuconfig
上下左右键进行操作
Enter进入下一个子菜单(末尾带箭头的会有子菜单)
[*] 编译进内核 zImage包含了驱动
M 以模块方式生成驱动文件xxx.ko 系统启动后,通过命令inmosd xxx.ko 加载
五、树莓派Linux内核编译
编译指令:
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make -j4 zImage modules dtbs
- -j4 :指定用几核心(进程)来编译(根据虚拟机的硬件选择)
- zImage:生成内核镜像
- modules:要生成的驱动模块
- dtbs:生成配置文件
查看是否编译成功:成功会在源码树目录下生成vmlinux文件(没有压缩的linux),失败则无此文件
成功后,arch/arm/boot 生成了zImage目标镜像
打包zImage成树莓派可用的xxx.img指令:
./scripts/mkknlimg arch/arm/boot/zImage ./kernel_new.img
六、安装编译出的DIRECTLY 到树莓派sd卡
1. 将树莓派的SD卡连接到ubuntu
输入指令:dmesg 查看SD卡是否连接成功,如果成功会显示:sdb:sdb1 sdb2
也可以通过观察ubuntu桌面有boot图标生成右下角是否有MXT USB Device设备连接
2. 数据拷贝:
- 树莓派的sd卡有两个分区:
一个 fat 分区,是boot相关的内容,kernel 的 img 文件就放在这个分区里
一个 ext4 分区,也就是系统的根目录分区 - 创建两个文件夹
存放内核镜像
mkdir data1
存放根目录文件
mkdir data2
- 挂载sdb1 和 sdb2 到 data1 data2 成功后SD卡才有数据
sudo mount /dev/sdb1 data1
sudo mount /dev/sdb2 data2
3. 安装modules (设备驱动文件)
进入linux-rpi-4.14.y路径下输入指令:
sudo ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make INSTALL_MOD_PATH=/home/gx/data2 modules_install
/home/gx/data2 为ext4分区挂载到的文件夹绝对路径
4. 安装更新 kernel.img 文件
安装更新kernel.img文件,注意:镜像名字是kernel7.img
避免刷机失败,我们把 kernel7.img 备份一下:
进入data1
cp kernel7.img kernel7OLD.img
再把编译新生成的 kernel_new.img 拷贝到 data1 ,起名:kernel7.img
进入linux-rpi-4.14.y
cp kernel_new.img /home/gx/data1/kernel7.img
注:通过指令 md5sum 文件名 可以查看文件是否一致
5. 拷贝其他相关文件
进入linux-rpi-4.14.y,均拷贝到fat分区也就是data1文件夹下
cp arch/arm/boot/dts/.*dtb* /home/gx/data1
cp arch/arm/boot/dts/overlays/.*dtb* /home/gx/data1/overlays
cp arch/arm/boot/dts/overlays/README /home/gx/data1/overlays
七、将树莓派出串口用来实现串口登录,观察树莓派能否启动
如果本来就是使用网路登录树莓派的可以忽略1、2步直接第3步即可查看是是否成功
1. 断开SD卡与ubuntu的连接,把SD卡的连接接到电脑上
2. 修改 cmdline.txt 文件
dwc_otg.lpm_enable=0 console=tty1 console=serial0,115200 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
3.将SD卡插回树莓派,启动树莓派
uname -r 查看内核的版本是否和我们开始下载的一致,一致则恭喜更换树莓派内核成功