Samsung原版44B0X的Bootloader分析
原作者:BCbbs
1.中斷向量表
????AREA????Init,CODE,READONLY
| 說明: 1.從代碼看Init段就是要寫入0x00地址的原始中斷向量,因此把這個文件編譯生成的44binit.O和Init填入ADS的Linker-Layout頁對應項中(這樣編譯器會把該段代碼編譯到0X0地址。 2.這一部分按44B0數據手冊中的中斷的地址順序列出了一個異常中斷向量表(每個表項占4個字節) 3.例如 ADC 的中斷向量為 0x000000c0 下面對應表中第49項位置;對應向量地址為 0x0+4*(49-1)= 0x000000c0 |
ENTRY????????????????????????;入口????????????????????????????????
;地址
????b ResetHandler???? ;for debug?????????????????????????? ;0x0000 0000
????b HandlerUndef???? ;handlerUndef??????????????????????;0x0000 0004
????b HandlerSWI????;SWI interrupt handler?????????? ;0x0000 0008
????b HandlerPabort???? ;handlerPAbort???????????????????? ;0x0000 000c
????b HandlerDabort???? ;handlerDAbort????????????????????;0x0000 0010
????b .???????????????????? ;handlerReserved??????????????????;0x0000 0014
????b HandlerIRQ?????????????????????????????????????????????????? ;0x0000 0018
????b HandlerFIQ?????????????????????????????????????????????????? ;0x0000 001c
;以下參考44B0的手冊:中斷控制器一章.按地址順序排列
VECTOR_BRANCH
????ldr pc,=HandlerEINT0????;mGA????H/W interrupt vector table 0x0000 0020
????ldr pc,=HandlerEINT1????;??
????ldr pc,=HandlerEINT2????;
????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
| 通過這段代碼,就在44B0的ROM中以0x00為起始地址的地方建立起了一張中斷向量表,而且這個表的順序完全符合44B0數據手冊中對中斷向量地址的定義要求。 |
2.一級與二級中斷處理程序
| 在中斷向量表中IRQ的地址處寫入一條進入IRQ中斷處理的指令,使IRQ發生中斷時先到IRQ——SERIVE(一級中斷處理程序)中對中斷向量進行識別,再進入相應的在外部RAM中具體的IRQ中斷程序。在此之間需要把中斷向量表中的INT源中的中斷與外部RAM中的與其對應的中斷處理程序(二級中斷處理程序)相對應,該操作是由一個宏來完成的,任何調用HandlerXXX HANDLER HandleXXX都將被下面的程序展開,該宏定義的代碼用于將對應中斷服務程序ISR的入口地址裝載到PC中,可稱之為“加載程序” 本初始化程序定義了一個34個字空間的數據區(在文件最后),用于存放相應中斷服務程序的首地址。每個字空間都有一個標號,以HandleXXX命名。在向量中斷模式下使用“加載程序”來執行中斷服務程序。 向量中斷和非向量中斷模式的概念與區別 (一)向量中斷模式是當CPU讀取位于0x18處的IRQ中斷指令的時候,系統自動讀取對應于該中斷源確定地址上的指令取代0x18處的指令,通過跳轉指令系統就直接跳轉到對應地址函數中,節省了中斷處理時間提高了中斷處理速度。例如 ADC 中斷的向量地址為0xC0,則在0xC0處放如下代碼:ldr PC,=HandlerADC 當ADC中斷產生的時候系統會自動跳轉到HandlerADC函數中處理中斷。 (二)非向量中斷模式處理方式是一種傳統的中斷處理方法,當系統產生中斷的時候,系統將INTPND寄存器中對應標志位置位,然后跳轉到位于0x18處的統一中斷函數中;該函數通過讀取INTPND寄存器中對應標志位來判斷中斷源,并根據優先級關系再跳到對應中斷源的處理代碼中處理中斷。 |
1)設置缺省中斷處理函數 。
????;****************************************************
????;*????Setup IRQ handler?????????????????????? *
????;****************************************************
????ldr?????? r0,=HandleIRQ??????????????;This routine is needed
????ldr?????? r1,=IsrIRQ?????????????????? ;if there isn't 'subs pc,lr,#4' at 0x18, 0x1c
????str?????? r1,[r0]
2)IRQ中斷處理函數
| 下面這段程序是用來處理非向量中斷,具體判斷I_ISPR中各位是否置1 置1表示目前此中斷等待響應(每次只能有一位置1),從最高優先級中斷位開始判斷,檢測到等待服務 ;中斷就將pc置為中斷服務函數首地址 |
IsrIRQ????;using I_ISPR register.
????sub??????sp,sp,#4?????? ;reserved for PC,為PC留下空位.
????stmfd?? sp!,{r8-r9}?????????? ;把r8,r9先入棧
????ldr?????? r9,=I_ISPR???? ;讀入I_ISPR中的值
????ldr?????? r9,[r9]
????mov???? r8,#0x0
0
????movs????r9,r9,lsr #1????;邏輯右移,得到中斷源的編號
????bcs??????%F1
????add??????r8,r8,#4
????b???????? %B0
1
????ldr?????? r9,=HandleADC??????
????add??????r9,r9,r8??????????;得到偏移地址
????ldr?????? r9,[r9]????????????;得到相應的IRQ程序地址
????str?????? r9,[sp,#8]??????????????;把IRQ程序的地址當成PC值入棧
????ldmfd?? sp!,{r8-r9,pc} ;對PC賦值,轉到新的中斷程序處。
3)定義一個加載宏。
????MACRO
$HandlerLabel HANDLER $HandleLabel
$HandlerLabel
;由于ADS僅支持FD(滿遞減)型堆棧
????sub??????sp,sp,#4???????????? ;decrement sp(to store jump address)
????stmfd?? sp!,{r0}??????????????;PUSH the work register to stack(lr does't push because it return to original address)
;將要使用的R0寄存器壓棧保護。
????ldr?????? r0,=$HandleLabel?? ;load the address of HandleXXX to r0
????ldr?????? r0,[r0]????????????????;load the contents(service routine start address) of HandleXXX
????str?????? r0,[sp,#4]??????????????????;store the contents(ISR) of HandleXXX to stack
;將對應的中斷函數首地址入棧保護
????ldmfd?? sp!,{r0,pc}??????????;POP the work register and pc(jump to ISR)
;將中斷函數的首地址出棧,放入PC中,系統將跳轉到對應中斷處理函數????
????MEND
4)宏調用
| 通過了這部分的程序,我們可以發現,在每一個IRQ中斷的入口地址處,都寫入了一個與其相關聯的IRQ服務程序的地址。 下面是具體的中斷處理函數跳轉的宏,通過上面的$HandlerLabel的宏定義展開后跳轉到對應的中斷處理函數(ISR)處理中斷(對于向量中斷) |
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
| 結合1中的代碼: VECTOR_BRANCH ????ldr pc,=HandlerEINT0????;mGA????H/W interrupt vector table 0x0000 0020 。。。。。。 我們很容易發現,這里通過向PC賦值的方法,直接跳轉到處理HandlerEINT0的程序處 |
3.設置存儲相關寄存器的程序
| 主要設置SDRAM,flash ROM 存儲器連接和工作時序的程序,以及片選定義的程序;SMRDATA map在下面的程序中定義 ;SMRDATA中涉及的值請參考memcfg.s程序 ;具體寄存器各位含義請參考S3C44B0X Specification |
??
;****************************************************
????;*????Set memory control registers?????????????? *????
????;****************************************************
????ldr?????? r0,=SMRDATA
????ldmia?? r0,{r1-r13}
????ldr?????? r0,=0x01c80000??;BWSCON Address
????stmia?? r0,{r1-r13}
這是上面提到的對存儲寄存器初始化的數據映射表(DATA Map)
SMRDATA DATA
?????? DCD 0x11110090?? ;Bank0=<?XML:NAMESPACE PREFIX = ST1 />OM[1:0], Bank1~Bank7=16bit, bank2=8bit;
??????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 0x16?????????????????????????? ;SCLK power mode, BANKSIZE 32M/32M
?????? DCD 0x20????????????????????;MRSR6 CL=2clk
?????? DCD 0x20????????????????????;MRSR7
?????? ALIGN
4.初始化各模式下的堆棧指針
;****************************************************
;*????The function for initializing stack??????*
;****************************************************
InitStacks
?????? ;Don't use DRAM,such as stmfd,ldmfd......
?????? ;SVCstack is initialized before
?????? ;Under toolkit ver 2.50, 'msr cpsr,r1' can be used instead of 'msr cpsr_cxsf,r1'
????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 is not initialized.
????mov???? pc,lr ;The LR register may be not valid for the mode changes.
5.對RW與ZI數據進行拷貝和初始化
| 應該從以下幾個方面來理解這個問題: 1.在ADS中指定的參數ro_base和rw_base是指的是映像文件被加載后的內存地址。 <?XML:NAMESPACE PREFIX = V /> 2.RO中的數據是不需要再次拷貝到運行地址處的。 3.RO的代碼的加載地址和運行地址是相同的。 4.說明:將數據段拷貝到RAM中,將ZI數據段清零,跳入C語言的main函數執行。到這里Bootloader初步引導結束??截恷Image$$RO$$Limit|起始的大小為(|Image$$ZI$$Base|-|Image$$RW$$Base|)的數據拷貝到|Image$$RW$$Base|對應的數據單元處。 ? |
????;********************************************************
????;*????Copy and paste RW data/zero initialized data???????????? *
????;********************************************************
????LDR?????????? r0, =|Image$$RO$$Limit|??????; Get pointer to ROM data,
;獲得ROM中的加載/運行時的RW地址
????LDR?????????? r1, =|Image$$RW$$Base|??????; and RAM copy
????????????????????????????????????????;獲得運行時的RW地址
????LDR?????????? r3, =|Image$$ZI$$Base|????????;獲得運行時的ZI地址
?????? ;Zero init base => top of initialised data
????????????????????
????CMP?????????? r0, r1??????????; Check that they are different
???????????????????????????????????????????????? ;比較指定的加載RW地址是否與運行時的RW地址相同。
BEQ?????????? %F1???????????????????? ;如果相同不需要拷貝RW數據,因為它們的在加載和運行時的地址相同
0????????????
????CMP?????????? r1, r3??????????; Copy init data,因為對RW指定了不同的加載和運行地址,因此需要拷貝
????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 segmen
??????????????????????????????????????????????????????????????????????;初始化ZI數據為0
????MOV??????????r2, #0
2????????????
????CMP?????????? r3, r1??????????; Zero init
????STRCC?? r2, [r3], #4
????BCC???? %B2
轉載于:https://www.cnblogs.com/yanhc/archive/2008/10/26/2175268.html
總結
以上是生活随笔為你收集整理的Samsung原版44B0X的Bootloader分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ROJECT SERVER如何与OUTL
- 下一篇: Flash与jsp通信类封装