运行厂商u-boot的前提:

运行u-boot,需要DDR或者DRAM,串口,SD卡驱动、EMMC、NAND,这些要和厂商的开发板一致,就能直接在自己板子上运行u-boot

开机流程:
当把u-boot.bin下载到SD卡上时,由于整个u-boot的起始地址为87800000,所以开始从SD卡启动IMX6ULL时,arm内核从sd卡中取指令,在DDR的87800000上运行u-boot,接着就是整个u-boot的启动流程,再通过bootcmd来自动从emmc中拷贝zImage和dtb根文件到指定地址的DDR中运行linux,bootz启动linux(其中分为从emmc启动linux,还是从网络tftp上启动linux),其中通过bootargs=console=ttymxc0,115200 root=/dev/mmcblk1p2, 来将参数告诉linux,让linux知道从imx6ull从ttymxc0串口与linux进行交互,并且设置115200波特率,且根文件系统要保存在/dev/mmcblk1p2(也就是emmc的第二个分区)。由于下载的zImage是压缩包,linux想要运行就必须先进行自解压缩,这就需要linux的第一行代码为kernel_entry(),它就是将linux进行解压的函数,在uboot的启动最后阶段会按照kernel_entry()的要求给其传入三个参数,在启动前做如下操作:

①、关闭 MMU。
②、关闭 D-cache。
③、 I-Cache 无所谓。
④、 r0=0。
⑤、 r1=machine nr(也就是机器 ID)。
⑥、 r2=atags 或者设备树(dtb)首地址。

一旦进入kernel_entry()函数,u-boot的使命结束,linux开始工作。

linux启动所做的工作:

1、确保CPU处于SVC模式且关闭所有中断,检查是否支持该CPU,验证设备树是否存在,使能MMU,调用 start_kernel 来启动 Linux 内核。(linux内核的第一阶段,接下来进入C语言)

2、未完待续。。。。

u-boot移植流程:(几个移植的重要文件)

mx6ull_14x14_evk_emmc_defconfig(添加开发板默认配置文件

uboot的configs 目录下有很多配置文件,可想而知,每一个配置文件就对应一块开发板。
我们找到 mx6ull_14x14_evk_emmc_defconfig, 这是nxp官方的配置文件,我们就是参考它做修改。

CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=board/freescale/mx6ull_my_emmc/imximage.cfg,MX6ULL_EVK_EMMC_REWORK"
CONFIG_ARM=y
CONFIG_ARCH_MX6=y
CONFIG_TARGET_MX6ULL_MY_EMMC=y
CONFIG_CMD_GPIO=y

mx6ullevk.h(添加自己开发板的头文件)

在include/configs 下拷贝mx6ullevk.h 并修改。

在这个头文件中有许多宏定义,这些宏基本用于配置uboot,也有一些I.MX6ULL 的配置项目。
如果我们想要禁用uboot的某些功能,在这个头文件中修改即可。

mx6ullevk.h 文件中基本都是“CONFIG_”开头的宏定义,这也说明 mx6ull_alientek_emmc.h 文件的主要功能就是配置或者裁剪 uboot如果需要某个功能的话就在里面添加这个功能对应的 CONFIG_XXX 宏即可,如果不需要某个功能的话就删除掉对应的宏即可。(在具体u-boot的启动流程中,会有ifdefine CONFIG_XXX ,则运行下面的代码,如果你没有定义或者删除改宏定义,则下面的代码就不会运行,相当与对u-boot进行了裁剪)

mx6ullevk.h 中包含了 mx6_common.h,如果没有在mx6ullevk.h中发现某个功能或命令,但uboot中又确实存在,可以去mx6_common.h 中寻找。

mx6ull_alientek_emmc(添加开发板对应的板级文件夹)

uboot中每一块板子都拥有一个板级文件夹,用来存放板级文件。比如开发板上的外设驱动文件等。

NXP 的 I.MX 系列芯片的所有板级文件夹都存放在 board/freescale 目录下,imx6ull 对应的板级文件夹是mx6ullevk。同样备份重命名。

进 入 mx6ull_alientek_emmc 目 录 中 , 将 其 中 的 mx6ullevk.c 文 件 重 命 名 为mx6ull_alientek_emmc.c

1、修改板级文件夹目录下的 Makefile 文件

将文件名修改为刚刚改的文件,这样才会编译mx6ull_my_emmc.c这个文件。

2、修改 imximage.cfg 文件

PLUGIN 这一项路径改成我们自己文件夹的路径。

3、修改 Kconfig 文件

4、修改 MAINTAINERS 文件

5、修改 U-Boot 图形界面配置文件

uboot 是支持图形界面配置

LCD 驱动修改

一般 uboot 中修改驱动基本都是在 xxx.h 和 xxx.c 这两个文件中进行的, xxx 为板子名称,比如 mx6ull_alientek_emmc.h 和 mx6ull_alientek_emmc.c 这两个文件。

一般修改 LCD 驱动重点注意以下几点:
①、 LCD 所使用的 GPIO,查看 uboot 中 LCD 的 IO 配置是否正确。
②、 LCD 背光引脚 GPIO 的配置。
③、 LCD 配置参数是否正确。

总结
①、不管是购买的开发板还是自己做的开发板,基本都是参考半导体厂商的 dmeo 板,而半导体厂商会在他们自己的开发板上移植好 uboot、linux kernel 和 rootfs 等,最终制作好 BSP包提供给用户。
我们可以在官方提供的 BSP 包的基础上添加我们的板子,也就是俗称的移植。
②、我们购买的开发板或者自己做的板子一般都不会原封不动的照抄半导体厂商的 demo板,都会根据实际的情况来做修改,既然有修改就必然涉及到 uboot 下驱动的移植。
③、一般 uboot 中需要解决串口、NAND、EMMC 或 SD 卡、网络和 LCD 驱动,因为 uboot的主要目的就是启动 Linux 内核,所以不需要考虑太多的外设驱动。
④、在 uboot 中添加自己的板子信息,根据自己板子的实际情况来修改 uboot 中的驱动。
 

u-boot启动流程 

uboot下emmc大小配置 uboot从emmc启动_linux

uboot下emmc大小配置 uboot从emmc启动_uboot下emmc大小配置_02