arm6ul 的TF卡启动.


arm6ul 的TF卡启动.

把拨码开关拨到一定位置,就会从TF卡启动, 那么什么叫启动,启动过程是如何进行的?

原来arm6ul 上电后从它的起始地址开始执行,检查拨码开关位置,符合条件从TF卡读取固定数据到内存,
然后跳转到内存继续执行, 和x86 的启动类似,也有boot,load,jump 的过程.

如果它不是一个启动盘, 那它可能是一般的文件系统盘,如fat32,ntfs,ext2等等, 启动盘是在此基础上添加了可启动特性!

本贴目的,就是要分析磁盘格式,并写出arm 启动盘制作过程.

下面看看具体的格式.
分析一下正点原子的启动盘制作程序imgdownload. 当然要用到屠龙刀IDApro
imxdownload <源文件> <目标盘> <-256m or -512m>

  1. 格式不对,它会打印一个帮助信息.
  2. 格式正确:
    2.1: 根据命令行参数,判断是256M or 512M
    2.2: 打开输入文件(第一个参数),打不开则出错.
    2.3: 获取文件长度参数,分配内存比文件长度大3K,把文件读到384偏移位置处
    2.4: copy 一个表到头部,对头的地址是有要求的,应该是8的边界.256M copy imx6_256mb_ivtdcd_table
    512M copy imx6_512mb_ivtdcd_table

写到此,看出了函数的实际执行意义,去掉了它的神秘性!
2.5: 下面就是写输出文件. 输出文件为load.imx
2.6: 用dd 命令把load.imx 写到目标盘
可见就是固定的加了一个头部!
这里再补充一下ivtdcd表的格式及确定一下它的意义:
所谓ivtdtd, 是ivt+bt+dcd,
ivt: image vector table
bt: boot data table, 只有一个地址+长度
dcd: device config data

rodata:00000000004011E0 imx6_256mb_ivtdcd_table dd 402000D1h, 87800000h, 0, 877FF42Ch, 877FF420h, 877FF400h
.rodata:00000000004011E0 ; DATA XREF: main+28C↑o
.rodata:00000000004011E0 dd 2 dup(0), 877FF000h, 76000h, 0, 40E801D2h, 4E401CCh
.rodata:00000000004011E0 dd 68400C02h, 0FFFFFFFFh, 6C400C02h, 0FFFFFFFFh, 70400C02h
.rodata:00000000004011E0 dd 0FFFFFFFFh, 74400C02h, 0FFFFFFFFh, 78400C02h, 0FFFFFFFFh
.rodata:00000000004011E0 dd 7C400C02h, 0FFFFFFFFh, 80400C02h, 0FFFFFFFFh, 0B4040E02h
.rodata:00000000004011E0 dd 0C00h, 0AC040E02h, 0, 7C020E02h, 30000000h, 50020E02h
.rodata:00000000004011E0 dd 30000000h, 4C020E02h, 30000000h, 90040E02h, 30000000h
.rodata:00000000004011E0 dd 88020E02h, 30000C00h, 70020E02h, 0, 60020E02h, 30000000h
.rodata:00000000004011E0 dd 64020E02h, 30000000h, 0A0040E02h, 30000000h, 94040E02h
.rodata:00000000004011E0 dd 200h, 80020E02h, 30000000h, 84020E02h, 30000000h, 0B0040E02h
.rodata:00000000004011E0 dd 200h, 98040E02h, 30000000h, 0A4040E02h, 30000000h, 44020E02h
.rodata:00000000004011E0 dd 30000000h, 48020E02h, 30000000h, 1C001B02h, 800000h
.rodata:00000000004011E0 dd 81B02h, 30039A1h, 0C081B02h, 4000000h, 3C081B02h, 3C013C01h
.rodata:00000000004011E0 dd 48081B02h, 38324040h, 50081B02h, 28304040h, 1C081B02h
.rodata:00000000004011E0 dd 33333333h, 20081B02h, 33333333h, 2C081B02h, 333333F3h
.rodata:00000000004011E0 dd 30081B02h, 333333F3h, 0C0081B02h, 9409400h, 0B8081B02h
.rodata:00000000004011E0 dd 80000h, 4001B02h, 2D000200h, 8001B02h, 3030331Bh, 0C001B02h
.rodata:00000000004011E0 dd 0F352433Fh, 10001B02h, 630B6DB6h, 14001B02h, 0DB00FF01h
.rodata:00000000004011E0 dd 18001B02h, 40172000h, 1C001B02h, 800000h, 2C001B02h
.rodata:00000000004011E0 dd 0D2260000h, 30001B02h, 23104300h, 40001B02h, 47000000h
.rodata:00000000004011E0 dd 1B02h, 1883h, 90081B02h, 4000h, 1C001B02h, 32800002h
.rodata:00000000004011E0 dd 1C001B02h, 33800000h, 1C001B02h, 31800400h, 1C001B02h
.rodata:00000000004011E0 dd 30802015h, 1C001B02h, 40800004h, 20001B02h, 80000h
.rodata:00000000004011E0 dd 18081B02h, 27020000h, 4001B02h, 2D550200h, 4041B02h
.rodata:00000000004011E0 dd 6100100h, 1C001B02h, 7Ch dup(0)

ivt 表是什么表呢? 下面一睹真颜!

ivt header(4bytes)
第一个字节0xd1,叫tag
第二,三个字节0x0020 是长度(大端序)
第4个字节0x40 叫version.

0x87800000 是led.bin的入口地址, 后面的0是保留地址
0x877ff42c 是dcd表地址. 可以算出boot data 长度是C
0x877ff420 (boot data)地址 可以看出boot data 紧跟在ivt 之后,长度要看dcd 表地址
0x877ff400(self), ivt 复制到ddr 后的内存 = 0x87800000-0xc00(3K)
0x0 保留
前面32字节就是ivt表, 后面是boot data:

boot data:

0x877ff000 (start), 整个load.imx 的加载地址,包括前边1Kb的保留地址
0x76000 (length), 影像的大小
0x0 (plugin). 插件.

dcd 数据: device config data, ivt 表中指定从0x877ff42c开始

dcd 是Imx6ul 寄存器地址和对应的配置信息的集合,其结构为:
dcd Header (4bytes)
cmd
cmd
cmd…
dcd header 同ivt的header
第一个字节0xd2, 叫tag
第2,3个字节0x01e8 为length(大端序)
第4个字节为为version (0x40或0x41)

每个cmd 还包含一层结构.
header tag(0xcc)+length+parameter
以0x4e401cc 为例,length(0x014e), parameter(4) 表示4个字节
由于dcd 的大小为0x1e8, 所以包含一个cmd 区.

address
value
address
value

后面就是根据手册查找对应地址,付给相应内容,其功能大体上是打开外设时钟,初始化ddr寄存器等.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值