找回密码
 注册
搜索
查看: 1131|回复: 6

[讨论] bootloader源程序问题请教

[复制链接]
发表于 2008-3-28 11:06:42 | 显示全部楼层 |阅读模式
最近闲下来了,想学习一下BOOTLOADER,在网上找到一个源代码,其中有一段弄不明白,主要是Part 4和Part 6看不懂。恳请各位解答。工程文件也传上来了,是基于ADS的。
启动初始化代码如下:

        AREA    Init, CODE, READONLY
                CODE32
                GET snds.s
               
        ENTRY

start



;Part 1,这一段我看明白了,主要是设置状态寄存器。
;***************************************************************
;disable interrupts in CPU and switch to SVC32 mode

        MRS        r0, cpsr
        BIC        r0, r0, #MASK_MODE
        ORR        r0, r0, #MODE_SVC32
        ORR r0, r0, #I_BIT
        ORR r0, r0, #F_BIT
        MSR        cpsr_c, r0

        LDR        r2, =ARM7_INTMASK                         ;R2->interrupt controller
        MVN        r1, #0                                                 ;&FFFFFFFF
        STR        r1, [r2]                                         ;disable all interrupt soucres

        LDR        r2, =ARM7_INTPEND                         ;R2->interrupt pend register.
        MVN        r1, #0                                                 ;&FFFFFFFF
        STR        r1, [r2]                                         ;clear all interrupt flags.


;Part 2
;****************************************************************

        LDR        r0, =ARM7_SYSCFG
        LDR        r1, =0x87ffffA0                                ;config SYSCFG
        STR        r1, [r0]                                         ;Cache & WB disabled


;Part 3
;***************************************************************
;        Import some important variables for later use

    IMPORT |Image$$RO$$Base|   
        IMPORT |Image$$RO$$Limit|   
        IMPORT |Image$$RW$$Base|   
        IMPORT |Image$$RW$$Limit|        
        IMPORT |Image$$ZI$$Base|        
        IMPORT |Image$$ZI$$Limit|


;Part 4,关键是这一段,我看不明白。请指教!!!!!!!!!!!!!!!!
;****************************************************************
;Initalize the memory as followa:
;        FLASH                        @ 0  ~ 2 M
;        SDRAM                        @ 2  ~ 18M


        LDR        r1, =rEXTDBWTH                                 ;EXTDBWTH                         
        LDR        r2, =rROMCON0                                  ;ROMCON0        @ 0M ~ 2M       
        LDR        r3, =rROMCON1                                ;ROMCON1        @ DISABLED
        LDR        r4, =rROMCON2                                ;ROMCON1        @ DISABLED
        LDR        r5, =rROMCON3                                ;ROMCON1        @ DISABLED
        LDR        r6, =rROMCON4                                ;ROMCON1        @ DISABLED
        LDR        r7, =rROMCON5                                ;ROMCON1        @ DISABLED
        LDR        r8, =rSDRAMCON0                                ;SDRAMCON0         @ 2M ~ 18M
        LDR        r9, =rSDRAMCON1                                ;SDRAMCON1         @ DISABLED
        LDR        r10,=rSDRAMCON2                                ;SDRAMCON2         @ DISABLED
        LDR        r11,=rSDRAMCON3                                ;SDRAMCON3         @ DISABLED
        LDR        r12,=rSREFEXTCON                       
       
        LDR        r0, =ARM7_EXTDBWTH                        
        STMIA        r0, {r1-r12}


;Part 5
;***************************************************************
;Self copy from FLASH to SDRAM

        LDR                r0, =|Image$$RO$$Base|      
        LDR                r1, =|Image$$RO$$Limit|      
        LDR                r2, =|Image$$RW$$Base|      
        LDR                r3, =|Image$$RW$$Limit|     

        SUB         r1, r1, r0
        SUB                r3, r3, r2
        ADD                r1, r1, r3
       
        LDR                r2, =0x200000   ;@2M

       
COPY
        LDR                r3, [r0], #4
        STR                r3, [r2], #4
        SUBS        r1, r1,   #4
        BNE                COPY



;Part 6,还有这一段开不懂!!!!!!!!
****************************************************************
;Remap the memory
;         FLASH        @ 16 ~ 18M
;         SDRAM        @ 0  ~ 16M

  
        LDR        r1, =rEXTDBWTH_R                         ;EXTDBWTH                         
        LDR        r2, =rROMCON0_R                          ;ROMCON0        @ 16M ~ 18M       
        LDR        r3, =rROMCON1_R                                ;ROMCON1        @ DISABLED
        LDR        r4, =rROMCON2_R                                ;ROMCON2        @ DISABLED
        LDR        r5, =rROMCON3_R                                ;ROMCON3        @ DISABLED
        LDR        r6, =rROMCON4_R                                ;ROMCON4        @ DISABLED
        LDR        r7, =rROMCON5_R                                ;ROMCON4        @ DISABLED
        LDR        r8, =rSDRAMCON0_R                        ;SDRAMCON0         @ 0M ~ 16M
        LDR        r9, =rSDRAMCON1_R                        ;SDRAMCON1         @ DISABLED
        LDR        r10,=rSDRAMCON2_R                        ;SDRAMCON2         @ DISABLED
        LDR        r11,=rSDRAMCON3_R                        ;SDRAMCON3         @ DISABLED
        LDR        r12,=rSREFEXTCON_R                       

        LDR        r0, =ARM7_EXTDBWTH                        
        STMIA        r0, {r1-r12}
  


;Part 7
;*****************************************************************
; Copy RW & ZI to SDRAM

        LDR r0, =|Image$$RO$$Limit|        
        LDR r1, =|Image$$RW$$Base|                
        LDR r3, =|Image$$ZI$$Base|                

        CMP r0, r1
        BEQ %1

0         CMP r1, r3                                                 ; Copy init data
        LDRCC r2, [r0], #4
        STRCC r2, [r1], #4
        BCC %0

1         LDR r1, =|Image$$ZI$$Limit|         ; Top of zero init segment
        MOV r2, #0

2         CMP r3, r1                                                 ; Zero init
        STRCC r2, [r3], #4
        BCC %2


;Part 8
;***********************************************************************
;Set stack pointer & jump to c function

        LDR                sp, =0x800000

        IMPORT        loadkernel
        LDR                pc, =loadkernel

        END


【文件名】:08328@52RD_bootloader(ADS).rar
【格 式】:rar
【大 小】:1374K
【简 介】:
【目 录】:This an simple implementation of  bootloader for S3C4510B
;        Hope it is useful to you.


 楼主| 发表于 2008-3-28 11:54:37 | 显示全部楼层
自己顶一个,高手解答,新手提问。
点评回复

使用道具 举报

发表于 2008-3-29 14:32:26 | 显示全部楼层
代码开始是从FLASH启动,然后把FLASH里面的所有东西拷贝到SDRAM,再把SDRAM重新映射到从地址0开始。
点评回复

使用道具 举报

发表于 2008-3-30 13:58:59 | 显示全部楼层
你看的这个bootloader是4510的吧?我是这样理解的:
part1~part2:就是设置状态寄存器,系统寄存器。
part3:获得RO,RW,ZI段的起止地址,这些地址是在程序运行时各段的对应值,是在连接时确定的。
part4:[/COLOR]设定系统的存储空间,就是通过写ARM芯片的寄存器来实现的,只要翻一下Datasheet就可以看明白。4510复位后只有bank0才是有效可以访问的,其他bank都处于无效状态,只有经过这一步,把DRAM等一些存储器映射到地址空间上,才能进行访问。说不清楚,一定要看Datasheet。
part5:涉及到加载域与运行时域,根据连接的需要把程序从flash拷贝到DARM,目的是希望程序能在DRAM中运行获得大的速度。
part6:[/COLOR]又是设置刚才part4的那些个寄存器!显然还是映射存储器地址空间,但不同的是把DRAM设在低地址,经过这一步,程序已经跑到DRAM上运行了。这里叫地址重映射。
part7:还是根据连接的需要,把RW段的数据拷贝到位,清零ZI。
part8:自然是跳到内核去了。[em02][em02]
整个bootloader大概就是这个过程,不知有没帮到你,我也刚学,有机会可以交流一下。[em14]
点评回复

使用道具 举报

 楼主| 发表于 2008-3-31 10:55:14 | 显示全部楼层

感谢楼上

楼上讲的很清楚,很感谢!我再好好研究下,有问题再请教![em01]
点评回复

使用道具 举报

发表于 2008-4-5 16:45:26 | 显示全部楼层
点评回复

使用道具 举报

 楼主| 发表于 2008-4-7 15:36:56 | 显示全部楼层
通过这几天的努力,看明白了个大概.对于这个语句LDR r2, =rROMCON0      ;ROMCON0 @ 0M ~ 2M
我怎么算地址都应该是0x00000----0x100000,这么算是0M~1M啊,并不是0M ~ 2M,高人来解释一下。
[em14]
点评回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies

本版积分规则

Archiver|手机版|小黑屋|52RD我爱研发网 ( 沪ICP备2022007804号-2 )

GMT+8, 2024-11-25 16:19 , Processed in 0.052708 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表