00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "includes.h"
00011
00012
00013
00014 #define __REGb(x) (*(volatile unsigned char *)(x))
00015 #define __REGi(x) (*(volatile unsigned int *)(x))
00016 #define NF_BASE 0x4e000000
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #define NAND_CHIP_ENABLE (NFCONT &= ~(1<<1))
00029 #define NAND_CHIP_DISABLE (NFCONT |= (1<<1))
00030 #define NAND_CLEAR_RB (NFSTAT |= (1<<2))
00031 #define NAND_DETECT_RB { while(! (NFSTAT&(1<<2)) );}
00032
00033 #define BUSY 4
00034 inline void wait_idle(void) {
00035 while(!(NFSTAT & BUSY));
00036 NFSTAT |= BUSY;
00037 }
00038
00039 #define NAND_CMD_READ0 0
00040 #define NAND_CMD_READSTART 0x30
00041 #define NAND_CMD_READOOB 0x50
00042 #define NAND_CMD_READID 0x90
00043
00044 #define PAGESPERSBLOCK (32)
00045 #define BYTESPERSPAGE (512)
00046 #define NAND_BLOCK_SMASK (512 - 1)
00047 #define PAGESPERLBLOCK (64)
00048 #define NAND_BLOCK_LMASK (2048 - 1)
00049
00050 #ifndef LARGEPAGE_FLASH
00051 #define NAND_SECTOR_SIZE 512
00052 #else
00053 #define NAND_SECTOR_SIZE 2048
00054 #endif
00055 #define NAND_BLOCK_MASK (NAND_SECTOR_SIZE - 1)
00056
00057 void PrintChar(char msg);
00058
00059
00060
00061 int nand_block_checkbad_ll(unsigned long addr);
00062 void PrintChar(char msg);
00063
00064
00065 int
00066 nand_read_ll(unsigned char *buf, unsigned long start_addr, int size)
00067 {
00068 int j, n;
00069 unsigned long addr,baddr;
00070
00071
00072
00073 if ((start_addr & NAND_BLOCK_MASK)) {
00074 return -1;
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
00084 NAND_CLEAR_RB;
00085 NFCMD = NAND_CMD_READ0;
00086
00087 addr = baddr+j;
00088
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 }
00112 baddr += (BYTESPERSPAGE*PAGESPERSBLOCK);
00113 }
00114 NAND_CHIP_DISABLE;
00115 return 0;
00116 }
00117
00118
00119 int nand_block_checkbad_ll(unsigned long addr)
00120 {
00121 int i;
00122
00123
00124
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
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 }
00159