欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

内核与设备树的编译和烧写

程序员文章站 2022-06-24 21:19:35
上一篇文章我记录了UBoot的编译与烧写,现在学习内核与设备树的编写与烧写,也就是zImage和.dbt文件。看过我之前写的uboot通过NFS挂载ubuntu根文件系统这边文章的朋友应该都比较熟悉,在通过nfs挂载根文件系统时,需要在tftp服务器中放入zImage和.dbt文件,之前是用开发板已 ......

上一篇文章我记录了uboot的编译与烧写,现在学习内核与设备树的编写与烧写,也就是zimage和.dbt文件。看过我之前写的uboot通过nfs挂载ubuntu根文件系统这边文章的朋友应该都比较熟悉,在通过nfs挂载根文件系统时,需要在tftp服务器中放入zimage和.dbt文件,之前是用开发板已经编译好的文件,现在尝试着自己编译一下。

一、准备材料

可以根据自己的需要准备相应材料,以下是我自己使用的:
开发环境:vmware
操作系统:ubuntu
开发版:湃兔i2s-6ub

二、下载linux内核文件

之前下载过uboot文件的朋友应该知道,在每个开发版的资料里都有相应的文件,没有的可以找购买开发版的店家要。
这里是湃兔的下载地址
下载完成后将文件拷贝到linux系统下进行解压,解压后会的目录如下图所示:
内核与设备树的编译和烧写
注意:编译时一定要在当前路径下才能编译

三、编译

1.清理项目工程

make arch=arm cross_compile=arm-linux-gnueabihf- distclean

2.设置默认配置文件

make arch=arm cross_compile=arm-linux-gnueabihf- i2som_imx6_defconfig

编译完成后会生成“.config”,如下图所示:
内核与设备树的编译和烧写
注意:湃兔的默认配置文件是“i2som_imx6_defconfig”,不同厂商的默认配置文件有所不同,可与根据相应的资料查看。如湃兔官网的说明,如下图所示
内核与设备树的编译和烧写
3.编译生成kernrl文件

make arch=arm cross_compile=arm-linux-gnueabihf- zimage

4.编译生成.dtb文件

make arch=arm cross_compile=arm-linux-gnueabihf- dtbs

注意:到这里内核与设备树的编译就算完成了,如果细心的小伙伴就会发现,为啥我的命令会长一些。每个指令中都用“arch=arm cross_compile=arm-linux-gnueabihf-”,这是设置编译器为交叉编译器。为了使编译指令简介一些,可以在makefile文件中添加arch和cross_compile的配置,以后就可以编译时就可以省掉命令中的“arch=arm cross_compile=arm-linux-gnueabihf-”部分,如下图所示:
内核与设备树的编译和烧写
5.生成文件的路径
zimage:/arch/arm/boot/目录下
dtb:/arch/arm/boot/dts目录下

四、通过tftp烧写zimage与.dtb文件

1.将zimage和.dtb文件放入tftp服务器中,不会的朋友可以看linux安装配置 tftp服务器
2.进入开发版uboot的命令行,配置tftp服务地址

setenv serverip 192.168.1.99
saveenv 

3.下载zimage文件

tftp 80800000 zimage

4.下载.dtb文件

tftp 83000000 i2c6ulxb-i2s6ull-emmc.dtb

5.启动加载zimage和dtb文件

bootz 80800000 - 83000000

6.验证是否成功
烧写完成后,在kernel启动时会打印编译的时间,如果时间是没问题则说明成功了,启动信息如下图所示:
内核与设备树的编译和烧写

五、常见问题

1.编译生成zimage时可能会出现的错误如下图所示:
内核与设备树的编译和烧写
这个错误主要是开发环境未安装‘lzop’工具,只需安装一下从新编译即可

sudo apt-get install lzop

2.启动时卡死在“starting kernel ...”,如下图所示:
内核与设备树的编译和烧写
不知道是我手里的开发有问题还是怎么回事,只要编译是不如改动其他文件一般不会有配置错误,所以遇到这种情况多重新试几次即可。
3.如图能启动系统,湃兔的开发版还可以通过替换文件进行更新,进入开发版的系统后之心一下操作

mkdir /mnt/linux/
umount /mnt/linux/
mount /dev/mmcblk1p1 /mnt/linux/
cp i2c6ulxb-i2s6ull-emmc.dtb /mnt/linux/zimage-i2c6ulxb-i2s6ull-emmc.dtb; sync
umount /mnt/linux
reboot

官方教程如下图所示:
内核与设备树的编译和烧写
4.启动后会发现不能正常启动,这是因为没有根文件导致的,在这里不急,我们下一篇学习根文件系统的制作
内核与设备树的编译和烧写