树莓派4.14内核替换

原文来自青木大哥
https://blog.csdn.net/weixin_45309916/article/details/107525503

为什么要进行树莓派的源码配置呢?
是为了驱动代码的编写,驱动代码的编译需要一个提前编译好的内核,编译内核就必须配置,配置的最终目标会生成 .config文件,该文件指导Makefile去把有用东西组织成内核

1.获取树莓派源码,安装好交叉编译工具
源码及工具: https://github.com/raspberrypi/
交叉编译工具的具体安装https://blog.csdn.net/qq_46777053/article/details/110221159
编译工具安装好后,所以的make命令都要指明一些环境变量

ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7

ARCH=arm 指定为RAM框架。指明当前要编译arm,虽然树莓派是64位的,这里仍然选择arm,而不是arm64。
CROSS_COMPILE 指明交叉工具链名称。
KERNEL 指明kernel类型,树莓派1设置为kernel,树莓派2、3设置为kernel7。

2.配置.config
linux源码中有很多工程:
树莓派1的工程是bcmrpi_defconfig;
树莓派2、3的工程是bcm2709_defconfig。

方法一:(1)cp 厂家.config .config
比如: 厂家配linux内核源码,比如说买了树莓派,树莓派linux内核源码
在源码目录下执行

ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make bcm2709_defconfig

make bcm2709_defconfig 为主要核心命令

方法二:一项项的配置,此方法需要安装ncurse库
安装必要的库

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

执行以下语句进行配置

ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make menuconfig

进入配置页面
在这里插入图片描述
上下左右键进行操作
Enter进入下一个子菜单(末尾带箭头的会有子菜单)
" M " 模块方式生成驱动文件xxx.ko 系统启动后,通过命令inmosd xxx.ko 加载
" * " 编译进内核 zImage包含了驱动
对需要的驱动进行筛选,将其配置为空格,达到内核裁剪的目的

方法三:完全自己来

3.编译

ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make -j4 zImage modules dtbs

make -j4 zImage modules dtbs 核心主要命令
-j4 采用四核处理器来编译
zImage 编译生成内核镜像
modules 编译生成驱动模块(树莓派独有的)
dtbs 编译生成配置文件等等 (树莓派独有的)

编译成功后,看到源码树目录多了vmlinux(没有压缩的Linux),失败则无此文件,成功后,目标zImage镜像在arch/arm/boot底下

对zImage进行打包,运用内核源码树目录下的scripts文件在的脚本文件进行打包,打包生成kernel_new.img,

./scripts/mkknlimg arch/arm/boot/zImage ./kernel_new.img

4.挂载树莓派SD卡
dmesg 命令是查看内核信息,有设备接入的时候,内核会打印驱动层面的内容,通过此查看SD卡是否接入ubuntu系统电脑
出现内核打印以下信息,说明以及接入

sdb:sdb1 sdb2 

把树莓派的sd卡插入ubuntu系统电脑,树莓派的sd卡有两个分区:
一个fat分区,是boot相关的内容,kernel的img文件就放在这个分区里;
一个是ext4分区,也就是系统的根目录分区。
fat分区可以不用root权限操作,ext4分区需要root权限操作。
(1)创建两个文件夹

mkdir data1 data2

(2)挂载sdb1和sdb2 到 data1 data2

sudo mount /dev/sdb1 data1   一个fat分区,是boot相关的内容,kernel的img
sudo mount /dev/sdb2 data2   一个是ext4分区,也就是系统的根目录分区。

然后就能查看SD中的数据,也能对SD中的数据进行操作

5.安装modules( 设备驱动文件: hdmi usb wifi io 等等)
在linux内核源码树目录下执行

sudo ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make INSTALL_MOD_PATH=/home/xxx/data2 modules_install

INSTALL_MOD_PATH=/home/xxx/data2 data2的绝对路径
操作ext4分区,需要root权限,前边加上sudo

6.安装更新 kernel.img (注意镜像名字是kernel7.img)
先备份kernel7.img ,避免刷机失败树莓派无法启动
cd /home/xxx/data1
cp kernel7.img kernel7OLD.img
然后将在Linux源码树目录下的kernel_new.img 拷贝到 /home/xxx/data1
将kernel7.img覆盖

cp kernel_new.img  /home/xxx/data1/kernel7.img

7.拷贝配置文件

	cp arch/arm/boot/dts/.*dtb* /home/xxx/data1
	cp arch/arm/boot/dts/overlays/.*dtb* /home/xxx/data1/overlays/
	cp arch/arm/boot/dts/overlays/README  /home/xxx/data1/overlays/

8.断开SD开的连接 把SD开的连接接到电脑上
1.修改codline.txt文件

dwc_otg.lpm_enable=0 console=tty1 console=serial0,115200 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait

2.修改config.tex文件**
在文件的末尾加上(如果有这句,就不需要加),目的是断开蓝牙占用串口

dtoverlay=pi3-miniuart-bt

3.通过串口登录树莓派
通过串口登录树莓派,目的是看操作系统能否启动
uname -r 查看内核版本
原先内核
在这里插入图片描述
更换内核后
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_46777053/article/details/112970351