本文内容来自对 《朱有鹏嵌入式linux核心课程》学习总结
uboot的源码目录分析
1.九鼎官方uboot和三星原版uboot对比
- 以九鼎官方的
uboot
为蓝本来学习的,以三星官方的这份做对照。 - 不同版本的
uboot
或者同一版本不同人移植的uboot
,可能目录结构和文件内容都有所不同。自己移植时也可以根据需要去添加/删除/更改目录结构。 - 九鼎在以三星的
uboot
为原材料进行移植时,把三星版本的uboot
中很多不必要的文件夹,文件给删除掉了。这个删除把很多完全用不到的文件清除出去,减少了整体的文件数量,便于工作。
2.各文件介绍
.gitgnore
:git工具的文件。arm-config.mk
:后缀是.mk,是一个Makefile
文件。会被其他Makefile
文件调用。- 三个
Changelog
文件:修改记录文件,该文件记录了这个uboot
项目的版本变迁以及每个版本较上个版本修改的记录。正式的项目都有这些记录。主要给维护uboot
的人用。 confog.mk
和arm_config.mk
差不多性质。COPYING
:版本声明,uboot
本身是GPL
许可证的。CREDITS
:鸣谢,里面记录了对uboot
有贡献的人,感谢目录。image_split
:一个脚本,看说明是用来分割uboot.bin
到BL1
的。MAINTAINERS
:维护者,就是当前参与维护uboot
源码的社区工作者。MAKEALL
:一个脚本,应该是帮助编译uboot
的。Makefile
:这个很重要,是uboot
源代码的主Makefile
,将来整个uboot
被编译时就是用这个Makefile
管理编译的。mk
:快速编译的脚本,其实就是先清理然后配置然后编译。mkmovi
:一个脚本,和iNand/SD
卡启动有关。README
:所有的软件都有README
,简单的使用说明书。rules.mk
:这个文件是我们uboot
的Makefile
使用的规则。
总结: 以上这些文件中,对我们比较重要,需要认真看的有2个:mkconfig
和Makefile
。一个负责uboot
的配置,一个负责编译。
3.各个文件夹介绍
-
api
:硬件无关的功能函数的API。uboot
移植时不用管,这些函数是uboot
本身使用的。 -
api_example
:API相关的测试示例代码。 -
board
:board
文件夹下每一个文件都代表一个开发板,这个文件夹下面放的文件就是用来描述这一开发板的信息的。board
目录下有多少个文件夹,就表示当前这个uboot
已经被移植到多少个开发板上了(当前的uboot支持多少个开发板)。
开发板越来越多,board目录下文件夹越来越多不方便管控。于是乎uboot就新增了一种机制,可以在board目录下不直接放开发板目录,而是在board下放厂家目录(vendor目录,以具体芯片厂商名字命名),然后将这个IC厂商的所有芯片开发板都丢到这个vendor目录下面去。所以大家会发现我们X210对应的开发板目录在board/samsung/x210。多了这层目录会影响配置阶段,在uboot的配置阶段要注意配置时的路径深度和实际存放要对应,不然配置后编译时找不到文件编译就会失败。注意一个细节就是历史原因造成的兼容性麻烦。最开始时board目录下就是开发板名字,后来才改成厂商名字的。但是因为要向前兼容,同一个厂商原来还是外面的开发板并没有挪移到厂商目录下面去。这样就造成后来的人不知道原委的感到很奇怪,感觉很混乱。
注意:
uboot
的配置阶段(其实就是根目录下面的mkconfig
脚本和Makefile
中配置有关的部分)主要解决的问题就是在可移植性领域能够帮助我们确定具体的文件夹的路径,然后编译时可以找到应该找到的文件,才能编译成功。因此uboot
目录下的不同会造成配置时的不同。如果移植时没注意这里肯定要失败。 -
common
:这个文件夹下放的是一些与具体硬件无关的普遍适用的一些代码。譬如控制台实现,crc校验等。但主要是两类:一类是cmd
开头的,是用来实现uboot
的命令系统;另一类是env
开头的,是用来实现环境变量的。 -
cpu
:这个目录是SoC
相关的,里面存放的代码都是SoC
相关初始化和控制代码(譬如cpu
的,中断的,串口等SoC
内部外设的,包括起始代码start.s
也在这里)。里面有很多子文件夹,每一个子文件夹就是一个SoC
系列。
**注意:**这个文件夹是严格和硬件相关的,因此移植时也是要注意的。但是因为这个文件夹内都是SoC
有关的,我们自己开发板和三星的开发板虽然板子设计不同但是SoC
都是同一个,因此实际移植时这个目录几乎不用动。 -
disk
:磁盘有关的。 -
doc
:文档目录,里面存放了很多uboot
相关文档,这些文档可以帮助我们理解uboot
代码。 -
driver
:驱动。从linux
源代码中扣出来原封不动的linux
设备驱动,主要是开发板上必须用到的一些驱动,如网卡驱动,iNand/SD
卡,NandFlash
等的驱动。(uboot
中的驱动其实就是linux
中的驱动,uboot
在一定程序上移植了linux
的驱动给自己用。但是linux
是操作系统而uboot
只是裸机程序,因此这种移植会有不同,uboot
中的驱动其实是linux
中的驱动的一部分) -
example
:示例代码。 -
fs
:文件系统也是从linux
源代码中移植过来的,用来管理Flash
等资源。 -
include
:头文件目录。 -
lib
开头的一索。(典型的lib_arm
和lib_generic
)架构相关的库文件。譬如lib_arm
里面就是arm
架构使用的一些库文件。lib_generic
里是所有架构通用的库文件。这类文件夹中的内容移植时基本不用管。 -
libfdt
:设备树有关的。linux
内核在3.4
左右的版本时候更改了启动传参的机制,改用设备树来进行启动传参,进行硬件信息的描述了。 -
nand_spl
:nand
相关的。 -
net
:网络相关的代码,譬如uboot
中的tftp, nfs, ping
命令。 -
onenand
开头的,是onenand
相关的代码,是三星加的,标准uboot
中应该没有的。 -
post
:不知道。 -
sd_fusing
:这里面代码实现了烧录uboot
镜像到sd
卡的代码。 -
tools
:工具类代码,譬如mkimage
。
总结: 文件夹里比较重要的有:board, common, cpu, drivers, include, lib_arm, lib_generic, sd_fusing