s3c6410 IROM启动代码分析

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.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值