📄 init.s
字号:
;************************************************************************************************;Beijing instittue of technology;File Name: Init.s;Description: Init.;Author: chaisc;Date: 200312-1;SDRAM Configuration: Use ljg.txt,SDRAM remap to address 0x0~0x100,0000(16MB) ;************************************************************************************************ GET mem.a GET casia1.a IMPORT main_entry ;声明要调用的外部文件名字,即main_entry.c CODE32 AREA Init,CODE,READONLY ENTRY B Reset_Handler NOP
NOP NOP
NOP NOP NOP NOP Reset_Handler ;****************************************************** ;mask all interrupt;****************************************************** LDR R1,=0x3ff0000 LDR R0,=0xE7ffff90 ;配置SYSCFG寄存器,内部RAM映射地址不变 STR R0,[R1] ;不使能cache
LDR r0, =0x3FF0000 + 0x3010 LDR r1, =rEXTDBWTH LDR r2, =rROMCON0 LDR r3, =rROMCON1 LDR r4, =rROMCON2 LDR r5, =rROMCON3 LDR r6, =rROMCON4 LDR r7, =rROMCON5 LDR r8, =0x14010380 LDR r9, =rSDRAMCON1 LDR r10,=rSDRAMCON2 LDR r11,=rSDRAMCON3 LDR r12,=rSREFEXTCON STMIA r0, {r1-r12} ;启动后第一次配置寄存器,Flash在0~2M,RAM在4~20M ldr r0, =0x0 ldr r1, =0x200000 ldr r2, =0x400000rom2ram_copy_loop ldr r3, [r0], #4 ;这么简单的拷贝实现方法,但很有效呀 str r3, [r2], #4 ;把0~2M内(即整个Flash)复制到 subs r1, r1, #4 ;从4M处开始的RAM中,为Remap做准备 bne rom2ram_copy_loop ;数据。注意:这中间包含了Booloader和uclinux代码。全部拷贝了过去。 LDR r0, =0x3FF0000 + 0x3010 ;呵呵以下是真正的Remap了 LDR r1, =0x00003002 ;rEXTDBWTH基本不变 LDR r2, =0x12040060 ;Flash映射到了16M~18M LDR r3, =rROMCON1 LDR r4, =rROMCON2 LDR r5, =rROMCON3 LDR r6, =rROMCON4 LDR r7, =rROMCON5 LDR r8, =0x10000380 ;RAM映射到了0~16M LDR r9, =rSDRAMCON1 LDR r10,=rSDRAMCON2 LDR r11,=rSDRAMCON3 LDR r12,=rSREFEXTCON STMIA r0, {r1-r12} LDR R1,=0x3ff5000 ;呵呵又被我猜对了,下边就是判断 LDR R0,=0x0 ;跳线1决定是加载Linux还是启动Bootloader STR R0,[R1] ;把IO设置为输入,读取IO引脚状态到R1中 LDR R0,=0x3ff5008 ; LDR R1,[R0] ; AND R1,R1,#0x08 ; CMP R1,#0x08 BNE Next ;如果P3为第电平则为Bootloader模式 LDR R0,=0x10000 ;如果为高电平则为Linux模式
MOV PC,R0 ;Linux内核存放在0X10000处,即Flash中前64K存放Bootloader;Flash中前64K存放Bootloader,从64K~2M处存放Uclinux。uclinux的入口在0X10000(64K)处
Next ;********************************************************;Initialise system stack for different processor modes
;;Change to Interrupt Mode (IRQ);******************************************************** mov r0, #0x12 MSR cpsr_c, r0 mov sp,#0x70000 ;中断模式的堆栈设在0X70000处
;********************************************************
;Change to Fast Interrupt Mode (FIQ)
;******************************************************** mov r0,#0x11 MSR cpsr_c, r0 mov sp,#0x7f000 ;快速中断模式的堆栈设置在0x7f000
;********************************************************
;Change to Supervisor Mode (SVC)
;******************************************************** mov r0,#0x13 MSR cpsr_c, r0 mov sp,#0x80000 ;管理模式的堆栈设置在0x80000 LDR R1,=0x3FF4000 ;所有的中断都在中断模式寄存器中设置为IRQ LDR R0,=0x0 STR R0,[R1];注意:此处因为是启动在Bootloader方式下,所以uclinux内核所占的RAM可以被覆盖,上边的各个堆栈可以任意设置 *********************************************************
IMPORT C_Entry BL C_Entry ;该函数在main_entry.c文件中 B . END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -