主题 : 求教,nandflash的问题 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 29469
精华: 0
发帖: 11
金钱: 55 两
威望: 11 点
贡献值: 0 点
综合积分: 22 分
注册时间: 2010-09-28
最后登录: 2011-08-07
楼主  发表于: 2010-11-28 22:13

 求教,nandflash的问题

各位大侠好。现在我在把redboot在mini2440上改成nand flash启动,所以改移植了vivi的投4kb中拷贝代码到内存的部分和nand_read_ll函数。现在在AXD调试中,在这个函数内,在拷贝到第6*512 + 57个字节的时候就跑飞了。我是嵌入式新手。想问一下,如果我用supervivi下载([a](Absolute User Application))烧写到nand flash中,这里的DNW设置地址应该无所谓吧(我设置的0x30008000)?那这个烧写是在nandflash片内0开始吗?再者nand flash启动,sram是不是映射到0-4k,而且我是不是应该修改redboot的运行地址?我现在百思不得其解。请教各位了
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
贡献值: 71 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
1楼  发表于: 2010-11-28 22:21
如果我用supervivi下载([a](Absolute User Application))烧写到nand flash中,这里的DNW设置地址应该无所谓吧(我设置的0x30008000)?

理论上是的。但因为supervivi是不开源的,我不能保证DNW设置的下载地址有什么关系。

那这个烧写是在nandflash片内0开始吗?

是的

再者nand flash启动,sram是不是映射到0-4k,而且我是不是应该修改redboot的运行地址?

是映射到0-4K。至于redboot的运行地址,准确的说是链接地址, 应该和你移植的拷贝代码中的SDRAM目标地址保持一致。
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
级别: 新手上路
UID: 29469
精华: 0
发帖: 11
金钱: 55 两
威望: 11 点
贡献值: 0 点
综合积分: 22 分
注册时间: 2010-09-28
最后登录: 2011-08-07
2楼  发表于: 2010-11-28 22:37
版主回得真快,谢谢了。我再试试
级别: 新手上路
UID: 29469
精华: 0
发帖: 11
金钱: 55 两
威望: 11 点
贡献值: 0 点
综合积分: 22 分
注册时间: 2010-09-28
最后登录: 2011-08-07
3楼  发表于: 2010-11-30 21:49
又遇到问题了,昨天开始,跑过了nand_read_ll函数,但是在读取到SDRAM的RedBoot代码段的前4k和位于SRAM中的代码进行比较时,不相等,彻底晕了,跟进去的地址和传入的寄存器地址都没什么问题啊

#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 GPDAT        __REGi(GPIO_CTL_BASE+oGPIO_F+oGPIO_DAT)

#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 BUSY 4
inline void wait_idle(void) {
    while(!(NFSTAT & BUSY));
    NFSTAT |= BUSY;
}

#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;
}

汇编后的部分代码
[0xe5c4c00c]   strb     r12,[r4,#0xc]    //r12,r2, r1, r0的值均为0,r4
                    为4e000000,[r4,#0xc] 为__REGb(NF_BASE + 0xC) 即为4e000000+0xc(NFADDR地址)
                    那我就是取的nand flash从0开始的字节吧?
[0xe5c4200c]   strb     r2,[r4,#0xc]
[0xe5c4100c]   strb     r1,[r4,#0xc]
[0xe5c4000c]   strb     r0,[r4,#0xc]
[0xe5d43020]   ldrb     r3,[r4,#0x20]
[0xe3130004]   tst      r3,#4
[0x0afffffc]   beq      0x788
[0xe3a02000]   mov      r2,#0
[0xe5d43010]   ldrb     r3,[r4,#0x10]        //取出的r3等于0x18,但是我现在的0地址(我是从nandflash启动的,也就是sram的开始地址吧?)第一个字节为0x0E
[0xe7c53002] * strb     r3,[r5,r2]    


我从nand flash启动,应该是把nand最开头的4kb拷到sram中,sram映射到0-4k,那现在为什么我取的nandflash第一个字节的值为什么和sram的第一个字节不同呢?
因为这个原因,所以现在redboot跳到了处理not match的死循环。我以上的分析有问题吗?

问题很多,请版主和各位大侠指教一下。万分感谢。
我是用AXD调试,loadbinary c:\redboot.bin 0x0
                                 setpc 0x0

另外我用LED灯,也表明了在这里判断是由于不等,而跳入了死循环
[ 此帖被sx0526在2010-11-30 23:34重新编辑 ]
级别: 新手上路
UID: 29469
精华: 0
发帖: 11
金钱: 55 两
威望: 11 点
贡献值: 0 点
综合积分: 22 分
注册时间: 2010-09-28
最后登录: 2011-08-07
4楼  发表于: 2010-12-01 23:56
对比redboot.bin文件和内存里的数据,发现从nand flash中读到内存里的数据是对的,0x0开始的地址,也就是sram中的和redboot.bin不合,。。。为什么。。。
级别: 新手上路
UID: 29469
精华: 0
发帖: 11
金钱: 55 两
威望: 11 点
贡献值: 0 点
综合积分: 22 分
注册时间: 2010-09-28
最后登录: 2011-08-07
5楼  发表于: 2010-12-02 21:59
好了,我汗,无缘无故
级别: 新手上路
UID: 33562
精华: 0
发帖: 1
金钱: 5 两
威望: 1 点
贡献值: 0 点
综合积分: 2 分
注册时间: 2010-12-02
最后登录: 2017-09-13
6楼  发表于: 2010-12-02 22:27
确认nandflash寄存器配置、sdram寄存器配置有没有问题。
级别: 新手上路
UID: 29469
精华: 0
发帖: 11
金钱: 55 两
威望: 11 点
贡献值: 0 点
综合积分: 22 分
注册时间: 2010-09-28
最后登录: 2011-08-07
7楼  发表于: 2010-12-07 23:11
多谢root100回复