btiger2000您说的id是什么呢?<br /><br />我将详细的相关程序贴在下面<br /><br />;reset nand<br />> ldr r1,=0x4E000000 ;NFCONF<br />> ldr r2,=0xf830 ;TWRPH0=3,TACLS=0,NAND CHIP INACTIVE,INITIALIZE ECC<br />> str r2,[r1] <br />> ldr r2,[r1]<br />> bic r2,r2,#0x800 ;NAND CHIP ACTIVE,ENABLE NAND FLASH CONTROLER<br />> str r2,[r1] <br />> mov r2,#0xff<br />> strb r2,[r1,#0x04] ;NFCMD<br />> mov r3,#0<br />>1 add r3,r3,#0x1<br />> cmp r3,#0xa<br />> blt %b1<br />>2 ldr r2,[r1,#0x10] ;NFSTAT<br />> TST r2,#0X1<br />> beq %b2<br />> ldr r2,[r1]<br />> orr r2,r2,#0x800 ;disable chip<br />> str r2,[r1]<br />><br />><br />> ldr sp,=0x33df6ffb ;DW_STACK_START ****** setup stack pionter<br />> mov fp,#0<br />> <br />> ldr r0,=0x33f00000 ;VIVI_RAM_BASE <br />> mov r1,#0x0<br />> mov r2,#0x20000 ;要拷贝128k<br />>;******************************************************************************* <br />><br />> <br />> bl nand_read_ll ;nand_read_ll函数将nand的从0地址处开始的128k的内<br />><br />><br />>容读到 ram的指定处<br />下面是nand_read_ll函数:<br /><br />#define NFCONF (*(volatile unsigned char *)0x4e000000)<br />>#define NFCMD (*(volatile unsigned char *)0x4e000004)<br />>#define NFADDR (*(volatile unsigned char *)0x4e000008)<br />>#define NFDATA (*(volatile unsigned char *)0x4e00000c)<br />>#define NFSTAT (*(volatile unsigned char *)0x4e000010)<br />>#define BUSY 1<br />> void wait_idle(void) {<br />> int i;<br />><br />> while(!(NFSTAT & BUSY))<br />> for(i=0; i<10; i++);<br />>}<br />><br />>#define NAND_SECTOR_SIZE 512<br />>#define NAND_BLOCK_MASK (NAND_SECTOR_SIZE - 1)<br />><br />>/* low level nand read function */<br />>int nand_read_ll(unsigned int *buf, unsigned long start_addr, int size)<br />>{ //(0x33f00000,#0x0,#0x20000)<br />> int i, j;<br />><br />> if ((start_addr & NAND_BLOCK_MASK) || (size & NAND_BLOCK_MASK))<br />> {<br />> return -1; /* invalid alignment */<br />> }<br />><br />> /* chip Enable */<br />> NFCONF &= ~0x800;<br />> for(i=0; i<10; i++);<br />><br />> for(i=start_addr; i < (start_addr + size);) {<br />> /* READ0 */<br />> NFCMD = 0;<br />><br />> /* Write Address */<br />> NFADDR = i & 0xff;<br />> NFADDR = (i >> 9) & 0xff;<br />> NFADDR = (i >> 17) & 0xff;<br />> NFADDR = (i >> 25) & 0xff;<br />><br />> wait_idle();<br />><br />> for(j=0; j < NAND_SECTOR_SIZE; j++, i++) {<br />> *buf = (NFDATA & 0xff);<br />> buf++;<br />> }<br />> }<br />><br />> /* chip Disable */<br />> NFCONF |= 0x800; /* chip disable */<br />><br />> return 0;<br />> <br />>}<br />
|