#if defined(CONFIG_NAND) 我们定义了#defineCONFIG_NAND
/* simple init for NAND */
bl nand_asm_init
#endif
nand_asm_init 源码如下:
/*
* Nand Interface Init for SMDK6400
*/
nand_asm_init:
ldrr0, =ELFIN_NAND_BASE ----- 寄存器基地址
ldrr1, [r0, #NFCONF_OFFSET]
orrr1, r1, #0x70
orrr1, r1, #0x7700
str r1, [r0, #NFCONF_OFFSET] -----看下面这些图,就明白是干什么的了:
ldrr1, [r0, #NFCONT_OFFSET]
orrr1, r1, #0x03
str r1, [r0, #NFCONT_OFFSET]------也看图:
movpc, lr -----返回
接着看:
bl mem_ctrl_asm_init ---- 这个的源码在cpu_init.S (cpu\s3c64xx\s3c6410)文件中,我以前分析过,主要是和DRAM有关的初始化,这里就不分析了。
继续接着看:
#if 1
ldr r0, =(ELFIN_CLOCK_POWER_BASE+RST_STAT_OFFSET)
ldr r1, [r0]
bic r1, r1, #0xfffffff7
cmp r1, #0x8
beq wakeup_reset -----主要和寄存器RST_STAT有关,看下面:
#endif
#if 1
wakeup_reset: 相等是跳转到这里
/*Clear wakeup status register*/
ldrr0, =(ELFIN_CLOCK_POWER_BASE+WAKEUP_STAT_OFFSET)
ldrr1, [r0]
strr1, [r0]
/*LED test*/
ldr r0, =ELFIN_GPIO_BASE
ldr r1, =0x3000
str r1, [r0, #GPNDAT_OFFSET]
/*Load return address and jump to kernel*/ 没用到
ldrr0, =(ELFIN_CLOCK_POWER_BASE+INF_REG0_OFFSET)
ldrr1, [r0]/* r1 = physical address of s3c6400_cpu_resume function*/
movpc, r1/*Jump to kernel (sleep-s3c6400.S)*/ 没有这个文件
nop
nop
#endif
到这里有关lowlevel_init.S 文件的内容就都说完了,主要是有关开发板的一些配置,因为是汇编,所以看起来有点烦,不过,也挺简单的。