分享

Bootloader代码分析

 笔录收藏 2012-08-01

代码分析报告 


(一)           Bootloader代码分析

 

1.      第一部分

功能:关闭中断,进入ARM状态,切换到SVC模式(复位异常进入SVC 模式)。

 

MRS  r0,    cpsr       

把状态寄存器CPSR中数据读入r0 寄存器。

BIC     r0,         r0,         #MASK_MODE

MASK_MODE  =   0x0000003F)把 r0 寄存器的低6位清零。(把Thumb状态为清零,回到ARM状态)

ORR r0,         r0,         #MODE_SVC32

MODE_SVC32 =    0x00000013)把r0 寄存器的低5置为 10011SVC模式)。

ORR     r0,    r0,         #I_BIT

I_BIT   0x80)把r0 寄存器的第8位置1(关闭中断状态位)。

ORR     r0,         r0,         F_BIT

F_BIT =  0x40 )把r0 寄存器的第7位置1(关闭快速中断状态位)。

MSR cpsr_c,     r0

r0 寄存器的低8位存储进CPSR寄存器的低8位。

 

自此进入ARM状态,切换到SVC模式,关闭中断和快速中断。

 

LDR  r2,  =  ARM7_INTMASK

ASIC_BASE        EQU     0x03ff0000

ARM7_INTMASK EQU     (ASIC_BASE+0x4008)

ARM7_INTMASK  =  0x03ff4008

0x03ff4008存入r2 寄存器。

ASIC_BASE SYSCFG寄存器的第16位到第25位,是指S3C4510b中特殊寄存器的启始地址。

SYSCFG寄存器复位时缺省值是0x37ff  ff91

SYSCFG寄存器的第16位到第25位的值是0x 3ff

ARM7_INTMASK EQU     (ASIC_BASE+0x4008)

            中断模式寄存器:控制中断源的掩码。

偏移地址0x4008

            ARM7_INTMASK 就是中断模式寄存器的寻址地址。

ARM7_INTMASK  =  0x03ff4008

            21位是全局模式位:置1时断开所有中断源。

                                 0 连接所有中断源。

            0位到第20位:置1时,断开所对应的中断源。

0时,连接所对应的中断源。

MVN r1, #0     

         r1 寄存器的32位全部置1

STR     1,  [r2]                   

         r1 寄存器中的值存入r2 寄存器中的地址中。

         既把中断模式寄存器所有位置1,断开所有中断源。

 

LDR r2,         =   ARM 7_INTPEND      

ASIC_BASE        EQU     0x03ff0000

ARM7_INTPEND    EQU     (ASIC_BASE+0x4004)

ARM7_ INTPEND  =  0x03ff4004

0x03ff4004r2 寄存器。

        名称:中断未决寄存器: 

偏移地址:0x4004

        ARM7_ INTPEND 就是中断未决寄存器的寻址地址

MVN r1,     #0

         r1 寄存器的32位全部置1

STR     r1, [r2]

r1 寄存器中的值存入r2 寄存器中的地址中。

         既把中断模式寄存器所有位置1,断开所有中断源。

 

 

 

 

 

2.      第二部分

LDR      r0    =   ARM7_SYSCFG

ASIC_BASE      EQU     0x03ff0000

     ARM7_SYSCFG     EQU     (ASIC_BASE+0x0000)

     ARM7_SYSCFG  =   0x03ff  0000

0x03ff  0000r0寄存器。

系统配置寄存器:偏移地址0x0000

系统复位的缺省值:0x37ff  ff91

ARM7_SYSCFG 就是系统配置寄存器的寻址地址。

        [0]SE必须设为0

        [1]CE cache 使能位;

                CE时,能够执行cache 的有关操作。

                CE 0时,禁止执行cache 的有关操作。

        [2]WE write buffer 使能位;

             WE时,能够执行write buffer 的有关操作。

             WE0时,禁止执行write buffer 的有关操作。

     [54]CM cache 模式位;(决定了CPU 内部的存储单元cache sram 的划分)

             00 时,cache 4 KBsram  4 KB

             01 时,cache 8 KBsram  0 KB

             10 时,cache 0 KBsram  8 KB

     [156]sram 的基址。

     [2516]:特殊寄存器的基址。

     [3026]:产品号。

             00001  S3C4510X

             11001  S3C4510B

     [31]DRAM 同步模式位。

             时,

             1时,

LDR      r1        0x87ffffA0 

     0x87ffffA0 存入r1 寄存器。

STR      r1        [r0]           

        r1 寄存器中的值0x87ffffA0 存入 r0 寄存器的地址中,即系统配置寄存器中。

        CE 位清 0 ,禁止cache 

WE位清 0 ,禁止write buffer 

CM 10 cache 0 KBsram  8 KB 

        sram 的基址:0x03FE 0000

        特殊寄存器的基址:0x03FF 0000

        产品号00001  S3C4510X

        DRAM 同步模式位:

 

3.      第三部分

IMPORT |Image$$RO$$Base|   

IMPORT |Image$$RO$$Limit|  

IMPORT |Image$$RW$$Base|  

IMPORT |Image$$RW$$Limit|  

IMPORT |Image$$ZI$$Base|     

IMPORT |Image$$ZI$$Limit|

引入与ADS 内设的6个变量。

 

4.      第四部分

LDR     r1,     =   rEXTDBWTH   ( rEXTDBWTH    =   0x00003001   

LDR     r2,     =   rROMCON0    rROMCON0      =   0x02000060 

LDR     r3,     =   rROMCON1    rROMCON1      =  0x60 

LDR     r4,    =   rROMCON2    rROMCON2      =  0x60 

LDR     r5,     =   rROMCON3    rROMCON3      =  0x60 

LDR     r6,     =   rROMCON4    rROMCON4      =  0x60 

LDR     r7,     =   rROMCON5    rROMCON5      =  0x60 

LDR     r8,     =   rSDRAMCON0  rSDRAMCON0     0x12008380 

LDR     r9,     =   rSDRAMCON1  rSDRAMCON1   =  0x00 

LDR     r10,    =   rSDRAMCON2  rSDRAMCON2   =  0x00     

LDR     r11,    =   rSDRAMCON3  rSDRAMCON3   =  0x00     

LDR     r12,    =   rSREFEXTCON rSREFEXTCON   =   0xCE278360 

        把一些配置字存入r0 – r12 寄存器,以至过后初始化SDRAMFLASH

 

    LDR r0, =ARM7_EXTDBWTH         

ASIC_BASE      EQU     0x03ff0000

        ARM7_EXTDBWTH   EQU     (ASIC_BASE+0x3010)

     ARM7_ EXTDBWTH  =   0x03ff 3010

    EXTDBWTH 寄存器的地址0x03ff 3010存入r0寄存器。

    名称:EXTDBWTH;(P176

    功能:设置每个地址段的数据总线宽度;

    偏移地址:0x3010

    缺省值:0x0000 0000

 

[10] 设置DSR0 的数据总线的宽度。DSR0是只读的。

    00 :不允许;

    01 8位;

    10 16位;

    11 32位;

[32] 设置DSR1的数据总线的宽度。

[54]

[76]

[98]

[1110]

    00 :不允许;

    01 8位;

    10 16位;

    11 32位;

[1312] 设置DSD0的数据总线的宽度。

[1514]

[1716]

[1918]

    00 :不允许;

    01 8位;

    10 16位;

    11 32位;

[2120] 设置DSX0的数据总线的宽度。(I/ O 地址范围)

[2322]

[2524]

[2726]

    00 :不允许;

    01 8位;

    10 16位;

    11 32位;

 

STMIA   r0, {r1-r12}

        r1 – r12 寄存器中的配置字依次写入r0 中地址 到r0 中地址 + 44中。

          EXTDBWTH寄存器;        ( rEXTDBWTH    =   0x00003001 

         ROMCON0 寄存器;        rROMCON0      =   0x02000060 

            ROMCON1 寄存器;        rROMCON1      =  0x60 

            ROMCON2 寄存器;        rROMCON2      =  0x60 

            ROMCON3 寄存器;        rROMCON3      =  0x60 

            ROMCON4 寄存器;        rROMCON4      =  0x60 

            ROMCON5 寄存器;        rROMCON5      =  0x60 

            DRAMCON0 寄存器;       rSDRAMCON0     0x12008380 

            DRAMCON1 寄存器;       rSDRAMCON1   =  0x00 

DRAMCON2 寄存器;       rSDRAMCON2   =  0x00 

DRAMCON3 寄存器;       rSDRAMCON3   =  0x00 

            REFEXTCON寄存器;       rSREFEXTCON   =   0xCE278360 

        名称:ROMCON0    ROMCON5

        功能:配置DSR 的地址范围和操作模式

        偏移地址:0x3014  0x3028

        缺省值:ROMCON0  0x2000 0060

                ROMCON1 ROMCON5 0x0000 0060

ROMCON0    ROMCON5 寄存器(P177

        [10] PMC 页模式配置位

            00 

            01 

            10 

            11 

        [32] tpa

            00 

            01 

            10 

            11 

        [64] tacc

            000 

            001 

            010 

            011 

            110 

            111 

        [1910] DSR 的基址;

            基址 = [1910] 左移 16 位。

        [2920] 当前 DSR 的结束地址;

            结束地址 = [2920] 左移 16   + 1

 

        名称:DRAMCON0    DRAMCON3

        功能:配置DSD 的地址范围和操作模式

        偏移地址:0x302C  0x3038

        缺省值:0x0000 0000

 

        名称:REFEXTCON

        功能:

        偏移地址: 0x303C

        缺省值:0x0000 0000

 

DRAMCON0    DRAMCON3 寄存器:

        [0] EDO 模式

        [21]

        [3]

        [64] 保留位

            缺省为 000,必须设置为 001

        [7]

        [98]

        [1910] DSD 的基址;

            基址 = [1910] 左移 16 位。

        [2920] 当前 DSD 的结束地址;

            结束地址 = [2920] 左移 16  + 1

        [3130] CAN

 

REFEXTCON 寄存器 (P203

        [90] I / O 地址基址

            基址 = [90] 左移 16 位。

            结束地址 = 基址 + 16 KB - 1 

        [15] VSF

        [16] REN Refresh 使能位

            :禁止DRAM Refresh

            :允许DRAM Refresh

        [1917]

        [20]

        [3120]

 

 

        EXTDBWTH寄存器;        ( rEXTDBWTH    =   0x00003001 

            [10]  01, 设置FLASH 数据总线宽度为 8 位;

            [1312]  11,设置SDRAM 数据总线宽度为 32位;

            其它位为 00, 禁止使用;

        ROMCON0寄存器:         rROMCON0      =   0x0200 0060 

            [10] PMC 页模式配置位

                设置为00 

            [32] tpa

                设置为00 

            [64] tacc

                设置为110 

            [1910] FLASH 的基址;

                设置为0x000

                基址 =  0x0000 0000

            [2920] 当前 DSR 的结束地址;

                设置为0x020

                结束地址 =  0x0020 0001

        ROMCON1    ROMCON5 寄存器 rROMCON1      =  0x60 

            不关心ROMCON1    ROMCON5 寄存器,把它们设置为缺省值。

    DRAMCON0 寄存器             rSDRAMCON0     0x12008380 

[0] EDO 模式

    设置为0

        [21]

            设置为0

        [3]

            设置为0

        [64] 保留位

            缺省为 000,必须设置为 001设置为000了, 为什么?

        [7]

            设置为1

        [98]

            设置为11

        [1910] SDRAM 的基址;

            设置为 0x020

            基址 = 0x0020 0000

 

        [2920] 当前 DSD 的结束地址;

            设置为 0x120

            结束地址= 0x0120 0001

        [3130] CAN

            设置为00

DRAMCON1    DRAMCON3 寄存器

    不关心DRAMCON1    DRAMCON3 寄存器,把它们设置为缺省值。

REFEXTCON 寄存器(rSREFEXTCON   =   0xCE278360 

        [90] I / O 地址基址

            基址 = [90] 左移 16 位。

            结束地址 = 基址 + 16 KB - 1 

        [15] VSF

        [16] REN Refresh 使能位

            :禁止DRAM Refresh

            :允许DRAM Refresh

        [1917]

        [20]

        [3120]

 

 

 

 

    至此,初始化了FLASH SDRAM

        FLASH 设置为8位数据宽度;

        地址范围从0x0000 0000  0x0200 0000

        SDRAM 设置为32位数据宽度;

        地址范围从0x0200 0000  0x1200 0000

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

5.      第五部分

Bootloader拷贝到SDRAM中。

LDR     r0, =  |Image$$RO$$Base|    

    RO段的基地址赋给 r0 寄存器。

LDR     r1, =  |Image$$RO$$Limit|     

    RO段的结束地址赋给 r1 寄存器。

LDR     r2, =  |Image$$RW$$Base|   

    RW段的基地址赋给 r2 寄存器。

LDR     r3, =  |Image$$RW$$Limit|

    RW段的结束地址赋给 r3 寄存器。

        SUB     r1, r1,    r0

            RO段的结束地址 - RO段的基地址得到RO段的长度,并赋给 r1 寄存器。

        SUB     r3, r3,    r2

            RW段的结束地址 - RW段的基地址得到RW段的长度,并赋给 r3 寄存器。

        ADD     r1, r1,    r3

            RO段的长度 + RW段的长度,得到Bootloader的长度,并赋给 r1 寄存器。

LDR     r2, =      0x20 0000

    设置r2 寄存器的值为 0x0020 00002MB),Bootloader拷贝的目标地址。

 

以下开始了把Bootloader拷贝到SDRAM中。

COPY

    LDR     r3, [r0],  #4

r0寄存器包含Bootloader的启始地址,从Bootloader的启始地址读入4个字节的数据进入r3寄存器。

r0寄存器中地址 + 4

    STR     r3, [r2],  #4

r2 寄存器包含Bootloader拷贝的目标地址,把r3寄存器中的数据存入SDRAM中。

R2寄存器中地址 + 4

    SUBS    r1, r1,     #4

        r1 寄存器包含Bootloader的长度,

        r1 寄存器中Bootloader的长度 – 4

        并影响状态位。

    BNE     COPY

检查状态位位,如果为0,执行这条指令,跳转到COPY,继续拷贝,如果不为0,不执行这个指令,表示Bootloader拷贝已经完成。

 

 

 

 

 

 

 

 

6.      第六部分

LDR r1, =   rEXTDBWTH_R     rEXTDBWTH_R       EQU     0x00003001

LDR r2, =   rROMCON0_R      rROMCON0_R        EQU     0x12040060

LDR r3, =   rROMCON1_R      rROMCON1_R    EQU     0x60

LDR r4, =   rROMCON2_R      rROMCON2_R    EQU     0x60

LDR r5, =   rROMCON3_R      rROMCON3_R    EQU     0x60

LDR r6, =   rROMCON4_R      rROMCON4_R    EQU     0x60

LDR r7, =   rROMCON5_R      rROMCON5_R    EQU     0x60

LDR r8, =   rSDRAMCON0_R    rSDRAMCON0_R      EQU     0x10000380

LDR r9, =   rSDRAMCON1_R    rSDRAMCON1_R      EQU 

(一)           Bootloader代码分析

 

1.      第一部分

功能:关闭中断,进入ARM状态,切换到SVC模式(复位异常进入SVC 模式)。

 

MRS  r0,    cpsr       

把状态寄存器CPSR中数据读入r0 寄存器。

BIC     r0,         r0,         #MASK_MODE

MASK_MODE  =   0x0000003F)把 r0 寄存器的低6位清零。(把Thumb状态为清零,回到ARM状态)

ORR r0,         r0,         #MODE_SVC32

MODE_SVC32 =    0x00000013)把r0 寄存器的低5置为 10011SVC模式)。

ORR     r0,    r0,         #I_BIT

I_BIT   0x80)把r0 寄存器的第8位置1(关闭中断状态位)。

ORR     r0,         r0,         F_BIT

F_BIT =  0x40 )把r0 寄存器的第7位置1(关闭快速中断状态位)。

MSR cpsr_c,     r0

r0 寄存器的低8位存储进CPSR寄存器的低8位。

 

自此进入ARM状态,切换到SVC模式,关闭中断和快速中断。

 

LDR  r2,  =  ARM7_INTMASK

ASIC_BASE        EQU     0x03ff0000

ARM7_INTMASK EQU     (ASIC_BASE+0x4008)

ARM7_INTMASK  =  0x03ff4008

0x03ff4008存入r2 寄存器。

ASIC_BASE SYSCFG寄存器的第16位到第25位,是指S3C4510b中特殊寄存器的启始地址。

SYSCFG寄存器复位时缺省值是0x37ff  ff91

SYSCFG寄存器的第16位到第25位的值是0x 3ff

ARM7_INTMASK EQU     (ASIC_BASE+0x4008)

            中断模式寄存器:控制中断源的掩码。

偏移地址0x4008

            ARM7_INTMASK 就是中断模式寄存器的寻址地址。

ARM7_INTMASK  =  0x03ff4008

            21位是全局模式位:置1时断开所有中断源。

                                 0 连接所有中断源。

            0位到第20位:置1时,断开所对应的中断源。

0时,连接所对应的中断源。

MVN r1, #0     

         r1 寄存器的32位全部置1

STR     1,  [r2]                   

         r1 寄存器中的值存入r2 寄存器中的地址中。

         既把中断模式寄存器所有位置1,断开所有中断源。

 

LDR r2,         =   ARM 7_INTPEND      

ASIC_BASE        EQU     0x03ff0000

ARM7_INTPEND    EQU     (ASIC_BASE+0x4004)

ARM7_ INTPEND  =  0x03ff4004

0x03ff4004r2 寄存器。

        名称:中断未决寄存器: 

偏移地址:0x4004

        ARM7_ INTPEND 就是中断未决寄存器的寻址地址

MVN r1,     #0

         r1 寄存器的32位全部置1

STR     r1, [r2]

r1 寄存器中的值存入r2 寄存器中的地址中。

         既把中断模式寄存器所有位置1,断开所有中断源。

 

 

 

 

 

2.      第二部分

LDR      r0    =   ARM7_SYSCFG

ASIC_BASE      EQU     0x03ff0000

     ARM7_SYSCFG     EQU     (ASIC_BASE+0x0000)

     ARM7_SYSCFG  =   0x03ff  0000

0x03ff  0000r0寄存器。

系统配置寄存器:偏移地址0x0000

系统复位的缺省值:0x37ff  ff91

ARM7_SYSCFG 就是系统配置寄存器的寻址地址。

        [0]SE必须设为0

        [1]CE cache 使能位;

                CE时,能够执行cache 的有关操作。

                CE 0时,禁止执行cache 的有关操作。

        [2]WE write buffer 使能位;

             WE时,能够执行write buffer 的有关操作。

             WE0时,禁止执行write buffer 的有关操作。

     [54]CM cache 模式位;(决定了CPU 内部的存储单元cache sram 的划分)

             00 时,cache 4 KBsram  4 KB

             01 时,cache 8 KBsram  0 KB

             10 时,cache 0 KBsram  8 KB

     [156]sram 的基址。

     [2516]:特殊寄存器的基址。

     [3026]:产品号。

             00001  S3C4510X

             11001  S3C4510B

     [31]DRAM 同步模式位。

             时,

             1时,

LDR      r1        0x87ffffA0 

     0x87ffffA0 存入r1 寄存器。

STR      r1        [r0]           

        r1 寄存器中的值0x87ffffA0 存入 r0 寄存器的地址中,即系统配置寄存器中。

        CE 位清 0 ,禁止cache 

WE位清 0 ,禁止write buffer 

CM 10 cache 0 KBsram  8 KB 

        sram 的基址:0x03FE 0000

        特殊寄存器的基址:0x03FF 0000

        产品号00001  S3C4510X

        DRAM 同步模式位:

 

3.      第三部分

IMPORT |Image$$RO$$Base|   

IMPORT |Image$$RO$$Limit|  

IMPORT |Image$$RW$$Base|  

IMPORT |Image$$RW$$Limit|  

IMPORT |Image$$ZI$$Base|     

IMPORT |Image$$ZI$$Limit|

引入与ADS 内设的6个变量。

 

4.      第四部分

LDR     r1,     =   rEXTDBWTH   ( rEXTDBWTH    =   0x00003001   

LDR     r2,     =   rROMCON0    rROMCON0      =   0x02000060 

LDR     r3,     =   rROMCON1    rROMCON1      =  0x60 

LDR     r4,    =   rROMCON2    rROMCON2      =  0x60 

LDR     r5,     =   rROMCON3    rROMCON3      =  0x60 

LDR     r6,     =   rROMCON4    rROMCON4      =  0x60 

LDR     r7,     =   rROMCON5    rROMCON5      =  0x60 

LDR     r8,     =   rSDRAMCON0  rSDRAMCON0     0x12008380 

LDR     r9,     =   rSDRAMCON1  rSDRAMCON1   =  0x00 

LDR     r10,    =   rSDRAMCON2  rSDRAMCON2   =  0x00     

LDR     r11,    =   rSDRAMCON3  rSDRAMCON3   =  0x00     

LDR     r12,    =   rSREFEXTCON rSREFEXTCON   =   0xCE278360 

        把一些配置字存入r0 – r12 寄存器,以至过后初始化SDRAMFLASH

 

    LDR r0, =ARM7_EXTDBWTH         

ASIC_BASE      EQU     0x03ff0000

        ARM7_EXTDBWTH   EQU     (ASIC_BASE+0x3010)

     ARM7_ EXTDBWTH  =   0x03ff 3010

    EXTDBWTH 寄存器的地址0x03ff 3010存入r0寄存器。

    名称:EXTDBWTH;(P176

    功能:设置每个地址段的数据总线宽度;

    偏移地址:0x3010

    缺省值:0x0000 0000

 

[10] 设置DSR0 的数据总线的宽度。DSR0是只读的。

    00 :不允许;

    01 8位;

    10 16位;

    11 32位;

[32] 设置DSR1的数据总线的宽度。

[54]

[76]

[98]

[1110]

    00 :不允许;

    01 8位;

    10 16位;

    11 32位;

[1312] 设置DSD0的数据总线的宽度。

[1514]

[1716]

[1918]

    00 :不允许;

    01 8位;

    10 16位;

    11 32位;

[2120] 设置DSX0的数据总线的宽度。(I/ O 地址范围)

[2322]

[2524]

[2726]

    00 :不允许;

    01 8位;

    10 16位;

    11 32位;

 

STMIA   r0, {r1-r12}

        r1 – r12 寄存器中的配置字依次写入r0 中地址 到r0 中地址 + 44中。

          EXTDBWTH寄存器;        ( rEXTDBWTH    =   0x00003001 

         ROMCON0 寄存器;        rROMCON0      =   0x02000060 

            ROMCON1 寄存器;        rROMCON1      =  0x60 

            ROMCON2 寄存器;        rROMCON2      =  0x60 

            ROMCON3 寄存器;        rROMCON3      =  0x60 

            ROMCON4 寄存器;        rROMCON4      =  0x60 

            ROMCON5 寄存器;        rROMCON5      =  0x60 

            DRAMCON0 寄存器;       rSDRAMCON0     0x12008380 

            DRAMCON1 寄存器;       rSDRAMCON1   =  0x00 

DRAMCON2 寄存器;       rSDRAMCON2   =  0x00 

DRAMCON3 寄存器;       rSDRAMCON3   =  0x00 

            REFEXTCON寄存器;       rSREFEXTCON   =   0xCE278360 

        名称:ROMCON0    ROMCON5

        功能:配置DSR 的地址范围和操作模式

        偏移地址:0x3014  0x3028

        缺省值:ROMCON0  0x2000 0060

                ROMCON1 ROMCON5 0x0000 0060

ROMCON0    ROMCON5 寄存器(P177

        [10] PMC 页模式配置位

            00 

            01 

            10 

            11 

        [32] tpa

            00 

            01 

            10 

            11 

        [64] tacc

            000 

            001 

            010 

            011 

            110 

            111 

        [1910] DSR 的基址;

            基址 = [1910] 左移 16 位。

        [2920] 当前 DSR 的结束地址;

            结束地址 = [2920] 左移 16   + 1

 

        名称:DRAMCON0    DRAMCON3

        功能:配置DSD 的地址范围和操作模式

        偏移地址:0x302C  0x3038

        缺省值:0x0000 0000

 

        名称:REFEXTCON

        功能:

        偏移地址: 0x303C

        缺省值:0x0000 0000

 

DRAMCON0    DRAMCON3 寄存器:

        [0] EDO 模式

        [21]

        [3]

        [64] 保留位

            缺省为 000,必须设置为 001

        [7]

        [98]

        [1910] DSD 的基址;

            基址 = [1910] 左移 16 位。

        [2920] 当前 DSD 的结束地址;

            结束地址 = [2920] 左移 16  + 1

        [3130] CAN

 

REFEXTCON 寄存器 (P203

        [90] I / O 地址基址

            基址 = [90] 左移 16 位。

            结束地址 = 基址 + 16 KB - 1 

        [15] VSF

        [16] REN Refresh 使能位

            :禁止DRAM Refresh

            :允许DRAM Refresh

        [1917]

        [20]

        [3120]

 

 

        EXTDBWTH寄存器;        ( rEXTDBWTH    =   0x00003001 

            [10]  01, 设置FLASH 数据总线宽度为 8 位;

            [1312]  11,设置SDRAM 数据总线宽度为 32位;

            其它位为 00, 禁止使用;

        ROMCON0寄存器:         rROMCON0      =   0x0200 0060 

            [10] PMC 页模式配置位

                设置为00 

            [32] tpa

                设置为00 

            [64] tacc

                设置为110 

            [1910] FLASH 的基址;

                设置为0x000

                基址 =  0x0000 0000

            [2920] 当前 DSR 的结束地址;

                设置为0x020

                结束地址 =  0x0020 0001

        ROMCON1    ROMCON5 寄存器 rROMCON1      =  0x60 

            不关心ROMCON1    ROMCON5 寄存器,把它们设置为缺省值。

    DRAMCON0 寄存器             rSDRAMCON0     0x12008380 

[0] EDO 模式

    设置为0

        [21]

            设置为0

        [3]

            设置为0

        [64] 保留位

            缺省为 000,必须设置为 001设置为000了, 为什么?

        [7]

            设置为1

        [98]

            设置为11

        [1910] SDRAM 的基址;

            设置为 0x020

            基址 = 0x0020 0000

 

        [2920] 当前 DSD 的结束地址;

            设置为 0x120

            结束地址= 0x0120 0001

        [3130] CAN

            设置为00

DRAMCON1    DRAMCON3 寄存器

    不关心DRAMCON1    DRAMCON3 寄存器,把它们设置为缺省值。

REFEXTCON 寄存器(rSREFEXTCON   =   0xCE278360 

        [90] I / O 地址基址

            基址 = [90] 左移 16 位。

            结束地址 = 基址 + 16 KB - 1 

        [15] VSF

        [16] REN Refresh 使能位

            :禁止DRAM Refresh

            :允许DRAM Refresh

        [1917]

        [20]

        [3120]

 

 

 

 

    至此,初始化了FLASH SDRAM

        FLASH 设置为8位数据宽度;

        地址范围从0x0000 0000  0x0200 0000

        SDRAM 设置为32位数据宽度;

        地址范围从0x0200 0000  0x1200 0000

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

5.      第五部分

Bootloader拷贝到SDRAM中。

LDR     r0, =  |Image$$RO$$Base|    

    RO段的基地址赋给 r0 寄存器。

LDR     r1, =  |Image$$RO$$Limit|     

    RO段的结束地址赋给 r1 寄存器。

LDR     r2, =  |Image$$RW$$Base|   

    RW段的基地址赋给 r2 寄存器。

LDR     r3, =  |Image$$RW$$Limit|

    RW段的结束地址赋给 r3 寄存器。

        SUB     r1, r1,    r0

            RO段的结束地址 - RO段的基地址得到RO段的长度,并赋给 r1 寄存器。

        SUB     r3, r3,    r2

            RW段的结束地址 - RW段的基地址得到RW段的长度,并赋给 r3 寄存器。

        ADD     r1, r1,    r3

            RO段的长度 + RW段的长度,得到Bootloader的长度,并赋给 r1 寄存器。

LDR     r2, =      0x20 0000

    设置r2 寄存器的值为 0x0020 00002MB),Bootloader拷贝的目标地址。

 

以下开始了把Bootloader拷贝到SDRAM中。

COPY

    LDR     r3, [r0],  #4

r0寄存器包含Bootloader的启始地址,从Bootloader的启始地址读入4个字节的数据进入r3寄存器。

r0寄存器中地址 + 4

    STR     r3, [r2],  #4

r2 寄存器包含Bootloader拷贝的目标地址,把r3寄存器中的数据存入SDRAM中。

R2寄存器中地址 + 4

    SUBS    r1, r1,     #4

        r1 寄存器包含Bootloader的长度,

        r1 寄存器中Bootloader的长度 – 4

        并影响状态位。

    BNE     COPY

检查状态位位,如果为0,执行这条指令,跳转到COPY,继续拷贝,如果不为0,不执行这个指令,表示Bootloader拷贝已经完成。

 

 

 

 

 

 

 

 

6.      第六部分

LDR r1, =   rEXTDBWTH_R     rEXTDBWTH_R       EQU     0x00003001

LDR r2, =   rROMCON0_R      rROMCON0_R        EQU     0x12040060

LDR r3, =   rROMCON1_R      rROMCON1_R    EQU     0x60

LDR r4, =   rROMCON2_R      rROMCON2_R    EQU     0x60

LDR r5, =   rROMCON3_R      rROMCON3_R    EQU     0x60

LDR r6, =   rROMCON4_R      rROMCON4_R    EQU     0x60

LDR r7, =   rROMCON5_R      rROMCON5_R    EQU     0x60

LDR r8, =   rSDRAMCON0_R    rSDRAMCON0_R      EQU     0x10000380

LDR r9, =   rSDRAMCON1_R    rSDRAMCON1_R      EQU 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多