准备工作
虚拟机:VM-Ware 16.2.3
操作系统:Ubuntu Linux 16.04
交叉编译器:arm-linux-gcc-4.6.4
工作文件夹:/home/work
“ 迅为iTOP-4412精英版之linux内核移植(一)_WL_arm的博客-CSDN博客 https://blog.csdn.net/Eva20192020/article/details/133752417?spm=1001.2014.3001.5502 ”
一、概念
什么是设备树
设备树device tree,简称dt在linux中用来做参数的表示和传递。在早期的linux版本其实也有参数的表示和传递的行为,例如uboot给kernel通过bootages传参,只不过那种做法并不太好,而设备树则更巧妙的解决了这种问题。
设备树是一个合集,主要包含了dts(device tree source)设备树源文件、dtc(device tree compiler)设备树编译/反编译/调试工具、dtb(device tree blob)二进制设备树镜像文件,dtb其实就是利用dtc将dts编译后的可执行的二进制文件。即.dtb
文件相当于 bin文件 或者 可执行文件,可由 dtc工具将 .dts
编译成 .dtb
文件。
为什么需要设备树
设备树的典型需求就是驱动,我们知道,在内核驱动中通常分为函数(操作方法)和数据,.c用来写函数,.h用来描述寄存器地址或者要写入寄存器的数据。随着芯片越来越多,如果我们把可能用到的各种芯片都写一个.c和.h,那么我们的内核就会有大量的这种芯片驱动的文件,把内核变成一个大胖子,且根本不可能囊括所有芯片。显然这套方法已经无法满足需求,所以就发明了设备树,来解决这个问题。
设备树基本工作原理
基于芯片日益增长的问题,所以内核开发者们引入了新的方法,就是在内核中只保留函数,而数据则不包含,由用户(应用程序员)自己把数据按照规定的格式编写,并放在约定的地方,为了不占用过多的内存,还要求数据以根精简的方式编写。在内核内部专门集成了设备树编译器生成代码,内核编译时先编译内核中用来编译设备树的编译器源码,生成一个设备树专用编译器,新编译器将驱动的数据编译成二进制文件dtb,在移植系统时则需要给设备树一个独立地址段。
boot启动时,传参给内核,告诉内核设备树文件和kernel的位置,内核启动时根据地址去找到设备树文件,再利用专用的编译器去反编译dtb文件,将dtb还原成数据结构,以供驱动的函数去调用。
二、烧写移植后的内核镜像
我们把编译生成的内核镜像uImage 和设备树 dtb 文件“exynos4412-itop-elite.dtb”拷贝到 fastboot烧写工具根目录中,已经可以使用了。但是为了检验我们的内核是否可以使用,我们可以先使用 已经移植好的来验证内核正确性。
1、 OTG 烧写设备树系统
2、烧写u-boot 镜像
fastboot.exe flash bootloader u-boot-iTOP-4412.bin
3、烧写内核镜像
烧写内核镜像,输入命令:
fastboot.exe flash kernel uImage
4、烧写设备树镜像
烧写设备树镜像,输入命令:
fastboot.exe flash dtb exynos4412-itop-elite.dtb
5、烧写根文件系统
烧写根文件系统(时间会长一些),输入命令:
fastboot.exe flash system system.img
6、重启
输入重启命令:fastboot.exe reboot
观察超级终端控制台,进入文件系统表明运行成功。