10.uboot的源码目录分析


10.1.GEC210官方uboot和三星SMDKV210官方uboot对比
(1)以GEC210官方的uboot为蓝本进行学习,以三星SMDKV210官方uboot作为对照。
(2)不同版本的uboot或者同一版本不同人移植的uboot,可能目录结构和文件内容都有所不同,我们可以根据自己的需要去添加/删除/更改目录结构。
(3)粤嵌在以三星的uboot为原材料进行移植时,把三星版本的uboot中很多不必要的文件夹、文件给删除了。即把很多完全用不到的文件清除出去,减少了整体文件的数量,便于工作。


10.2.GEC210官方uboot文件介绍
(1).gitignore;git工具的配置文件,用于设置git要忽略的特殊文件。git是一个分布式版本管理工具,还有一个集中式版本管理工具svn。该文件本身和git有关,和uboot本身无关。
(2)arm_config.mk;后缀是.mk,是一个Makefile文件,将来在某个Makefile文件中会去调用它。
(3)三个changelog文件;修改记录文件,该文件记录了这个uboot项目的版本变迁以及每个版本较上个版本修改的记录。正式的项目都有changelog。我们可直接忽略,这些文件主要是给维护uboot的人使用的。
(4)config.mk;和arm_config.mk文件性质差不多。
(5)COPYING;版权声明,uboot本身是GPL许可证。
(6)CREDITS;感谢目录,记录了对uboot项目作出贡献的人。
(7)image_split;一个bash脚本,看说明是用来分割uboot.bin到BL1的,我们暂时用不到,先不管。
(8)MAINTAINERS;维护者,即当前在参与维护uboot源码的社区工作者。
(9)MAKEALL;一个bash脚本,应该是帮助编译uboot的。
(10)Makefile;非常重要,是uboot源代码的主Makefile,该文件管理整个uboot的编译过程,我们研究uboot的编译配置过程时需重点分析该文件。
(11)mk;快速编译的脚本文件,即先清理然后配置然后编译而已。
(12)mkconfig;非常重要,是uboot配置阶段的主要配置脚本,uboot的可移植性很大程度上就是靠这个配置脚本维护的,我们研究uboot的编译配置过程时需重点分析该文件。
(13)mkmovi;一个bash脚本,和iNand/SD卡启动有关,暂时先不管它。
(14)README;所有的软件都有README,它其实就是个简单的使用说明书。
(15)rules.mk;该文件是uboot的Makefile使用的规则,本身非常重要,但是我们一般不去分析它。
(16)总结:以上这些文件中,我们需要认真分析的文件有mkconfig文件和Makefile文件。mkconfig负责配置,Makefile负责编译。附设置win7下显示隐藏文件的操作(见图1)。


10.3.GEC210官方uboot文件夹介绍
(1)api;与硬件无关的功能函数的API,uboot移植时基本不用管,这些函数是uboot本身使用的。
(2)api_examples;与API相关的测试示例代码。
(3)board;该文件夹下每一个文件都代表一个具体的开发板,该文件夹下的文件是用来描述具体开发板的信息的。board目录下有多少个文件夹,就表示当前这个版本的uboot已经被移植到多少个开发板上了,即当前版本的uboot支持多少个开发板。
(4)common;该目录下放置的是一些与具体硬件无关的普遍使用的一些代码。平台控制台实现、CRC校验。但是更多的主要是两类:一类是cmd开头的,用来实现uboot的命令系统的;另一类是env开头的,是用来实现环境变量的。
(5)cpu;该目录是SoC相关的,里面存放的代码都是SoC相关初始化和控制代码(譬如CPU的、中断的、串口的等SoC内部外设的,包括起始代码Start.S也在这里),里面有很多子文件夹,每一个子文件夹就是一个SoC系列。该文件夹严格与硬件相关,则移植时需要注意。但是因为GEC210上的SoC与SMDKV210上的SoC是同一个系列的SoC,因此实际移植时该目录内容几乎不会动。
(6)disk;磁盘有关的,木有研究过。
(7)doc;文档目录,里面存放了很多uboot相关文档,这些文档可帮助我们理解uboot代码。但因为是纯英文的,而且很杂乱,所以几乎没用。
(8)drivers;驱动目录,该目录中放置的是从linux源码中抠出来的原封不动的linux设备驱动,主要是开发板上必须用到的一些驱动,如网卡驱动、Inand/SD卡、NandFlash等的驱动。即uboot中的驱动其实就是linux中的驱动,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目录里面是所有架构通用的库文件。这类文件中的内容在移植时基本不用管,SoC厂商已经做好了相关移植。
(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。
(20)总结:以上目录中,我们需要认真分析的目录是:board、common、cpu、drivers、include、lib_arm、lib_generic、sd_fusing。


10.4.相关问题思考
(1)uboot如何支持多套开发板,如何具有可移植性?
uboot通过board文件夹收录很多套具体的的开发板的代码,在具体的开发板上要用到哪套代码就调用该套代码即可。
(2)board目录下有这么多文件夹,如何确定具体使用的是哪一个?
uboot在配置阶段会通过某些手段帮助我们确定使用的是board目录下的哪一个文件夹。
(3)开发板越来越多,board目录下文件夹管控变得复杂,uboot提供的管理机制是啥?
uboot在board目录下不直接放置具体的开发板目录,而是在board下放置厂家目录(vendor目录,以具体芯片厂商名字命名),然后将该IC厂商的所有芯片开发板都放置vendor目录下面。则GEC210对应的开发板目录在board/samsung/gec210。在uboot的配置阶段需注意配置时的路径深度和实际存放路径需对应,否则配置后编译时会找不到文件而编译失败。
(4)board目录下文件夹的管理机制是后期提出来的,那如何与早期的uboot版本兼容呢?
这是历史原因造成的兼容性麻烦。最开始时board目录下放置的就是具体开发板的名字,后来才改为厂商名字。但是因为要向前兼容,同一个厂商原来还是外面的开发板并没有挪到厂商目录下面去,这样造成后面不知道原委的人感到很奇怪,会让人感觉很混乱。
(5)uboot配置阶段的主要解决的问题是啥?
uboot配置阶段(即根目录下面的mkconfig脚本和Makefile中配置相关的部分)在可移植性领域能够帮助我们确定具体的文件夹的路径,然后编译时能够找到应该找到的文件,这样才能编译成功。则board目录下的不同会造成配置时的不同。


10.uboot的源码目录分析_第1张图片


你可能感兴趣的:(uboot和kernel)