在分析uboot源码之前一定要在Ubuntu中编译一下uboot源码,因为编译过程会生成一些文件,而生成的这些恰恰是分析uboot源码不可或缺的文件。
arch文件夹
存放和架构有关的文件,我们现在用的是ARM芯片,所以只需要关系arm文件夹即可
其中有一部分march-xxx的文件夹。march开头的文件夹跟具体的设备有关,比如“mach-exynos”就是跟三星的 exyons 系列 CPU 有关的文件。
我们使用的是I.MX6ULL,所以要关注imx-common这个文件夹。此外,“cpu”文件夹和cpu架构有关。
I.MX6ULL使用的是Cortex-A7内核,Cortex-A7属于armv7,所以我们要关心“armv7”这个文件夹。
“u-boot.lds”是ARM芯片使用的u-boot连接脚本文件。
board文件夹
board 文件夹就是和具体的板子有关的,打开此文件夹,里面全是不同的板子。
所有使用freescale芯片的板子都放到此文件夹中,I.MX系列以前属于freescale,只是后面被NXP收购了。
以“mx6ul”开头的表示使用I.MX6UL 芯片的板子,以 mx6ull 开头的表示使用 I.MX6ULL 芯片的板子。mx6ullevk 是 NXP官方的I.MX6ULL 开发板,正点原子的ALPHA开发板就是在这个基础上开发的,因此 mx6ullevk也是正点原子的开发板。我们后面移植 uboot 到时候就是参考 NXP 官方的开发板,也就是要参考 mx6ullevk 这个文件夹来定义我们的板子。
configs文件夹
此文件夹为uboot配置文件,uboot是可配置的。
但是你要是自己从头开始一个一个项目的配置,那就太麻烦了,因此一般半导体或者开发板厂商都会制作好一个配置文件。我们可以在这个做好的配置文件基础上来添加自己想要的功能,这些半导体厂商或者开发板厂商制作好的配置文件统一命名为“xxx_defconfig”,xxx 表示开发板名字,这些 defconfig 文件都存放在 configs文件夹。
make max6ull_14x14_ddr512_emmc_defconfig
上述命令就是配置正点原子的I.MX6ULL EMMC核心板所使用的uboot。
在编译uboot之前一定要使用defconfig来配置uboot。
在mx6ull_alientel_emmc.sh中就有一句
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_14x14_ddr512_emmc_defconfig
这个就是调用 mx6ull_14x14_ddr512_emmc_defconfig 来配置 uboot。
当我们执行make xxx_defconfig后就会生成.config文件,此文件保存了详细的uboot配置信息。
u-boot.xxx_cmd文件,这些文件都是编译生成的,都是一些命令文件,比如文件u-boot.bin.cmd
cmd_u-boot.bin := cp u-boot-nodtb.bin u-boot.bin
.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.cmd就是用于生成u-boot.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,也就是链接工具,将各个built-in.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 中。
工具mkimage就是读取文件imximage-ddr512.cfg.cfgtmp 里面的信息,然后将其添加到文件 u-boot.bin 的头部,最终生成 u-boot.imx。