@disable pull-up
str r2, [r1, #oGPIO_UP]
bl InitUART
@in autoconf.h:#undef CONFIG_DEBUG_LL
#ifdef CONFIG_DEBUG_LL
@ Print current Program Counter
ldr r1, SerBase
mov r0, #'\r'
bl PrintChar
mov r0, #'\n'
bl PrintChar
mov r0, #'@'
bl PrintChar
mov r0, pc
bl PrintHexWord
#endif
@ in autoconf.h:#undef CONFIG_BOOTUP_MEMTEST
#ifdef CONFIG_BOOTUP_MEMTEST
@ simple memory test to find some DRAM flaults.
bl memtest
#endif
@ in autoconf.h:#define CONFIG_S3C2410_NAND_BOOT 1
#ifdef CONFIG_S3C2410_NAND_BOOT
bl copy_myself
@ jump to ram
ldr r1, =on_the_ram
add pc, r1, #0
nop
nop
1: b 1b @ infinite loop
on_the_ram:
#endif
#ifdef CONFIG_DEBUG_LL
ldr r1, SerBase
ldr r0, STR_STACK
bl PrintWord
ldr r0, DW_STACK_START
bl PrintHexWord
#endif
@11010010B
mrs r0, cpsr
bic r0, r0, #0x1f @clear
orr r1, r0, #(0x12|0xc0) @IRQ Mode for Control Bit
msr cpsr_c, r1
ldr sp, IRQ_STACK_START
bic r0, r0, #(0x1f|0xc0) @SVC Mode for Control Bit
orr r1, r0, #0x13
msr cpsr_c, r1
@ get read to call C functions
ldr r0, DW_STACK_START @ stack base
sub r0, r0, #MALLOC_LEN
sub r0, r0, #(STACKSIZE_IRQ+STACKSIZE_FIQ)
sub sp, r0, #12 @ setup stack pointer leave 3 words for abort-stack
mov fp, #0 @ no previous frame, so fp=0
mov a2, #0 @ set argv to NULL
@ Enable MMU ICache
mrc p15, 0, r0, c1, c0, 0
orr r0, r0, #0x800 @ orr r0, r0, #0x1000
@错误
mcr p15, 0, r0, c1, c0, 0
bl main @ call main
mov pc, #FLASH_BASE @ otherwise, reboot,即reset:”mov pc, #0x00”
@
@ End VIVI head
@
/*
* subroutines
*/
@
@ Wake-up codes
@
#ifdef CONFIG_PM
WakeupStart:
@ Clear sleep reset bit
ldr r0, PMST_ADDR
mov r1, #PMST_SMR
str r1, [r0]
@ Release the SDRAM signal protections
@位清除指令
@bic rd, rm
@rd = rd&(~rm)
ldr r0, PMCTL1_ADDR
ldr r1, [r0]
bic r1, r1, #(SCLKE | SCLK1 | SCLK0)
str r1, [r0]
@ Go...
ldr r0, PMSR0_ADDR @ read a return address
ldr r1, [r0]
mov pc, r1
nop
nop
1: b 1b @ infinite loop
SleepRamProc:
@ SDRAM is in the self-refresh mode */
ldr r0, REFR_ADDR
ldr r1, [r0]
orr r1, r1, #SELF_REFRESH
str r1, [r0]
@ wait until SDRAM into self-refresh
mov r1, #16
1: subs r1, r1, #1
bne 1b
@ Set the SDRAM singal protections
ldr r0, PMCTL1_ADDR
ldr r1, [r0]
orr r1, r1, #(SCLKE | SCLK1 | SCLK0)
str r1, [r0]
/* Sleep... Now */
ldr r0, PMCTL0_ADDR
ldr r1, [r0]
orr r1, r1, #SLEEP_ON
str r1, [r0]
1: b 1b
#ifdef CONFIG_TEST
hmi:
ldr r0, PMCTL0_ADDR
ldr r1, =0x7fff0
str r1, [r0]
@ All LED on
mov r1, #GPIO_CTL_BASE
add r1, r1, #oGPIO_F
ldr r2,=0x55aa
str r2, [r1, #oGPIO_CON]
mov r2, #0xff
str r2, [r1, #oGPIO_UP]
mov r2, #0xe0
str r2, [r1, #oGPIO_DAT]
1: b 1b
#endif
#endif
ENTRY(memsetup)
@ initialise the static memory
@ set memory control registers
mov r1, #MEM_CTL_BASE
adrl r2, mem_cfg_val
add r3, r1, #52
1: ldr r4, [r2], #4
str r4, [r1], #4
cmp r1, r3
bne 1b
mov pc, lr
#ifdef CONFIG_S3C2410_NAND_BOOT
@
@ copy_myself: copy vivi to ram
@
copy_myself:
mov r10, lr
@ reset NAND
mov r1, #NAND_CTL_BASE
ldr r2, =0xf830 @ initial value
str r2, [r1, #oNFCONF]
ldr r2, [r1, #oNFCONF]
@”bic rd,rm,operand2” = “rd = rm & (~operand2)”
bic r2, r2, #0x800 @ enable chip
str r2, [r1, #oNFCONF]
mov r2, #0xff @ RESET command
strb r2, [r1, #oNFCMD]
mov r3, #0 @ wait
1: add r3, r3, #0x1
cmp r3, #0xa
blt 1b
2: ldr r2, [r1, #oNFSTAT] @ wait ready
tst r2, #0x1
beq 2b
ldr r2, [r1, #oNFCONF]
orr r2, r2, #0x800 @ disable chip
str r2, [r1, #oNFCONF]
@ get ready 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 vivi to RAM
ldr r0, =VIVI_RAM_BASE
mov r1, #0x0
mov r2, #0x20000
@128KB
@ nand_read_ll defined in /vivi/arch/s3c2410/nand_read.c
@ int nand_read_ll(unsigned char *buf, unsigned long start_addr, int size)
@ r0 nand_read_ll(r0, r1, r2);
bl nand_read_ll
@r0中存放函数nand_read_ll()返回值,具体规则可以参见ATPCS
@简单的说就是如果函数有不多于四个参数,对应的用R0-R3来进行传递,多于4个时
@借助栈,函数的返回值通过R0来返回。
tst r0, #0x0
beq ok_nand_read
@in autoconf.h:#undef CONFIG_DEBUG_LL
#ifdef CONFIG_DEBUG_LL
bad_nand_read:
ldr r0, STR_FAIL
ldr r1, SerBase
bl PrintWord
1: b 1b @ infinite loop
#endif
|