diff options
Diffstat (limited to 'stm')
-rw-r--r-- | stm/lib/usbd_storage_msd.c | 2 | ||||
-rw-r--r-- | stm/main.c | 155 |
2 files changed, 109 insertions, 48 deletions
diff --git a/stm/lib/usbd_storage_msd.c b/stm/lib/usbd_storage_msd.c index afdd47865d..a924a868d2 100644 --- a/stm/lib/usbd_storage_msd.c +++ b/stm/lib/usbd_storage_msd.c @@ -308,7 +308,7 @@ int8_t STORAGE_Write (uint8_t lun, while (SD_GetStatus() != SD_TRANSFER_OK);
#endif
*/
- //disk_write(0, buf, blk_addr, blk_len);
+ disk_write(0, buf, blk_addr, blk_len);
return (0);
}
diff --git a/stm/main.c b/stm/main.c index 5cf39e924f..fc61962f16 100644 --- a/stm/main.c +++ b/stm/main.c @@ -16,8 +16,22 @@ #include "usb.h" #include "ff.h" +static FATFS fatfs0; + extern uint32_t _heap_start; +void flash_error(int n) { + for (int i = 0; i < n; i++) { + led_state(PYB_LED_R1, 1); + led_state(PYB_LED_R2, 0); + sys_tick_delay_ms(250); + led_state(PYB_LED_R1, 0); + led_state(PYB_LED_R2, 1); + sys_tick_delay_ms(250); + } + led_state(PYB_LED_R2, 0); +} + static void impl02_c_version() { int x = 0; while (x < 400) { @@ -58,14 +72,8 @@ int sw_get() { void __fatal_error(const char *msg) { lcd_print_strn("\nFATAL ERROR:\n", 14); lcd_print_strn(msg, strlen(msg)); - for (;;) { - led_state(PYB_LED_R1, 1); - led_state(PYB_LED_R2, 0); - sys_tick_delay_ms(150); - led_state(PYB_LED_R1, 0); - led_state(PYB_LED_R2, 1); - sys_tick_delay_ms(150); + flash_error(1); } } @@ -79,16 +87,27 @@ void __fatal_error(const char *msg) { #include "runtime.h" #include "repl.h" +static qstr pyb_config_source_dir = 0; +static qstr pyb_config_main = 0; + py_obj_t pyb_source_dir(py_obj_t source_dir) { + pyb_config_source_dir = py_get_qstr(source_dir); return py_const_none; } py_obj_t pyb_main(py_obj_t main) { + pyb_config_main = py_get_qstr(main); + return py_const_none; +} + +// sync all file systems +py_obj_t pyb_sync() { + storage_flush(); return py_const_none; } py_obj_t pyb_delay(py_obj_t count) { - sys_tick_delay_ms(rt_get_int(count)); + sys_tick_delay_ms(py_get_int(count)); return py_const_none; } @@ -105,8 +124,6 @@ py_obj_t pyb_sw() { } } -FATFS fatfs0; - /* void g(uint i) { printf("g:%d\n", i); @@ -185,27 +202,27 @@ static py_obj_t pyb_info() { printf("_heap_start=%p\n", &_heap_start); } + // GC info + { + gc_info_t info; + gc_info(&info); + printf("GC:\n"); + printf(" %lu total\n", info.total); + printf(" %lu : %lu\n", info.used, info.free); + printf(" 1=%lu 2=%lu m=%lu\n", info.num_1block, info.num_2block, info.max_block); + } + // free space on flash { DWORD nclst; FATFS *fatfs; f_getfree("0:", &nclst, &fatfs); - printf("free=%u\n", (uint)(nclst * fatfs->csize * 512)); + printf("LFS free: %u bytes\n", (uint)(nclst * fatfs->csize * 512)); } return py_const_none; } -/* -void gc_print_info() { - gc_info_t info; - gc_info(&info); - printf("! %lu total\n", info.total); - printf("! %lu : %lu\n", info.used, info.free); - printf("! 1=%lu 2=%lu m=%lu\n", info.num_1block, info.num_2block, info.max_block); -} -*/ - int readline(vstr_t *line, const char *prompt) { usb_vcp_send_str(prompt); int len = vstr_len(line); @@ -287,7 +304,46 @@ void do_repl() { } } - usb_vcp_send_str("\r\nMicro Python REPL finished\r\n"); + usb_vcp_send_str("\r\n"); +} + +bool do_file(const char *filename) { + py_lexer_file_buf_t fb; + py_lexer_t *lex = py_lexer_new_from_file(filename, &fb); + + if (lex == NULL) { + printf("could not open file '%s' for reading\n", filename); + return false; + } + + py_parse_node_t pn = py_parse(lex, PY_PARSE_FILE_INPUT); + py_lexer_free(lex); + + if (pn == PY_PARSE_NODE_NULL) { + return false; + } + + bool comp_ok = py_compile(pn, false); + if (!comp_ok) { + return false; + } + + py_obj_t module_fun = rt_make_function_from_id(1); + if (module_fun == py_const_none) { + return false; + } + + nlr_buf_t nlr; + if (nlr_push(&nlr) == 0) { + rt_call_function_0(module_fun); + nlr_pop(); + return true; + } else { + // uncaught exception + py_obj_print((py_obj_t)nlr.ret_val); + printf("\n"); + return false; + } } #define RAM_START (0x20000000) // fixed for chip @@ -356,6 +412,7 @@ soft_reset: rt_store_attr(m, qstr_from_str_static("info"), rt_make_function_0(pyb_info)); rt_store_attr(m, qstr_from_str_static("source_dir"), rt_make_function_1(pyb_source_dir)); rt_store_attr(m, qstr_from_str_static("main"), rt_make_function_1(pyb_main)); + rt_store_attr(m, qstr_from_str_static("sync"), rt_make_function_0(pyb_sync)); rt_store_attr(m, qstr_from_str_static("gc"), rt_make_function_0(pyb_gc)); rt_store_attr(m, qstr_from_str_static("delay"), rt_make_function_1(pyb_delay)); rt_store_attr(m, qstr_from_str_static("led"), rt_make_function_1(pyb_led)); @@ -426,38 +483,38 @@ soft_reset: } } + // run /boot.py + if (!do_file("0:/boot.py")) { + flash_error(4); + } + // USB usb_init(); - // run /boot.py - if (1) { - py_lexer_file_buf_t fb; - py_lexer_t *lex = py_lexer_new_from_file("0:/boot.py", &fb); - py_parse_node_t pn = py_parse(lex, PY_PARSE_FILE_INPUT); - py_lexer_free(lex); + // turn boot-up LED off + led_state(PYB_LED_G1, 0); - if (pn != PY_PARSE_NODE_NULL) { - bool comp_ok = py_compile(pn, true); - if (comp_ok) { - py_obj_t module_fun = rt_make_function_from_id(1); - if (module_fun != py_const_none) { - nlr_buf_t nlr; - if (nlr_push(&nlr) == 0) { - rt_call_function_0(module_fun); - nlr_pop(); - } else { - // uncaught exception - py_obj_print((py_obj_t)nlr.ret_val); - printf("\n"); - } - } - } + // run main script + { + vstr_t *vstr = vstr_new(); + vstr_add_str(vstr, "0:/"); + if (pyb_config_source_dir == 0) { + vstr_add_str(vstr, "src"); + } else { + vstr_add_str(vstr, qstr_str(pyb_config_source_dir)); + } + vstr_add_char(vstr, '/'); + if (pyb_config_main == 0) { + vstr_add_str(vstr, "main.py"); + } else { + vstr_add_str(vstr, qstr_str(pyb_config_main)); + } + if (!do_file(vstr_str(vstr))) { + flash_error(3); } + vstr_free(vstr); } - // turn boot-up LED off - led_state(PYB_LED_G1, 0); - //printf("init;al=%u\n", m_get_total_bytes_allocated()); // 1600, due to qstr_init //sys_tick_delay_ms(1000); @@ -676,5 +733,9 @@ soft_reset: //sdio_init(); } + printf("PYB: sync filesystems\n"); + pyb_sync(); + + printf("PYB: soft reboot\n"); goto soft_reset; } |