diff options
-rw-r--r-- | ChangeLog | 4 | ||||
-rw-r--r-- | libmpio/ecc.c | 58 |
2 files changed, 53 insertions, 9 deletions
@@ -1,7 +1,9 @@ 2002-10-13 Markus Germeier <mager@tzi.de> * all operations on external memory should work now! - + * libmpio/ecc.c (mpio_ecc_256_check): + 1 Bit errors are now automagically corrected + 2002-10-13 Markus Germeier <mager@tzi.de> * libmpio/mpio.c (mpio_init): fixed segv when external memory diff --git a/libmpio/ecc.c b/libmpio/ecc.c index 5175a32..67cb7c1 100644 --- a/libmpio/ecc.c +++ b/libmpio/ecc.c @@ -1,6 +1,6 @@ /* * - * $Id: ecc.c,v 1.2 2002/09/09 13:29:52 germeier Exp $ + * $Id: ecc.c,v 1.3 2002/10/13 14:37:41 germeier Exp $ * * Library for USB MPIO-* * @@ -183,18 +183,60 @@ int mpio_ecc_256_check(BYTE *data, BYTE *ecc) { BYTE own_ecc[3]; + BYTE check[3]; + BYTE c; + BYTE line, col; + + int v, i; + mpio_ecc_256_gen(data, own_ecc); if ((own_ecc[0]^ecc[0])| (own_ecc[1]^ecc[1])| (own_ecc[2]^ecc[2])) { - debug("ECC %2x %2x %2x vs. %2x %2x %2x\n", + debugn(2, "ECC %2x %2x %2x vs. %2x %2x %2x\n", ecc[0], ecc[1], ecc[2], own_ecc[0], own_ecc[1], own_ecc[2]); - debugn(2, "ECC Error detected\n"); - debugn(2, "ECC Correction code not in place yet, Sorry\n"); - debugn(3, "got ECC: %2x %2x %2x\n", ecc[0], ecc[1], ecc[2]); - debugn(3, "calc. ECC: %2x %2x %2x\n", own_ecc[0], own_ecc[1], own_ecc[2]); - - return 1; + check[0] = (ecc[0] ^ own_ecc[0]); + check[1] = (ecc[1] ^ own_ecc[1]); + check[2] = (ecc[2] ^ own_ecc[2]); + + v=1; + for(i=0; i<4; i++) + { + if (!((get_bit(check[1], i*2) ^ + (get_bit(check[1], i*2+1))))) + v=0; + if (!((get_bit(check[0], i*2) ^ + (get_bit(check[0], i*2+1))))) + v=0; + } + for(i=1; i<4; i++) + { + if (!((get_bit(check[2], i*2) ^ + (get_bit(check[2], i*2+1))))) + v=0; + } + + if (v) { + debug("correctable error detected ... fixing the bit\n"); + line = get_bit(check[1], 7) * 128 + + get_bit(check[1], 5) * 64 + + get_bit(check[1], 3) * 32 + + get_bit(check[1], 1) * 16 + + get_bit(check[0], 7) * 8 + + get_bit(check[0], 5) * 4 + + get_bit(check[0], 3) * 2 + + get_bit(check[0], 1); + col = get_bit(check[2], 7) * 4 + + get_bit(check[2], 5) * 2 + + get_bit(check[2], 3); + debug ("error in line: %d , col %d\n", line, col); + debug ("defect byte is: %02x\n", data[line]); + data[line] ^= ( 1 << col); + debug ("fixed byte is: %02x\n", data[line]); + } else { + debug("uncorrectable error detected. Sorry you lose!\n"); + return 1; + } } return 0; |