mnt.c 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. /**************************************************************************//**
  2. *
  3. * @copyright (C) 2019 Nuvoton Technology Corp. All rights reserved.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0
  6. *
  7. * Change Logs:
  8. * Date Author Notes
  9. * 2021-3-4 Wayne First version
  10. *
  11. ******************************************************************************/
  12. #include "rtconfig.h"
  13. #include <rtthread.h>
  14. #define LOG_TAG "mnt"
  15. #define DBG_ENABLE
  16. #define DBG_SECTION_NAME "mnt"
  17. #define DBG_LEVEL DBG_ERROR
  18. #define DBG_COLOR
  19. #include <rtdbg.h>
  20. #if defined(RT_USING_DFS)
  21. #include <dfs_fs.h>
  22. #include <dfs_posix.h>
  23. #endif
  24. #if defined(PKG_USING_FAL)
  25. #include <fal.h>
  26. #endif
  27. #if defined(PKG_USING_RAMDISK)
  28. #define RAMDISK_NAME "ramdisk0"
  29. #define RAMDISK_UDC "ramdisk1"
  30. #define MOUNT_POINT_RAMDISK0 "/"
  31. #endif
  32. #if defined(BOARD_USING_STORAGE_SPIFLASH)
  33. #define PARTITION_NAME_FILESYSTEM "filesystem"
  34. #define MOUNT_POINT_SPIFLASH0 "/mnt/"PARTITION_NAME_FILESYSTEM
  35. #endif
  36. #ifdef RT_USING_DFS_MNTTABLE
  37. /*
  38. const char *device_name;
  39. const char *path;
  40. const char *filesystemtype;
  41. unsigned long rwflag;
  42. const void *data;
  43. */
  44. const struct dfs_mount_tbl mount_table[] =
  45. {
  46. { RAMDISK_UDC, "/mnt/ram_usbd", "elm", 0, RT_NULL },
  47. {0},
  48. };
  49. #endif
  50. #if defined(PKG_USING_RAMDISK)
  51. extern rt_err_t ramdisk_init(const char *dev_name, rt_uint8_t *disk_addr, rt_size_t block_size, rt_size_t num_block);
  52. int ramdisk_device_init(void)
  53. {
  54. rt_err_t result = RT_EOK;
  55. /* Create a 8MB RAMDISK */
  56. result = ramdisk_init(RAMDISK_NAME, NULL, 512, 2 * 8192);
  57. RT_ASSERT(result == RT_EOK);
  58. /* Create a 4MB RAMDISK */
  59. result = ramdisk_init(RAMDISK_UDC, NULL, 512, 2 * 4096);
  60. RT_ASSERT(result == RT_EOK);
  61. return 0;
  62. }
  63. INIT_DEVICE_EXPORT(ramdisk_device_init);
  64. /* Recursive mkdir */
  65. static int mkdir_p(const char *dir, const mode_t mode)
  66. {
  67. int ret = -1;
  68. char *tmp = NULL;
  69. char *p = NULL;
  70. struct stat sb;
  71. rt_size_t len;
  72. if (!dir)
  73. goto exit_mkdir_p;
  74. /* Copy path */
  75. /* Get the string length */
  76. len = strlen(dir);
  77. tmp = rt_strdup(dir);
  78. /* Remove trailing slash */
  79. if (tmp[len - 1] == '/')
  80. {
  81. tmp[len - 1] = '\0';
  82. len--;
  83. }
  84. /* check if path exists and is a directory */
  85. if (stat(tmp, &sb) == 0)
  86. {
  87. if (S_ISDIR(sb.st_mode))
  88. {
  89. ret = 0;
  90. goto exit_mkdir_p;
  91. }
  92. }
  93. /* Recursive mkdir */
  94. for (p = tmp + 1; p - tmp <= len; p++)
  95. {
  96. if ((*p == '/') || (p - tmp == len))
  97. {
  98. *p = 0;
  99. /* Test path */
  100. if (stat(tmp, &sb) != 0)
  101. {
  102. /* Path does not exist - create directory */
  103. if (mkdir(tmp, mode) < 0)
  104. {
  105. goto exit_mkdir_p;
  106. }
  107. }
  108. else if (!S_ISDIR(sb.st_mode))
  109. {
  110. /* Not a directory */
  111. goto exit_mkdir_p;
  112. }
  113. if (p - tmp != len)
  114. *p = '/';
  115. }
  116. }
  117. ret = 0;
  118. exit_mkdir_p:
  119. if (tmp)
  120. rt_free(tmp);
  121. return ret;
  122. }
  123. /* Initialize the filesystem */
  124. int filesystem_init(void)
  125. {
  126. rt_err_t result = RT_EOK;
  127. // ramdisk as root
  128. if (!rt_device_find(RAMDISK_NAME))
  129. {
  130. LOG_E("cannot find %s device", RAMDISK_NAME);
  131. goto exit_filesystem_init;
  132. }
  133. else
  134. {
  135. /* Format these ramdisk */
  136. result = (rt_err_t)dfs_mkfs("elm", RAMDISK_NAME);
  137. RT_ASSERT(result == RT_EOK);
  138. /* mount ramdisk0 as root directory */
  139. if (dfs_mount(RAMDISK_NAME, "/", "elm", 0, RT_NULL) == 0)
  140. {
  141. LOG_I("ramdisk mounted on \"/\".");
  142. /* now you can create dir dynamically. */
  143. mkdir_p("/mnt", 0x777);
  144. mkdir_p("/cache", 0x777);
  145. mkdir_p("/download", 0x777);
  146. mkdir_p("/mnt/ram_usbd", 0x777);
  147. mkdir_p("/mnt/filesystem", 0x777);
  148. #if defined(RT_USBH_MSTORAGE) && defined(UDISK_MOUNTPOINT)
  149. mkdir_p(UDISK_MOUNTPOINT, 0x777);
  150. #endif
  151. }
  152. else
  153. {
  154. LOG_E("root folder creation failed!\n");
  155. goto exit_filesystem_init;
  156. }
  157. }
  158. if (!rt_device_find(RAMDISK_UDC))
  159. {
  160. LOG_E("cannot find %s device", RAMDISK_UDC);
  161. goto exit_filesystem_init;
  162. }
  163. else
  164. {
  165. /* Format these ramdisk */
  166. result = (rt_err_t)dfs_mkfs("elm", RAMDISK_UDC);
  167. RT_ASSERT(result == RT_EOK);
  168. }
  169. exit_filesystem_init:
  170. return -result;
  171. }
  172. INIT_ENV_EXPORT(filesystem_init);
  173. #endif
  174. #if defined(BOARD_USING_STORAGE_SPIFLASH)
  175. int mnt_init_spiflash0(void)
  176. {
  177. #if defined(PKG_USING_FAL)
  178. extern int fal_init_check(void);
  179. if (!fal_init_check())
  180. fal_init();
  181. #endif
  182. struct rt_device *psNorFlash = fal_blk_device_create(PARTITION_NAME_FILESYSTEM);
  183. if (!psNorFlash)
  184. {
  185. rt_kprintf("Failed to create block device for %s.\n", PARTITION_NAME_FILESYSTEM);
  186. goto exit_mnt_init_spiflash0;
  187. }
  188. else if (dfs_mount(psNorFlash->parent.name, MOUNT_POINT_SPIFLASH0, "elm", 0, 0) != 0)
  189. {
  190. rt_kprintf("Failed to mount elm on %s.\n", MOUNT_POINT_SPIFLASH0);
  191. rt_kprintf("Try to execute 'mkfs -t elm %s' first, then reboot.\n", PARTITION_NAME_FILESYSTEM);
  192. goto exit_mnt_init_spiflash0;
  193. }
  194. rt_kprintf("mount %s with elmfat type: ok\n", PARTITION_NAME_FILESYSTEM);
  195. exit_mnt_init_spiflash0:
  196. return 0;
  197. }
  198. INIT_APP_EXPORT(mnt_init_spiflash0);
  199. #endif