Chinaunix首页 | 论坛 | 博客
  • 博客访问: 8959
  • 博文数量: 9
  • 博客积分: 320
  • 博客等级: 一等列兵
  • 技术积分: 95
  • 用 户 组: 普通用户
  • 注册时间: 2007-11-15 16:59
文章分类

全部博文(9)

文章存档

2011年(1)

2009年(1)

2008年(7)

我的朋友
最近访客

分类: LINUX

2008-09-23 21:21:15



@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

阅读(348) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~