以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。
一、如何获取uboot?
uboot可以有3种获取途径:uboot官方、SoC官方、具体开发板的官方。
(1)最原始的uboot的源代码都是从uboot官网下载的。但是从uboot官网下载的uboot,可能没有你当前使用的开发板的相关移植,甚至你可能找不到当前开发板使用的SoC对应的移植版本。
uboot官方地址:网址链接
(2)SoC厂商在推出一款SoC后,也会推出一款使用这款SoC的开发板。SoC厂商的工程师会去uboot官网下载一个uboot,并根据自己的SoC和开发板进行移植。比如三星推出S5PV210这款SoC后,也推出了一款使用S5PV210这款SoC的开发板SMDKV210,并根据这款开发板对uboot进行修改与移植。
三星官方为SMDKV210开发板移植的uboot:uboot_smdkv210.tar
(3)具体的开发板供应商(比如深圳市九鼎科技公司)首先购买三星的SMDKV210开发板,然后进行裁剪(把一些无用的接口功能裁剪去,降低或者替换一些硬件配置)。裁剪之后形成新的开发板(比如深圳市九鼎科技公司推出的X210开发板)和三星官方的SMDKV210有所不同,因此uboot也不同。但是因为SoC是相同的,所以至少有60%的相似度。因此具体开发板供应商会以三星SMDKV210中移植的uboot为蓝本,来移植得到适配自己开发板的uboot。
我们购买深圳市九鼎科技公司的X210开发板时,附带光盘中的BSP(board support package,板级支持包,包含与开发板相关的源代码、文档、教程等内容)中的uboot源码,就是九鼎科技公司移植过的(位于qt_x210v3s_160307.tar.bz2中,如下图所示)。
九鼎官方为X210开发板移植的uboot:uboot_jiuding.tar
二、uboot的源码目录分析
不同版本的uboot,或者同一版本不同人员移植的uboot,目录结构和文件内容都会有所不同,因为可以根据需要去添加、删除或者更改目录结构。在以三星的 uboot 为蓝本进行移植时,九鼎科技公司删除了很多不必要的文件夹与文件。我们以九鼎移植后的uboot,来说明uboot的目录结构。
1、文件分析
重要文件有mkconfig和Makefile,一个负责uboot的配置,一个负责编译。
(1)Makefile。此文件是uboot源代码的主Makefile,用此文件来管理uboot的编译。
(2)mkconfig。此文件是uboot配置阶段的主要配置脚本,uboot的可移植性很大程度依靠这个配置脚本。
(3).gitignore。git是一个版本管理工具(类似的还有svn),这个文件和git有关,和uboot本身无关的。
(4)arm_config.mk。后缀是.mk,是一个Makefile文件,将来在某个Makefile中会去调用它。
(5)三个Changelog文件。修改记录文件,记录uboot项目的版本变迁,以及每个版本较上个版本修改的记录。正式的项目都有这些记录的。主要是给维护uboot的人用的。
(6)config.mk。和arm_config.mk性质差不多。
(7)COPYING。版权声明,uboot本身是GPL许可证的。
(8)CREDITS。鸣谢,里面记录了对uboot有贡献的人,感谢目录。
(9)image_split。一个脚本,将uboot.bin分割到BL1。
(10)MAINTAINERS。维护者,即当前在参与维护uboot源码的社区工作者。
(11)MAKEALL。一个脚本,帮助编译uboot的。
(12)mk。快速编译的脚本,其实就是先清理然后配置然后编译而已。
(13)mkmovi。一个脚本,和iNand/SD卡启动有关。
(14)README。所有的软件都有README,其实就是个简单的使用说明书。
(15)rules.mk。这个文件是uboot的Makefile的使用规则。本身非常重要,但是不用分析。
2、目录分析
重要的目录有board、common、cpu、drivers、include、lib_arm、lib_generic、sd_fusing等。
(1)api。与硬件无关的功能函数的API,是uboot本身使用的,uboot移植时基本不用管。
(2)api_examples。 API相关的测试事例代码。
(3)board。board文件夹下每一个文件都代表一个开发板,这个文件夹下面放的文件就是用来描述这一个开发板的信息的。board目录下有多少个文件夹,就表示当前的uboot支持多少个开发板。
由于开发板越来越多,board目录下文件夹越来越多而不方便管控,因此uboot新增了一种机制,在board目录下不直接放开发板目录,而是在board目录下放厂商目录(vendor目录,以具体芯片厂商名字命名),然后将这个厂商的所有芯片开发板文件夹都丢到这个vendor目录中(因此大家会发现X210开发板对应的文件夹是board/samsung/x210)。但是因为要向前兼容,早期就位于board目录下的开发板文件夹并没有被挪移到相应的厂商目录中。
(4)common。这个文件夹存放一些与具体硬件无关的、普遍适用的一些代码。譬如控制台实现、crc校验的。但是更多的主要是两类:一类是cmd开头的,是用来实现uboot的命令系统的;另一类是env开头的,是用来实现环境变量的。
(5)cpu。这个目录是SoC相关的,存放与SoC相关初始化和控制的代码(譬如CPU的、中断的、串口等SoC内部外设的,包括起始代码start.S)。里面很多子文件夹,每一个子文件夹就是一个SoC系列。这个文件和硬件严格相关,移植时也是要注意的。但是因为这个文件夹内都是SoC有关的,X210开发板和三星的开发板虽然板子设计不同,但是SoC都是同一个,因此实际移植时这个目录几乎不用动。
(6)disk。与磁盘有关。
(7)doc。文档目录,里面存放了很多uboot相关文档,这些文档可以帮助理解uboot代码。
(8)drivers。存放的是从linux源代码中拷贝过来的linux设备驱动,主要是开发板上必须用到的一些驱动,如网卡驱动、Inand/SD卡、NandFlash等的驱动。uboot中的驱动其实就是linux中的驱动,uboot在一定程度上移植了linux的驱动。
(9)examples。示例代码。
(10)fs。filesystem,文件系统。也是从linux源代码中移植过来的,用来管理Flash等资源。
(11)include。头文件目录。uboot和linux kernel在管理头文件时都采用了同一个思路,即把所有的头文件全部集中存放在include目录下,而不是头文件跟着自己对应的c文件。因此在uboot中头文件包含时路径结构要在这里去找。
(12)lib_开头的目录,典型的如lib_arm和lib_generic。这是架构相关的库文件。譬如lib_arm里面就是arm架构使用的一些库文件。lib_generic里是所有架构通用的库文件。这类文件夹中的内容移植时基本不用管。
(13)libfdt。与设备树有关。linux内核在3.4左右的版本的时候更改了启动传参的机制,改用设备树来进行启动传参,进行硬件信息的描述。
(14)nand_spl。nand相关的。
(15)net。网络相关的代码,譬如uboot中的tftp nfs ping都是在这里实现的。
(16)onenand开头的,是onenand相关的代码,是三星加的,标准uboot中应该是没有的。
(17)post。
(18)sd_fusing。烧录uboot镜像到SD卡的代码。
(19)tools。里面是一些工具类的代码。譬如mkimage。