filesystem.c 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. /*
  2. * Copyright (c) 2006-2022, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2018-12-13 balanceTWK add sdcard port file
  9. * 2019-06-11 WillianChan Add SD card hot plug detection
  10. */
  11. #include <rtthread.h>
  12. #ifdef BSP_USING_FS
  13. #if DFS_FILESYSTEMS_MAX < 4
  14. #error "Please define DFS_FILESYSTEMS_MAX more than 4"
  15. #endif
  16. #if DFS_FILESYSTEM_TYPES_MAX < 4
  17. #error "Please define DFS_FILESYSTEM_TYPES_MAX more than 4"
  18. #endif
  19. #include <dfs_fs.h>
  20. #ifdef BSP_USING_SDCARD_FS
  21. #include <board.h>
  22. #include "drv_sdio.h"
  23. #endif
  24. #ifdef BSP_USING_SPI_FLASH_FS
  25. #include "fal.h"
  26. #endif
  27. #define DBG_TAG "app.filesystem"
  28. #define DBG_LVL DBG_INFO
  29. #include <rtdbg.h>
  30. #include "dfs_romfs.h"
  31. #ifdef RT_USING_DFS_ELMFAT
  32. static const struct romfs_dirent _romfs_root[] =
  33. {
  34. {ROMFS_DIRENT_DIR, "flash", RT_NULL, 0},
  35. {ROMFS_DIRENT_DIR, "sdcard", RT_NULL, 0},
  36. {ROMFS_DIRENT_DIR, "filesystem", RT_NULL, 0}
  37. };
  38. #else
  39. static const struct romfs_dirent _romfs_root[] =
  40. {
  41. {ROMFS_DIRENT_DIR, "flash", RT_NULL, 0},
  42. {ROMFS_DIRENT_DIR, "sdcard", RT_NULL, 0}
  43. };
  44. #endif
  45. const struct romfs_dirent romfs_root =
  46. {
  47. ROMFS_DIRENT_DIR, "/", (rt_uint8_t *)_romfs_root, sizeof(_romfs_root) / sizeof(_romfs_root[0])
  48. };
  49. #ifdef BSP_USING_SDCARD_FS
  50. /* SD Card hot plug detection pin */
  51. #define SD_CHECK_PIN GET_PIN(D, 5)
  52. static void _sdcard_mount(void)
  53. {
  54. rt_device_t device;
  55. device = rt_device_find("sd0");
  56. if (device == NULL)
  57. {
  58. mmcsd_wait_cd_changed(0);
  59. sdcard_change();
  60. mmcsd_wait_cd_changed(RT_WAITING_FOREVER);
  61. device = rt_device_find("sd0");
  62. }
  63. if (device != RT_NULL)
  64. {
  65. if (dfs_mount("sd0", "/sdcard", "elm", 0, 0) == RT_EOK)
  66. {
  67. LOG_I("sd card mount to '/sdcard'");
  68. }
  69. else
  70. {
  71. LOG_W("sd card mount to '/sdcard' failed!");
  72. }
  73. }
  74. }
  75. static void _sdcard_unmount(void)
  76. {
  77. rt_thread_mdelay(200);
  78. dfs_unmount("/sdcard");
  79. LOG_I("Unmount \"/sdcard\"");
  80. mmcsd_wait_cd_changed(0);
  81. sdcard_change();
  82. mmcsd_wait_cd_changed(RT_WAITING_FOREVER);
  83. }
  84. static void sd_mount(void *parameter)
  85. {
  86. rt_uint8_t re_sd_check_pin = 1;
  87. rt_thread_mdelay(200);
  88. if (rt_pin_read(SD_CHECK_PIN))
  89. {
  90. _sdcard_mount();
  91. }
  92. while (1)
  93. {
  94. rt_thread_mdelay(200);
  95. if (!re_sd_check_pin && (re_sd_check_pin = rt_pin_read(SD_CHECK_PIN)) != 0)
  96. {
  97. _sdcard_mount();
  98. }
  99. if (re_sd_check_pin && (re_sd_check_pin = rt_pin_read(SD_CHECK_PIN)) == 0)
  100. {
  101. _sdcard_unmount();
  102. }
  103. }
  104. }
  105. #endif /* BSP_USING_SDCARD_FS */
  106. int mount_init(void)
  107. {
  108. #ifdef RT_USING_DFS_ROMFS
  109. if (dfs_mount(RT_NULL, "/", "rom", 0, &(romfs_root)) != 0)
  110. {
  111. LOG_E("rom mount to '/' failed!");
  112. }
  113. #endif
  114. #ifdef BSP_USING_SPI_FLASH_FS
  115. struct rt_device *flash_dev = RT_NULL;
  116. #ifndef RT_USING_WIFI
  117. fal_init();
  118. #endif
  119. flash_dev = fal_mtd_nor_device_create("filesystem");
  120. #ifdef RT_USING_DFS_ELMFAT
  121. flash_dev = fal_blk_device_create("filesystem");
  122. if (flash_dev)
  123. {
  124. //mount filesystem
  125. if (dfs_mount(flash_dev->parent.name, "/filesystem", "elm", 0, 0) != 0)
  126. {
  127. LOG_W("mount to '/filesystem' failed! try to mkfs %s", flash_dev->parent.name);
  128. dfs_mkfs("elm", flash_dev->parent.name);
  129. if (dfs_mount(flash_dev->parent.name, "/filesystem", "elm", 0, 0) == 0)
  130. {
  131. LOG_I("mount to '/filesystem' success!");
  132. }
  133. }
  134. else
  135. {
  136. LOG_I("mount to '/filesystem' success!");
  137. }
  138. }
  139. else
  140. {
  141. LOG_E("Can't create block device filesystem or bt_image partition.");
  142. }
  143. #else
  144. if (flash_dev)
  145. {
  146. //mount filesystem
  147. if (dfs_mount(flash_dev->parent.name, "/flash", "lfs", 0, 0) != 0)
  148. {
  149. LOG_W("mount to '/flash' failed! try to mkfs %s", flash_dev->parent.name);
  150. dfs_mkfs("lfs", flash_dev->parent.name);
  151. if (dfs_mount(flash_dev->parent.name, "/flash", "lfs", 0, 0) == 0)
  152. {
  153. LOG_I("mount to '/flash' success!");
  154. }
  155. }
  156. else
  157. {
  158. LOG_I("mount to '/flash' success!");
  159. }
  160. }
  161. else
  162. {
  163. LOG_E("Can't create block device filesystem or bt_image partition.");
  164. }
  165. #endif
  166. #endif
  167. #ifdef BSP_USING_SDCARD_FS
  168. rt_thread_t tid;
  169. rt_pin_mode(SD_CHECK_PIN, PIN_MODE_INPUT_PULLUP);
  170. tid = rt_thread_create("sd_mount", sd_mount, RT_NULL,
  171. 2048, RT_THREAD_PRIORITY_MAX - 2, 20);
  172. if (tid != RT_NULL)
  173. {
  174. rt_thread_startup(tid);
  175. }
  176. else
  177. {
  178. LOG_E("create sd_mount thread err!");
  179. }
  180. #endif
  181. return RT_EOK;
  182. }
  183. INIT_APP_EXPORT(mount_init);
  184. #endif /* BSP_USING_FS */