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