树莓派linux源码的配置
小tips
精彩博文: https://blog.csdn.net/nicekwell/article/details/78482833
-
树莓派Linux源码配置
驱动代码的编写
驱动代码的编译需要一个提前编译好的内核
编译内核就必须配置
配置的最终目标会生成.config文件,该文件指导Makefile去把有用东西组织成内核
厂家配linux内核源码,比如说买了树莓派,树莓派linux内核源码 -
第一种方式:
cp 厂家.config .conflg
-
第二种方式:
make menuconfig一项项配置,通常是基于厂家的config来配置
-
第三种方式:
完全自己来
一、配置树莓派linux内核:
1、配置config
1.1将厂家的bcm2709_defconfig变成.config
在/linux-rpi-4.14.y中执行命令:
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make bcm2709_defconfig
说明:指定arm架构,指定编译器是arm-linux-gnueabihf-,树莓派指定的kernel7,主要核心命令是make bcm2709_defconfig
厂家的bcm2709_defconfig变成了.config
2.内核配置
安装必要的库:
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
会看到这个界面
- 驱动两种加载方式:
* 编译进内核 zImage包含了驱动
M 模块方式生成驱动文件xxx.ko 系统启动后,通过命令inmosd xxx.ko加载
二.内核编译
2.1编译
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make -j4 zImage modules dtbs
-j4 :指定你的内核用多少资源来编,4就是4核(线程)
zImage :生成zImage,生成内核镜像
modules:要生成驱动模块(树莓派独有)
dtbs :生成配置文件(树莓派独有)
大概要跑20分钟左右
如果刚跑起来10秒就出错,就要检查前面的交叉编译工具链、内核配置有没有做。
2.2编译成功
编译成功后,看到源码树目录多了vmlinux,失败则无此文件。
成功后,目标zImage镜像(这就是我们想要的东西,)在arch/arm/boot底下(不仅树莓派是这样的,编译nanopi,mini2440,mini6410等arm架构的都是在这个文件夹底下生成zImage)
2.3打包zImage成树莓派可用的xxx.img
回到源码树目录/linux-rpi-4.14.y进行操作
把zImage打包成树莓派可用的kernel_new.img
./scripts/mkknlimg arch/arm/boot/zImage ./kernel_new.img
这样就打包成功了!
三.镜像的拷贝
拔出树莓派sd卡,插到读卡器,插到电脑,把它映射到虚拟机
点击虚拟机右下角的图标:
挂在到虚拟机后输入dmesg查看底层硬件数据:
树莓派的sd卡有两个分区:
sdb1:一个fat分区,是boot相关的内容,kernel的img文件就放在这个分区里;
sdb2:一个是ext4分区,也就是系统的根目录分区。
四.数据拷贝
在工作目录:
mkdir data1
mkdir data2
-
挂载u盘:
sudo mount /dev/sdb1 ./data1
sudo mount /dev/sdb2 ./data2 -
安装modules,设备驱动文件:HDMI,USB,WIFI,IO …
进入到/SYSTEM/linux-rpi-4.14.y,执行操作:
sudo ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make INSTALL_MOD_PATH=/home/sct/data2 modules_install
其中的/home/sct/data2是挂载ext4根目录分区的绝对路径
- 安装更新kernel.img文件,注意镜像名字是kernel7.img
- 备份
为了防止刷机失败导致树莓派启动不了,我们先备份一份kernel7.img
cp kernel7.img kernelOLD.img
- 拷贝内核
进入linux-rpi-4.14.y文件夹:
cd linux-rpi-4.14.y/
更新kernel7.img:
cp kernel_new.img /home/sct/data1/kernel7.img
查看是否拷贝有误,两个值相同则无误
md5sum kernel_new.img
md5sum /home/sct/data1/kernel7.img
- 拷贝配置文件
进入/linux-rpi-4.14.y文件夹,依次执行:
cp arch/arm/boot/dts/.*dtb* /home/sct/data1
将.*dtb*文件全部拷过来
cp arch/arm/boot/dts/overlays/.*dtb* /home/sct/data1/overlays/
将.*dtb*文件全部拷过来
cp arch/arm/boot/dts/overlays/README /home/sct/data1/overlays/
五.恢复树莓派串口文件
因为树莓派在做串口编程时会修改cmdline.txt里面的内容,所以我们还原它,以便用串口重启树莓派内成功
dwc_otg.lpm_enable=0 console=tty1 console=serial0,115200 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
也就是添加了console=serial0,115200。
还原后保存,sd卡插入树莓派,使用串口初始化树莓派
六.如何确认自己更换内核成功?
uname -r
- 这是以前的版本
- 这是现在的版本
我可以看到98,变成了114,即更换成功