代码分析报告
(一) 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