又遇到问题了,昨天开始,跑过了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重新编辑 ]