1 typedef struct NandfsBlockData NandfsBlockData; 2 typedef struct NandfsAuxiliary NandfsAuxiliary; 3 4 struct NandfsBlockData { 5 ulong path; 6 short tag; 7 ulong nerase; 8 int partial; 9 }; 10 11 struct Nandfs { 12 LogfsLowLevel ll; 13 char *(*read)(void*, void*, long, ulong); 14 char *(*write)(void*, void*, long, ulong); 15 char *(*erase)(void*, long blockaddr); 16 char *(*sync)(void*); 17 void *magic; 18 long rawblocksize; 19 long baseblock; 20 long limitblock; 21 NandfsBlockData *blockdata; 22 int trace; 23 int worseblocks; 24 int printbad; 25 }; 26 27 struct NandfsAuxiliary { 28 uchar parth[4]; // ggpppppp pppppppp pppppppp pp1hhhhh (bigendian) self-protected 29 uchar tag; // self-protecting 30 uchar blockstatus; // self-protecting 31 uchar nerasemagicmsw[2]; // see nerasemagiclsw 32 uchar ecc2[3]; // self-protecting 33 uchar nerasemagiclsw[2]; // mmmmmm mmeeeeee eeeeeeeeee ee1hhhhh (bigendian) self-protected 34 uchar ecc1[3]; // self-protecting 35 }; 36 37 #define getbig2(p) (((p)[0] << 8) | (p)[1]) 38 #define getbig4(p) (((p)[0] << 24) | ((p)[1] << 16) | ((p)[2] << 8) | (p)[3]) 39 #define getlittle3(p) (((p)[2] << 16) | ((p)[1] << 8) | (p)[0]) 40 #define putlittle3(p, q) ((p)[0] = (q), (p)[1] = (q) >> 8, (p)[2] = (q) >> 16) 41 #define putbig2(p, q) ((p)[0] = (q) >> 8, (p)[1] = (q)) 42 #define putbig4(p, q) ((p)[0] = (q) >> 24, (p)[1] = (q) >> 16, (p)[2] = (q) >> 8, (p)[3] = (q)) 43 44 LogfsLowLevelReadResult _nandfscorrectauxiliary(NandfsAuxiliary*); 45 46 extern uchar _nandfsvalidtags[]; 47 extern int _nandfsvalidtagscount; 48 49 ulong _nandfshamming31_26calc(ulong in); 50 int _nandfshamming31_26correct(ulong *in); 51 52 void _nandfsextracttags(NandfsAuxiliary*, NandfsTags*); 53 54 extern char Enomem[], Eperm[], Eio[]; 55