1、uboot移植和imx文件分析

 


本系列使用的平台为百问网IMX6ULL,通过对NXP提供uboot的分析和修改,使其支持百问网IMX6ULL

本系列参考了正点原子和百问网的IMX6ULL教程,在此表示衷心感谢

本章参考文件有:《i.MX 6 BSP Porting Guide》、《ARMv7架构参考手册》

百度网盘链接:

https://pan.baidu.com/s/1h3LjDtOmAYChti7Rr30aSA

提取码为:07yl


 

 

一、uboot准备过程

首先需要解压uboot,解压后得到的顶层文件夹有:

 

《i.MX 6 BSP Porting Guide》中1.2.1节所述流程如下:

1. 复制开发板目录中相关文件夹(我选择的是mx6ull_ddr3_arm2)到自定义文件夹:

$ cp -R ./board/freescale/mx6ullevk/ ./board/freescale/mx6ull_lioker

$ mv ./board/freescale/mx6ull_lioker/mx6ullevk.c ./board/freescale/mx6ull_lioker/mx6ull_lioker.c

2. 复制头文件目录中相关文件为自定义文件:

$ cp ./include/configs/mx6ullevk.h ./include/configs/mx6ull_lioker.h

3. 复制配置文件目录中相关文件为自定义文件:

$ cp ./configs/mx6ull_14x14_evk_emmc_defconfig ./configs/mx6ull_lioker_defconfig

4. 修改上述自定义文件

修改后的文件存放在百度网盘链接的./uboot-imx-rel_imx_4.1.15_2.1.0_ga_lioker/文件夹中

5. 修改相关的配置文件:arch/arm/cpu/armv7/mx6/Kconfig

  

a. 仿照TARGET_IMX6ULL_等配置项添加自定义配置选项

b. 添加自定义配置文件

 

在解压uboot之后,通常还需要打补丁、配置和编译。如:

1. $ patch -p1 < u-boot-2012.04.01_100ask.patch

2. $ make 100ask24x0_config

3. $ make

其中,配置和编译都会调用uboot的顶层Makefile,接下来我会简单分析此过程

 

本文所使用的uboot中并没有补丁文件,因此只需要清除、配置和编译操作:

1. 清除:$ make ARCH=arm CROSS_COMPILE=arm-linux- distclean

2. 配置:$ make ARCH=arm CROSS_COMPILE=arm-linux- mx6ull_lioker_defconfig

2. 编译:make V=1 ARCH=arm CROSS_COMPILE=arm-linux-

 

配置过程通过scripts/kconfig/conf生成.config,若想获取更多信息可通过修改顶层Makefile中“Q = ”实现:

 

通过编译过程图,可以确定以下两点:

1. 编译过程所使用的链接文件和主汇编文件分别为u-boot.lds和arch/arm/cpu/armv7/start.S

2. 编译过程所生成的文件是u-boot,并通过拷贝命令生成u-boot.bin

 

但是我们需要烧写的并不是u-boot.bin,而是通过编译图中如下命令生成的u-boot.imx文件

make -f ./scripts/Makefile.build obj = arch/arm/imx-common u-boot.imx

u-boot.imx烧写过程请参考第二节

 

 

二、u-boot.imx烧写过程

本节使用SD卡进行烧写,步骤如下:

1. SD Card Formatter.exe中选中当前SD卡,点击Format按键(需要注意File system是否为FAT32)

 

2. ubuntu中执行$ ls /dev/sd*

3. 虚拟机连接SD卡

4. ubuntu中重新执行$ ls /dev/sd*,新出现的设备为SD卡(在我的系统里为sdc)

5. 切换到u-boot目录,执行$ sudo dd if=u-boot.imx of=/dev/sdc bs=1k seek=1 conv=fsync

 

 

三、u-boot.imx分析

在分析时,我们可以通过Hex Editor Neo等hex查看器打开imx文件查看对应数值,如下图:

 

imx文件构成可以在imx6ull datesheet的8.7一节中找到答案:

布局如下图:

接下来,我将一一对其进行介绍

 

1. IVT:用于存放程序地址、DCD地址等数据

根据imx6ull datesheet的Figure 8.1可以确定内部ROM在初始化时钟、DDR等外设后会将imx文件拷贝至DDR中

为正确读取imx文件,ROM将IVT定位在固定的地址,该地址由连接到芯片的引导设备确定,如下图:

 

其结构如下表,其中每一项均占据32bit

其header格式如下:

其他项的结果分别为:

entry(代码链接地址):0x87800000

dcd地址:0x877ff42c

boot data地址:0x877ff420

self(IVT地址):0x877ff400

csf:0

 

2. boot data:用于记录程序的起始地址和大小

其结构如下图,其中每一项均占据32bit

各项的结果分别为:

start(imx起始地址):0x877ff000

length(imx大小):0x0006c000

plugin:0

 

3. dcd:device configuration data,存储着地址和变量,用于重新设置时钟和DDR等外设

其结构如下图,其中每一项均占据32bit

CMD的结构图下图,其中每一行均占据32bit

dcd的大小为entry - dcd = 0xbd4

 

链接文件和主汇编文件我将在下一节中进行分析

 

 

下一章  2、struct gd_t gd成员设置

 

posted @ 2020-07-01 15:32  Lioker  阅读(378)  评论(0编辑  收藏