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. #ifdef RT_USING_DFS_ROMFS
  31. #include "dfs_romfs.h"
  32. #ifdef RT_USING_DFS_ELMFAT
  33. static const struct romfs_dirent _romfs_root[] =
  34. {
  35. {ROMFS_DIRENT_DIR, "flash", RT_NULL, 0},
  36. {ROMFS_DIRENT_DIR, "sdcard", RT_NULL, 0},
  37. {ROMFS_DIRENT_DIR, "filesystem", RT_NULL, 0}
  38. };
  39. #else
  40. static const struct romfs_dirent _romfs_root[] =
  41. {
  42. {ROMFS_DIRENT_DIR, "flash", RT_NULL, 0},
  43. {ROMFS_DIRENT_DIR, "sdcard", RT_NULL, 0}
  44. };
  45. #endif
  46. const struct romfs_dirent romfs_root =
  47. {
  48. ROMFS_DIRENT_DIR, "/", (rt_uint8_t *)_romfs_root, sizeof(_romfs_root) / sizeof(_romfs_root[0])
  49. };
  50. #endif
  51. #ifdef BSP_USING_SDCARD_FS
  52. /* SD Card hot plug detection pin */
  53. #define SD_CHECK_PIN GET_PIN(D, 5)
  54. static void _sdcard_mount(void)
  55. {
  56. rt_device_t device;
  57. device = rt_device_find("sd");
  58. if (device == NULL)
  59. {
  60. mmcsd_wait_cd_changed(0);
  61. sdcard_change();
  62. mmcsd_wait_cd_changed(RT_WAITING_FOREVER);
  63. device = rt_device_find("sd");
  64. }
  65. if (device != RT_NULL)
  66. {
  67. if (dfs_mount("sd", "/sdcard", "elm", 0, 0) == RT_EOK)
  68. {
  69. LOG_I("sd card mount to '/sdcard'");
  70. }
  71. else
  72. {
  73. LOG_W("sd card mount to '/sdcard' failed!");
  74. }
  75. }
  76. }
  77. static void _sdcard_unmount(void)
  78. {
  79. rt_thread_mdelay(200);
  80. dfs_unmount("/sdcard");
  81. LOG_I("Unmount \"/sdcard\"");
  82. mmcsd_wait_cd_changed(0);
  83. sdcard_change();
  84. mmcsd_wait_cd_changed(RT_WAITING_FOREVER);
  85. }
  86. static void sd_mount(void *parameter)
  87. {
  88. rt_uint8_t re_sd_check_pin = 1;
  89. rt_thread_mdelay(200);
  90. if (rt_pin_read(SD_CHECK_PIN))
  91. {
  92. _sdcard_mount();
  93. }
  94. while (1)
  95. {
  96. rt_thread_mdelay(200);
  97. if (!re_sd_check_pin && (re_sd_check_pin = rt_pin_read(SD_CHECK_PIN)) != 0)
  98. {
  99. _sdcard_mount();
  100. }
  101. if (re_sd_check_pin && (re_sd_check_pin = rt_pin_read(SD_CHECK_PIN)) == 0)
  102. {
  103. _sdcard_unmount();
  104. }
  105. }
  106. }
  107. #endif /* BSP_USING_SDCARD_FS */
  108. int mount_init(void)
  109. {
  110. #ifdef RT_USING_DFS_ROMFS
  111. if (dfs_mount(RT_NULL, "/", "rom", 0, &(romfs_root)) != 0)
  112. {
  113. LOG_E("rom mount to '/' failed!");
  114. }
  115. #endif
  116. #ifdef BSP_USING_SPI_FLASH_FS
  117. struct rt_device *flash_dev = RT_NULL;
  118. #ifndef RT_USING_WIFI
  119. fal_init();
  120. #endif
  121. flash_dev = fal_mtd_nor_device_create("filesystem");
  122. #ifdef RT_USING_DFS_ELMFAT
  123. flash_dev = fal_blk_device_create("filesystem");
  124. if (flash_dev)
  125. {
  126. //mount filesystem
  127. if (dfs_mount(flash_dev->parent.name, "/filesystem", "elm", 0, 0) != 0)
  128. {
  129. LOG_W("mount to '/filesystem' failed! try to mkfs %s", flash_dev->parent.name);
  130. dfs_mkfs("elm", flash_dev->parent.name);
  131. if (dfs_mount(flash_dev->parent.name, "/filesystem", "elm", 0, 0) == 0)
  132. {
  133. LOG_I("mount to '/filesystem' success!");
  134. }
  135. }
  136. else
  137. {
  138. LOG_I("mount to '/filesystem' success!");
  139. }
  140. }
  141. else
  142. {
  143. LOG_E("Can't create block device filesystem or bt_image partition.");
  144. }
  145. #else
  146. if (flash_dev)
  147. {
  148. //mount filesystem
  149. if (dfs_mount(flash_dev->parent.name, "/flash", "lfs", 0, 0) != 0)
  150. {
  151. LOG_W("mount to '/flash' failed! try to mkfs %s", flash_dev->parent.name);
  152. dfs_mkfs("lfs", flash_dev->parent.name);
  153. if (dfs_mount(flash_dev->parent.name, "/flash", "lfs", 0, 0) == 0)
  154. {
  155. LOG_I("mount to '/flash' success!");
  156. }
  157. }
  158. else
  159. {
  160. LOG_I("mount to '/flash' success!");
  161. }
  162. }
  163. else
  164. {
  165. LOG_E("Can't create block device filesystem or bt_image partition.");
  166. }
  167. #endif
  168. #endif
  169. #ifdef BSP_USING_SDCARD_FS
  170. rt_thread_t tid;
  171. rt_pin_mode(SD_CHECK_PIN, PIN_MODE_INPUT_PULLUP);
  172. tid = rt_thread_create("sd_mount", sd_mount, RT_NULL,
  173. 2048, RT_THREAD_PRIORITY_MAX - 2, 20);
  174. if (tid != RT_NULL)
  175. {
  176. rt_thread_startup(tid);
  177. }
  178. else
  179. {
  180. LOG_E("create sd_mount thread err!");
  181. }
  182. #endif
  183. return RT_EOK;
  184. }
  185. INIT_APP_EXPORT(mount_init);
  186. #endif /* BSP_USING_FS */