加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Bootloader代码分析

发布时间:2020-12-15 06:32:52 所属栏目:百科 来源:网络整理
导读:? 代码分析 报告 ? (一) ??????????? Bootloader 代码分析 ? 1. ?????? 第一部分 功能:关闭中断,进入 ARM 状态,切换到 SVC 模式(复位异常进入 SVC? 模式)。 ? MRS ?? r0, ? ??? cpsr ??????? 把状态寄存器 CPSR 中数据读入 r0? 寄存器。 BIC ? ????
?

代码分析报告?


(一)???????????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,?????????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?使能位;

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

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

????????[2]WE write buffer?使能位;

?????????????WE1?时,能够执行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?同步模式位。

?????????????0?时,

?????????????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?同步模式位: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?寄存器,以至过后初始化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?使能位

????????????0?:禁止DRAM Refresh

????????????1?:允许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?使能位

????????????0?:禁止DRAM Refresh

????????????1?:允许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,????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,?????#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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读