華清遠見非著名講師 O(∩_∩)O 牛牛猛
點擊鏈接加我好友!
http://student.csdn.net/invite.php?u=111047&c=758a60d66d3a92d1
歡迎大家去我CSDN博客上踩踩
http://blog.csdn.net/mistyeyed
前幾天寫了關於CE的驅動分析,好像難了點,今天發個稍微簡單的點的,就是傳說中嵌入式Linux中常用的U-boot啓動代碼分析,這是我平時我講課時的講義,將要整理成書,這裏先和大家分享一下,也許您的意見會體現在我的新書裏哦!
分析cpu/arm920t/start.s文件
打開cpu/arm920t/start.s文件
s3c2440復位之後,pc指針會指向0x0地址。在u-boot代碼中,該0x0地址是一個向量表,第一條指令跳轉branch到復位代碼start_code。 位於cpu/arm920t/start.S彙編語言文件最開始的地方:
.globl _start /*定義一個全局變量,_start,也就是程序的入口點*/ _start: b start_code /*程序入口點是一條跳轉指令,跳轉到start_code 入口執行*/ |
/*定義中斷向量表*/ ldr pc, _undefined_instruction ldr pc, _software_interrupt ldr pc, _prefetch_abort ldr pc, _data_abort ldr pc, _not_used ldr pc, _irq ldr pc, _fiq |
按照上面定義的異常模式,當發生異常時,執行cpu/arm920t/interrupts.c中定義的中斷處理函數。
復位指令跳轉之後標號爲start_code處開始執行,開始執行arm920t處理器的基本初始化。首先修改當前程序狀態寄存器CPSR,使處理器進入Supervisor|32 bit ARM模式,
並關閉ARM9TDMI中斷和快速中斷,這是通過設置CPSR相應掩碼實現的:
start_code: /* * set the cpu to SVC32 mode */ mrs r0,cpsr bic r0,r0,#0x1f orr r0,r0,#0xd3 msr cpsr,r0 |
緊接着,將S3C2410特有的WTCON寄存器清零,此舉僅爲關閉看門狗,因爲系統啓動時一般不需要看門狗的支持。
ldr r0, =pWTCON mov r1, #0x0 str r1, [r0] |
然後將S3C2410中斷控制器INTMSK寄存器置爲全1,INTSUBMSK置爲0x7ff,禁止全部中斷源。S3C2410手冊中對此有詳細描述:
mov r1, #0xffffffff ldr r0, =INTMSK str r1, [r0]
# if defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440) || defined(CONFIG_S3C2442) || / defined(CONFIG_S3C2443)
ldr r1, =INTSUBMSK_val ldr r0, =INTSUBMSK str r1, [r0] # endif |
接下來,訪問arm920t控制寄存器CP15,並置位最高兩位[31,30]。此兩位置爲0b11後,處理器時鐘被設置爲異步模式,允許處理器異步訪問總線:
mrc p15, 0, r1, c1, c0, 0 orr r1, r1, #0xc0000000 mcr p15, 0, r1, c1, c0, 0
|
至此arm920t相關的配置完成。