深入浅析Linux下uboot之(二)-----------------------:uboot的目录分析

一般我们uboot可以通过3种途径去下载获得:uboot官方、SoC官方、具体开发板的官方

所有uboot源头的源代码是uboot官网下载的。SoC厂商在推出一款SoC后,厂商的工程师会去uboot官网下载一个uboot,根据自己的SoC进行第一步的移植,移植的目标是厂商推出的开发板。(譬如三星的S5PV210芯片厂商出的开发板就叫SMDKV210).所以三星的工程师移植的uboot是根据他们自己的SMDKV210开发板移植的。具体的开发板供应商(譬如X210的生产商深圳市九鼎科技)首先购买三星的SMDKV210开发板,然后进行裁剪(把一些无用的接口功能裁剪去,配置降低一下,某些配置会被替换)。硬件替换和裁剪之后生成的新的开发板(譬如X210)和三星官方的SMDKV210有所不同,因此uboot也不同。但是因为SoC是相同的,所以相似度至少有60%以上。所以具体开发板供应商会以三星SMDKV210中移植的uboot为蓝本来移植得到自己的开发板的一个uboot移植。

深入浅析Linux下uboot之(二)-----------------------:uboot的目录分析

我们就以九鼎的uboot为例,来分析一下它目录结构:

目录文件夹的含义:

  • api       硬件无关的功能函数的API。uboot移植时基本不用管,这些函数是uboot本身使用的
  • api_examples  API相关的测试事例代码。
  • board  board是板的意思,板就是开发板。board文件夹下每一个文件都代表一个开发板,这个文件夹下面放的文件就是用来描述这一个开发板的信息的。board目录下有多少个文件夹,就表示当前这个uboot已经被移植到多少个开发板上了(当前的uboot支持多少个开发板)。ps:(开发板越来越多,board目录下文件夹越来越多不方便管控。于是乎uboot就新增了一种机制,可以在board目录下不直接放开发板目录,而是在board下放厂家目录(vendor目录,以具体芯片厂商名字命名),然后将这个IC厂商的所有芯片开发板都丢到这个vendor目录下面去。所以大家会发现我们X210对应的开发板目录在board/samsung/x210。多了这层目录会影响配置阶段,在uboot的配置阶段要注意配置时的路径深度和实际存放要对应,不然配置后编译时找不到文件编译就会失败。注意一个细节就是历史原因造成的兼容性麻烦。最开始时board目录下就是开发板名字,后来才改成厂商名字的。但是因为要向前兼容,同一个厂商原来还是外面的开发板并没有挪移到厂商目录下面去。)
  • common     common是普遍的普通的,这个文件夹下放的是一些与具体硬件无关的普遍适用的一些代码。譬如控制台实现、crc校验的。但是更多的主要是两类:一类是cmd开头的,是用来实现uboot的命令系统的;另一类是env开头的,是用来实现uboot的环境变量。
  • cpu    这个目录是SoC相关的,里面存放的代码都是SoC相关初始化和控制代码(譬如CPU的、中断的、串口等SoC内部外设的,包括起始代码start.S也在这里)。里面很多子文件夹,每一个子文件夹就是一个SoC系列。
  • disk    磁盘有关的
  • doc    文档目录,里面存放了很多uboot相关文档,这些文档可以帮助我们理解uboot代码,但都是纯英文的。
  • drivers    驱动。这里面放的就是从linux源代码中扣出来的原封不动的linux设备驱动,主要是开发板上必须用到的一些驱动,如网卡驱动、Inand/SD卡、NandFlash等的驱动。要知道:uboot中的驱动其实就是linux中的驱动,uboot在一定程度上移植了linux的驱动给自己用。但是linux是操作系统而uboot只是个裸机程序,因此这种移植会有不同。
  • examples     示例代码
  • fs    filesystem,文件系统。这个也是从linux源代码中移植过来的,用来管理Flash等资源。
  • include    头文件目录。uboot和linux kernel在管理头文件时都采用了同一个思路,就是把所有的头文件全部集中存放在include目录下,而不是头文件跟着自己对应的c文件。所以在uboot中头文件包含时路径结构要在这里去找。
  • llib_arm    里面就是arm架构使用的一些库文件。
  • lib_generic    里是所有架构通用的库文件。
  • libfdt    设备树有关的。linux内核在3.4左右的版本的时候更改了启动传参的机制,改用设备树来进行启动传参,进行硬件信息的描述了。
  • nand_spl    nand相关的
  • net     网络相关的代码,譬如uboot中的tftp nfs ping命令 都是在这里实现的
  • onenand***开头的,是onenand相关的代码,是三星加的,标准uboot中应该是没有的。
  • sd_fusing    这里面代码实现了烧录uboot镜像到SD卡的代码
  • tools    里面是一些工具类的代码。譬如mkimage。

ps比较总要的文件夹:board、common、cpu、drivers、include、lib_arm、lib_generic、sd_fusing

各个文件的含义:

  • gitignore    git工具的文件,git是一个版本管理工具(类似的还有个svn),这个文件和git有关,和uboot本身无关的,不用去管。
  • arm_config.mk    后缀是.mk,是一个Makefile文件,将来在某个Makefile中会去调用它。
  • 三个Changelog文件,修改记录文件,该文件记录了这个uboot项目的版本变迁以及每个版本较上个版本修改的记录。正式的项目都有这些记录的。可以直接忽略,主要是给维护uboot的人用的。
  • config.mk    后缀是.mk,是一个Makefile文件,将来在某个Makefile中会去调用它
  • COPYING    版权声明,uboot本身是GPL许可证的。
  • CREDITS    鸣谢,里面记录了对uboot有贡献的人,感谢目录。
  • image_split    一个脚本,看说明是用来分割uboot.bin到BL1的,暂时用不到,先不管。
  • MAINTAINERS    维护者,就是当前在参与维护uboot源码的社区工作者。
  • MAKEALL    一个脚本,应该是帮助编译uboot的。
  • Makefile    这个很重要,是uboot源代码的主Makefile,将来整个uboot被编译时就是用这个Makefile管理编译的。
  • mk    快速编译的脚本,其实就是先清理然后配置然后编译而已。
  • mkconfig    这个很重要,是uboot配置阶段的主要配置脚本。uboot的可移植性很大程度就是靠这个配置脚本在维护的。
  • mkmovi    一个脚本,和iNand/SD卡启动有关
  • README    所有的软件都有README,一般拿到一个东西要先读README,这个东西其实就是个简单的使用说明书。
  • rules.mk    这个文件是我们uboot的Makefile使用的规则

ps:比较重要的两个文件:mkconfig和Makefile。一个负责uboot的配置,一个负责编译。