37
37
#include "cortex_m.h"
38
38
#include "target_board.h"
39
39
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
+
40
69
// Must be bigger than 4x the flash size of the biggest supported
41
70
// device. This is to accomodate for hex file programming.
42
71
static const uint32_t disc_size = MB (64 );
@@ -61,6 +90,22 @@ static const char error_type_prefix[] = "type: ";
61
90
62
91
static const vfs_filename_t assert_file = "ASSERT TXT" ;
63
92
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
+
64
109
static uint8_t file_buffer [VFS_SECTOR_SIZE ];
65
110
static char assert_buf [64 + 1 ];
66
111
static uint16_t assert_line ;
@@ -138,47 +183,68 @@ void vfs_user_file_change_handler(const vfs_filename_t filename, vfs_file_change
138
183
}
139
184
140
185
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 ;
146
192
}
193
+ }
147
194
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
+ }
182
248
}
183
249
}
184
250
0 commit comments