init.S (board\samsung\smdk6410)(3)

#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]   -----看下面这些图,就明白是干什么的了:


init.S (board\samsung\smdk6410)


init.S (board\samsung\smdk6410)



ldrr1, [r0, #NFCONT_OFFSET]
orrr1, r1, #0x03
str     r1, [r0, #NFCONT_OFFSET]------也看图:

init.S (board\samsung\smdk6410)

init.S (board\samsung\smdk6410)


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有关,看下面:


init.S (board\samsung\smdk6410)



#endif


#if 1
wakeup_reset:    相等是跳转到这里


/*Clear wakeup status register*/
ldrr0, =(ELFIN_CLOCK_POWER_BASE+WAKEUP_STAT_OFFSET)
ldrr1, [r0]
strr1, [r0]



init.S (board\samsung\smdk6410)


        /*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 文件的内容就都说完了,主要是有关开发板的一些配置,因为是汇编,所以看起来有点烦,不过,也挺简单的。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/psfpz.html