Kestrel Interface
Loading...
Searching...
No Matches
kest_sd.c
Go to the documentation of this file.
1#include <sys/unistd.h>
2#include <sys/stat.h>
3#include <dirent.h>
4
5#include "esp_vfs_fat.h"
6#include "sdmmc_cmd.h"
7#include "driver/i2c.h"
8#include "sd_pwr_ctrl_by_on_chip_ldo.h"
9
10#include "tinyusb.h"
11#include "tinyusb_msc.h"
12
13#include <string.h>
14#include "bsp/esp32_p4_nano.h"
15
16static const char *FNAME = "kest_sd.c";
17
18#include "kest_int.h"
19
20#define MAX_PARALLEL_FILES 12
21
22const int mount_point_strlen = strlen(MOUNT_POINT);
23
24const char mount_point[] = MOUNT_POINT;
25
26sdmmc_host_t host = SDMMC_HOST_DEFAULT();
27sdmmc_slot_config_t slot_config = SDMMC_SLOT_CONFIG_DEFAULT();
28
29esp_vfs_fat_sdmmc_mount_config_t mount_config = {
30 .format_if_mount_failed = false,
31 .max_files = 5,
32 .allocation_unit_size = 16 * 1024
33 };
34
35static sdmmc_card_t card_obj;
36sdmmc_card_t *card = &card_obj;
37
38tinyusb_config_t tusb_cfg = {
39 .task = {
40 .size = 4096,
41 .priority = 5,
42 .xCoreID = 0,
43 },
44};
45
46tinyusb_msc_driver_config_t msc_drv_cfg = {
47 .user_flags.auto_mount_off = 1,
48};
49
50tinyusb_msc_storage_config_t storage_cfg = {
51 .mount_point = TINYUSB_MSC_STORAGE_MOUNT_APP,
52};
53
54tinyusb_msc_storage_handle_t storage_handle;
55
56SemaphoreHandle_t sd_mutex;
57
59
60#ifdef USE_SDCARD
61int init_sd_card()
62{
63 esp_err_t ret;
64
65 sd_pwr_ctrl_ldo_config_t ldo_config = {
66 .ldo_chan_id = 4,
67 };
68 sd_pwr_ctrl_handle_t pwr_ctrl_handle = NULL;
69
70 ret = sd_pwr_ctrl_new_on_chip_ldo(&ldo_config, &pwr_ctrl_handle);
71
72 if (ret != ESP_OK)
73 {
74 kest_printf("Failed to create a new on-chip LDO power control driver");
75 return ERR_SD_INIT_FAIL;
76 }
77 host.pwr_ctrl_handle = pwr_ctrl_handle;
78
79 sd_pwr_ctrl_set_io_voltage(pwr_ctrl_handle, 3300);
80
81 slot_config.width = 4;
82 slot_config.clk = 43;
83 slot_config.cmd = 44;
84 slot_config.d0 = 39;
85 slot_config.d1 = 40;
86 slot_config.d2 = 41;
87 slot_config.d3 = 42;
88
89 slot_config.flags |= SDMMC_SLOT_FLAG_INTERNAL_PULLUP;
90
91 /*ret = esp_vfs_fat_sdmmc_mount(mount_point, &host, &slot_config, &mount_config, &card);
92
93 if (ret != ESP_OK)
94 {
95 ESP_LOGE("SD", "Failed to mount SD card: %s\n", esp_err_to_name(ret));
96 return ERR_SD_INIT_FAIL;
97 }*/
98
99 ret = sdmmc_host_init();
100 if (ret != ESP_OK)
101 {
102 kest_printf("Failed to initialise SDMMC host: %s\n", esp_err_to_name(ret));
103 return ERR_SD_INIT_FAIL;
104 }
105
106 ret = sdmmc_host_init_slot(host.slot, &slot_config); // or SDMMC_HOST_SLOT_1 depending on your target
107 if (ret != ESP_OK)if (ret != ESP_OK)
108 {
109 kest_printf("Failed to initialise SDMMC host slot: %s\n", esp_err_to_name(ret));
110 return ERR_SD_INIT_FAIL;
111 }
112
113 ret = sdmmc_card_init(&host, card);
114 if (ret != ESP_OK)if (ret != ESP_OK)
115 {
116 kest_printf("Failed to initialise SDMMC card: %s\n", esp_err_to_name(ret));
117 return ERR_SD_INIT_FAIL;
118 }
119
120 ret = tinyusb_driver_install(&tusb_cfg);
121 storage_cfg.medium.card = card;
122
123 sdmmc_card_print_info(stdout, card);
124
125
126 if (ret != ESP_OK)
127 {
128 kest_printf("Failed to installed tinyusb driver: %s\n", esp_err_to_name(ret));
129 return ERR_SD_INIT_FAIL;
130 }
131
132 ret = tinyusb_msc_install_driver(&msc_drv_cfg);
133
134 if (ret != ESP_OK)
135 {
136 kest_printf("Failed to installed tinyusb MSC driver: %s\n", esp_err_to_name(ret));
137 return ERR_SD_INIT_FAIL;
138 }
139
140 ret = tinyusb_msc_new_storage_sdmmc(&storage_cfg, &storage_handle);
141
142 if (ret != ESP_OK)
143 {
144 kest_printf("Failed to create tinyusb MSC SDMMC storage decide: %s\n", esp_err_to_name(ret));
145 return ERR_SD_INIT_FAIL;
146 }
147
148 sd_mutex = xSemaphoreCreateMutex();
149
150 return NO_ERROR;
151}
152
153#else
154
156{
157 return NO_ERROR;
158}
159
160#endif
161
163{
164 xSemaphoreTake(sd_mutex, portMAX_DELAY);
165
166 esp_err_t ret = tinyusb_msc_set_storage_mount_point(storage_handle, TINYUSB_MSC_STORAGE_MOUNT_USB);
167
168 if (ret != NO_ERROR)
169 {
170 kest_printf("Failed to set SD storage point to USB\n");
171 return ERR_SD_MOUNT_FAIL;
172 }
173
174 sd_msc_mode = 1;
175
176 return NO_ERROR;
177}
178
180{
181 esp_err_t ret = tinyusb_msc_set_storage_mount_point(storage_handle, TINYUSB_MSC_STORAGE_MOUNT_APP);
182
183 if (ret != ESP_OK)
184 {
185 kest_printf("Failed to uninstall tinyusb driver: %s\n", esp_err_to_name(ret));
186 return ERR_SD_INIT_FAIL;
187 }
188
189 sd_msc_mode = 0;
190 xSemaphoreGive(sd_mutex);
191
192 return NO_ERROR;
193}
194
196{
197 int ret_val;
198 if (sd_msc_mode)
199 ret_val = kest_sd_mode_local();
200 else
201 ret_val = kest_sd_mode_msc();
202
203 tinyusb_msc_mount_point_t mp;
204 tinyusb_msc_get_storage_mount_point(storage_handle, &mp);
205 kest_printf("MSC mount point now: %d");
206
207 return ret_val;
208}
#define NO_ERROR
#define ERR_SD_MOUNT_FAIL
#define ERR_SD_INIT_FAIL
void kest_printf(const char *fmt,...)
Definition kest_printf.c:21
int kest_sd_mode_local()
Definition kest_sd.c:179
sdmmc_slot_config_t slot_config
Definition kest_sd.c:27
const char mount_point[]
Definition kest_sd.c:24
int init_sd_card()
Definition kest_sd.c:155
sdmmc_host_t host
Definition kest_sd.c:26
int kest_sd_mode_msc()
Definition kest_sd.c:162
const int mount_point_strlen
Definition kest_sd.c:22
tinyusb_msc_storage_handle_t storage_handle
Definition kest_sd.c:54
int kest_sd_toggle_msc()
Definition kest_sd.c:195
int sd_msc_mode
Definition kest_sd.c:58
esp_vfs_fat_sdmmc_mount_config_t mount_config
Definition kest_sd.c:29
tinyusb_msc_storage_config_t storage_cfg
Definition kest_sd.c:50
tinyusb_msc_driver_config_t msc_drv_cfg
Definition kest_sd.c:46
tinyusb_config_t tusb_cfg
Definition kest_sd.c:38
SemaphoreHandle_t sd_mutex
Definition kest_sd.c:56
sdmmc_card_t * card
Definition kest_sd.c:36
#define MOUNT_POINT
Definition kest_sd.h:7