Date:2010-10-12 19:29:58 (2 years 7 months ago)
Author:Bas Wijnen
Commit:8d5e29095ebc8d69554b7b6f4b9cef8a3d111053
Message:allow using 2GB nand and ignore 'valid'-bits

Files: mips/nand.hhp (8 diffs)

Change Details

mips/nand.hhp
134134    // 33: 9-byte ecc of 4th 512 bytes
135135    // 42: unused
136136    // 64: end of space
137    unsigned col = (1 << page_bits) + 2
137    unsigned col = (1 << page_bits) + 6 + 9 * (column >> 9)
138138    cmd (CMD_READ0)
139139    addr (col)
140140    addr (col >> 8)
...... 
142142    addr (row >> 8)
143143    addr (row >> 16)
144144    cmd (CMD_READSTART)
145    bool valid = false
146    for unsigned t = 0; t < 3; ++t:
147        if rdata () == 0:
148            valid = true
149            break
150    if !valid:
151        //debug ("invalid page for nand read: %x\n", a)
152        for unsigned i = 0; i < 1 << (9 - 2); ++i:
153            ((unsigned *)buffer)[i] = ~0
154        return false
155    col = (1 << page_bits) + 6 + 9 * (column >> 9)
156    cmd (CMD_RNDOUT)
157    addr (col)
158    addr (col >> 8)
159    cmd (CMD_RNDOUTSTART)
160145    //debug ("parity data:")
161146    for unsigned t = 0; t < 9; ++t:
162147        error[t] = rdata ()
...... 
192177        data ^= mask << offset
193178        buffer[byte] = data
194179        buffer[byte + 1] = data >> 8
180    #if 0
195181    for unsigned i = 0; i < 0x10; ++i:
196182        if (buffer[i] & 0xff) < 0x10:
197            //debug (" 0")
183            debug (" 0")
198184        else:
199            //debug (" ")
200        //debug ("%x", buffer[i] & 0xff)
201    //debug ("\n")
185            debug (" ")
186        debug ("%x", buffer[i] & 0xff)
187    debug ("\n")
188    #endif
202189    return true
203190
204191static void write (unsigned a, char *buffer):
205    dbgl ()
206192    unsigned row = a >> page_bits
207193    //debug ("writing: %x/%x\n", a, row)
208194    cmd (CMD_SEQIN)
...... 
211197    addr (row)
212198    addr (row >> 8)
213199    addr (row >> 16)
214    char ecc[4][12]
215    dbgl ()
216    for unsigned i = 0; i < 0x4; ++i:
217        dbgl ()
200    char ecc[8][12]
201    for unsigned i = 0; i < 1 << (page_bits - 9); ++i:
218202        bool all_ff = true
219203        EMC_NFECR = EMC_NFECR_ECCE | EMC_NFECR_RS | EMC_NFECR_RS_ENCODING | EMC_NFECR_ERST
220204        //debug ("writing data from %x\n", (unsigned)buffer + i * 0x200)
...... 
225209        if !all_ff:
226210            while !(EMC_NFINTS & EMC_NFINTS_ENCF):
227211                DELAY ()
228            dbgl ()
229212            for unsigned t = 0; t < 9; ++t:
230213                ecc[i][t] = ((volatile char *)&EMC_NFPAR (0))[t]
231            dbgl ()
232214            //debug ("parity for %x:", i * 0x200 + a)
233215            //for unsigned t = 0; t < 9; ++t:
234216                //debug (" %x", ecc[i][t] & 0xff)
235217            //kdebug ("\n")
236218        else:
237            dbgl ()
238219            for unsigned t = 0; t < 9; ++t:
239220                ecc[i][t] = 0xff
240    dbgl ()
241221    // Spare space (starts at 1 << page_bits)
242222    // 0: unused
243223    // 2: detect valid data (at least 1 byte == 0 means valid)
...... 
250230    // 64: end of space
251231    for unsigned i = 0; i < 6; ++i:
252232        wdata (0)
253    for unsigned i = 0; i < 4; ++i:
233    for unsigned i = 0; i < 1 << (page_bits - 9); ++i:
254234        for unsigned j = 0; j < 9; ++j:
255235            wdata (ecc[i][j])
256    dbgl ()
257236    cmd (CMD_PAGEPROG)
258237    // Wait at least 100 ns.
259238    DELAY ()
260    dbgl ()
261239    cmd (CMD_READ0)
262240    addr (0)
263241    addr (0)
...... 
265243    addr (row >> 8)
266244    addr (row >> 16)
267245    cmd (CMD_READSTART)
268    dbgl ()
269    for unsigned i = 0; i < 4; ++i:
270        dbgl ()
246    for unsigned i = 0; i < 1 << (page_bits - 9); ++i:
271247        EMC_NFINTS = 0
272248        EMC_NFECR = EMC_NFECR_ECCE | EMC_NFECR_RS | EMC_NFECR_RS_DECODING | EMC_NFECR_ERST
273249        for unsigned t = 0; t < 0x200; ++t:
...... 
292268            unsigned offset= bit & 7
293269            unsigned byte = bit / 8
294270            debug ("error detected by parity: %x on %x+%d\n", mask, byte, offset)
295    dbgl ()
296271    for unsigned i = 0; i < 6; ++i:
297272        if rdata () != 0:
298273            debug ("extra data not 0 at byte %d\n", i)
299    dbgl ()
300    for unsigned i = 0; i < 4; ++i:
274    for unsigned i = 0; i < 1 << (page_bits - 9); ++i:
301275        for unsigned j = 0; j < 9; ++j:
302276            unsigned r = rdata () & 0xff
303277            if r != (ecc[i][j] & 0xff):
304278                debug ("ecc doesn't match: %x != %x\n", r, ecc[i][j] & 0xff)
305    dbgl ()
306279    //debug ("nand program %x:", a)
280    #if 0
307281    for unsigned i = 0; i < 0x10; ++i:
308282        if (buffer[i] & 0xff) < 0x10:
309            //debug (" 0")
283            debug (" 0")
310284        else:
311            //debug (" ")
312        //debug ("%x", buffer[i] & 0xff)
313    dbgl ()
314    //debug ("\n")
285            debug (" ")
286        debug ("%x", buffer[i] & 0xff)
287    debug ("\n")
288    #endif
315289
316290static void erase (unsigned a):
317291    unsigned row = a >> page_bits

Archive Download the corresponding diff file

Branches:
master



interactive