天天看點

U-boot start.s 詳解最近在學習Uboot,對其結構不清楚是以這篇文章還不錯。

最近在學習Uboot,對其結構不清楚是以這篇文章還不錯。

1、紅色為彙編指令;棕色為gnu彙編指令; 藍色 為寄存器;黑色為變量、常量、數字等;綠色為注釋。

2、部分比較繁瑣的注釋用白色标出。

.globl _start         

@将_start聲明為“全局變量”,且可以被外部引用。globl: makes the symbol visible to ld,在别的程式中出現:ldr   pc._star時,程式将跳轉到這個地方執行

_start:       b          reset     

@在_start行寫入b reset語句 。 b指令就是無條件地跳到reset的地方運作

     ldr      pc ,  _undefined_instruction

@LDR 指令用于從存儲器中将一個32 位的字資料傳送到目的寄存器中。該指令通常用于從存儲器中讀取32 位的字資料到通用寄存器,然後對資料進行處理。當程式計數器PC 作為目的寄存器時,指令從存儲器中讀取的資料被當作目的位址,進而可以實作程式流程的跳轉。

@ 當 發生中斷 時 程式跳轉到此行,程式将繼續跳轉到中斷處理程式中執行。以下類同。我想一定是放在存儲器0x00的位置,這樣就可以系統可以根據中斷向量的标号來找到跳轉到對應的行。如中斷向量是2,則會跳到 ldr    pc, _prefetch_abort。

@ldr:load from memory into a register.

    ldr    pc, _software_interrupt

    ldr    pc, _prefetch_abort

    ldr    pc, _data_abort

    ldr    pc, _not_used

    ldr    pc, _irq

    ldr    pc, _fiq

_undefined_instruction:   .word undefined_instruction

_software_interrupt:   .word software_interrupt

_prefetch_abort:    .word prefetch_abort

_data_abort:        .word data_abort

_not_used:        .word not_used

_irq:           .word irq

_fiq:            .word fiq

    .balignl 16,0xdeadbeef

.......

reset:          //複位啟動子程式

//ARM 微處理器支援程式狀态寄存器通路指令,用于在程式狀态寄存器

//和通用寄存器之間傳送資料,程式狀态寄存器通路指令包括以下兩條:

//MRS 程式狀态寄存器到通用寄存器的資料傳送指令

//MRS{條件} 通用寄存器,程式狀态寄存器(CPSR 或SPSR)

       mrs   r0,cpsr

       bic   r0,r0,#0x1f // 清除r0的低五位。

       orr   r0,r0,#0xd3 // r0置位 d3=11010011

       msr   cpsr,r0 // r0寫回cpsr

# define pWTCON        0x53000000

# define INTMSK        0x4A000008

# define CLKDIVN    0x4C000014   

//關閉看門狗

    ldr     r0, =pWTCON //把pWTCON的值裝載到r0

    mov     r1, #0x0  // 0裝載到r1

    str     r1, [r0] // 将0賦給r0指向的位址

// 禁止所有中斷

 //禁止主中斷控制器

    mov    r1, #0xffffffff  //把 0xffffffff 裝載到 r1

    ldr    r0, =INTMSK  //把 INTMSK 的值裝載到r0

    str    r1, [r0]  // 将 0xffffffff 賦給 INTMSK 指向的位址

# if defined(CONFIG_S3C2410)

//禁止子中斷控制器

    ldr    r1, =0x3ff

    ldr    r0, =INTSUBMSK

    str    r1, [r0]

# endif

設定CPU的頻率

CLKDIVN寄存器的reset預設值是0x00000000,

第0位=0,PCLK=HCLK;第0位=1,PCLK=HCLK/2;

第1位=0,HCLK=FCLK;第1位=1,HCLK=FCLK/2;

這裡 HCLK=FCLK/2,PCLK=HCLK/2;

    ldr    r0, =CLKDIVN

    mov    r1, #3

    str    r1, [r0]

MCR 指令的格式為:

MCR{條件} 協處理器編碼,協處理器操作碼1,源寄存器,目的寄存器1,目的寄存器2,協處

理器操作碼2。

MCR 指令用于将ARM處理器寄存器中的資料傳送到協處理器寄存器中,若協處理器不能成功完成操作,則産生未定義指令異常。其中協處理器操作碼1 和協處理器操作碼2為協處理器将要執行的操作,源寄存器為ARM 處理器的寄存器,目的寄存器1 和目的寄存器2 均為協處理器的寄存器。

指令示例:

MCR P3 , 3 , R0 , C4 , C5 , 6 ;該指令将 ARM 處理器寄存器 R0 中的資料傳送到協處理器 P3 的寄存器 C4 和 C5 中。

5、MRC 指令

MRC 指令的格式為:

MRC{條件} 協處理器編碼,協處理器操作碼1,目的寄存器,源寄存器1,源寄存器2,協處理

器操作碼2。

MRC 指令用于将協處理器寄存器中的資料傳送到ARM處理器寄存器中,若協處理器不能成功完成操作,則産生未定義指令異常。其中協處理器操作碼1 和協處理器操作碼2為協處理器将要執行的操作,目的寄存器為ARM 處理器的寄存器,源寄存器1 和源寄存器2 均為協處理器的寄存器。

指令示例:

MRC P3 , 3 , R0 , C4 , C5 , 6 ;該指令将協處理器 P3 的寄存器中的資料傳送到 ARM 處理器寄存器中.

cpu_init_crit:

    mov    r0, #0

    mcr    p15, 0, r0, c7, c7, 0    

    mcr    p15, 0, r0, c8, c7, 0    

    mrc    p15, 0, r0, c1, c0, 0

    bic    r0, r0, #0x00002300    @ clear bits 13, 9:8 (--V- --RS)

    bic    r0, r0, #0x00000087    @ clear bits 7, 2:0 (B--- -CAM)

    orr    r0, r0, #0x00000002    @ set bit 2 (A) Align

    orr    r0, r0, #0x00001000    @ set bit 12 (I) I-Cache

    mcr    p15, 0, r0, c1, c0, 0

    mov    ip, lr

    bl    lowlevel_init

    mov    lr, ip

    mov    pc, lr