init.c 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. #include "logfsos.h"
  2. #include "logfs.h"
  3. #include "nandfs.h"
  4. #include "local.h"
  5. uchar _nandfsvalidtags[] = {
  6. LogfsTnone,
  7. LogfsTboot,
  8. LogfsTlog,
  9. LogfsTdata,
  10. };
  11. int _nandfsvalidtagscount = nelem(_nandfsvalidtags);
  12. static int
  13. l2(long n)
  14. {
  15. int i;
  16. for (i = 0; i < 32; i++)
  17. if ((1 << i) >= n)
  18. return i;
  19. return 0;
  20. }
  21. char *
  22. nandfsinit(void *magic, long rawsize, long rawblocksize,
  23. char *(*read)(void *magic, void *buf, long nbytes, ulong offset),
  24. char *(*write)(void *magic, void *buf, long nbytes, ulong offset),
  25. char *(*erase)(void *magic, long blockaddr),
  26. char *(*sync)(void *magic),
  27. LogfsLowLevel **llp)
  28. {
  29. Nandfs *nandfs;
  30. nandfs = nandfsrealloc(nil, sizeof(*nandfs));
  31. if (nandfs == nil)
  32. return Enomem;
  33. if (rawblocksize % NandfsFullSize)
  34. return "unsupported block size";
  35. if (rawsize % rawblocksize)
  36. return "size not multiple of block size";
  37. nandfs->read = read;
  38. nandfs->write = write;
  39. nandfs->erase = erase;
  40. nandfs->sync = sync;
  41. nandfs->magic = magic;
  42. nandfs->limitblock = rawsize / rawblocksize;
  43. //print("rawsize %ld\n", rawsize);
  44. //print("rawblocksize %ld\n", rawblocksize);
  45. //print("limitblock %ld\n", nandfs->limitblock);
  46. nandfs->rawblocksize = rawblocksize;
  47. /* fill in upper interface */
  48. nandfs->ll.pathbits = NandfsPathBits;
  49. nandfs->ll.blocks = 0;
  50. nandfs->ll.l2pagesize = NandfsL2PageSize;
  51. nandfs->ll.l2pagesperblock = l2(rawblocksize / NandfsFullSize);
  52. nandfs->ll.open = (LOGFSOPENFN *)nandfsopen;
  53. nandfs->ll.getblocktag = (LOGFSGETBLOCKTAGFN *)nandfsgettag;
  54. nandfs->ll.setblocktag = (LOGFSSETBLOCKTAGFN *)nandfssettag;
  55. nandfs->ll.getblockpath = (LOGFSGETBLOCKPATHFN *)nandfsgetpath;
  56. nandfs->ll.setblockpath = (LOGFSSETBLOCKPATHFN *)nandfssetpath;
  57. nandfs->ll.getblockpartialformatstatus = (LOGFSGETBLOCKPARTIALFORMATSTATUSFN *)nandfsgetblockpartialformatstatus;
  58. nandfs->ll.findfreeblock = (LOGFSFINDFREEBLOCKFN *)nandfsfindfreeblock;
  59. nandfs->ll.readpagerange = (LOGFSREADPAGERANGEFN *)nandfsreadpagerange;
  60. nandfs->ll.writepage = (LOGFSWRITEPAGEFN *)nandfswritepage;
  61. nandfs->ll.readblock = (LOGFSREADBLOCKFN *)nandfsreadblock;
  62. nandfs->ll.writeblock = (LOGFSWRITEBLOCKFN *)nandfswriteblock;
  63. nandfs->ll.eraseblock = (LOGFSERASEBLOCKFN *)nandfseraseblock;
  64. nandfs->ll.formatblock = (LOGFSFORMATBLOCKFN *)nandfsformatblock;
  65. nandfs->ll.reformatblock = (LOGFSREFORMATBLOCKFN *)nandfsreformatblock;
  66. nandfs->ll.markblockbad = (LOGFSMARKBLOCKBADFN *)nandfsmarkblockbad;
  67. nandfs->ll.getbaseblock = (LOGFSGETBASEBLOCKFN *)nandfsgetbaseblock;
  68. nandfs->ll.getblocksize = (LOGFSGETBLOCKSIZEFN *)nandfsgetblocksize;
  69. nandfs->ll.calcrawaddress = (LOGFSCALCRAWADDRESSFN *)nandfscalcrawaddress;
  70. nandfs->ll.getblockstatus = (LOGFSGETBLOCKSTATUSFN *)nandfsgetblockstatus;
  71. nandfs->ll.calcformat = (LOGFSCALCFORMATFN *)nandfscalcformat;
  72. nandfs->ll.getopenstatus = (LOGFSGETOPENSTATUSFN *)nandfsgetopenstatus;
  73. nandfs->ll.free = (LOGFSFREEFN *)nandfsfree;
  74. nandfs->ll.sync = (LOGFSSYNCFN *)nandfssync;
  75. *llp = (LogfsLowLevel *)nandfs;
  76. return nil;
  77. }
  78. void
  79. nandfsfree(Nandfs *nandfs)
  80. {
  81. if (nandfs) {
  82. nandfsfreemem(nandfs->blockdata);
  83. nandfsfreemem(nandfs);
  84. }
  85. }
  86. void
  87. nandfssetmagic(Nandfs *nandfs, void *magic)
  88. {
  89. nandfs->magic = magic;
  90. }
  91. char *
  92. nandfssync(Nandfs *nandfs)
  93. {
  94. return (*nandfs->sync)(nandfs->magic);
  95. }