?? 44binit.s
字號(hào):
; *******************************************************
; * NAME : 44BINIT.S *
; * Version : 1.1 24.April.2002 *
; * 描述:
; * *
; * C 啟動(dòng)代碼 *
; * 配置存儲(chǔ)器, 初始化 ISR 中斷 ,各種CPU Mode下的堆棧 *
; * 初始化C變量 *
; * 對(duì) zero-initialized C-變量清零 *
; * For HaiMai Hm701Esp(Nep)Board *
; *******************************************************
GET option.s ;匯編包含文件: 包含幾個(gè)系統(tǒng)宏定義
GET memcfg.s ;匯編包含文件: 外部存儲(chǔ)器控制參數(shù)
;SDRAM存儲(chǔ)器區(qū)域 (詳情參考\datasheet\s3c44b0x)
;BANK6 16bit寬度 (8MB) SDRAM(0xc000000-0xc7fffff)
;應(yīng)用程序 0xc000000~0xc7effff
;STACK =0xc7ffa00
;中斷控制寄存器
INTPND EQU 0x01e00004
INTMOD EQU 0x01e00008
INTMSK EQU 0x01e0000c
I_ISPR EQU 0x01e00020
I_CMST EQU 0x01e0001c
;看門狗定時(shí)器
WTCON EQU 0x01d30000
;時(shí)鐘控制器
PLLCON EQU 0x01d80000
CLKCON EQU 0x01d80004
LOCKTIME EQU 0x01d8000c
;存儲(chǔ)器控制器
REFRESH EQU 0x01c80024
;BDMA 目標(biāo)控制器
BDIDES0 EQU 0x1f80008
BDIDES1 EQU 0x1f80028
;預(yù)定義的CPU模式、中斷等常量
USERMODE EQU 0x10
FIQMODE EQU 0x11
IRQMODE EQU 0x12
SVCMODE EQU 0x13
ABORTMODE EQU 0x17
UNDEFMODE EQU 0x1b
MODEMASK EQU 0x1f
NOINT EQU 0xc0
;ARM和THUMB
GBLL THUMBCODE
[ {CONFIG} = 16
THUMBCODE SETL {TRUE}
CODE32
|
THUMBCODE SETL {FALSE}
]
[ THUMBCODE
CODE32 ; Thumb mode 的啟動(dòng)代碼
]
MACRO
$HandlerLabel HANDLER $HandleLabel
$HandlerLabel
sub sp,sp,#4 ;為返回PC值保留
stmfd sp!,{r0} ;保存工作寄存器
ldr r0,=$HandleLabel ;裝載HandleXXX 到 r0
ldr r0,[r0] ;
str r0,[sp,#4] ;
ldmfd sp!,{r0,pc} ;恢復(fù)工作寄存器,并跳轉(zhuǎn)到中斷處理程序
MEND
IMPORT |Image$$RO$$Limit| ; ROM 代碼的末
IMPORT |Image$$RW$$Base| ; RW 數(shù)據(jù)區(qū)
IMPORT |Image$$ZI$$Base| ; ZI 需初始化為0的數(shù)據(jù)區(qū)頭
IMPORT |Image$$ZI$$Limit| ; 需初始化為0的數(shù)據(jù)區(qū)尾
; 這幾個(gè)符號(hào)是由 ARM連接器產(chǎn)生的符號(hào)
; 細(xì)節(jié)請(qǐng)參照《ARM的體系結(jié)構(gòu)與編程》
IMPORT Main ; 主C-代碼的入口
AREA Init,CODE,READONLY ;段聲明,為保證下面的代碼為起始在ARM連接器中l(wèi)ayout選項(xiàng)中指明44Binit.o(Init)
ENTRY
b ResetHandler ;加電、復(fù)位入口
b HandlerUndef ;為定義指令異常
b HandlerSWI ;SWI 軟中斷
b HandlerPabort ;指令預(yù)取異常
b HandlerDabort ;數(shù)據(jù)訪問異常
b . ;保留
b HandlerIRQ ;外部中斷處理入口
b HandlerFIQ ;快速中斷處理入口
;***特別注意***
;三星s3c44b0x有一種自有的中斷模式:H/W矢量模式,上面兩條指令應(yīng)改為
; b HandlerIRQ -> subs pc,lr,#4
; b HandlerIRQ -> subs pc,lr,#4
VECTOR_BRANCH
ldr pc,=HandlerEINT0 ;mGA H/W 模式中斷矢量表
ldr pc,=HandlerEINT1 ; 由S3C44B0X內(nèi)部直接產(chǎn)生各個(gè)具體中斷到此的跳轉(zhuǎn)
ldr pc,=HandlerEINT2 ; 這種方式不是標(biāo)準(zhǔn)的ARM體系所規(guī)定
ldr pc,=HandlerEINT3 ;
ldr pc,=HandlerEINT4567 ;
ldr pc,=HandlerTICK ;mGA
b .
b .
ldr pc,=HandlerZDMA0 ;mGB
ldr pc,=HandlerZDMA1 ;
ldr pc,=HandlerBDMA0 ;
ldr pc,=HandlerBDMA1 ;
ldr pc,=HandlerWDT ;
ldr pc,=HandlerUERR01 ;mGB
b .
b .
ldr pc,=HandlerTIMER0 ;mGC
ldr pc,=HandlerTIMER1 ;
ldr pc,=HandlerTIMER2 ;
ldr pc,=HandlerTIMER3 ;
ldr pc,=HandlerTIMER4 ;
ldr pc,=HandlerTIMER5 ;mGC
b .
b .
ldr pc,=HandlerURXD0 ;mGD
ldr pc,=HandlerURXD1 ;
ldr pc,=HandlerIIC ;
ldr pc,=HandlerSIO ;
ldr pc,=HandlerUTXD0 ;
ldr pc,=HandlerUTXD1 ;mGD
b .
b .
ldr pc,=HandlerRTC ;mGKA
b . ;
b . ;
b . ;
b . ;
b . ;mGKA
b .
b .
ldr pc,=HandlerADC ;mGKB
b . ;
b . ;
b . ;
b . ;
b . ;mGKB
b .
b .
;0xe0=EnterPWDN
ldr pc,=EnterPWDN
LTORG
HandlerFIQ HANDLER HandleFIQ
HandlerIRQ HANDLER HandleIRQ
HandlerUndef HANDLER HandleUndef
HandlerSWI HANDLER HandleSWI
HandlerDabort HANDLER HandleDabort
HandlerPabort HANDLER HandlePabort
HandlerADC HANDLER HandleADC
HandlerRTC HANDLER HandleRTC
HandlerUTXD1 HANDLER HandleUTXD1
HandlerUTXD0 HANDLER HandleUTXD0
HandlerSIO HANDLER HandleSIO
HandlerIIC HANDLER HandleIIC
HandlerURXD1 HANDLER HandleURXD1
HandlerURXD0 HANDLER HandleURXD0
HandlerTIMER5 HANDLER HandleTIMER5
HandlerTIMER4 HANDLER HandleTIMER4
HandlerTIMER3 HANDLER HandleTIMER3
HandlerTIMER2 HANDLER HandleTIMER2
HandlerTIMER1 HANDLER HandleTIMER1
HandlerTIMER0 HANDLER HandleTIMER0
HandlerUERR01 HANDLER HandleUERR01
HandlerWDT HANDLER HandleWDT
HandlerBDMA1 HANDLER HandleBDMA1
HandlerBDMA0 HANDLER HandleBDMA0
HandlerZDMA1 HANDLER HandleZDMA1
HandlerZDMA0 HANDLER HandleZDMA0
HandlerTICK HANDLER HandleTICK
HandlerEINT4567 HANDLER HandleEINT4567
HandlerEINT3 HANDLER HandleEINT3
HandlerEINT2 HANDLER HandleEINT2
HandlerEINT1 HANDLER HandleEINT1
HandlerEINT0 HANDLER HandleEINT0
;
;下面子程序用于非矢量中斷模式
IsrIRQ ;使用 I_ISPR 中斷未決寄存器,下面是中斷分揀.
sub sp,sp,#4 ;為PC保留空間
stmfd sp!,{r8-r9}
;
;如果沒有正確使用中斷位清除寄存器I_ISPC(如清除了另外的位), I_ISPR 可能變?yōu)?。
ldr r9,=I_ISPR
ldr r9,[r9]
cmp r9, #0x0 ;
;
beq %F2
mov r8,#0x0
0
movs r9,r9,lsr #1
bcs %F1
add r8,r8,#4
b %B0
1
ldr r9,=HandleADC ;ADC中斷在I_ISPR中為第[0]位
add r9,r9,r8
ldr r9,[r9]
str r9,[sp,#8]
ldmfd sp!,{r8-r9,pc}
2
ldmfd sp!,{r8-r9}
add sp,sp,#4
subs pc,lr,#4
;****************************************************
;* 加電、復(fù)位的起始執(zhí)行入口 *
;****************************************************
ResetHandler
ldr r0,=WTCON ;關(guān)閉看門狗
ldr r1,=0x0
str r1,[r0]
ldr r0,=INTMSK
ldr r1,=0x07ffffff ;屏蔽所有的中斷
str r1,[r0]
;****************************************************
;* 設(shè)置時(shí)鐘控制寄存器 *
;****************************************************
ldr r0,=LOCKTIME
ldr r1,=0xfff
str r1,[r0]
[ PLLONSTART
ldr r0,=PLLCON ; PLL 控制
ldr r1,=((M_DIV<<12)+(P_DIV<<4)+S_DIV) ;Fin=12MHz,Fout=64MHz
str r1,[r0]
]
ldr r0,=CLKCON
ldr r1,=0x7ff8 ;所有部件的CLOCK打開
str r1,[r0]
;****************************************
;* 改變BDMA的控制BDMACON *
;****************************************
ldr r0,=BDIDES0
ldr r1,=0x40000000 ;BDIDESn 0x40000000
str r1,[r0]
ldr r0,=BDIDES1
ldr r1,=0x40000000 ;BDIDESn 0x40000000
str r1,[r0]
;****************************************************
;* 設(shè)置存儲(chǔ)器控制 BANK1~BANK7的工作參數(shù) *
;****************************************************
ldr r0,=SMRDATA
ldmia r0,{r1-r13}
ldr r0,=0x01c80000 ;BWSCON寄存器的地址
stmia r0,{r1-r13}
;****************************************************
;* 初始化SVC模式下的堆棧 *
;****************************************************
ldr sp, =SVCStack ;加電復(fù)位后CPU進(jìn)入SVC模式,所以SVC堆棧必須先設(shè)置,不然無法調(diào)用下面的子程序
bl InitStacks
;****************************************************
;* 設(shè)置 IRQ 中斷處理總?cè)肟邳c(diǎn) *
;****************************************************
ldr r0,=HandleIRQ ;
ldr r1,=IsrIRQ ;
str r1,[r0]
;********************************************************
;* 拷貝 RW 數(shù)據(jù)區(qū)/清零 ZI 數(shù)據(jù)區(qū) *
;********************************************************
LDR r0, =|Image$$RO$$Limit| ; 看上面的解釋
LDR r1, =|Image$$RW$$Base| ;
LDR r3, =|Image$$ZI$$Base|
;
CMP r0, r1 ;
BEQ %F1
0
CMP r1, r3 ; 拷貝初始化數(shù)據(jù)
LDRCC r2, [r0], #4 ;--> LDRCC r2, [r0] + ADD r0, r0, #4
STRCC r2, [r1], #4 ;--> STRCC r2, [r1] + ADD r1, r1, #4
BCC %B0
1
LDR r1, =|Image$$ZI$$Limit| ; Top of zero init segment
MOV r2, #0
2
CMP r3, r1 ; Zero init
STRCC r2, [r3], #4
BCC %B2
[ :LNOT:THUMBCODE
BL Main ;不要使用小寫的 main() 因?yàn)椴幌胱尵幾g器產(chǎn)生初始化調(diào)用__main()
B .
]
[ THUMBCODE ;Thumb 模式的啟動(dòng)代碼
orr lr,pc,#1
bx lr
CODE16
bl Main ;不使用main()因?yàn)?.....
b .
CODE32
]
;****************************************************
;* 初始化各個(gè)模式下的堆棧指針 *
;****************************************************
InitStacks
;加電、復(fù)位后cpu進(jìn)入SVC模式
;SVCstack 已在前面初始化
;
mrs r0,cpsr
bic r0,r0,#MODEMASK
orr r1,r0,#UNDEFMODE|NOINT
msr cpsr_cxsf,r1 ;UndefMode
ldr sp,=UndefStack
orr r1,r0,#ABORTMODE|NOINT
msr cpsr_cxsf,r1 ;AbortMode
ldr sp,=AbortStack
orr r1,r0,#IRQMODE|NOINT
msr cpsr_cxsf,r1 ;IRQMode
ldr sp,=IRQStack
orr r1,r0,#FIQMODE|NOINT
msr cpsr_cxsf,r1 ;FIQMode
ldr sp,=FIQStack
bic r0,r0,#MODEMASK|NOINT
orr r1,r0,#SVCMODE
msr cpsr_cxsf,r1 ;SVCMode
ldr sp,=SVCStack
;USER mode 不能初始化,因?yàn)闊o法返回到SVC Mode.
mov pc,lr ;
;****************************************************
;* 進(jìn)入掉電處理子程序 *
;****************************************************
;void EnterPWDN(int CLKCON);
EnterPWDN
mov r2,r0 ;r0=CLKCON
ldr r0,=REFRESH
ldr r3,[r0]
mov r1, r3
orr r1, r1, #0x400000 ;
str r1, [r0]
nop ;
nop ;
nop ;
nop
nop
nop
nop
;enter POWERDN mode
ldr r0,=CLKCON
str r2,[r0]
;wait until enter SL_IDLE,STOP mode and until wake-up
ldr r0,=0x10
0 subs r0,r0,#1
bne %B0
;exit from DRAM/SDRAM self refresh mode.
ldr r0,=REFRESH
str r3,[r0]
mov pc,lr
*****************************************************************
LTORG
SMRDATA DATA
;*****************************************************************
;* 存儲(chǔ)器配置十分重要,配置不好會(huì)影響整個(gè)系統(tǒng)的運(yùn)轉(zhuǎn)穩(wěn)定和性能 *
;* 參數(shù)的優(yōu)化應(yīng)根據(jù)使用的器件參數(shù) *
;*****************************************************************
;*** Hm701Esp(Nep)的存儲(chǔ)空間分配 *****
;Bank0 16bit SST39VF160
;Bank1 8Bit NandFlash
;Bank2 NIC 8019as 16bit
;Bank3 IDE
;bank4 8Bit USB
;Bank5 8Bit nGCSEXT
;Bank6 16Bit SDRAM
;Bank7 Expand
DCD 0x11001000 ;Bank0=16bit 1M BootRom(INTEL E320)
; ||||||-- Bank1=8bit NandFlash :0x2000000
; |||||--- Bank2=16bit NIC :0x4000000
; ||||---- Bank3=16bit IDE :0x6000000
; |||----- Bank4=8bit USB :0x8000000
; ||------ Bank5=8bit EXT :0xA000000
; |------- Bank6=16bit SDRAM(16M) :0xc000000
; -------- Bank7=16bit Expand
DCD ((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)+(B0_Tcoh<<6)+(B0_Tah<<4)+(B0_Tacp<<2)+(B0_PMC)) ;GCS0
DCD ((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+(B1_Tah<<4)+(B1_Tacp<<2)+(B1_PMC)) ;GCS1
DCD ((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+(B2_Tah<<4)+(B2_Tacp<<2)+(B2_PMC)) ;GCS2
DCD ((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B3_Tacp<<2)+(B3_PMC)) ;GCS3
DCD ((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+(B4_Tah<<4)+(B4_Tacp<<2)+(B4_PMC)) ;GCS4
DCD ((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+(B5_Tah<<4)+(B5_Tacp<<2)+(B5_PMC)) ;GCS5
DCD ((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN)) ;GCS6
DCD ((B7_MT<<15)+(B7_Trcd<<2)+(B7_SCAN)) ;GCS7
DCD ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+(Tchr<<16)+REFCNT) ;REFRESH RFEN=1, TREFMD=0, trp=3clk, trc=5clk, tchr=3clk,count=1019
DCD (0x10) ;SCLK power down mode, BANKSIZE 32M/32M
DCD (0x20) ;MRSR6 CL=2clk
DCD (0x20) ;MRSR7
ALIGN
AREA RamData, DATA, READWRITE
^ (_ISR_STARTADDRESS-0x2000)
AddedStack # 1024
UserStack # 1024 ;預(yù)留的各個(gè)CPU模式堆棧
SVCStack # 1024 ;
UndefStack # 1024 ;
AbortStack # 1024 ;
IRQStack # 1024 ;
FIQStack # 0 ;
^ _ISR_STARTADDRESS
HandleReset # 4
HandleUndef # 4
HandleSWI # 4
HandlePabort # 4
HandleDabort # 4
HandleReserved # 4
HandleIRQ # 4
HandleFIQ # 4
;
HandleADC # 4
HandleRTC # 4
HandleUTXD1 # 4
HandleUTXD0 # 4
HandleSIO # 4
HandleIIC # 4
HandleURXD1 # 4
HandleURXD0 # 4
HandleTIMER5 # 4
HandleTIMER4 # 4
HandleTIMER3 # 4
HandleTIMER2 # 4
HandleTIMER1 # 4
HandleTIMER0 # 4
HandleUERR01 # 4
HandleWDT # 4
HandleBDMA1 # 4
HandleBDMA0 # 4
HandleZDMA1 # 4
HandleZDMA0 # 4
HandleTICK # 4
HandleEINT4567 # 4
HandleEINT3 # 4
HandleEINT2 # 4
HandleEINT1 # 4
HandleEINT0 # 4 ;_ISR_STARTADDRESS + 0x84
END
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -