XuSenfeng

个人站

复读了,更新随缘,有的文件不全或者图片缺失具体看我的笔记库(https://github.com/XuSenfeng/note)


IMX启动方式

目录

IMX启动方式

启动方式的选择

LED灯是从SD卡读取启动文件, 所以支持从SD卡启动

大多数的Linux芯片都支持多种启动方式

6ULL

怎么选择启动方式,

手册第八章

  • 启动方式的选择

根据引脚设置, BOOT_MODE1和BOOT_MODE0两个引脚

这是两个I/O控制的, 默认连接到拨码开关的1,2按键, 在芯片内部默认为下拉, 外接上拉电阻

00: 从熔丝启动

01: 串行下载, USB启动

10: 内部的boot

11: 保留

如果要烧写系统使用USB下载, 一般下载到SD卡EMMC中等, 烧写完成后设置为从内部boot启动

  • 启动设备的选择

前提是你已经设置为从内部启动

支持的设备: nor fash, oneNAND, QSPI fash, SD/EMMPRON, 最常用的是NAND, SD, EMMC和 QSPI Flash

选择, 通过BOOT_CFG选择

有BOOT_CFG1, 2, 4每个八位

是由LCD_DATA0-23进行设置的, 开发板上大部分默认为47K接地

BOOT_CFG4全部接地

BOOT_CFG2-3, 4可以选择使用哪一个SD卡接口(一共有两个), 但是4都接0, 所以只有第三个接口连接到拨码开关, 0的时候从eSDHC1启动, 1从eSDHC2启动

BOOT1-3, 4, 5, 6, 7被使用, 0,1默认上拉, 其他的位设施SD卡, EMMC, NADA启动的方式, 以及设备的格式

在核心板上boot核心设置, 一般为47k接地, 拨码开关有一个4.7k电阻接3.3v, 用以设置

启动头文件

boot rom启动的时候

首先会进行

手册8.4设备初始化

ROM是从0x00000000到0x00017fff一共96k

RAM是从0x00900000到0x0091ffff

Boot Rom做的事情

设置时钟, 内核时钟为396M, 以及各个外设的时钟源

使能MMU(内存管理单元), 和Cache, 加快运行的速度

从BOOT_CFG设置的外部存储之中读取image, 然后做相应的处理

IVT和Boot Data数据

8.7烧写镜像

①、Image vectortable,简称IVT,IVT里面包含了一系列的地址信息,这些地址信息在ROM中按照固定的地址存放着

②、Bootdata,启动数据,包含了镜像要拷贝到哪个地址,拷贝的大小是多少等等。

③、Device configuration data,简称DCD,设备配置信息,重点是DDR3的初始化配置

④、用户代码可执行文件,比如led.bin

在头部之中必须有的数据结构, 放置有一系列的地址

IVT表

包含镜像的入口地址, DCD数据的位置, 以及其他需要的地址, 不同的设备位置不同, 我们烧写到SD卡中的文件起始地址是0x400也就是1024, 然后存放3K的头部信息.之后才是我们烧写的bin文件, 在书写的时候是低字节在前

IVT大小是32字节, 一共有8条

地址为0x877FF400开始

  • 第一条header保存自己的信息0X402000D1

    格式为

    tag=>Length=>Version

    Tag为一个字节长度固定为0xD1, Length两个字节, 最后是Version为0x41或0x40

    高直接保存在低字节

  • 第二条entry: 入口地址0X87800000

  • 第三条: 保留

  • 第四条dcd: 0X877FF42C, DCD地址, 由于已经设置文件的地址为0X87800000, 所以load.imx的起始地址就是0X87800000-0XC00=0X877FF400。0X2C这个地址开始就是DCD数据了。

  • 第五条boot data: header里面已经设置了IVT大小是32个 字 节 , 所 以boot data的 地 址 就 是0X877FF400+32=0X877FF420。

  • 第六条self: IVT复制到DDR中以后的首地址0X877FF400
  • 第七条csf: CSF地址。0X00000000没有用到
  • 保留

Boot data

有三个, 每一个32位

  • 镜像绝对地址0X877FF000, 实际为定位前4kb处, 多出来的1kb是为了防止破坏SD卡的原始数据
  • 镜像绝对大小0X00200000: 镜像大小,这里设置2MByte。镜像大小不能超过2MByte。
  • plugin: 0X00000000插件

DCD数据

设备配置数据

就是用来配置内部寄存器的数据, 最大为1178b

  • 0X40E801D2也是有一个header, 结构和IVT表一样, 固定字节为0xD2, 所以DCD大小为0X01E8=488字节
  • 0X04E401CC第一个为Tag,固定为0XCC,第二和三这两个字节是大端模式的命令总长度,为0X01E4=484个字节。第四个字节是Parameter,为0X04,表示目标位置宽度为4个字节
  • 地址大端模式
  • 地址

首先设置引脚, 然后设置DDR(内存)

其他的数据

检查数据命令, NOP命令, 解锁命令, 插件镜像等都没有写, 都属于DCD