mnt.c 7.0 KB

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