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
12 #include <rtthread.h>
13
14 #ifdef BSP_USING_FS
15 #if DFS_FILESYSTEMS_MAX < 4
16 #error "Please define DFS_FILESYSTEMS_MAX more than 4"
17 #endif
18 #if DFS_FILESYSTEM_TYPES_MAX < 4
19 #error "Please define DFS_FILESYSTEM_TYPES_MAX more than 4"
20 #endif
21
22 #include <dfs_fs.h>
23
24 #ifdef BSP_USING_SDCARD_FS
25 #include <board.h>
26 #include "drv_sdio.h"
27 #endif
28 #ifdef BSP_USING_SPI_FLASH_FS
29 #include "fal.h"
30 #endif
31 #define DBG_TAG "app.filesystem"
32 #define DBG_LVL DBG_INFO
33 #include <rtdbg.h>
34
35 #ifdef RT_USING_DFS_ROMFS
36 #include "dfs_romfs.h"
37
38 #ifdef RT_USING_DFS_ELMFAT
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 {ROMFS_DIRENT_DIR, "filesystem", RT_NULL, 0}
44 };
45 #else
46 static const struct romfs_dirent _romfs_root[] =
47 {
48 {ROMFS_DIRENT_DIR, "flash", RT_NULL, 0},
49 {ROMFS_DIRENT_DIR, "sdcard", RT_NULL, 0}
50 };
51 #endif
52
53 const struct romfs_dirent romfs_root =
54 {
55 ROMFS_DIRENT_DIR, "/", (rt_uint8_t *)_romfs_root, sizeof(_romfs_root) / sizeof(_romfs_root[0])
56 };
57 #endif
58
59 #ifdef BSP_USING_SDCARD_FS
60
61 /* SD Card hot plug detection pin */
62 #define SD_CHECK_PIN GET_PIN(D, 5)
63
_sdcard_mount(void)64 static void _sdcard_mount(void)
65 {
66 rt_device_t device;
67
68 device = rt_device_find("sd");
69
70 if (device == NULL)
71 {
72 mmcsd_wait_cd_changed(0);
73 sdcard_change();
74 mmcsd_wait_cd_changed(RT_WAITING_FOREVER);
75 device = rt_device_find("sd");
76 }
77
78 if (device != RT_NULL)
79 {
80 if (dfs_mount("sd", "/sdcard", "elm", 0, 0) == RT_EOK)
81 {
82 LOG_I("sd card mount to '/sdcard'");
83 }
84 else
85 {
86 LOG_W("sd card mount to '/sdcard' failed!");
87 }
88 }
89 }
90
_sdcard_unmount(void)91 static void _sdcard_unmount(void)
92 {
93 rt_thread_mdelay(200);
94 dfs_unmount("/sdcard");
95 LOG_I("Unmount \"/sdcard\"");
96
97 mmcsd_wait_cd_changed(0);
98 sdcard_change();
99 mmcsd_wait_cd_changed(RT_WAITING_FOREVER);
100 }
101
sd_mount(void * parameter)102 static void sd_mount(void *parameter)
103 {
104 rt_uint8_t re_sd_check_pin = 1;
105 rt_thread_mdelay(200);
106
107 if (rt_pin_read(SD_CHECK_PIN))
108 {
109 _sdcard_mount();
110 }
111
112 while (1)
113 {
114 rt_thread_mdelay(200);
115
116 if (!re_sd_check_pin && (re_sd_check_pin = rt_pin_read(SD_CHECK_PIN)) != 0)
117 {
118 _sdcard_mount();
119 }
120
121 if (re_sd_check_pin && (re_sd_check_pin = rt_pin_read(SD_CHECK_PIN)) == 0)
122 {
123 _sdcard_unmount();
124 }
125 }
126 }
127
128 #endif /* BSP_USING_SDCARD_FS */
129
mount_init(void)130 int mount_init(void)
131 {
132 #ifdef RT_USING_DFS_ROMFS
133 if (dfs_mount(RT_NULL, "/", "rom", 0, &(romfs_root)) != 0)
134 {
135 LOG_E("rom mount to '/' failed!");
136 }
137 #endif
138
139 #ifdef BSP_USING_SPI_FLASH_FS
140 struct rt_device *flash_dev = RT_NULL;
141
142 #ifndef RT_USING_WIFI
143 fal_init();
144 #endif
145
146 flash_dev = fal_mtd_nor_device_create("filesystem");
147
148 #ifdef RT_USING_DFS_ELMFAT
149 flash_dev = fal_blk_device_create("filesystem");
150 if (flash_dev)
151 {
152 //mount filesystem
153 if (dfs_mount(flash_dev->parent.name, "/filesystem", "elm", 0, 0) != 0)
154 {
155 LOG_W("mount to '/filesystem' failed! try to mkfs %s", flash_dev->parent.name);
156 dfs_mkfs("elm", flash_dev->parent.name);
157 if (dfs_mount(flash_dev->parent.name, "/filesystem", "elm", 0, 0) == 0)
158 {
159 LOG_I("mount to '/filesystem' success!");
160 }
161 }
162 else
163 {
164 LOG_I("mount to '/filesystem' success!");
165 }
166 }
167 else
168 {
169 LOG_E("Can't create block device filesystem or bt_image partition.");
170 }
171 #else
172 if (flash_dev)
173 {
174 //mount filesystem
175 if (dfs_mount(flash_dev->parent.name, "/flash", "lfs", 0, 0) != 0)
176 {
177 LOG_W("mount to '/flash' failed! try to mkfs %s", flash_dev->parent.name);
178 dfs_mkfs("lfs", flash_dev->parent.name);
179
180 if (dfs_mount(flash_dev->parent.name, "/flash", "lfs", 0, 0) == 0)
181 {
182 LOG_I("mount to '/flash' success!");
183 }
184 }
185 else
186 {
187 LOG_I("mount to '/flash' success!");
188 }
189 }
190 else
191 {
192 LOG_E("Can't create block device filesystem or bt_image partition.");
193 }
194 #endif
195
196 #endif
197
198 #ifdef BSP_USING_SDCARD_FS
199 rt_thread_t tid;
200
201 rt_pin_mode(SD_CHECK_PIN, PIN_MODE_INPUT_PULLUP);
202
203 tid = rt_thread_create("sd_mount", sd_mount, RT_NULL,
204 2048, RT_THREAD_PRIORITY_MAX - 2, 20);
205
206 if (tid != RT_NULL)
207 {
208 rt_thread_startup(tid);
209 }
210 else
211 {
212 LOG_E("create sd_mount thread err!");
213 }
214
215 #endif
216 return RT_EOK;
217 }
218 INIT_APP_EXPORT(mount_init);
219
220 #endif /* BSP_USING_FS */
221