⊙ ARM process의 power on(reset)후 actions
.....
⊙ ENTRY POINT (_start)
Supervisor mode,arm state,pc 값이 0x0이므로 Linker script file의 entry point에서 선언된 ‘_start’부터 프로그램 코드가 실행된다.
_start: b reset @ offset jump이므로 dram으로 이동하지 않는다.
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
.global _start
Linker에게 ‘_start’ symbol 처리할 수 있도록 export한다.
_start의 첫번째 instruction은 ‘b reset’이므로 reset 함수로 branch하여
reset으로 제어가 옮겨진다.
나머지는 ARM에서 발생할 수 있는 exception으로 상황에 대한 처리 routine들로 exception이 발생하면 해당하는 핸들러로 branch할 것이다.
_undefined_instruction
_software_interrupt
_prefetch_abort
_data_abort
_not_used
_irq
_fiq
⊙ reset :
[1] mode setting 및 interrupt disable
* the actual reset code
*/
reset:
/*
* set the cpu to SVC32 mode and IRQ & FIQ disable
*/
@;mrs r0,cpsr @ cpsr값을 r0레지스터로 옮긴다.
@;bic r0,r0,#0x1f @ Mode bit을 clear한다.
@;orr r0,r0,#0xd3 @ interrupt 을 disable,supervisor mode
@;msr cpsr,r0 @ r0값으로 cpsr값을 바꾼다.
msr cpsr_c, #0xd3 @ I & F disable, Mode: 0x13 - SVC
⊙ cpu_init_crit
중요한 registers 및 memory timing 등을 setup한다.
cpu_init_crit:
#ifndef CONFIG_EVT1
#if 0
bl v7_flush_dcache_all
#else
bl disable_l2cache
mov r0, #0x0 @
mov r1, #0x0 @ i
mov r3, #0x0
mov r4, #0x0
lp1:
mov r2, #0x0 @ j
lp2:
mov r3, r1, LSL #29 @ r3 = r1(i) <<29
mov r4, r2, LSL #6 @ r4 = r2(j) <<6
orr r4, r4, #0x2 @ r3 = (i<<29)|(j<<6)|(1<<1)
orr r3, r3, r4
mov r0, r3 @ r0 = r3
bl CoInvalidateDCacheIndex
add r2, #0x1 @ r2(j)++
cmp r2, #1024 @ r2 < 1024
bne lp2 @ jump to lp2
add r1, #0x1 @ r1(i)++
cmp r1, #8 @ r1(i) < 8
bne lp1 @ jump to lp1
bl set_l2cache_auxctrl
bl enable_l2cache
#endif
#endif
bl disable_l2cache
bl set_l2cache_auxctrl_cycle
bl enable_l2cache
/*
* Invalidate L1 I/D
*/
mov r0, #0 @ set up for MCR
mcr p15, 0, r0, c8, c7, 0 @ invalidate TLBs
mcr p15, 0, r0, c7, c5, 0 @ invalidate icache
/*
* disable MMU stuff and caches
*/
mrc p15, 0, r0, c1, c0, 0
bic r0, r0, #0x00002000 @ clear bits 13 (--V-)
bic r0, r0, #0x00000007 @ clear bits 2:0 (-CAM)
orr r0, r0, #0x00000002 @ set bit 1 (--A-) Align
orr r0, r0, #0x00000800 @ set bit 12 (Z---) BTB
mcr p15, 0, r0, c1, c0, 0
/* Read booting information */
ldr r0, =PRO_ID_BASE
ldr r1, [r0,#OMR_OFFSET]
bic r2, r1, #0xffffffc1
#ifdef CONFIG_VOGUES
/* PS_HOLD(GPH0_0) set to output high */
ldr r0, =ELFIN_GPIO_BASE
ldr r1, =0x00000001
str r1, [r0, #GPH0CON_OFFSET]
ldr r1, =0x5500
str r1, [r0, #GPH0PUD_OFFSET]
ldr r1, =0x01
str r1, [r0, #GPH0DAT_OFFSET]
#endif
'[C-06] S5PV210' 카테고리의 다른 글
[mango210] u-boot.lds 분석 (0) | 2011.03.17 |
---|---|
[mango210] u-boot hardware point (0) | 2011.03.16 |
[mango210] u-boot 디렉토리 구조 (0) | 2011.03.16 |
[mango210] ARM Architecture Reference Manual (0) | 2011.03.10 |
[mango210] S5PV210 Booting Sequence (0) | 2011.01.14 |