mnt.c 6.7 KB

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