1 /*
2  * Copyright (c) 2006-2018, 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 #ifdef BSP_USING_SPI_FLASH_FS
23 #include "fal.h"
24 #endif
25 
26 #include <dfs_fs.h>
27 #include "dfs_romfs.h"
28 #include "drv_sdmmc.h"
29 
30 #define DBG_TAG "app.filesystem"
31 #define DBG_LVL DBG_INFO
32 #include <rtdbg.h>
33 
34 static const struct romfs_dirent _romfs_root[] = {
35 //    {ROMFS_DIRENT_DIR, "flash", RT_NULL, 0},
36     {ROMFS_DIRENT_DIR, "sdcard", RT_NULL, 0}};
37 
38 const struct romfs_dirent romfs_root = {
39     ROMFS_DIRENT_DIR, "/", (rt_uint8_t *)_romfs_root, sizeof(_romfs_root) / sizeof(_romfs_root[0])};
40 
41 #ifdef BSP_USING_SDCARD_FS
42 
43 /* SD Card hot plug detection pin */
44 #define SD_CHECK_PIN GET_PIN(N, 7)
45 
_sdcard_mount(void)46 static void _sdcard_mount(void)
47 {
48     rt_device_t device;
49 
50     device = rt_device_find("sd0");
51     if (device == NULL)
52     {
53         mmcsd_wait_cd_changed(0);
54         stm32_mmcsd_change();
55         mmcsd_wait_cd_changed(RT_WAITING_FOREVER);
56         device = rt_device_find("sd0");
57     }
58     if (device != RT_NULL)
59     {
60         if (dfs_mount("sd0", "/sdcard", "elm", 0, 0) == RT_EOK)
61         {
62             LOG_I("sd card mount to '/sdcard'");
63         }
64         else
65         {
66             LOG_W("sd card mount to '/sdcard' failed!");
67         }
68     }
69 }
70 
_sdcard_unmount(void)71 static void _sdcard_unmount(void)
72 {
73     rt_thread_mdelay(200);
74     dfs_unmount("/sdcard");
75     LOG_I("Unmount \"/sdcard\"");
76 
77     mmcsd_wait_cd_changed(0);
78     stm32_mmcsd_change();
79     mmcsd_wait_cd_changed(RT_WAITING_FOREVER);
80 }
81 
sd_mount(void * parameter)82 static void sd_mount(void *parameter)
83 {
84     rt_uint8_t re_sd_check_pin = 1;
85     rt_thread_mdelay(200);
86     if (rt_pin_read(SD_CHECK_PIN))
87     {
88         _sdcard_mount();
89     }
90     while (1)
91     {
92         rt_thread_mdelay(200);
93         if (!re_sd_check_pin && (re_sd_check_pin = rt_pin_read(SD_CHECK_PIN)) != 0)
94         {
95             _sdcard_mount();
96         }
97 
98         if (re_sd_check_pin && (re_sd_check_pin = rt_pin_read(SD_CHECK_PIN)) == 0)
99         {
100             _sdcard_unmount();
101         }
102     }
103 }
104 
105 #endif /* BSP_USING_SDCARD_FS */
106 
mount_init(void)107 int mount_init(void)
108 {
109     if (dfs_mount(RT_NULL, "/", "rom", 0, &(romfs_root)) != 0)
110     {
111         LOG_E("rom mount to '/' failed!");
112     }
113 #ifdef BSP_USING_SPI_FLASH_FS
114     struct rt_device *flash_dev = RT_NULL;
115 
116 #ifndef RT_USING_WIFI
117     fal_init();
118 #endif
119 
120     flash_dev = fal_mtd_nor_device_create("filesystem");
121 
122     if (flash_dev)
123     {
124         //mount filesystem
125         if (dfs_mount(flash_dev->parent.name, "/flash", "lfs", 0, 0) != 0)
126         {
127             LOG_W("mount to '/flash' failed! try to mkfs %s", flash_dev->parent.name);
128             dfs_mkfs("lfs", flash_dev->parent.name);
129             if (dfs_mount(flash_dev->parent.name, "/flash", "lfs", 0, 0) == 0)
130             {
131                 LOG_I("mount to '/flash' success!");
132             }
133         }
134         else
135         {
136             LOG_I("mount to '/flash' success!");
137         }
138     }
139     else
140     {
141         LOG_E("Can't create  block device  filesystem or bt_image partition.");
142     }
143 
144 #endif
145 
146 #ifdef BSP_USING_SDCARD_FS
147     rt_thread_t tid;
148 
149     rt_pin_mode(SD_CHECK_PIN, PIN_MODE_INPUT_PULLUP);
150 
151     tid = rt_thread_create("sd_mount", sd_mount, RT_NULL,
152                            2048, RT_THREAD_PRIORITY_MAX - 2, 20);
153     if (tid != RT_NULL)
154     {
155         rt_thread_startup(tid);
156     }
157     else
158     {
159         LOG_E("create sd_mount thread err!");
160     }
161 #endif
162     return RT_EOK;
163 }
164 INIT_APP_EXPORT(mount_init);
165 
166 #endif /* BSP_USING_FS */
167