S3C6410 純粹的裸機(jī)啟動,自己寫的SD BOOT啟動
這幾天晚上一直折騰S3C6410的裸機(jī)SD卡啟動,不大想使用UBOOT,我是搞硬件的,對底層非常感興趣,不喜歡已經(jīng)寫好的,因此自己一直在嘗試,其實很早之前就試過SD卡啟動,也就是ARM11上電后會把SD卡倒數(shù)第9KB開始的8KB(倒數(shù)0x2400B偏移量)復(fù)制到內(nèi)部SRAM中執(zhí)行,這個比較簡單,但是代碼量只有8K,不能像STM32一樣玩,因此查閱相關(guān)資料,得知啟動方式為L0加載L1,L1加載L2,簡單來說,就是上電啟動后,固化在S3C6410內(nèi)部的L0代碼啟動,將NAND,SD卡等外部存儲器映射或者復(fù)制到內(nèi)部SRAM,這個從SD卡或者flash復(fù)制過去的代碼稱之為L1,也就是用戶的啟動代碼,在電腦上相當(dāng)于硬盤主分區(qū)的啟動代碼和BIOS,用來初始化外時鐘以及外設(shè),并啟動系統(tǒng),,這部分代碼只有8KB因此完成的工作有限,因此可以使用這段代碼完成初始化并復(fù)制操作系統(tǒng)或者更大的代碼到內(nèi)存,這部分代碼就是L2了,只有L1將內(nèi)存初始化后才能使用內(nèi)存,再此之前內(nèi)存只有8KB,就是內(nèi)部SRAM,從SD卡啟動的時候映射到0x0c000000,從NAND可以是0,也可以是0x0c000000.
目前只實現(xiàn)了L1,無需uboot,只需要燒寫到SD卡的指定位置即可,需要將開發(fā)板選擇為SD卡啟動.
啟動代碼,完成了關(guān)閉看門狗,初始化時鐘,SDRAM內(nèi)存,堆棧,VIC,中斷等操作(啟動代碼來自互聯(lián)網(wǎng))
INCLUDES3C6410.inc
PRESERVE8
AREAInit,CODE,READONLY
STACK_BASEADDRESSEQU0x0c000400;0x52000000
SVCStackEQU(STACK_BASEADDRESS);管理模式
UndefStackEQU(STACK_BASEADDRESS-0x300);指令終止模式
AbortStackEQU(STACK_BASEADDRESS-0x300);數(shù)據(jù)訪問終止模式
IRQStackEQU(STACK_BASEADDRESS-0x200);中斷模式
FIQStackEQU(STACK_BASEADDRESS-0x100);快速中斷模式
;---------------------------
;CPSRModeBitDefinition
;---------------------------
Mode_USREQU(0x10)
Mode_FIQEQU(0x11)
Mode_IRQEQU(0x12)
Mode_SVCEQU(0x13)
Mode_ABTEQU(0x17)
Mode_UNDEQU(0x1B)
Mode_SYSEQU(0x1F)
Mode_MASKEQU(0x1F)
NOINTEQU(0xC0)
I_BitEQU(0x80)
F_BitEQU(0x40)
;異常處理函數(shù)
;---------------------------------------------------------------------------------------------------
IMPORTmain
EXPORTResetHandler
ResetHandler
ldrr0,=0x70000013;BaseAddres:0x70000000,Size:256MB(0x13)
mcrp15,0,r0,c15,c2,4;告訴CPU外設(shè)寄存器的基地址和地址空間重要
;設(shè)置為SVC模式
MRSR0,CPSR
BICR0,R0,#0x1F
ORRR0,R0,#0xD3
MSRCPSR_cxsf,R0
;未知模式堆棧
mrsr0,cpsr
bicr0,r0,#Mode_MASK
orrr1,r0,#Mode_UND|NOINT
msrcpsr_cxsf,r1;UndefMode
ldrsp,=UndefStack
;異常模式堆棧
orrr1,r0,#Mode_ABT|NOINT
msrcpsr_cxsf,r1;AbortMode
ldrsp,=AbortStack
;中斷模式堆棧
orrr1,r0,#Mode_IRQ|NOINT
msrcpsr_cxsf,r1;IRQMode
ldrsp,=IRQStack
;管理模式堆棧
bicr0,r0,#Mode_MASK|NOINT
orrr1,r0,#Mode_SVC
msrcpsr_cxsf,r1;SVCMode
ldrsp,=SVCStack
;禁止看門狗
LDRR0,=rWTCON
LDRR1,=0x0
STRR1,[R0]
;禁止cache和mmu
LDRR0,=0x0
MRCp15,0,R0,c1,c0,0
LDRR1,=0xFFFF
BICR0,R0,R1
MCRp15,0,R0,c1,c0,0
;禁止所有中斷
LDRR0,=rVIC0INTENCLEAR
LDRR1,=0xFFFFFFFF
STRR1,[R0]
LDRR0,=rVIC1INTENCLEAR
LDRR1,=0xFFFFFFFF
STRR1,[R0]
;---------------------------------------------------------------------------------------------------
;設(shè)置時鐘源
LDRR0,=rOTHERS
LDRR1,[R0]
ORRR1,R1,#(1<<6)
LDRR0,=rCLK_SRC
LDRR1,=(1<<13)|7
STRR1,[R0]
LDRR0,=rCLK_SRC2
LDRR1,=0x0
STRR1,[R0]
;設(shè)置時鐘分頻
LDRR0,=rCLK_DIV0
LDRR1,=0x01043310
STRR1,[R0]
LDRR0,=rCLK_DIV1
LDRR1,=0x0
STRR1,[R0]
LDRR0,=rCLK_DIV2
LDRR1,=3<<16
STRR1,[R0]
;使能時鐘
LDRR0,=rHCLK_GATE
LDR R1,=0xFFFFFFFF