目录
Uboot 源码目录分析
arch 文件夹
board 文件夹
configs 文件夹
.u-boot.xxx_cmd 文件
Makefile 文件
u-boot.xxx文件
.config文件
README
Uboot 源码目录分析
学会uboot使用以后就可以尝试移uboot到自己的开发板上了,但是在移植之前需要我们得先分析一遍uboot的启动流程源码,得捋一下uboot的启动流程,否则移植的时候都不知道该修改那些文件。本章我们就来分析一下uboot源码,重点是分析uboot启动流程,而不是整个 uboot源码,uboot整个源码非常大,我们只看跟我们关心的部分即可。
因为uboot会使用到一些经过编译才会生成的文件,因此我们在分析uboot的时候需要先编译一下uboot。未编译的uboot如图所示:
编译后的uboot文件夹内容
对比图,可以看出编译后的uboot要比没编译之前多了好多文件,这些文件夹或文件的含义见表所示:
arch 文件夹
这个文件夹里面存放着和架构有关的文件,如图所示:
从图可以看出有很多架构,比如arm, avr32, m68k等,我们现在用的是ARM芯片,所以只需要关心arm文件夹即可,打开arm文件夹里面内容如图所示:
mach开头的文件夹是跟具体的设备有关的,比如“mach-exynos”就是跟三星的exyons系列 CPU有关的文件。我们使用的是 I.MX6ULL,所以要关注“imx-common”这个文件夹。另外“cpu”这个文件夹也是和cpu架构有关的,打开以后如图所示:
从图可以看出有多种ARM架构相关的文件夹, I.MX6ULL使用的Cortex-A7内核,Cortex-A7 属于armv7,所以我们要关心“armv7”这个文件夹。cpu文件夹里面有个名为“uboot.Ids”的链接脚本文件,这个就是ARM芯片所使用的u-boot链接脚本文件!armv7 这个文件夹里面的文件都是跟ARMV7架构有关的,是我们分析uboot启动源码的时候需要重点关注的。
board 文件夹
board文件夹就是和具体的板子有关的,打开此文件夹,里面全是不同的板子,毫无疑问正点原子的开发板肯定也在里面,borad文件夹里面有个名为"freescale”的文件夹,如图所示:
所有使用freescale芯片的板子都放到此文件夹中, IMX系列以前属干freescale,只是"freescale后来被NXP收购了。打开此freescale文件夹,在里面找到和mx6u(I.MX6UL/ULL)有关的文件来,如图所示:
图mx6ul相关板子图中有5个文件夹,这5个文件夹对应5种板子,以“mx6ul”开头的表示使用I.MX6UL芯片的板子,以mx6ull开头的表示使用I.MX6ULL芯片的板子。mx6ullevk是NXP官方的I.MX6ULL开发板,正点原子的ALPHA开发板就是在这个基础上开发的,因此mx6ullevk也是正点原子的开发板。我们后面移植uboot到时候就是参考NXP官方的开发板,也就是要参考mx6ullevk这个文件夹来定义我们的板子。
configs 文件夹
此文件夹为uboot配置文件,uboot是可配置的,但是你要是自己从头开始一个一个项目的配置,那就太麻烦了,因此一般半导体或者开发板厂商都会制作好一个配置文件。我们可以在这个做好的配置文件基础上来添加自己想要的功能,这些半导体厂商或者开发板厂商制作好的基配置文件统一命名为“xxx_defconfig”,xxx 表示开发板名字,这些defconfig文件都存放在 configs文件夹,因此, NXP官方开发板和正点原子的开发板配置文件肯定也在这个文件夹中,如图所示:
图中这6个文件就是正点原子I.MX6U-ALPHA开发板所对应的uboot默认配置文件。我们只关心mx6ull 14x14 ddr512 emmc defconfig和mx6ull 14x14 ddr256 nand defconfig这两个文件,分别是正点原子IMX6ULL EMMC核心板和NAND核心板的配置文件。使用“make xxx_defconfig”命令即可配置uboot,比如:
make mxбull_14x14_ddr512_emme_defconfig
上述命令就是配置正点原子的I.MX6ULL EMMC核心板所使用的uboot。
在编译uboot之前一定要使用defconfig来配置uboot!
在mx6ull_alientek_emme.sh中就有下面这一句:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_14x14_ddr512_emmc_
defconfig
这个就是调用mx6ull_14x14_ddr512_emme_defconfig来配置uboot,只是这个命令还带了一些其它参数而已。
.u-boot.xxx_cmd 文件
.u-boot.xxx_cmd是一系列的文件,这些文件都是编译生成的,都是一些命令文件,比如文件u-boot bincmd看名字应该是和ubootbin有关的,此文件的内容如下:
u-boot.bin.cmd里面定义了一个变量: cmd u-boot.bin,此变量的值为“cp u-boot-nodtb.bin" u-boot.bin,也就是拷贝一份u-boot-nodtb.bin文件,并且重命名为u-boot.bin,这个就是 u-boot.bin的来源,来自文件u_boot-nodtb.bin。
那么u-boot-nodtb.bin是怎么来的呢?文件.u-boot-nodtb.bin.cmd就是用于生成uboot.nodtb.bin的,此文件内容如下:
这里用到了arm-linux-gnueabihf-objcopy,使用objcopy将ELF格式的u-boot文件转换为二进制的u-boot-nodtb.bin文件。
文件u-boot是ELF格式的文件,文件u-boot.cmd用于生成u-boot,文件内容如下:
.u-boot.cmd使用到了arm-linux-gnueabihf-ld.bfd,也就是链接工具,使用Id.bfd将各个 builtin.o文件链接在一起就形成了u-boot 文件。uboot 在编译的时候会将同一个目录中的所有.c文件都编译在一起,并命名为 built-in.o,相当于将众多的.c文件对应的.o文件集合在一起,这个就是u-boot文件的来源。
如果我们要用NXP提供的MFGTools工具向开发板烧写uboot,此时烧写的是u-boot.imx文件,而不是u-boot.bin文件。u-boot.imx是在u-boot.bin文件的头部添加了IVT,DCD等信息。这个工作是由文件u-boot.imx.cmd来完成的,此文件内容加下:
可以看出,这里用到了工具tools/mkimage,而IVT、DCD等数据保存在了文件board/freescale/mx6ullevk/imximage-ddr512.cfg.cfgtmp中(如果是NAND核心板的话就是imximage-ddr256.cfg.cfgtmp),工具mkimage就是读取文件imximage-ddr512.cfg.cfgtmp里面的信息,然后将其添加到文件u-boot.bin的头部,最终生成u-boot.imx。
文件.u-boot.lds.cmd就是用于生成u-boot.lds链接脚本的,由于.u-bootlds.cmd文件内容太多,这里就不列出来了。uboot根目录下的u-boot.lds链接脚本就是来源于arch/arm/cpu/u-boot.lds文件
Makefile 文件
这个是顶层Makefile文件,Makefile是支持嵌套的,也就是顶层Makefile可以调用子目录中的Makefile文件。Makefile嵌套在大项目中很常见,一般大项目里面所有的源代码都不会放"到同一个目录中,各个功能模块的源代码都是分开的,各自存放在各自的目录中。每个功能模块目录下都有一个 Makefile,这个Makefile只处理本模块的编译链接工作,这样所有的编译链接工作就不用全部放到一个Makefile中,可以使得Makefile变得简洁明了。
uboot源码根目录下的Makefile是顶层Makefile,他会调用其它的模块的Makefile文件,比如drivers/adc/Makefile。当然了,顶层Makefile要做的工作可远不止调用子目录Makefile这么简单,关于顶层Makefile的内容我们稍后会有详细的讲解。
u-boot.xxx文件
u-boot.xxx同样也是一系列文件,包括u-boot、u-boot.bin、u-boot.cfg、u-boot.imx、u-boot.lds、u-boot.map、u-boot.srec、u-boot.sym和u-boot-nodtb.bin,这些文件的含义如下:
u-boot:编译出来的ELF格式的uboot镜像文件。
u-boot.bin:编译出来的二进制格式的uboot可执行镜像文件。
u-boot.cfg: uboot的另外一种配置文件。
u-boot.imx: u-boot.bin添加头部信息以后的文件,NXP的CPU专用文件。
u-boot.lds:链接脚本。
u-boot.map: uboot映射文件,通过查看此文件可以知道某个函数被链接到了哪个地址上。
u-boot.srec:S-Record格式的镜像文件。
u-boot.sym: uboot符号文件。
u-boot-nodtb.bin:和u-boot.bin一样,u-boot.bin就是u-boot-nodtb.bin的复制文件。
.config文件
uboot配置文件,使用命令"make xxx_defconfig”配置 uboot 以后就会自动生成,.config内容如下:
可以看出.config文件中都是以“CONFIG_”开始的配置项,这些配置项就是Makefile中的变量,因此后面都跟有相应的值,uboot的顶层Makefile或者Makefile会调用这些变量值。在.config中会有大量的变量值为'y',这些为'y'的变量一般用于控制某项功能是否使能,为‘y’的话就表示功能使能,比如:
CONFIG_CMD_BOOTM=y
如果使能了bootd这个命令的话, CONFIG_CMD_BOOTM就为'y'。在cmd/Makefile中有如下代码:
在示例代码中,有如下所示一行代码:
obj-$(CONFIG CMD BOOTM)+= bootm.o
CONFIG CMD BOOTM=y,将其展开就是:
obj-y += bootm.o
也就是给obj-y追加了一个“bootm.o”,obj-y包含着所有要编译的文件对应的.o文件,这里表示需要编译文件cmd/bootm.c。相当于通过“CONFIG_CMD_BOOTD-y”来使能bootm这个命令,进而编译cmd/bootm.c这个文件,这个文件实现了命令bootm。在uboot和Linux内核中都是采用这种方法来选择使能某个功能,编译对应的源码文件。
README
README文件描述了uboot的详细信息,包括uboot该如何编译、uboot中各文件夹的含义、相应的命令等等。