1uboot移植和imx文件分析
Posted lioker
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1uboot移植和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
链接文件和主汇编文件我将在下一节中进行分析
以上是关于1uboot移植和imx文件分析的主要内容,如果未能解决你的问题,请参考以下文章
uboot | 移植NXP官方uboot到imx6ull开发板(2016.03)
uboot | 移植NXP官方uboot到imx6ull开发板(2016.03)