嵌入式爱好者

查看: 9266|回复: 2

移植u-boot的问题 FL2440

[复制链接]

1

主题

1

帖子

1

积分

扫一扫,手机访问本帖
发表于 2010-1-29 11:27:06 | 显示全部楼层 |阅读模式
#ifdef CONFIG_S3C2440_NAND_BOOT
    mov r1, #NAND_CTL_BASE   //复位Nand Flash
    ldr r2, =( (7<<12)|(7<<8)|(7<<4)|(0<<0) )
    str r2, [r1, #oNFCONF]   //设置配置寄存器的初始值,参考s3c2440手册
    ldr r2, [r1, #oNFCONF]

    ldr r2, =( (1<<4)|(0<<1)|(1<<0) )
    str r2, [r1, #oNFCONT]   //设置控制寄存器
    ldr r2, [r1, #oNFCONT]

    ldr r2, =(0x6)           //RnB Clear
    str r2, [r1, #oNFSTAT]
    ldr r2, [r1, #oNFSTAT]
    mov r2, #0xff            //复位command
    strb r2, [r1, #oNFCMD]

    mov r3, #0               //等待
nand1:
    add r3, r3, #0x1
    cmp r3, #0xa
    blt nand1

nand2:
    ldr r2, [r1, #oNFSTAT]   //等待就绪
    tst r2, #0x4
    beq nand2

    ldr r2, [r1, #oNFCONT]
    orr r2, r2, #0x2         //取消片选
    str r2, [r1, #oNFCONT]

    //get read to call C functions (for nand_read())
    ldr sp, DW_STACK_START   //为C代码准备堆栈,DW_STACK_START定义在下面
    mov fp, #0               

    //copy U-Boot to RAM
    ldr r0, =TEXT_BASE//传递给C代码的第一个参数:u-boot在RAM中的起始地址
    mov r1, #0x0      //传递给C代码的第二个参数:Nand Flash的起始地址
    mov r2, #0x30000  //传递给C代码的第三个参数:u-boot的长度大小(128k)
    bl nand_read_ll   //此处调用C代码中读Nand的函数,现在还没有要自己编写实现
    tst r0, #0x0
    beq ok_nand_read

bad_nand_read:
    loop2: b loop2    //infinite loop

ok_nand_read:
    //检查搬移后的数据,如果前4k完全相同,表示搬移成功
    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 stack_setup
    bne go_next

notmatch:
    loop3: b loop3           //infinite loop

#endif //CONFIG_S3C2440_NAND_BOOT



_start_armboot: .word start_armboot //在这一句的下面加上DW_STACK_START的定义

.align 2
DW_STACK_START: .word STACK_BASE+STACK_SIZE-4




#include <config.h>

#define __REGb(x)        (*(volatile unsigned char *)(x))
#define __REGi(x)        (*(volatile unsigned int *)(x))
#define NF_BASE                0x4e000000
#define NFCONF                __REGi(NF_BASE + 0x0)

#define NFCONT __REGi(NF_BASE + 0x4)
#define NFCMD __REGb(NF_BASE + 0x8)
#define NFADDR __REGb(NF_BASE + 0xC)
#define NFDATA __REGb(NF_BASE + 0x10)
#define NFSTAT __REGb(NF_BASE + 0x20)

#define NAND_CHIP_ENABLE (NFCONT &= ~(1<<1))
#define NAND_CHIP_DISABLE (NFCONT |= (1<<1))
#define NAND_CLEAR_RB (NFSTAT |= (1<<2))
#define NAND_DETECT_RB { while(! (NFSTAT&(1<<2)));}
#define NAND_SECTOR_SIZE        512
#define NAND_BLOCK_MASK                (NAND_SECTOR_SIZE - 1)
/* low level nand read function */
int
nand_read_ll(unsigned char *buf, unsigned long start_addr, int size)
{
        int i, j;
       
        if ((start_addr & NAND_BLOCK_MASK) || (size & NAND_BLOCK_MASK)) {
        return -1;        /* invalid alignment */
        }
       
        NAND_CHIP_ENABLE;
               
        for(i=start_addr; i < (start_addr + size);) {
        /* READ0 */
                NAND_CLEAR_RB;       
                NFCMD = 0;       
       
                /* Write Address */
                NFADDR = i & 0xff;
                NFADDR = (i >> 9) & 0xff;
                NFADDR = (i >> 17) & 0xff;
                NFADDR = (i >> 25) & 0xff;
       
                NAND_DETECT_RB;
       
                for(j=0; j < NAND_SECTOR_SIZE; j++, i++) {
                *buf = (NFDATA & 0xff);
                buf++;
                }
        }
        NAND_CHIP_DISABLE;       
        return 0;
}
//#endif


为什么u-boot一直在循环运行  nand_read_ll,我测试过(通过led),串口没有任何输出,请斑竹帮我修改一下!
我是在我原来的u-boot基础上修改的,原来的u-boot能在s3c2440运行,能正确引导和输出!
回复

使用道具 举报

NULL 该用户已被删除
发表于 2010-1-30 08:26:42 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

NULL 该用户已被删除
发表于 2010-1-30 09:07:36 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋| 飞凌嵌入式 ( 冀ICP备12004394号-1 )

GMT+8, 2024-11-15 14:54

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表