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