Skip to content

Commit 960b7de

Browse files
committed
Use table for MSD magic files.
1 parent ebffbe1 commit 960b7de

File tree

1 file changed

+105
-39
lines changed

1 file changed

+105
-39
lines changed

source/daplink/drag-n-drop/vfs_user.c

Lines changed: 105 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,35 @@
3737
#include "cortex_m.h"
3838
#include "target_board.h"
3939

40+
//! @brief Constants for magic action or config files.
41+
//!
42+
//! The "magic files" are files with a special name that if created on the USB MSC volume, will
43+
//! cause an event. There are two classes of magic files: action files and config files. The former
44+
//! causes a given action to take place, while the latter changes a persistent configuration setting
45+
//! to a predetermined value.
46+
//!
47+
//! See #s_magic_file_info for the mapping of filenames to these enums.
48+
typedef enum _magic_file {
49+
kDAPLinkModeActionFile, //!< Switch between interface and bootloader.
50+
kTestAssertActionFile, //!< Force an assertion for testing.
51+
kRefreshActionFile, //!< Force a remount.
52+
kEraseActionFile, //!< Erase the target flash.
53+
kAutoResetConfigFile, //!< Enable reset after flash.
54+
kHardResetConfigFile, //!< Disable reset after flash.
55+
kAutomationOnConfigFile, //!< Enable automation.
56+
kAutomationOffConfigFile, //!< Disable automation.
57+
kOverflowOnConfigFile, //!< Enable UART overflow reporting.
58+
kOverflowOffConfigFile, //!< Disable UART overflow reporting.
59+
kMSDOnConfigFile, //!< Enable USB MSC. Uh....
60+
kMSDOffConfigFile, //!< Disable USB MSC.
61+
} magic_file_t;
62+
63+
//! @brief Mapping from filename string to magic file enum.
64+
typedef struct _magic_file_info {
65+
const char *name; //!< Name of the magic file, must be in 8.3 format.
66+
magic_file_t which; //!< Enum for the file.
67+
} magic_file_info_t;
68+
4069
// Must be bigger than 4x the flash size of the biggest supported
4170
// device. This is to accomodate for hex file programming.
4271
static const uint32_t disc_size = MB(64);
@@ -61,6 +90,22 @@ static const char error_type_prefix[] = "type: ";
6190

6291
static const vfs_filename_t assert_file = "ASSERT TXT";
6392

93+
//! @brief Table of magic files and their names.
94+
static const magic_file_info_t s_magic_file_info[] = {
95+
{ daplink_mode_file_name, kDAPLinkModeActionFile },
96+
{ "ASSERT ACT", kTestAssertActionFile },
97+
{ "REFRESH ACT", kRefreshActionFile },
98+
{ "ERASE ACT", kEraseActionFile },
99+
{ "AUTO_RSTCFG", kAutoResetConfigFile },
100+
{ "HARD_RSTCFG", kHardResetConfigFile },
101+
{ "AUTO_ON CFG", kAutomationOnConfigFile },
102+
{ "AUTO_OFFCFG", kAutomationOffConfigFile },
103+
{ "OVFL_ON CFG", kOverflowOnConfigFile },
104+
{ "OVFL_OFFCFG", kOverflowOffConfigFile },
105+
{ "MSD_ON CFG", kMSDOnConfigFile },
106+
{ "MSD_OFF CFG", kMSDOffConfigFile },
107+
};
108+
64109
static uint8_t file_buffer[VFS_SECTOR_SIZE];
65110
static char assert_buf[64 + 1];
66111
static uint16_t assert_line;
@@ -138,47 +183,68 @@ void vfs_user_file_change_handler(const vfs_filename_t filename, vfs_file_change
138183
}
139184

140185
if (VFS_FILE_CREATED == change) {
141-
if (!memcmp(filename, daplink_mode_file_name, sizeof(vfs_filename_t))) {
142-
if (daplink_is_interface()) {
143-
config_ram_set_hold_in_bl(true);
144-
} else {
145-
// Do nothing - bootloader will go to interface by default
186+
int32_t which_magic_file = -1;
187+
188+
// Compare the new file's name to our table of magic filenames.
189+
for (int32_t i = 0; i < ARRAY_SIZE(s_magic_file_info); ++i) {
190+
if (!memcmp(filename, s_magic_file_info[i].name, sizeof(vfs_filename_t))) {
191+
which_magic_file = i;
146192
}
193+
}
147194

148-
vfs_mngr_fs_remount();
149-
} else if (!memcmp(filename, "AUTO_RSTCFG", sizeof(vfs_filename_t))) {
150-
config_set_auto_rst(true);
151-
vfs_mngr_fs_remount();
152-
} else if (!memcmp(filename, "HARD_RSTCFG", sizeof(vfs_filename_t))) {
153-
config_set_auto_rst(false);
154-
vfs_mngr_fs_remount();
155-
} else if (!memcmp(filename, "ASSERT ACT", sizeof(vfs_filename_t))) {
156-
// Test asserts
157-
util_assert(0);
158-
} else if (!memcmp(filename, "REFRESH ACT", sizeof(vfs_filename_t))) {
159-
// Remount to update the drive
160-
vfs_mngr_fs_remount();
161-
} else if (!memcmp(filename, "AUTO_ON CFG", sizeof(vfs_filename_t))) {
162-
config_set_automation_allowed(true);
163-
vfs_mngr_fs_remount();
164-
} else if (!memcmp(filename, "AUTO_OFFCFG", sizeof(vfs_filename_t))) {
165-
config_set_automation_allowed(false);
166-
vfs_mngr_fs_remount();
167-
} else if (!memcmp(filename, "ERASE ACT", sizeof(vfs_filename_t))) {
168-
erase_target();
169-
vfs_mngr_fs_remount();
170-
} else if (!memcmp(filename, "OVFL_ON CFG", sizeof(vfs_filename_t))) {
171-
config_set_overflow_detect(true);
172-
vfs_mngr_fs_remount();
173-
} else if (!memcmp(filename, "OVFL_OFFCFG", sizeof(vfs_filename_t))) {
174-
config_set_overflow_detect(false);
175-
vfs_mngr_fs_remount();
176-
} else if (!memcmp(filename, "MSD_ON ACT", sizeof(vfs_filename_t))) {
177-
config_ram_set_disable_msd(false);
178-
vfs_mngr_fs_remount();
179-
} else if (!memcmp(filename, "MSD_OFF ACT", sizeof(vfs_filename_t))) {
180-
config_ram_set_disable_msd(true);
181-
vfs_mngr_fs_remount();
195+
// Check if we matched a magic filename and handle it.
196+
if (which_magic_file != -1) {
197+
bool do_remount = true; // Almost all magic files cause a remount.
198+
199+
switch (which_magic_file) {
200+
case kDAPLinkModeActionFile:
201+
if (daplink_is_interface()) {
202+
config_ram_set_hold_in_bl(true);
203+
} else {
204+
// Do nothing - bootloader will go to interface by default
205+
}
206+
break;
207+
case kTestAssertActionFile:
208+
// Test asserts
209+
util_assert(0);
210+
do_remount = false;
211+
break;
212+
case kRefreshActionFile:
213+
// Remount to update the drive
214+
break;
215+
case kEraseActionFile:
216+
erase_target();
217+
break;
218+
case kAutoResetConfigFile:
219+
config_set_auto_rst(true);
220+
break;
221+
case kHardResetConfigFile:
222+
config_set_auto_rst(false);
223+
break;
224+
case kAutomationOnConfigFile:
225+
config_set_automation_allowed(true);
226+
break;
227+
case kAutomationOffConfigFile:
228+
config_set_automation_allowed(false);
229+
break;
230+
case kOverflowOnConfigFile:
231+
config_set_overflow_detect(true);
232+
break;
233+
case kOverflowOffConfigFile:
234+
config_set_overflow_detect(false);
235+
break;
236+
case kMSDOnConfigFile:
237+
config_ram_set_disable_msd(false);
238+
break;
239+
case kMSDOffConfigFile:
240+
config_ram_set_disable_msd(true);
241+
break;
242+
243+
}
244+
245+
if (do_remount) {
246+
vfs_mngr_fs_remount();
247+
}
182248
}
183249
}
184250

0 commit comments

Comments
 (0)