S3c6410 IROM启动代码分析:
1) 跳转到steppingstone
由于新做的板子要用SD卡启动的方式测试板子硬件功能是否正常,所以我很想知道程序是如何由irom跳转到我写的测试代码的:
jump_to_stepingldr0:
0x451c: e51ff004 ldr pc, [pc, #-4] ; 将0x4520内存处的数据作为地址写入PC
0x4520: 0c000000 stceq 0, c0, [r0], {0}
哦,原来就是通过写pc寄存器的值跳转到0x0c000000处执行啊,这就相当于跳转后irom就休假了,不再干任何事。这样我写代码的时候不需要考虑堆栈等(不是通过BL命令跳转的)的设置会破坏irom程序的执行。
2) 中断向量表
大家知道,ARM程序的前32 字节必须放置异常中断向量表,每次开机都从这里开始执行程序。但是当从IROM启动的时候,我们写的代码并不是放在0地址处的,那么我们要想实现中断程序的正确跳转应该怎么办呢?我们的向量表得放在哪里呢?这得知道irom的内部启动代码在这最开始的32字节存储上放的是什么代码:
Reset_vector:
0x0: ea00002b b 0xb4 ; 跳转到irom_entry处执行
0x4: ea000006 b 0x24 ;
0x8: ea00000b b 0x3c ;
0xc: ea000010 b 0x54 ;
0x10:ea000015 b 0x6c ;
0x14:eafffffe b 0x14 ; 在此处无限循环
0x18: ea000019 b 0x84 ;
0x1c: ea00001e b 0x9c ;
0x20:eafffffe b 0x20 ; 在此处无限循环
这里我们当然很好奇0x24,0x3c,0x54,0x6c,0x84,0x9c处的代码再会跳到哪去呢:
0x24: e24dd004 sub sp,sp, #4
0x28: e92d0001 push {r0}; 将r0压入堆栈,保护数据
0x2c: e59f02ac ldr r0, [pc, #684] ; 0x2e0
0x30: e5900000 ldr r0, [r0]
0x34: e58d0004 str r0, [sp, #4]
0x38: e8bd8001 pop {r0,pc}; 将0x2e0处放置的数据作为地址写入pc,实现跳转:
0x2e0:0c001fe4 stceq 15,c1, [r0], {228}
0x2e4:0c001fe8 stceq 15, c1, [r0],{232}
0x2e8:0c001fec stceq 15, c1,[r0], {236}
0x2ec:0c001ff0 stceq 15, c1,[r0], {240}
0x2f0:0c001ff8 stceq 15, c1,[r0], {248}
0x2f4:0c001ffc stceq 15,c1, [r0], {252}
于是我们知道,IROM内部启动代码并没有实现中断处理程序的编写,而是跳转到steppingstone的顶端的6字节。所以我们自己写的程序(自己的u-boot)的第一级中断向量表要放在BL1的最后面,这可以通过scatter-load装载技术实现。另外,由于irom只有6条跳转指令,因此我们写的中断向量表的格式得变一下了:
B HandlerUndef
B HandlerSWI
B HandlerPabort
B HandlerDabort
B HandlerIRQ
B HandlerFIQ
这里就不需要添加b ResetHandle 和 b .这两条指令了。
3) irom内部启动代码BL0都做了哪些硬件初始化工作:
理解了这个之后,有些事我们就不需要再去做了^_^
1. Disable the Watch-Dog Timer关闭看门狗
2. Initialize the TCM. 初始化TCM
3. Initialize the Block Device CopyFunction. 初始化了一些很有用的函数:将SD卡/NandFlash /OneNand的代码复制到指定内存地址处。
4. Initialize the stack region 初始化堆栈
5. Initialize the PLL. 设置APLL(220,3,2),MPLL(220,3,3)和EPLL(60,2,4,0)
6. Initialize the instruction cache初始化 I-Cache
7. Initialize the heap region. 初始化堆
4) 数据复制函数
如何使用这些函数呢,很简单,只要声明几个指针指向对应的函数的地址就可以了,具体可以参考三星官方网站。
地址 | 名称 | 功能 |
0x0C004008 | CopyMMCtoMem | This internal function can copy any data from SD/MMC device to SDRAM. |