|
; boot from NAND flash
mov r0,r1
sub r2,r2,r1
mov r1,#0
ldr lr, =On_The_Ram
b nand_read_ll /// 调用后没有问题
///////////////////////////上面是启动代码里面的 下面是调用函数////////
int nand_read_ll(unsigned char *buf, unsigned long start_addr, int size)
{
int i;
unsigned long addr, baddr;
if ((start_addr & NAND_BLOCK_MASK)/* || (size & NAND_SECTOR_MASK)*/) {
return -1; /* invalid alignment */
}
/* chip Enable */
NAND_CHIP_ENABLE;
for(i=0; i<100; i++);
for(baddr=start_addr&~NAND_BLOCK_MASK; size>0; baddr+=NAND_BLOCK_SIZE) {
/* READOOB */
NAND_CLEAR_RB;
NFCMD = NAND_CMD_READOOB;
/* Write Address */
NFADDR = (5) & 0xff;
NFADDR = (baddr >> 9) & 0xff;
NFADDR = (baddr >> 17) & 0xff;
NFADDR = (baddr >> 25) & 0xff;
NAND_DETECT_RB
if ((NFDATA & 0xff)!= 0xff) {
//Uart0_Printf ("bad block at %d\r\n",baddr>>14);
continue; //bad block
}
for(addr=0; addr<NAND_BLOCK_SIZE && (size>0); size-=NAND_SECTOR_SIZE,addr+=NAND_SECTOR_SIZE) {
/* READ0 */
NAND_CLEAR_RB;
NFCMD = 0;
/* Write Address */
NFADDR = (baddr+addr) & 0xff;
NFADDR = ((baddr+addr) >> 9) & 0xff;
NFADDR = ((baddr+addr) >> 17) & 0xff;
NFADDR = ((baddr+addr) >> 25) & 0xff;
NAND_DETECT_RB
for(i=0; i < NAND_SECTOR_SIZE; i++) {
*buf = (NFDATA & 0xff); //////函数在这就死机了 不知道为什么 希望得到指点
buf++;
}
}
}
/* chip Disable */
NAND_CHIP_DISABLE;
return 0;
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|