Bootloader代码分析
?
代码分析报告? (一)???????????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,?????????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,????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,?????#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? (一)??????????????rSDRAMCON1_R????(rSDRAMCON1_REQU (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |