IMX6ULL映像文件的制作

我们制作映像文件的目的什么?把自己的程序烧写到启动设备,让boot ROM程序启动它。

所以制作映像文件的起点是:我们编写的程序。制作过程中各填值的计算方法如下图所示。

IMX6ULL映像文件的制作_第1张图片

上图中各步骤细说如下:
① 确定入口地址entry:
  我们的程序运行时要放在内存中哪一个位置,这是我们决定的。它被称为入口地址、链接地址。
  
② 确定映像文件在内存中的地址start:
  boot ROM程序启动时,会把“initial load region”读出来,“initial load region”里含有IVT、Boot data、DCD。boot ROM根据DCD初始化设备后,再把整个映像文件读到内存。
  在启动设备上,“initial load region”之后紧跟着我们的程序,反过来说就是我们程序的前面,放着“initial load region”。假设“initial load region”的大小为load_size,那么在内存中“initial load region”的位置start = entry – load_size。
  注意:“initial load region”位于启动设备0位置,它的头部并不是IVT,而是一些无用的数据(或是分区信息)。
  
③ 确定IVT在内存中的地址self:
  我们知道IVT在启动设备上某个固定的位置:ivt_offset。那么在内存中它的位置可以如下计算:
  self = start + ivt_offset = entry – load_size + ivt_offset
  
④ 确定Boot data在内存中的地址boot_data:
  IVT的大小是32字节,IVT之后就是Boot data,而IVT中的boot_data值表示Boot data在内存中的位置,计算如下:
  boot_data = self + 32 = entry – load_size + ivt_offset + 32
  
⑤ 确定DCD在内存中的地址dcd:
  Boot data的大小是12字节,Boot data之后就是DCD,而IVT中的dcd值表示DCD在内存中的位置,计算如下:
  dcd = boot_data + 12 = entry – load_size + ivt_offset + 44
  
⑥ 写入DCD的数据:
  DCD是用初始化硬件的,特别是初始化DDR。而DDR的初始化非常的复杂、专业,我们一般是使用硬件厂家提供的代码。
  在后面的程序中你可以看到,我们是使用类似下面的指令来制作映象文件:

	./mkimage -n ./imximage.cfg.cfgtmp -T imximage -e 0x80100000 -d led.bin led.imx

上述命令中的imximage.cfg.cfgtmp就是厂家提供的,内部截取部分贴出来:

IMX6ULL映像文件的制作_第2张图片

从上图也可以看到imximage.cfg.cfgtmp文件中基本是对寄存器的写操作。
  mkimage程序来自u-boot,它会把imximage.cfg.cfgtmp中的内容转换为DCD数据。我们并不打算讲解DCD的内容,只需要了解它的大概作用:
  a. 设置时钟:DDR也需要时钟,这很好理解
  b. 设置引脚:DDR需要很多引脚
  c. 设置DDR控制器:Multi-mode DDR controller (MMDC)
  
⑦ 写入用户程序
⑧ 经过上述7个步骤,整个映像文件就构造出来了,可以把它烧入启动设备。
  
  我们提供的示例程序001_led中有一个文件:led.img,它就是映象文件,可以直接烧入TF卡。用软件Hex Editor Neo打开led.img,选择doble word方式显示,可以看到如下内容,你可以自行验证一下映像文件中各个值。
IMX6ULL映像文件的制作_第3张图片

你可能感兴趣的:(IMX.6)