主题 : u-boot1.1.6移植时,copy_myself老是死在读取oNFSTAT这个寄存器的地方,请大侠们解答 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 16058
精华: 0
发帖: 1
金钱: 5 两
威望: 1 点
贡献值: 0 点
综合积分: 2 分
注册时间: 2010-03-13
最后登录: 2010-03-25
楼主  发表于: 2010-03-14 21:52

 u-boot1.1.6移植时,copy_myself老是死在读取oNFSTAT这个寄存器的地方,请大侠们解答

前几天买了块micro2440的板子,板子的FLASH的大小是256m,在家按照大家提供的方法去移植,但是老是死在copy_myself这个函数里面,主要是ldr   r2, [r1, #oNFSTAT]  这一段,这句主要作用是查看FLASH 控制器的状态的,我把START.S的内容贴出来,希望花费下大侠们的十来分钟的时间,帮我解答下,本人不胜感激,我的arm-linux-gcc 是用3.3.2编译的

.globl _start
_start:    b       reset
    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

_undefined_instruction:    .word undefined_instruction
_software_interrupt:    .word software_interrupt
_prefetch_abort:    .word prefetch_abort
_data_abort:        .word data_abort
_not_used:        .word not_used
_irq:            .word irq
_fiq:            .word fiq

    .balignl 16,0xdeadbeef



_TEXT_BASE:
    .word    TEXT_BASE

.globl _armboot_start
_armboot_start:
    .word _start

/*
* These are defined in the board-specific linker script.
*/
.globl _bss_start
_bss_start:
    .word __bss_start

.globl _bss_end
_bss_end:
    .word _end

#ifdef CONFIG_USE_IRQ
/* IRQ stack memory (calculated at run-time) */
.globl IRQ_STACK_START
IRQ_STACK_START:
    .word    0x0badc0de

/* IRQ stack memory (calculated at run-time) */
.globl FIQ_STACK_START
FIQ_STACK_START:
    .word 0x0badc0de
#endif

reset:
    /*
     * set the cpu to SVC32 mode
     */
    mrs    r0,cpsr
    bic    r0,r0,#0x1f
    orr    r0,r0,#0xd3
    msr    cpsr,r0

/* turn off the watchdog */
#if defined(CONFIG_S3C2400)
# define pWTCON        0x15300000
# define INTMSK        0x14400008    /* Interupt-Controller base addresses */
# define CLKDIVN    0x14800014    /* clock divisor register */
#elif defined(CONFIG_S3C2410)|| defined(CONFIG_S3C2440)
# define pWTCON        0x53000000
# define INTMSK        0x4A000008    /* Interupt-Controller base addresses */
# define INTSUBMSK    0x4A00001C
# define CLKDIVN    0x4C000014    /* clock divisor register */
#endif

#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410)|| defined(CONFIG_S3C2440)
    ldr     r0, =pWTCON
    mov     r1, #0x0
    str     r1, [r0]
    mov    r1, #0xffffffff
    ldr    r0, =INTMSK
    str    r1, [r0]
# if defined(CONFIG_S3C2440)
    ldr    r1, =0x7fff
    ldr    r0, =INTSUBMSK
    str    r1, [r0]
# endif
    /* FCLK:HCLK:PCLK = 1:2:4 */
    /* default FCLK is 120 MHz ! */
    ldr    r0, =CLKDIVN
    mov    r1, #5
    str    r1, [r0]
    mrc    p15, 0, r1, c1, c0, 0        /*read ctrl register   tekkaman*/
    orr    r1, r1, #0xc0000000         /*Asynchronous  tekkaman*/
    mcr    p15, 0, r1, c1, c0, 0    
    mov    r1, #CLK_CTL_BASE    /* tekkaman*/
    mov    r2, #MDIV_405                   /* mpll_405mhz    tekkaman*/
    add    r2, r2, #PSDIV_405             /* mpll_405mhz    tekkaman*/
    str    r2, [r1, #0x04]               /* MPLLCON tekkaman */

#endif    /* CONFIG_S3C2400 || CONFIG_S3C2410 */
#ifndef CONFIG_SKIP_LOWLEVEL_INIT
    bl    cpu_init_crit
#endif

#ifndef CONFIG_SKIP_RELOCATE_UBOOT
@relocate:                /* relocate U-Boot to RAM        */
@    adr    r0, _start        /* r0 <- current position of code   */
@    ldr    r1, _TEXT_BASE        /* test if we run from flash or RAM */
@    cmp     r0, r1                  /* don't reloc during debug         */
@    @beq     stack_setup

@    ldr    r2, _armboot_start
@    ldr    r3, _bss_start
@    sub    r2, r3, r2        /* r2 <- size of armboot            */
@    add    r2, r0, r2        /* r2 <- source end address         */

@copy_loop:
@    ldmia    r0!, {r3-r10}        /* copy from source address [r0]    */
@    stmia    r1!, {r3-r10}        /* copy to   target address [r1]    */
@    cmp    r0, r2            /* until source end addreee [r2]    */
@    ble    copy_loop
#endif    /* CONFIG_SKIP_RELOCATE_UBOOT */

    bl    copy_myself
    /*CONFIG_S3C2410_NAND_BOOT*/
    /* Set up the stack                            */
stack_setup:
    ldr    r0, _TEXT_BASE        /* upper 128 KiB: relocated uboot   */
    sub    r0, r0, #CFG_MALLOC_LEN    /* malloc area                      */
    sub    r0, r0, #CFG_GBL_DATA_SIZE /* bdinfo                        */
#ifdef CONFIG_USE_IRQ
    sub    r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)
#endif
    sub    sp, r0, #12        /* leave 3 words for abort-stack    */

clear_bss:
    ldr    r0, _bss_start        /* find start of bss segment        */
    ldr    r1, _bss_end        /* stop here                        */
    mov     r2, #0x00000000        /* clear                            */

clbss_l:str    r2, [r0]        /* clear loop...                    */
    add    r0, r0, #4
    cmp    r0, r1
    ble    clbss_l

#if 0
    /* try doing this stuff after the relocation */
    ldr     r0, =pWTCON
    mov     r1, #0x0
    str     r1, [r0]

    /*
     * mask all IRQs by setting all bits in the INTMR - default
     */
    mov    r1, #0xffffffff
    ldr    r0, =INTMR
    str    r1, [r0]

    /* FCLK:HCLK:PCLK = 1:2:4 */
    /* default FCLK is 120 MHz ! */
    ldr    r0, =CLKDIVN
    mov    r1, #3
    str    r1, [r0]
    /* END stuff after relocation */
#endif

    ldr    pc, _start_armboot

_start_armboot:    .word start_armboot



#ifndef CONFIG_SKIP_LOWLEVEL_INIT
cpu_init_crit:
    /*
     * flush v4 I/D caches
     */
    mov    r0, #0
    mcr    p15, 0, r0, c7, c7, 0    /* flush v3/v4 cache */
    mcr    p15, 0, r0, c8, c7, 0    /* flush v4 TLB */

    /*
     * disable MMU stuff and caches
     */
    mrc    p15, 0, r0, c1, c0, 0
    bic    r0, r0, #0x00002300    @ clear bits 13, 9:8 (--V- --RS)
    bic    r0, r0, #0x00000087    @ clear bits 7, 2:0 (B--- -CAM)
    orr    r0, r0, #0x00000002    @ set bit 2 (A) Align
    orr    r0, r0, #0x00001000    @ set bit 12 (I) I-Cache
    mcr    p15, 0, r0, c1, c0, 0
    mov    ip, lr
    bl    lowlevel_init
    mov    lr, ip
    mov    pc, lr
#endif /* CONFIG_SKIP_LOWLEVEL_INIT */
@
@ copy_myself: copy u-boot to ram
@
copy_myself:
    mov   r10, lr
     mov   r1, #NAND_CTL_BASE
    ldr    r2, =( (7<<12)|(7<<8)|(7<<4)|(0<<0) )
    str    r2, [r1, #oNFCONF]
    ldr    r2, [r1, #oNFCONF]
    ldr    r2, =( (1<<4)|(0<<1)|(1<<0) ) @ Active low CE Control
    str    r2, [r1, #oNFCONT]
    ldr    r2, [r1, #oNFCONT]
    ldr    r2, =(0x6)        @ RnB Clear
    str    r2, [r1, #oNFSTAT]
    ldr    r2, [r1, #oNFSTAT]
    mov    r2, #0xff        @ RESET command
    strb    r2, [r1, #oNFCMD]
  mov r3, #0                   @ wait
nand1:
  add  r3, r3, #0x1
  cmp r3, #0xa
  blt   nand1
nand2:
  ldr   r2, [r1, #oNFSTAT]      @ wait ready???????????????????主要是死在这里,想不出来时哪出问题,恳请大侠帮我解答
  tst    r2, #0x4
  beq  nand2

/*-------------------lea start-----*/
mov    r1, #GPIO_CTL_BASE
    add    r1, r1, #oGPIO_B
    ldr    r2,=0x155aa
    str    r2, [r1, #oGPIO_CON]
    mov    r2, #0xff
    str    r2, [r1, #oGPIO_UP]
    mov    r2, #0x1c0
    str    r2, [r1, #oGPIO_DAT]
/*-----------------end------*/
    ldr    r2, [r1, #oNFCONT]
    orr    r2, r2, #0x2        @ Flash Memory Chip Disable
    str    r2, [r1, #oNFCONT]
@ get read 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 U-Boot to RAM
  ldr   r0, =TEXT_BASE
  mov     r1, #0x0
  mov r2, #0x20000
  bl    nand_read_ll
  tst    r0, #0x0
  beq  ok_nand_read
bad_nand_read:
loop2:    b     loop2          @ infinite loop
ok_nand_read:
@ verify
  mov r0, #0
  ldr   r1, =TEXT_BASE
  mov r2, #0x400     @ 4 bytes * 1024 = 4K-bytes
go_next:
  ldr   r3, [r0], #4
  ldr   r4, [r1], #4
  teq   r3, r4
  bne  notmatch
  subs r2, r2, #4
  beq  done_nand_read
  bne  go_next
notmatch:
loop3:     b     loop3         @ infinite loop
done_nand_read:
    mov   pc, r10

    @ CONFIG_S3C2440_NAND_BOOT
.align     2
DW_STACK_START:  .word  STACK_BASE+STACK_SIZE-4
级别: 新手上路
UID: 16254
精华: 0
发帖: 3
金钱: 15 两
威望: 3 点
贡献值: 0 点
综合积分: 6 分
注册时间: 2010-03-15
最后登录: 2010-06-07
1楼  发表于: 2010-03-16 22:36
是有两块flash吗?
先初始化第一块先吧。看看会产生什么问题