luat_fs_lfs2.c 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. #include "luat_base.h"
  2. #include "luat_fs.h"
  3. #include "luat_spi.h"
  4. #include "luat_malloc.h"
  5. #define LUAT_LOG_TAG "vfs.lfs2"
  6. #include "luat_log.h"
  7. #ifdef LUAT_USE_FS_VFS
  8. // #ifdef LUAT_VFS_USE_LFS2
  9. #include "lfs.h"
  10. FILE* luat_vfs_lfs2_fopen(void* userdata, const char *filename, const char *mode) {
  11. lfs_t* fs = (lfs_t*)userdata;
  12. lfs_file_t *file = (lfs_file_t*)luat_heap_malloc(sizeof(lfs_file_t));
  13. int flag = 0;
  14. for (size_t i = 0; i < strlen(mode); i++)
  15. {
  16. char m = *(mode + i);
  17. switch (m)
  18. {
  19. case 'r':
  20. flag |= LFS_O_RDONLY;
  21. break;
  22. case 'w':
  23. flag |= LFS_O_RDWR | LFS_O_CREAT | LFS_O_TRUNC;
  24. break;
  25. case 'a':
  26. flag |= LFS_O_APPEND;
  27. break;
  28. case '+':
  29. flag |= LFS_O_APPEND;
  30. break;
  31. default:
  32. break;
  33. }
  34. }
  35. int ret = lfs_file_open(fs, file, filename, flag);
  36. if (ret < 0) {
  37. luat_heap_free(file);
  38. return 0;
  39. }
  40. return (FILE*)file;
  41. }
  42. int luat_vfs_lfs2_getc(void* userdata, FILE* stream) {
  43. //LLOGD("posix_getc %p", stream);
  44. lfs_t* fs = (lfs_t*)userdata;
  45. lfs_file_t* file = (lfs_file_t*)stream;
  46. char buff = 0;
  47. int ret = lfs_file_read(fs, file, &buff, 1);
  48. if (ret < 0)
  49. return -1;
  50. return (int)buff;
  51. }
  52. int luat_vfs_lfs2_fseek(void* userdata, FILE* stream, long int offset, int origin) {
  53. lfs_t* fs = (lfs_t*)userdata;
  54. lfs_file_t* file = (lfs_file_t*)stream;
  55. int ret = lfs_file_seek(fs, file, offset, origin);
  56. return ret < 0 ? -1 : 0;
  57. }
  58. int luat_vfs_lfs2_ftell(void* userdata, FILE* stream) {
  59. lfs_t* fs = (lfs_t*)userdata;
  60. lfs_file_t* file = (lfs_file_t*)stream;
  61. int ret = lfs_file_tell(fs, file);
  62. return ret < 0 ? -1 : ret;
  63. }
  64. int luat_vfs_lfs2_fclose(void* userdata, FILE* stream) {
  65. lfs_t* fs = (lfs_t*)userdata;
  66. lfs_file_t* file = (lfs_file_t*)stream;
  67. lfs_file_close(fs, file);
  68. if (file != NULL)
  69. luat_heap_free(file);
  70. return 0;
  71. }
  72. int luat_vfs_lfs2_feof(void* userdata, FILE* stream) {
  73. lfs_t* fs = (lfs_t*)userdata;
  74. lfs_file_t* file = (lfs_file_t*)stream;
  75. if (lfs_file_size(fs, file) <= lfs_file_tell(fs, file))
  76. return 1;
  77. return 0;
  78. }
  79. int luat_vfs_lfs2_ferror(void* userdata, FILE *stream) {
  80. return 0;
  81. }
  82. size_t luat_vfs_lfs2_fread(void* userdata, void *ptr, size_t size, size_t nmemb, FILE *stream) {
  83. lfs_t* fs = (lfs_t*)userdata;
  84. lfs_file_t* file = (lfs_file_t*)stream;
  85. int ret = lfs_file_read(fs, file, ptr, size*nmemb);
  86. return ret < 0 ? 0 : ret;
  87. }
  88. size_t luat_vfs_lfs2_fwrite(void* userdata, const void *ptr, size_t size, size_t nmemb, FILE *stream) {
  89. lfs_t* fs = (lfs_t*)userdata;
  90. lfs_file_t* file = (lfs_file_t*)stream;
  91. int ret = lfs_file_write(fs, file, ptr, size*nmemb);
  92. return ret < 0 ? 0 : ret;
  93. }
  94. int luat_vfs_lfs2_remove(void* userdata, const char *filename) {
  95. lfs_t* fs = (lfs_t*)userdata;
  96. return lfs_remove(fs, filename);
  97. }
  98. int luat_vfs_lfs2_rename(void* userdata, const char *old_filename, const char *new_filename) {
  99. lfs_t* fs = (lfs_t*)userdata;
  100. return lfs_rename(fs, old_filename, new_filename);
  101. }
  102. int luat_vfs_lfs2_fexist(void* userdata, const char *filename) {
  103. FILE* fd = luat_vfs_lfs2_fopen(userdata, filename, "rb");
  104. if (fd) {
  105. luat_vfs_lfs2_fclose(userdata, fd);
  106. return 1;
  107. }
  108. return 0;
  109. }
  110. size_t luat_vfs_lfs2_fsize(void* userdata, const char *filename) {
  111. FILE *fd;
  112. size_t size = 0;
  113. fd = luat_vfs_lfs2_fopen(userdata, filename, "rb");
  114. if (fd) {
  115. size = lfs_file_size((lfs_t*)userdata, (lfs_file_t*)fd);
  116. luat_vfs_lfs2_fclose(userdata, fd);
  117. }
  118. return size;
  119. }
  120. int luat_vfs_lfs2_mkfs(void* userdata, luat_fs_conf_t *conf) {
  121. LLOGE("not support yet : mkfs");
  122. return -1;
  123. }
  124. int luat_vfs_lfs2_mount(void** userdata, luat_fs_conf_t *conf) {
  125. *userdata = (void*)conf->busname;
  126. return 0;
  127. }
  128. int luat_vfs_lfs2_umount(void* userdata, luat_fs_conf_t *conf) {
  129. LLOGE("not support yet : umount");
  130. return 0;
  131. }
  132. int luat_vfs_lfs2_mkdir(void* userdata, char const* _DirName) {
  133. return -1;
  134. }
  135. int luat_vfs_lfs2_rmdir(void* userdata, char const* _DirName) {
  136. return -1;
  137. }
  138. int luat_vfs_lfs2_info(void* userdata, const char* path, luat_fs_info_t *conf) {
  139. lfs_t* fs = (lfs_t*)userdata;
  140. memcpy(conf->filesystem, "lfs", strlen("lfs")+1);
  141. conf->type = 0;
  142. conf->total_block = fs->cfg->block_count;
  143. conf->block_used = lfs_fs_size(fs);
  144. conf->block_size = fs->cfg->block_size;
  145. return 0;
  146. }
  147. #define T(name) .name = luat_vfs_lfs2_##name
  148. const struct luat_vfs_filesystem vfs_fs_lfs2 = {
  149. .name = "lfs2",
  150. .opts = {
  151. T(mkfs),
  152. T(mount),
  153. T(umount),
  154. T(mkdir),
  155. T(rmdir),
  156. T(remove),
  157. T(rename),
  158. T(fsize),
  159. T(fexist),
  160. T(info)
  161. },
  162. .fopts = {
  163. T(fopen),
  164. T(getc),
  165. T(fseek),
  166. T(ftell),
  167. T(fclose),
  168. T(feof),
  169. T(ferror),
  170. T(fread),
  171. T(fwrite)
  172. }
  173. };
  174. // #endif
  175. #endif