summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--atmel-samd/main.c63
1 files changed, 37 insertions, 26 deletions
diff --git a/atmel-samd/main.c b/atmel-samd/main.c
index ff970f15c..df259d9c4 100644
--- a/atmel-samd/main.c
+++ b/atmel-samd/main.c
@@ -47,6 +47,9 @@ void do_str(const char *src, mp_parse_input_kind_t input_kind) {
}
}
+// TODO(tannewt): Remove these default files in favor a very simple README with
+// a url to all of the files that ship on boards.
+
static const char fresh_boot_py[] =
"# boot.py -- run on boot-up\r\n"
"# can run arbitrary Python, but best to keep it minimal\r\n"
@@ -93,6 +96,11 @@ void init_flash_fs() {
if (res == FR_NO_FILESYSTEM) {
// no filesystem, or asked to reset it, so create a fresh one
+ // We are before USB initializes so temporarily undo the USB_WRITEABLE
+ // requirement.
+ bool usb_writeable = (vfs->flags & FSUSER_USB_WRITEABLE) > 0;
+ vfs->flags &= ~FSUSER_USB_WRITEABLE;
+
res = f_mkfs("/flash", 0, 0);
if (res == FR_OK) {
// success creating fresh LFS
@@ -118,6 +126,35 @@ void init_flash_fs() {
f_open(&fp, "/flash/README.txt", FA_WRITE | FA_CREATE_ALWAYS);
f_write(&fp, fresh_readme_txt, sizeof(fresh_readme_txt) - 1 /* don't count null terminator */, &n);
f_close(&fp);
+
+ // Make sure we have a /flash/boot.py. Create it if needed.
+ FILINFO fno;
+ #if _USE_LFN
+ fno.lfname = NULL;
+ fno.lfsize = 0;
+ #endif
+ res = f_stat("/flash/boot.py", &fno);
+ if (res == FR_OK) {
+ if (fno.fattrib & AM_DIR) {
+ // exists as a directory
+ // TODO handle this case
+ // see http://elm-chan.org/fsw/ff/img/app2.c for a "rm -rf" implementation
+ } else {
+ // exists as a file, good!
+ }
+ } else {
+ // doesn't exist, create fresh file
+
+ FIL fp;
+ f_open(&fp, "/flash/boot.py", FA_WRITE | FA_CREATE_ALWAYS);
+ UINT n;
+ f_write(&fp, fresh_boot_py, sizeof(fresh_boot_py) - 1 /* don't count null terminator */, &n);
+ // TODO check we could write n bytes
+ f_close(&fp);
+ }
+ if (usb_writeable) {
+ vfs->flags |= FSUSER_USB_WRITEABLE;
+ }
} else if (res == FR_OK) {
// mount successful
} else {
@@ -129,32 +166,6 @@ void init_flash_fs() {
// The current directory is used as the boot up directory.
// It is set to the internal flash filesystem by default.
f_chdrive("/flash");
-
- // Make sure we have a /flash/boot.py. Create it if needed.
- FILINFO fno;
-#if _USE_LFN
- fno.lfname = NULL;
- fno.lfsize = 0;
-#endif
- res = f_stat("/flash/boot.py", &fno);
- if (res == FR_OK) {
- if (fno.fattrib & AM_DIR) {
- // exists as a directory
- // TODO handle this case
- // see http://elm-chan.org/fsw/ff/img/app2.c for a "rm -rf" implementation
- } else {
- // exists as a file, good!
- }
- } else {
- // doesn't exist, create fresh file
-
- FIL fp;
- f_open(&fp, "/flash/boot.py", FA_WRITE | FA_CREATE_ALWAYS);
- UINT n;
- f_write(&fp, fresh_boot_py, sizeof(fresh_boot_py) - 1 /* don't count null terminator */, &n);
- // TODO check we could write n bytes
- f_close(&fp);
- }
}
static char *stack_top;