打印

LPC3250 kickstart问题

[复制链接]
4267|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mygodlsh|  楼主 | 2010-11-25 14:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请教各位大侠LPC3250从NAND FLASH启动的问题。
LPC3250上电启动后,片内IROM固化的程序把NAND FLASH里的kickstart程序读到IRAM运行。那么IRAM运行起来后,把自己copy到IRAM的高端空间,然后怎么跳转到位于高端IRAM的kickstart程序继续运行?我看程序,没有找到跳转这一段。具体程序如下,请大家帮忙看看,谢了。
arm926ejs_reset
    ; Put the processor is in system mode with interrupts disabled
    MOV   r0, #MODE_SVC:OR:I_MASK:OR:F_MASK
    MSR   cpsr_cxsf, r0
    ; Ensure the MMU is disabled
    MRC   p15, 0, r1, c1, c0, 0
    LDR   r2,=MMU_DISABLE_MASK
    AND   r1, r1, r2
    MCR   p15, 0, r1, c1, c0, 0
clearzi_exit
    ; Enter SVC mode and setup the SVC stack pointer.
    ; This is the mode for runtime initialization.
    MOV   r1, #I_MASK:OR:F_MASK ; No Interrupts
    ORR   r0, r1, #MODE_SVC
    MSR   cpsr_cxsf, r0
    LDR   r11, =END_OF_IRAM
    MOV   sp, r11
; Relocate 15.5K of image
LDR   r0, =END_OF_IRAM
LDR   r1, =0x8000
SUB   r0, r0, r1
MOV   r8, r0
MOV   r2, #0
LDR   r1, =0x4000
loopmove
LDR   r3, [r2], #4
STR   r3, [r0], #4
SUB   r1, r1, #4
CMP   r1, #0
BNE   loopmove
    ; Get address of application to execute
    LDR   r0, =c_entry
    BX    r0
    END

相关帖子

沙发
mygodlsh|  楼主 | 2010-11-25 16:45 | 只看该作者
补充一下c_entry在另外一个C文件里定义,是一个c函数。那么请问
LDR   r0, =c_entry
BX    r0
也是跳到IRAM低端的地址运行,并不会跳到IRAM高端COPY过去的程序运行。
我用软件仿真过的。既然kickstart程序还是在IRAM低端的地址运行,那么接下来kickstart把stage1的程序copy进IRAM的低端地址,此不是把kickstart给覆盖了?那么程序就产生冲突了。想问一下,kickstart究竟是在哪段代码跳到高端的COPY上运行的。

使用特权

评论回复
板凳
思行合一| | 2011-2-9 23:39 | 只看该作者
汇编啊,完全看不懂啊

使用特权

评论回复
地板
maoyanketi| | 2011-2-11 16:58 | 只看该作者
完全不懂,看来好好学习了得

使用特权

评论回复
5
-自己人| | 2011-2-11 22:30 | 只看该作者
看不懂

使用特权

评论回复
6
米其林r| | 2011-2-16 12:58 | 只看该作者
太复杂,看不懂啊!

使用特权

评论回复
7
zmarshal| | 2012-5-2 09:48 | 只看该作者
本帖最后由 zmarshal 于 2012-5-2 09:50 编辑

一起来理解这段代码。我理解是先在IRAM顶部预留了32KB(0x8000)的空间,这时IRAM的0x0就是kickstart(一开机就有IROM里的bootRom代码拷贝到IRAM的0x0处),kickstart把0x0~0x4000的16KB
拷贝到(END_OF_IRAM-0x8000)~(END_OF_IRAM-0x4000)处。最后结过是:
  | -------------------|  END_OF_IRAM
  |                            |   
  |--------------------| (END_OF_IRAM-0x4000)
  |   Kickstart  新居     |
  |--------------------| (END_OF_IRAM-0x8000)
  |                            |
  |                            |
  |--------------------| 0x4000
  |  kickstart   故居      |
  |--------------------| 0x0
我的问题是:
(1) 源码中“Relocate 15.5K of image”这个15.5K 是怎么来的?
(2) 我用JTAG直接烧kickstart和S1L到block 0和block 1板子起不来,为什么?

使用特权

评论回复
8
shushiqiankun| | 2013-5-28 09:56 | 只看该作者
可以的,编译时将CODE的代码空间设置为0x38000开始就行了,

使用特权

评论回复
9
shushiqiankun| | 2013-5-28 09:57 | 只看该作者
但我一直没找到2k Nand 起动的源码,那位大哥有呀,主要是restore的NAND 驱动部分。

使用特权

评论回复
10
jplzl10000| | 2013-11-1 11:56 | 只看该作者
shushiqiankun 发表于 2013-5-28 09:56
可以的,编译时将CODE的代码空间设置为0x38000开始就行了,

这个能行吗?这个kickstart的功能是将从0地址开始的16K代码搬移到0x38000处的。
把CODE代码空间,也即加载地址高为0x38000时,kickstart代码本身就处在0x38000处。
那怎么把自己搬移到0x08038000处呢?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

2

帖子

1

粉丝