U-BOOT start.S分析
U-BOOT start.S分析
一.8つの異常ジャンプテーブルと7つの異常アドレス、1つのメモリフラグを格納し、deadbeefは以上のメモリ禁止操作を示します.
二.アドレスラベル変数、例えばbss_start ,_startラベルのアドレス.
三.開始コード:
1.cpuをsvcモードにする
2.番犬を閉じる.
3.オフ割り込み、サブ割り込み.
4.クロックレジスタを設定し、FCLK=400 M HCLK=100 M PCLK=50 Mにする
5.メモリおよびMMUを初期化し、cpu_に入るinit_crit関数
(1)データcacheと命令cacheを無効にする
(2)MMUを閉じる
(3)lowlevel_init.Sに入り、メモリを初期化する.メモリ用チップは開発ボードに関係しているため、このファイルは/boardにある
6.判定コード位置、比較_startのアドレスと_TEXT_BASEが同じかどうかは、同じ説明コードがメモリにある場合、内部RAMにある場合、またはNorFlashにある.
7.起動方式を判断するには、BWSONレジスタの内容を読み取る方式を採用し、NANDFALSHまたはNARFLASH起動はピンOM【1:0】によって決定され、彼らの状態はBWSON【2:1】に影響し、
OM[1:0]=00、BWSCON[2:1]=00であればNANDFLASH起動、そうでなければNORFLASH起動となる.
四.メモリへ
1.NANDFLASH起動
(1)NANDFLASHをリセットし,スタックポインタを初期化し,C関数に入る準備をする.
(2)/board/chuangwaiyuntian/mini 2440/nand_read.cのnand_read_ll関数を呼び出してu-bootをメモリにコピーします.
(3)レプリケーションに成功したかどうかを検証し、主にアドレス0 x 0とアドレス_TEXT_BASEの後の4 Kコードが完全に同じかどうかを検査する.同じように正常に実行すれば、ここで死んでしまう.
2 NORFLASH起動
(1)簡単なコピーコード
五.スタックを初期化することは、スタックポインタを正確なアドレスに向けることです.
六.bssセグメントのクリア
七.第2段階のstart_にジャンプarmboot関数が実行されます.
一.8つの異常ジャンプテーブルと7つの異常アドレス、1つのメモリフラグを格納し、deadbeefは以上のメモリ禁止操作を示します.
.globl _start
_start: b 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
_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
二.アドレスラベル変数、例えばbss_start ,_startラベルのアドレス.
_TEXT_BASE:
.word TEXT_BASE
.globl _armboot_start
_armboot_start:
.word _start
/*
* These are defined in the board-specific linker script.
*/
.globl _bss_start
_bss_start:
.word __bss_start
.globl _bss_end
_bss_end:
.word _end
#ifdef CONFIG_USE_IRQ
/* IRQ stack memory (calculated at run-time) */
.globl IRQ_STACK_START
IRQ_STACK_START:
.word 0x0badc0de
/* IRQ stack memory (calculated at run-time) */
.globl FIQ_STACK_START
FIQ_STACK_START:
.word 0x0badc0de
#endif
三.開始コード:
1.cpuをsvcモードにする
mrs r0, cpsr
bic r0, r0, #0x1f
orr r0, r0, #0xd3
msr cpsr, r0
2.番犬を閉じる.
ldr r0, =pWTCON
mov r1, #0x0
str r1, [r0]
3.オフ割り込み、サブ割り込み.
mov r1, #0xffffffff
ldr r0, =INTMSK
str r1, [r0]
# if defined(CONFIG_S3C2410)
ldr r1, =0x7ff
ldr r0, =INTSUBMSK
str r1, [r0]
# endif
#if defined(CONFIG_S3C2440)
ldr r1, =0x7fff
ldr r0, =INTSUBMSK
str r1, [r0]
#endif
4.クロックレジスタを設定し、FCLK=400 M HCLK=100 M PCLK=50 Mにする
/* FCLK:HCLK:PCLK = 1:4:8 */
ldr r0, =CLKDIVN
mov r1, #5
str r1, [r0]
mrc p15, 0, r1, c1, c0, 0
orr r1, r1, #0xc0000000
mcr p15, 0, r1, c1, c0, 0
mov r1, #CLK_CTL_BASE
mov r2, #MDIV_405
add r2, r2, #PSDIV_405
str r2, [r1, #0x04] /* MPLLCON tekkaman */
5.メモリおよびMMUを初期化し、cpu_に入るinit_crit関数
(1)データcacheと命令cacheを無効にする
mov r0, #0
mcr p15, 0, r0, c7, c7, 0 /* flush v3/v4 cache */
mcr p15, 0, r0, c8, c7, 0 /* flush v4 TLB */
(2)MMUを閉じる
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
(3)lowlevel_init.Sに入り、メモリを初期化する.メモリ用チップは開発ボードに関係しているため、このファイルは/boardにある
mov ip, lr
bl lowlevel_init
6.判定コード位置、比較_startのアドレスと_TEXT_BASEが同じかどうかは、同じ説明コードがメモリにある場合、内部RAMにある場合、またはNorFlashにある.
adr r0, _start /* r0 <- current position of code */
ldr r1, _TEXT_BASE /* test if we run from flash or RAM */
cmp r0, r1 /* don't reloc during debug */
beq stack_setup
7.起動方式を判断するには、BWSONレジスタの内容を読み取る方式を採用し、NANDFALSHまたはNARFLASH起動はピンOM【1:0】によって決定され、彼らの状態はBWSON【2:1】に影響し、
OM[1:0]=00、BWSCON[2:1]=00であればNANDFLASH起動、そうでなければNORFLASH起動となる.
#define rBWSCON 0x48000000
mov r0, #rBWSCON
ldr r0, [r0]
bic r0, r0, #0xfffffff5 /* BWSCON[2:1] is controled by OM[1:0] */
cmp r0, #0 /* when OM[1:0] is 00,BSWCON[2:1]=00, nand flash boot */
bne relocate /* norflash boot */
四.メモリへ
1.NANDFLASH起動
(1)NANDFLASHをリセットし,スタックポインタを初期化し,C関数に入る準備をする.
#define LENGTH_UBOOT 0x60000
#define NAND_CTL_BASE 0x4E000000
#ifdef CONFIG_S3C2440
/* Offset */
#define oNFCONF 0x00
#define oNFCONT 0x04
#define oNFCMD 0x08
#define oNFSTAT 0x20
@ reset NAND
mov r1, #NAND_CTL_BASE
ldr r2, =( (7<<12)|(7<<8)|(7<<4)|(0<<0) )
str r2, [r1, #oNFCONF]
ldr r2, [r1, #oNFCONF]
ldr r2, =( (1<<4)|(0<<1)|(1<<0) ) @ Active low CE Control
str r2, [r1, #oNFCONT]
ldr r2, [r1, #oNFCONT]
ldr r2, =(0x6) @ RnB Clear
str r2, [r1, #oNFSTAT]
ldr r2, [r1, #oNFSTAT]
mov r2, #0xff @ RESET command
strb r2, [r1, #oNFCMD]
mov r3, #0 @ wait
nand1:
add r3, r3, #0x1
cmp r3, #0xa
blt nand1
nand2:
ldr r2, [r1, #oNFSTAT] @ wait ready
tst r2, #0x4
beq nand2
ldr r2, [r1, #oNFCONT]
orr r2, r2, #0x2 @ Flash Memory Chip Disable
str r2, [r1, #oNFCONT]
@ get read to call C functions (for nand_read())
ldr sp, DW_STACK_START @ setup stack pointer
mov fp, #0 @ no previous frame, so fp=0
@ copy U-Boot to RAM
ldr r0, =TEXT_BASE
mov r1, #0x0
mov r2, #LENGTH_UBOOT
(2)/board/chuangwaiyuntian/mini 2440/nand_read.cのnand_read_ll関数を呼び出してu-bootをメモリにコピーします.
bl nand_read_ll
(3)レプリケーションに成功したかどうかを検証し、主にアドレス0 x 0とアドレス_TEXT_BASEの後の4 Kコードが完全に同じかどうかを検査する.同じように正常に実行すれば、ここで死んでしまう.
bad_nand_read:
loop2:
b loop2 @ infinite loop
ok_nand_read:
@ verify
mov r0, #0
ldr r1, =TEXT_BASE
mov r2, #0x400 @ 4 bytes * 1024 = 4K-bytes
go_next:
ldr r3, [r0], #4
ldr r4, [r1], #4
teq r3, r4
bne notmatch
subs r2, r2, #4
beq stack_setup
bne go_next
notmatch:
loop3:
b loop3 @ infinite loop
2 NORFLASH起動
(1)簡単なコピーコード
relocate: /* relocate U-Boot to RAM */
adr r0, _start /* r0 <- current position of code */
ldr r1, _TEXT_BASE /* test if we run from flash or RAM */
cmp r0, r1 /* don't reloc during debug */
beq stack_setup
ldr r2, _armboot_start
ldr r3, _bss_start
sub r2, r3, r2 /* r2 <- size of armboot */
add r2, r0, r2 /* r2 <- source end address */
copy_loop:
ldmia r0!, {r3-r10} /* copy from source address [r0] */
stmia r1!, {r3-r10} /* copy to target address [r1] */
cmp r0, r2 /* until source end addreee [r2] */
ble copy_loop
五.スタックを初期化することは、スタックポインタを正確なアドレスに向けることです.
stack_setup:
ldr r0, _TEXT_BASE /* upper 128 KiB: relocated uboot */
sub r0, r0, #CONFIG_SYS_MALLOC_LEN /* malloc area */
sub r0, r0, #CONFIG_SYS_GBL_DATA_SIZE /* bdinfo */
#ifdef CONFIG_USE_IRQ
sub r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)
#endif
sub sp, r0, #12 /* leave 3 words for abort-stack */
六.bssセグメントのクリア
clear_bss:
ldr r0, _bss_start /* find start of bss segment */
ldr r1, _bss_end /* stop here */
mov r2, #0x00000000 /* clear */
clbss_l:str r2, [r0] /* clear loop... */
add r0, r0, #4
cmp r0, r1
ble clbss_l
七.第2段階のstart_にジャンプarmboot関数が実行されます.
ldr pc, _start_armboot
_start_armboot: .word start_armboot