mirror of
git://projects.qi-hardware.com/iris.git
synced 2024-12-29 21:38:57 +02:00
allow using 2GB nand and ignore 'valid'-bits
This commit is contained in:
parent
90186ce7ce
commit
8d5e29095e
@ -134,7 +134,7 @@ static bool read (unsigned a, char *buffer):
|
|||||||
// 33: 9-byte ecc of 4th 512 bytes
|
// 33: 9-byte ecc of 4th 512 bytes
|
||||||
// 42: unused
|
// 42: unused
|
||||||
// 64: end of space
|
// 64: end of space
|
||||||
unsigned col = (1 << page_bits) + 2
|
unsigned col = (1 << page_bits) + 6 + 9 * (column >> 9)
|
||||||
cmd (CMD_READ0)
|
cmd (CMD_READ0)
|
||||||
addr (col)
|
addr (col)
|
||||||
addr (col >> 8)
|
addr (col >> 8)
|
||||||
@ -142,21 +142,6 @@ static bool read (unsigned a, char *buffer):
|
|||||||
addr (row >> 8)
|
addr (row >> 8)
|
||||||
addr (row >> 16)
|
addr (row >> 16)
|
||||||
cmd (CMD_READSTART)
|
cmd (CMD_READSTART)
|
||||||
bool valid = false
|
|
||||||
for unsigned t = 0; t < 3; ++t:
|
|
||||||
if rdata () == 0:
|
|
||||||
valid = true
|
|
||||||
break
|
|
||||||
if !valid:
|
|
||||||
//debug ("invalid page for nand read: %x\n", a)
|
|
||||||
for unsigned i = 0; i < 1 << (9 - 2); ++i:
|
|
||||||
((unsigned *)buffer)[i] = ~0
|
|
||||||
return false
|
|
||||||
col = (1 << page_bits) + 6 + 9 * (column >> 9)
|
|
||||||
cmd (CMD_RNDOUT)
|
|
||||||
addr (col)
|
|
||||||
addr (col >> 8)
|
|
||||||
cmd (CMD_RNDOUTSTART)
|
|
||||||
//debug ("parity data:")
|
//debug ("parity data:")
|
||||||
for unsigned t = 0; t < 9; ++t:
|
for unsigned t = 0; t < 9; ++t:
|
||||||
error[t] = rdata ()
|
error[t] = rdata ()
|
||||||
@ -192,17 +177,18 @@ static bool read (unsigned a, char *buffer):
|
|||||||
data ^= mask << offset
|
data ^= mask << offset
|
||||||
buffer[byte] = data
|
buffer[byte] = data
|
||||||
buffer[byte + 1] = data >> 8
|
buffer[byte + 1] = data >> 8
|
||||||
|
#if 0
|
||||||
for unsigned i = 0; i < 0x10; ++i:
|
for unsigned i = 0; i < 0x10; ++i:
|
||||||
if (buffer[i] & 0xff) < 0x10:
|
if (buffer[i] & 0xff) < 0x10:
|
||||||
//debug (" 0")
|
debug (" 0")
|
||||||
else:
|
else:
|
||||||
//debug (" ")
|
debug (" ")
|
||||||
//debug ("%x", buffer[i] & 0xff)
|
debug ("%x", buffer[i] & 0xff)
|
||||||
//debug ("\n")
|
debug ("\n")
|
||||||
|
#endif
|
||||||
return true
|
return true
|
||||||
|
|
||||||
static void write (unsigned a, char *buffer):
|
static void write (unsigned a, char *buffer):
|
||||||
dbgl ()
|
|
||||||
unsigned row = a >> page_bits
|
unsigned row = a >> page_bits
|
||||||
//debug ("writing: %x/%x\n", a, row)
|
//debug ("writing: %x/%x\n", a, row)
|
||||||
cmd (CMD_SEQIN)
|
cmd (CMD_SEQIN)
|
||||||
@ -211,10 +197,8 @@ static void write (unsigned a, char *buffer):
|
|||||||
addr (row)
|
addr (row)
|
||||||
addr (row >> 8)
|
addr (row >> 8)
|
||||||
addr (row >> 16)
|
addr (row >> 16)
|
||||||
char ecc[4][12]
|
char ecc[8][12]
|
||||||
dbgl ()
|
for unsigned i = 0; i < 1 << (page_bits - 9); ++i:
|
||||||
for unsigned i = 0; i < 0x4; ++i:
|
|
||||||
dbgl ()
|
|
||||||
bool all_ff = true
|
bool all_ff = true
|
||||||
EMC_NFECR = EMC_NFECR_ECCE | EMC_NFECR_RS | EMC_NFECR_RS_ENCODING | EMC_NFECR_ERST
|
EMC_NFECR = EMC_NFECR_ECCE | EMC_NFECR_RS | EMC_NFECR_RS_ENCODING | EMC_NFECR_ERST
|
||||||
//debug ("writing data from %x\n", (unsigned)buffer + i * 0x200)
|
//debug ("writing data from %x\n", (unsigned)buffer + i * 0x200)
|
||||||
@ -225,19 +209,15 @@ static void write (unsigned a, char *buffer):
|
|||||||
if !all_ff:
|
if !all_ff:
|
||||||
while !(EMC_NFINTS & EMC_NFINTS_ENCF):
|
while !(EMC_NFINTS & EMC_NFINTS_ENCF):
|
||||||
DELAY ()
|
DELAY ()
|
||||||
dbgl ()
|
|
||||||
for unsigned t = 0; t < 9; ++t:
|
for unsigned t = 0; t < 9; ++t:
|
||||||
ecc[i][t] = ((volatile char *)&EMC_NFPAR (0))[t]
|
ecc[i][t] = ((volatile char *)&EMC_NFPAR (0))[t]
|
||||||
dbgl ()
|
|
||||||
//debug ("parity for %x:", i * 0x200 + a)
|
//debug ("parity for %x:", i * 0x200 + a)
|
||||||
//for unsigned t = 0; t < 9; ++t:
|
//for unsigned t = 0; t < 9; ++t:
|
||||||
//debug (" %x", ecc[i][t] & 0xff)
|
//debug (" %x", ecc[i][t] & 0xff)
|
||||||
//kdebug ("\n")
|
//kdebug ("\n")
|
||||||
else:
|
else:
|
||||||
dbgl ()
|
|
||||||
for unsigned t = 0; t < 9; ++t:
|
for unsigned t = 0; t < 9; ++t:
|
||||||
ecc[i][t] = 0xff
|
ecc[i][t] = 0xff
|
||||||
dbgl ()
|
|
||||||
// Spare space (starts at 1 << page_bits)
|
// Spare space (starts at 1 << page_bits)
|
||||||
// 0: unused
|
// 0: unused
|
||||||
// 2: detect valid data (at least 1 byte == 0 means valid)
|
// 2: detect valid data (at least 1 byte == 0 means valid)
|
||||||
@ -250,14 +230,12 @@ static void write (unsigned a, char *buffer):
|
|||||||
// 64: end of space
|
// 64: end of space
|
||||||
for unsigned i = 0; i < 6; ++i:
|
for unsigned i = 0; i < 6; ++i:
|
||||||
wdata (0)
|
wdata (0)
|
||||||
for unsigned i = 0; i < 4; ++i:
|
for unsigned i = 0; i < 1 << (page_bits - 9); ++i:
|
||||||
for unsigned j = 0; j < 9; ++j:
|
for unsigned j = 0; j < 9; ++j:
|
||||||
wdata (ecc[i][j])
|
wdata (ecc[i][j])
|
||||||
dbgl ()
|
|
||||||
cmd (CMD_PAGEPROG)
|
cmd (CMD_PAGEPROG)
|
||||||
// Wait at least 100 ns.
|
// Wait at least 100 ns.
|
||||||
DELAY ()
|
DELAY ()
|
||||||
dbgl ()
|
|
||||||
cmd (CMD_READ0)
|
cmd (CMD_READ0)
|
||||||
addr (0)
|
addr (0)
|
||||||
addr (0)
|
addr (0)
|
||||||
@ -265,9 +243,7 @@ static void write (unsigned a, char *buffer):
|
|||||||
addr (row >> 8)
|
addr (row >> 8)
|
||||||
addr (row >> 16)
|
addr (row >> 16)
|
||||||
cmd (CMD_READSTART)
|
cmd (CMD_READSTART)
|
||||||
dbgl ()
|
for unsigned i = 0; i < 1 << (page_bits - 9); ++i:
|
||||||
for unsigned i = 0; i < 4; ++i:
|
|
||||||
dbgl ()
|
|
||||||
EMC_NFINTS = 0
|
EMC_NFINTS = 0
|
||||||
EMC_NFECR = EMC_NFECR_ECCE | EMC_NFECR_RS | EMC_NFECR_RS_DECODING | EMC_NFECR_ERST
|
EMC_NFECR = EMC_NFECR_ECCE | EMC_NFECR_RS | EMC_NFECR_RS_DECODING | EMC_NFECR_ERST
|
||||||
for unsigned t = 0; t < 0x200; ++t:
|
for unsigned t = 0; t < 0x200; ++t:
|
||||||
@ -292,26 +268,24 @@ static void write (unsigned a, char *buffer):
|
|||||||
unsigned offset= bit & 7
|
unsigned offset= bit & 7
|
||||||
unsigned byte = bit / 8
|
unsigned byte = bit / 8
|
||||||
debug ("error detected by parity: %x on %x+%d\n", mask, byte, offset)
|
debug ("error detected by parity: %x on %x+%d\n", mask, byte, offset)
|
||||||
dbgl ()
|
|
||||||
for unsigned i = 0; i < 6; ++i:
|
for unsigned i = 0; i < 6; ++i:
|
||||||
if rdata () != 0:
|
if rdata () != 0:
|
||||||
debug ("extra data not 0 at byte %d\n", i)
|
debug ("extra data not 0 at byte %d\n", i)
|
||||||
dbgl ()
|
for unsigned i = 0; i < 1 << (page_bits - 9); ++i:
|
||||||
for unsigned i = 0; i < 4; ++i:
|
|
||||||
for unsigned j = 0; j < 9; ++j:
|
for unsigned j = 0; j < 9; ++j:
|
||||||
unsigned r = rdata () & 0xff
|
unsigned r = rdata () & 0xff
|
||||||
if r != (ecc[i][j] & 0xff):
|
if r != (ecc[i][j] & 0xff):
|
||||||
debug ("ecc doesn't match: %x != %x\n", r, ecc[i][j] & 0xff)
|
debug ("ecc doesn't match: %x != %x\n", r, ecc[i][j] & 0xff)
|
||||||
dbgl ()
|
|
||||||
//debug ("nand program %x:", a)
|
//debug ("nand program %x:", a)
|
||||||
|
#if 0
|
||||||
for unsigned i = 0; i < 0x10; ++i:
|
for unsigned i = 0; i < 0x10; ++i:
|
||||||
if (buffer[i] & 0xff) < 0x10:
|
if (buffer[i] & 0xff) < 0x10:
|
||||||
//debug (" 0")
|
debug (" 0")
|
||||||
else:
|
else:
|
||||||
//debug (" ")
|
debug (" ")
|
||||||
//debug ("%x", buffer[i] & 0xff)
|
debug ("%x", buffer[i] & 0xff)
|
||||||
dbgl ()
|
debug ("\n")
|
||||||
//debug ("\n")
|
#endif
|
||||||
|
|
||||||
static void erase (unsigned a):
|
static void erase (unsigned a):
|
||||||
unsigned row = a >> page_bits
|
unsigned row = a >> page_bits
|
||||||
|
Loading…
Reference in New Issue
Block a user