uboot 官网为 http://www.denx.de/wiki/U-Boot/,哪里就是 uboot 原汁原味的源码文件,但是我们一般不会直接用 uboot 官方的 U-Boot 源码的。uboot 官方的 uboot 源码是给半导体厂商准备的,半导体厂商会下载 uboot 官方的 uboot 源码,然后将自家相应的芯片移植进去。也就是说半导体厂商会自己维护一个版本的 uboot,这个版本的 uboot 相当于是他们定制的。既然是定制的,那么肯定对自家的芯片支持会很全,虽然 uboot 官网的源码中一般也会支持他们的芯片,但是绝对是没有半导体厂商自己维护的 uboot 全面。NXP 就 维 护 的 2016.03 这 个 版 本 的 uboot
三种 uboot 的区别
1.官方的 uboot 代码 由 uboot 官方维护开发的 uboot 版本,版本更新快,基本包含所有常用的芯片,但是支持太弱了,不支持NAND,EMMC启动
2.半导体厂商的uboot代码 半导体厂商如(NXP)维护的一个 uboot,专门针对自家的芯片,在对自家芯片支持上要比 uboot 官方的好。
3.开发板厂商的 uboot 代码 开发板厂商在半导体厂商提供的 uboot 基础上加入了对自家开发板的支持。
那么这三种 uboot 该如何选择呢?首先 uboot 官方的基本是不会用的,因为支持太弱了。最常用的就是半导体厂商或者开发板厂商的 uboot,如果你用的半导体厂商的评估板,那么就使用半导体厂商的 uboot,如果你是购买的第三方开发板,比如正点原子的 I.MX6ULL 开发板,那么就使用正点原子提供的 uboot 源码(也是在半导体厂商的 uboot 上修改的)。当然了,你也可以在购买了第三方开发板以后使用半导体厂商提供的 uboot,只不过有些外设驱动可能不支持,需要自己移植,这个就是我们常说的 uboot 移植。
1.api 与硬件无关的 API 函数。
2.arch 与架构体系有关的代码。cpu其实油很多构架,平常我们接触的桌面级cpu其实就是X86构架的,像STM32,NXP7ULL属于Arm构架,还有接触比较少的,如I64等等。每个大构架下面又有很多子分类,如arm下armv7,armv8等等。我们现在用的是 ARM 芯片,所以只需要关心 arm 文件夹即可.开 arm 文件夹里面内容包含cpu,mach-xxx(具体设备),mx-common(IMX6U)。cpu 文件夹里面有个名为“uboot.lds”的链接脚本文件,这个就是 ARM 芯片所使用的 u-boot 链接脚本文件!armv7 这个文件夹里面的文件都是跟 ARMV7 架构有关的,是我们分析 uboot 启动源码的时候需要重点关注的
3.board 不同板子(开发板)的定制代码。
board 文件夹就是和具体的板子有关的,打开此文件夹,里面全是不同的板子,毫无疑问正点原子的开发板肯定也在里面(正点原子添加的),borad 文件夹里面有个名为“freescale”的文件夹。所有使用 freescale 芯片的板子都放到此文件夹中,I.MX 系列以前属于 freescale,只是freescale 后来被 NXP 收购了。打开此 freescale 文件夹,在里面有mx6u(I.MX6UL/ULL)有关的文件夹,
4.script 脚本文件。
Kbuild.include :此文件里面定义了很多变量:build := -f $(srctree)/scripts/Makefile.build obj;if_changed;if_changed_dep(依赖fixdep) 等等
Makefile.build:这是个Makefile其最终生成.config文件
./basic/fixdep
5.config 配置文件夹
此文件夹为 uboot 配置文件,uboot 是可配置的,但是你要是自己从头开始一个一个项目的配置,那就太麻烦了,因此一般半导体或者开发板厂商都会制作好一个配置文件。我们可以在这个做好的配置文件基础上来添加自己想要的功能,这些半导体厂商或者开发板厂商制作好的配置文件统一命名为“xxx_defconfig”,xxx 表示开发板名字,这些 defconfig 文件都存放在 configs文件夹,因此,NXP 官方开发板和正点原子的开发板配置文件肯定也在这个文件夹中
lee@MRZ:~/uboot/NXP/uboot-imx-rel_imx_4.1.15_2.1.0_ga$ ls configs |grep mx6u mx6ul_14x14_ddr3_arm2_defconfig ............ mx6ull_14x14_ddr3_arm2_defconfig mx6ull_14x14_ddr3_arm2_emmc_defconfig mx6ull_14x14_ddr3_arm2_epdc_defconfig mx6ull_14x14_ddr3_arm2_nand_defconfig mx6ull_14x14_ddr3_arm2_qspi1_defconfig mx6ull_14x14_ddr3_arm2_spinor_defconfig mx6ull_14x14_ddr3_arm2_tsc_defconfig mx6ull_14x14_evk_defconfig mx6ull_14x14_evk_emmc_defconfig mx6ull_14x14_evk_nand_defconfig mx6ull_14x14_evk_qspi1_defconfig
6.Makefile 文件
这个是顶层 Makefile 文件,Makefile 是支持嵌套的,也就是顶层 Makefile 可以调用子目录中的 Makefile 文件。Makefile 嵌套在大项目中很常见,一般大项目里面所有的源代码都不会放到同一个目录中,各个功能模块的源代码都是分开的,各自存放在各自的目录中。每个功能模块目录下都有一个 Makefile,这个 Makefile 只处理本模块的编译链接工作,这样所有的编译链接工作就不用全部放到一个 Makefile 中,可以使得 Makefile 变得简洁明了。uboot 源码根目录下的 Makefile 是顶层 Makefile,他会调用其它的模块的 Makefile 文件,比如 drivers/adc/Makefile。当然了,顶层 Makefile 要做的工作可远不止调用子目录 Makefile 这么简单,关于顶层 Makefile 的内容我们稍后会有详细的讲解。
7.xxx_defconfig 文件
configs文件夹存在大量的配置这样的配置文件:
cat configs/mx6ul_14x14_evk_nand_defconfig CONFIG_ARM=y CONFIG_ARCH_MX6=y CONFIG_TARGET_MX6UL_14X14_EVK=y CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=board/freescale/mx6ul_14x14_evk/imximage.cfg,SYS_BOOT_NAND" CONFIG_CMD_GPIO=y CONFIG_CMD_DHCP=y CONFIG_CMD_PING=y
当使用make指定这些文件后
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ul_14x14_evk_nand_defconfig
这条命令会根据算选择的配置文件生成对应的”.config”文件,里面包含1.uboot是否包含某个命令等等
8..config 文件(编译生成的文件)
uboot 配置文件,使用命令“make xxx_defconfig”配置 uboot 以后就会自动生成.config 文件中都是以“CONFIG_”开始的配置项,这些配置项就是 Makefile 中的变量,因此后面都跟有相应的值,uboot 的顶层 Makefile 或子 Makefile 会调用这些变量值。在.config 中会有大量的变量值为‘y’,这些为‘y’的变量一般用于控制某项功能是否使能,为‘y’的话就表示功能使能,板子的*.h ,*.defconfig .config都可以启用关闭功能,某些功能默认是打开的如CONFIG_CMD_NET,没找到什么时候定义的
lee@MRZ:~/uboot/NXP/uboot-imx-rel_imx_4.1.15_2.1.0_ga$ cat .config |grep -v "^#"|grep -v "^$" CONFIG_CREATE_ARCH_SYMLINK=y CONFIG_HAVE_GENERIC_BOARD=y CONFIG_SYS_GENERIC_BOARD=y CONFIG_ARM=y CONFIG_SYS_ARCH="arm" CONFIG_SYS_CPU="armv7" CONFIG_SYS_SOC="mx6" CONFIG_SYS_VENDOR="freescale" CONFIG_SYS_BOARD="mx6ul_14x14_evk" CONFIG_SYS_CONFIG_NAME="mx6ul_14x14_evk" CONFIG_HAS_VBAR=y CONFIG_HAS_THUMB2=y CONFIG_CPU_V7=y CONFIG_SYS_L2CACHE_OFF=y CONFIG_ARCH_MX6=y CONFIG_SYS_MALLOC_F_LEN=0x400 CONFIG_MX6=y CONFIG_MX6UL=y CONFIG_TARGET_MX6UL_14X14_EVK=y CONFIG_SYS_MALLOC_F=y CONFIG_ROM_UNIFIED_SECTIONS=y CONFIG_DEFAULT_DEVICE_TREE="" CONFIG_LOCALVERSION="" CONFIG_LOCALVERSION_AUTO=y CONFIG_CC_OPTIMIZE_FOR_SIZE=y CONFIG_EXPERT=y CONFIG_SYS_MALLOC_CLEAR_ON_INIT=y CONFIG_SUPPORT_SPL=y CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=board/freescale/mx6ul_14x14_evk/imximage.cfg,SYS_BOOT_NAND" CONFIG_BOOTSTAGE_USER_COUNT=20 CONFIG_BOOTSTAGE_STASH_ADDR=0 CONFIG_BOOTSTAGE_STASH_SIZE=4096 CONFIG_SYS_PROMPT="=> " CONFIG_CMD_BDI=y CONFIG_CMD_CONSOLE=y CONFIG_CMD_BOOTD=y CONFIG_CMD_BOOTM=y CONFIG_CMD_ELF=y CONFIG_CMD_GO=y CONFIG_CMD_RUN=y CONFIG_CMD_IMI=y CONFIG_CMD_IMLS=y CONFIG_CMD_XIMG=y CONFIG_CMD_EXPORTENV=y CONFIG_CMD_IMPORTENV=y CONFIG_CMD_EDITENV=y CONFIG_CMD_SAVEENV=y CONFIG_CMD_ENV_EXISTS=y CONFIG_CMD_MEMORY=y CONFIG_CMD_CRC32=y CONFIG_CMD_DM=y CONFIG_CMD_LOADB=y CONFIG_CMD_LOADS=y CONFIG_CMD_FLASH=y CONFIG_CMD_FPGA=y CONFIG_CMD_GPIO=y CONFIG_CMD_ECHO=y CONFIG_CMD_ITEST=y CONFIG_CMD_SOURCE=y CONFIG_CMD_SETEXPR=y CONFIG_CMD_NET=y CONFIG_CMD_DHCP=y CONFIG_CMD_NFS=y CONFIG_CMD_PING=y CONFIG_CMD_MISC=y CONFIG_SUPPORT_OF_CONTROL=y CONFIG_NET=y CONFIG_NET_TFTP_VARS=y CONFIG_DM=y CONFIG_DM_WARN=y CONFIG_DM_DEVICE_REMOVE=y CONFIG_DM_STDIO=y CONFIG_DM_SEQ_ALIAS=y CONFIG_DISK=y CONFIG_DM_THERMAL=y CONFIG_HAVE_PRIVATE_LIBGCC=y CONFIG_SYS_HZ=1000 CONFIG_REGEX=y
7.config.mk(uBoot自带)
某个 Makefile 会调用此文件