local.h 1.6 KB

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