1 /*
2 * Copyright (c) 2006-2023, RT-Thread Development Team
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 *
6 * Email: opensource_embedded@phytium.com.cn
7 *
8 * Change Logs:
9 * Date Author Notes
10 * 2023-04-27 huanghe first version
11 * 2023-07-14 liqiaozhong add SD file sys mount func
12 * 2024-04-08 zhugengyu define mount table by board
13 */
14 #include <rtthread.h>
15 #include <dfs_fs.h>
16
17 #define DBG_TAG "mnt.filesystem"
18 #define DBG_LVL DBG_INFO
19 #include <rtdbg.h>
20
21 #define FS_SD_MOUNT_POINT "/"
22 #define FS_SD_DEVICE_NAME "sd00" /* first partition of SD0 */
23 #define FS_SD_DEVICE_INDEX 0
24
25 extern void sdif_change(rt_uint32_t id);
26 extern rt_int32_t sdif_card_inserted(rt_uint32_t id);
27
28 static rt_int32_t card_inserted = 0;
29
_sdcard_mount(void)30 static void _sdcard_mount(void)
31 {
32 rt_device_t device;
33
34 device = rt_device_find(FS_SD_DEVICE_NAME);
35 rt_kprintf("rt_device_find %x \r\n", device);
36 if (device == NULL)
37 {
38 mmcsd_wait_cd_changed(0);
39 sdif_change(FS_SD_DEVICE_INDEX);
40 mmcsd_wait_cd_changed(RT_WAITING_FOREVER);
41 device = rt_device_find(FS_SD_DEVICE_NAME);
42 }
43
44 if (device != RT_NULL)
45 {
46 if (dfs_mount(FS_SD_DEVICE_NAME, FS_SD_MOUNT_POINT, "elm", 0, 0) == RT_EOK)
47 {
48 LOG_I("%s mount to '%s'", FS_SD_DEVICE_NAME, FS_SD_MOUNT_POINT);
49 card_inserted = 1;
50 }
51 else
52 {
53 LOG_W("%s mount to '%s' failed!", FS_SD_DEVICE_NAME, FS_SD_MOUNT_POINT);
54 }
55 }
56 }
57
_sdcard_unmount(void)58 static void _sdcard_unmount(void)
59 {
60 rt_thread_mdelay(200);
61 dfs_unmount(FS_SD_MOUNT_POINT);
62 LOG_I("Unmount %s", FS_SD_MOUNT_POINT);
63
64 mmcsd_wait_cd_changed(0);
65 sdif_change(FS_SD_DEVICE_INDEX);
66 mmcsd_wait_cd_changed(RT_WAITING_FOREVER);
67
68 card_inserted = 0;
69 }
70
sd_auto_mount(void * parameter)71 static void sd_auto_mount(void *parameter)
72 {
73 rt_thread_mdelay(20);
74
75 if ((card_inserted == 0) && (sdif_card_inserted(FS_SD_DEVICE_INDEX) == 1))
76 {
77 _sdcard_mount();
78 }
79
80 while (RT_TRUE)
81 {
82 rt_thread_mdelay(200);
83
84 if ((card_inserted == 0) && (sdif_card_inserted(FS_SD_DEVICE_INDEX) == 1))
85 {
86 _sdcard_mount();
87 }
88
89 if ((card_inserted == 1) && (sdif_card_inserted(FS_SD_DEVICE_INDEX) == 0))
90 {
91 _sdcard_unmount();
92 }
93 }
94 }
95
sd_mount(void)96 static void sd_mount(void)
97 {
98 rt_thread_t tid;
99
100 tid = rt_thread_create("sd_mount", sd_auto_mount, RT_NULL,
101 4096, RT_THREAD_PRIORITY_MAX - 2, 20);
102 if (tid != RT_NULL)
103 {
104 rt_thread_startup(tid);
105 }
106 else
107 {
108 LOG_E("create sd_mount thread err!");
109 return;
110 }
111 }
112
filesystem_mount(void)113 int filesystem_mount(void)
114 {
115 sd_mount();
116 return RT_EOK;
117 }
118 INIT_APP_EXPORT(filesystem_mount);
119