arch/s3c2440/nand_read.c File Reference

Go to the source code of this file.

Functions

void wait_idle (void)
void PrintChar (char msg)
int nand_block_checkbad_ll (unsigned long addr)
int nand_read_ll (unsigned char *buf, unsigned long start_addr, int size)


Function Documentation

int nand_block_checkbad_ll ( unsigned long  addr  ) 

Definition at line 119 of file nand_read.c.

00120 {
00121     int i;
00122     //char data;
00123 
00124     /* READOOB */
00125     NAND_CLEAR_RB;
00126 #ifndef LARGEPAGE_FLASH
00127     NFCMD = NAND_CMD_READOOB;
00128 #else
00129     NFCMD = NAND_CMD_READ0;../../include/
00130 #endif
00131 
00132     /* Write Address */
00133 #ifndef LARGEPAGE_FLASH
00134       addr &= ~0x3fff;
00135       NFADDR = 5;
00136       NFADDR = (addr >> 9) & 0xff;
00137       NFADDR = (addr >> 17) & 0xff;
00138       NFADDR = (addr >> 25) & 0xff;
00139 #else
00140       addr &= ~0x1ffff;
00141 
00142       NFADDR = 0;
00143       NFADDR = 0x08;
00144       NFADDR = (addr >> 11) & 0xff;
00145       NFADDR = (addr >> 19) & 0xff;
00146       NFADDR = (addr >> 27) & 0x3;
00147 
00148       NFCMD = NAND_CMD_READSTART;
00149 #endif
00150 
00151     NAND_DETECT_RB;
00152     for (i=0;i<1000;i++);
00153 
00154     if ((NFDATA & 0xff)!=0xff) {
00155       return 1;
00156     }
00157     return 0;
00158 }

int nand_read_ll ( unsigned char *  buf,
unsigned long  start_addr,
int  size 
)

Definition at line 66 of file nand_read.c.

00067 {
00068   int j, n;
00069   unsigned long addr,baddr;
00070 
00071   //PrintChar('r');
00072   
00073   if ((start_addr & NAND_BLOCK_MASK)/* || (size & NAND_BLOCK_MASK)*/) {
00074     return -1;  /* invalid alignment */
00075   }
00076 
00077   NAND_CHIP_ENABLE;
00078 
00079   baddr=start_addr;
00080   while(size>0) {
00081     if (!nand_block_checkbad_ll(baddr)) {
00082       for (j=0;j<size;j+=NAND_SECTOR_SIZE) {
00083         /* READ0 */
00084         NAND_CLEAR_RB;
00085         NFCMD = NAND_CMD_READ0;
00086     
00087         addr = baddr+j;
00088         /* Write Address */
00089 #ifndef LARGEPAGE_FLASH
00090         NFADDR = addr & 0xff;
00091         NFADDR = (addr >> 9) & 0xff;
00092         NFADDR = (addr >> 17) & 0xff;
00093         NFADDR = (addr >> 25) & 0xff;
00094 #else
00095         NFADDR = addr & 0xff;
00096         NFADDR = (addr >> 8) & 0x07;
00097         NFADDR = (addr >> 11) & 0xff;
00098         NFADDR = (addr >> 19) & 0xff;
00099         NFADDR = (addr >> 27) & 0x3;
00100   
00101         NFCMD = NAND_CMD_READSTART;
00102 #endif
00103         NAND_DETECT_RB;
00104     
00105         for(n=0; n<NAND_SECTOR_SIZE; n++) {
00106           *buf = (NFDATA & 0xff);
00107           buf++;
00108         }
00109       }
00110       size -= j;
00111     } //else PrintChar('e');
00112     baddr += (BYTESPERSPAGE*PAGESPERSBLOCK);
00113   }
00114   NAND_CHIP_DISABLE;
00115   return 0;
00116 }

void PrintChar ( char  msg  ) 

void wait_idle ( void   )  [inline]

Definition at line 34 of file nand_read.c.

00034                             {
00035   while(!(NFSTAT & BUSY));
00036   NFSTAT |= BUSY;
00037 }


Generated on Tue Sep 2 08:45:41 2008 for A Simple operation System using S3C2410 by  doxygen 1.5.6