代码分析报告 (一) 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置为 10011(SVC模式)。 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 把0x03ff4004入r2 寄存器。
名称:中断未决寄存器: 偏移地址: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 0000入r0寄存器。
系统配置寄存器:偏移地址0x0000。 系统复位的缺省值:0x37ff ff91 ARM7_SYSCFG 就是系统配置寄存器的寻址地址。
[0]:SE必须设为0; [1]:CE cache 使能位; CE置1 时,能够执行cache 的有关操作。 CE 置0时,禁止执行cache 的有关操作。 [2]:WE write buffer 使能位; WE置1 时,能够执行write buffer 的有关操作。 WE置0时,禁止执行write buffer 的有关操作。 [5:4]:CM cache 模式位;(决定了CPU 内部的存储单元cache 和sram 的划分) 00 时,cache为 4 KB,sram 为 4 KB。 01 时,cache为 8 KB,sram 为 0 KB。 10 时,cache为 0 KB,sram 为 8 KB。 [15:6]:sram 的基址。 [25:16]:特殊寄存器的基址。 [30:26]:产品号。 00001 为 S3C4510X。 11001 为 S3C4510B。 [31]:DRAM 同步模式位。 0 时, 1时, LDR r1, 0x87ffffA0 把0x87ffffA0 存入r1 寄存器。 STR r1, [r0] 把r1 寄存器中的值0x87ffffA0 存入 r0 寄存器的地址中,即系统配置寄存器中。 CE 位清 0 ,禁止cache ; WE位清 0 ,禁止write buffer ; CM位 10 ,cache为 0 KB,sram 为 8 KB ; sram 的基址:0x03FE 0000 特殊寄存器的基址:0x03FF 0000 产品号:00001 为 S3C4510X。 DRAM 同步模式位:1 为
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 寄存器,以至过后初始化SDRAM和FLASH。
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;
[1:0] 设置DSR0 的数据总线的宽度。DSR0是只读的。 00 :不允许; 01 :8位; 10 :16位; 11 :32位; [3:2] 设置DSR1的数据总线的宽度。 [5:4] [7:6] [9:8] [11:10] 00 :不允许; 01 :8位; 10 :16位; 11 :32位; [13:12] 设置DSD0的数据总线的宽度。 [15:14] [17:16] [19:18] 00 :不允许; 01 :8位; 10 :16位; 11 :32位; [21:20] 设置DSX0的数据总线的宽度。(I/ O 地址范围) [23:22] [25:24] [27:26] 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)
[1:0] PMC 页模式配置位 00 : 01 : 10 : 11 : [3:2] tpa 00 : 01 : 10 : 11 : [6:4] tacc 000 : 001 : 010 : 011 : 110 : 111 : [19:10] DSR 的基址; 基址 = [19:10] 左移 16 位。 [29:20] 当前 DSR 的结束地址; 结束地址 = [29:20] 左移 16 位 + 1。
名称:DRAMCON0 到 DRAMCON3 功能:配置DSD 的地址范围和操作模式 偏移地址:0x302C 到 0x3038 缺省值:0x0000 0000
名称:REFEXTCON 功能: 偏移地址: 0x303C 缺省值:0x0000 0000
DRAMCON0 到 DRAMCON3 寄存器:
[0] EDO 模式 [2:1] [3] [6:4] 保留位 缺省为 000,必须设置为 001; [7] [9:8] [19:10] DSD 的基址; 基址 = [19:10] 左移 16 位。 [29:20] 当前 DSD 的结束地址; 结束地址 = [29:20] 左移 16 位 + 1。 [31:30] CAN
REFEXTCON 寄存器 (P203)
[9:0] I / O 地址基址 基址 = [9:0] 左移 16 位。 结束地址 = 基址 + 16 KB - 1 。 [15] VSF [16] REN Refresh 使能位 0 :禁止DRAM Refresh; 1 :允许DRAM Refresh; [19:17] [20] [31:20]
EXTDBWTH寄存器; ( rEXTDBWTH = 0x00003001 ) [1:0] 为 01, 设置FLASH 数据总线宽度为 8 位; [13:12] 为 11,设置SDRAM 数据总线宽度为 32位; 其它位为 00, 禁止使用; ROMCON0寄存器: (rROMCON0 = 0x0200 0060 ) [1:0] PMC 页模式配置位 设置为00 : [3:2] tpa 设置为00 : [6:4] tacc 设置为110 : [19:10] FLASH 的基址; 设置为0x000 基址 = 0x0000 0000 [29:20] 当前 DSR 的结束地址; 设置为0x020 结束地址 = 0x0020 0001 ROMCON1 到 ROMCON5 寄存器 (rROMCON1 = 0x60 ) 不关心ROMCON1 到 ROMCON5 寄存器,把它们设置为缺省值。 DRAMCON0 寄存器 (rSDRAMCON0 = 0x12008380 ) [0] EDO 模式 设置为0, [2:1] 设置为0, [3] 设置为0, [6:4] 保留位 缺省为 000,必须设置为 001;设置为000了, 为什么? [7] 设置为1, [9:8] 设置为11, [19:10] SDRAM 的基址; 设置为 0x020 基址 = 0x0020 0000
[29:20] 当前 DSD 的结束地址; 设置为 0x120 结束地址= 0x0120 0001 [31:30] CAN 设置为00, DRAMCON1 到 DRAMCON3 寄存器 不关心DRAMCON1 到 DRAMCON3 寄存器,把它们设置为缺省值。 REFEXTCON 寄存器(rSREFEXTCON = 0xCE278360 ) [9:0] I / O 地址基址 基址 = [9:0] 左移 16 位。 结束地址 = 基址 + 16 KB - 1 。 [15] VSF [16] REN Refresh 使能位 0 :禁止DRAM Refresh; 1 :允许DRAM Refresh; [19:17] [20] [31:20]
至此,初始化了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 0000(2MB),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 检查状态位Z 位,如果为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置为 10011(SVC模式)。 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 把0x03ff4004入r2 寄存器。
名称:中断未决寄存器: 偏移地址: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 0000入r0寄存器。
系统配置寄存器:偏移地址0x0000。 系统复位的缺省值:0x37ff ff91 ARM7_SYSCFG 就是系统配置寄存器的寻址地址。
[0]:SE必须设为0; [1]:CE cache 使能位; CE置1 时,能够执行cache 的有关操作。 CE 置0时,禁止执行cache 的有关操作。 [2]:WE write buffer 使能位; WE置1 时,能够执行write buffer 的有关操作。 WE置0时,禁止执行write buffer 的有关操作。 [5:4]:CM cache 模式位;(决定了CPU 内部的存储单元cache 和sram 的划分) 00 时,cache为 4 KB,sram 为 4 KB。 01 时,cache为 8 KB,sram 为 0 KB。 10 时,cache为 0 KB,sram 为 8 KB。 [15:6]:sram 的基址。 [25:16]:特殊寄存器的基址。 [30:26]:产品号。 00001 为 S3C4510X。 11001 为 S3C4510B。 [31]:DRAM 同步模式位。 0 时, 1时, LDR r1, 0x87ffffA0 把0x87ffffA0 存入r1 寄存器。 STR r1, [r0] 把r1 寄存器中的值0x87ffffA0 存入 r0 寄存器的地址中,即系统配置寄存器中。 CE 位清 0 ,禁止cache ; WE位清 0 ,禁止write buffer ; CM位 10 ,cache为 0 KB,sram 为 8 KB ; sram 的基址:0x03FE 0000 特殊寄存器的基址:0x03FF 0000 产品号:00001 为 S3C4510X。 DRAM 同步模式位:1 为
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 寄存器,以至过后初始化SDRAM和FLASH。
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;
[1:0] 设置DSR0 的数据总线的宽度。DSR0是只读的。 00 :不允许; 01 :8位; 10 :16位; 11 :32位; [3:2] 设置DSR1的数据总线的宽度。 [5:4] [7:6] [9:8] [11:10] 00 :不允许; 01 :8位; 10 :16位; 11 :32位; [13:12] 设置DSD0的数据总线的宽度。 [15:14] [17:16] [19:18] 00 :不允许; 01 :8位; 10 :16位; 11 :32位; [21:20] 设置DSX0的数据总线的宽度。(I/ O 地址范围) [23:22] [25:24] [27:26] 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)
[1:0] PMC 页模式配置位 00 : 01 : 10 : 11 : [3:2] tpa 00 : 01 : 10 : 11 : [6:4] tacc 000 : 001 : 010 : 011 : 110 : 111 : [19:10] DSR 的基址; 基址 = [19:10] 左移 16 位。 [29:20] 当前 DSR 的结束地址; 结束地址 = [29:20] 左移 16 位 + 1。
名称:DRAMCON0 到 DRAMCON3 功能:配置DSD 的地址范围和操作模式 偏移地址:0x302C 到 0x3038 缺省值:0x0000 0000
名称:REFEXTCON 功能: 偏移地址: 0x303C 缺省值:0x0000 0000
DRAMCON0 到 DRAMCON3 寄存器:
[0] EDO 模式 [2:1] [3] [6:4] 保留位 缺省为 000,必须设置为 001; [7] [9:8] [19:10] DSD 的基址; 基址 = [19:10] 左移 16 位。 [29:20] 当前 DSD 的结束地址; 结束地址 = [29:20] 左移 16 位 + 1。 [31:30] CAN
REFEXTCON 寄存器 (P203)
[9:0] I / O 地址基址 基址 = [9:0] 左移 16 位。 结束地址 = 基址 + 16 KB - 1 。 [15] VSF [16] REN Refresh 使能位 0 :禁止DRAM Refresh; 1 :允许DRAM Refresh; [19:17] [20] [31:20]
EXTDBWTH寄存器; ( rEXTDBWTH = 0x00003001 ) [1:0] 为 01, 设置FLASH 数据总线宽度为 8 位; [13:12] 为 11,设置SDRAM 数据总线宽度为 32位; 其它位为 00, 禁止使用; ROMCON0寄存器: (rROMCON0 = 0x0200 0060 ) [1:0] PMC 页模式配置位 设置为00 : [3:2] tpa 设置为00 : [6:4] tacc 设置为110 : [19:10] FLASH 的基址; 设置为0x000 基址 = 0x0000 0000 [29:20] 当前 DSR 的结束地址; 设置为0x020 结束地址 = 0x0020 0001 ROMCON1 到 ROMCON5 寄存器 (rROMCON1 = 0x60 ) 不关心ROMCON1 到 ROMCON5 寄存器,把它们设置为缺省值。 DRAMCON0 寄存器 (rSDRAMCON0 = 0x12008380 ) [0] EDO 模式 设置为0, [2:1] 设置为0, [3] 设置为0, [6:4] 保留位 缺省为 000,必须设置为 001;设置为000了, 为什么? [7] 设置为1, [9:8] 设置为11, [19:10] SDRAM 的基址; 设置为 0x020 基址 = 0x0020 0000
[29:20] 当前 DSD 的结束地址; 设置为 0x120 结束地址= 0x0120 0001 [31:30] CAN 设置为00, DRAMCON1 到 DRAMCON3 寄存器 不关心DRAMCON1 到 DRAMCON3 寄存器,把它们设置为缺省值。 REFEXTCON 寄存器(rSREFEXTCON = 0xCE278360 ) [9:0] I / O 地址基址 基址 = [9:0] 左移 16 位。 结束地址 = 基址 + 16 KB - 1 。 [15] VSF [16] REN Refresh 使能位 0 :禁止DRAM Refresh; 1 :允许DRAM Refresh; [19:17] [20] [31:20]
至此,初始化了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 0000(2MB),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 检查状态位Z 位,如果为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 |
|