diff options
Diffstat (limited to 'stmhal/main.c')
-rw-r--r-- | stmhal/main.c | 169 |
1 files changed, 91 insertions, 78 deletions
diff --git a/stmhal/main.c b/stmhal/main.c index e40026efdd..9efaaec764 100644 --- a/stmhal/main.c +++ b/stmhal/main.c @@ -75,6 +75,7 @@ void __fatal_error(const char *msg) { STATIC mp_obj_t pyb_config_source_dir = MP_OBJ_NULL; STATIC mp_obj_t pyb_config_main = MP_OBJ_NULL; +STATIC mp_obj_t pyb_config_usb_mode = MP_OBJ_NULL; STATIC mp_obj_t pyb_source_dir(mp_obj_t source_dir) { if (MP_OBJ_IS_STR(source_dir)) { @@ -94,6 +95,15 @@ STATIC mp_obj_t pyb_main(mp_obj_t main) { MP_DEFINE_CONST_FUN_OBJ_1(pyb_main_obj, pyb_main); +STATIC mp_obj_t pyb_usb_mode(mp_obj_t usb_mode) { + if (MP_OBJ_IS_STR(usb_mode)) { + pyb_config_usb_mode = usb_mode; + } + return mp_const_none; +} + +MP_DEFINE_CONST_FUN_OBJ_1(pyb_usb_mode_obj, pyb_usb_mode); + void fatality(void) { led_state(PYB_LED_R1, 1); led_state(PYB_LED_G1, 1); @@ -109,12 +119,9 @@ static const char fresh_boot_py[] = "# can run arbitrary Python, but best to keep it minimal\n" "\n" "import pyb\n" -"pyb.source_dir('/src')\n" -"pyb.main('main.py')\n" -"#pyb.usb_usr('VCP')\n" -"#pyb.usb_msd(True, 'dual partition')\n" -"#pyb.flush_cache(False)\n" -"#pyb.error_log('error.txt')\n" +"#pyb.source_dir('/src')\n" +"#pyb.main('main.py')\n" +"#pyb.usb_mode('CDC+MSC') # one of: 'CDC+MSC', 'CDC+HID'\n" ; static const char fresh_main_py[] = @@ -171,23 +178,64 @@ int main(void) { // basic sub-system init pendsv_init(); led_init(); + switch_init0(); - // turn on LED to indicate bootup - led_state(PYB_LED_GREEN, 1); + int first_soft_reset = true; + uint reset_mode; + +soft_reset: + + // check if user switch held to select the reset mode + reset_mode = 1; + led_state(1, 0); + led_state(2, 1); + led_state(3, 0); + led_state(4, 0); + +#if MICROPY_HW_HAS_SWITCH + if (switch_get()) { + for (uint i = 0; i < 3000; i++) { + if (!switch_get()) { + break; + } + HAL_Delay(20); + if (i % 30 == 29) { + reset_mode = (reset_mode + 1) & 7; + led_state(2, reset_mode & 1); + led_state(3, reset_mode & 2); + led_state(4, reset_mode & 4); + } + } + // flash the selected reset mode + for (uint i = 0; i < 6; i++) { + led_state(2, 0); + led_state(3, 0); + led_state(4, 0); + HAL_Delay(50); + led_state(2, reset_mode & 1); + led_state(3, reset_mode & 2); + led_state(4, reset_mode & 4); + HAL_Delay(50); + } + HAL_Delay(400); + } +#endif #if MICROPY_HW_ENABLE_RTC - rtc_init(); + if (first_soft_reset) { + rtc_init(); + } #endif // more sub-system init #if MICROPY_HW_HAS_SDCARD - sdcard_init(); + if (first_soft_reset) { + sdcard_init(); + } #endif - storage_init(); - - int first_soft_reset = true; - -soft_reset: + if (first_soft_reset) { + storage_init(); + } // GC init gc_init(&_heap_start, &_heap_end); @@ -215,6 +263,7 @@ soft_reset: exti_init(); #if MICROPY_HW_HAS_SWITCH + // must come after exti_init switch_init(); #endif @@ -225,29 +274,12 @@ soft_reset: pin_map_init(); - // check if user switch held (initiates reset of filesystem) - bool reset_filesystem = false; -#if MICROPY_HW_HAS_SWITCH - if (switch_get()) { - reset_filesystem = true; - for (int i = 0; i < 50; i++) { - if (!switch_get()) { - reset_filesystem = false; - break; - } - HAL_Delay(10); - } - } -#endif // local filesystem init { // try to mount the flash FRESULT res = f_mount(&fatfs0, "0:", 1); - if (!reset_filesystem && res == FR_OK) { - // mount sucessful - } else if (reset_filesystem || res == FR_NO_FILESYSTEM) { - // no filesystem, so create a fresh one - // TODO doesn't seem to work correctly when reset_filesystem is true... + if (reset_mode == 3 || res == FR_NO_FILESYSTEM) { + // no filesystem, or asked to reset it, so create a fresh one // LED on to indicate creation of LFS led_state(PYB_LED_R2, 1); @@ -275,6 +307,8 @@ soft_reset: // keep LED on for at least 200ms sys_tick_wait_at_least(start_tick, 200); led_state(PYB_LED_R2, 0); + } else if (res == FR_OK) { + // mount sucessful } else { __fatal_error("could not access LFS"); } @@ -317,20 +351,24 @@ soft_reset: } // run /boot.py - if (!pyexec_file("0:/boot.py")) { - flash_error(4); + if (reset_mode == 1) { + if (!pyexec_file("0:/boot.py")) { + flash_error(4); + } } - // turn boot-up LED off - led_state(PYB_LED_GREEN, 0); + // turn boot-up LEDs off + led_state(2, 0); + led_state(3, 0); + led_state(4, 0); #if defined(USE_DEVICE_MODE) - usbd_storage_medium_kind_t usbd_medium_kind = USBD_STORAGE_MEDIUM_FLASH; + usb_storage_medium_t usb_medium = USB_STORAGE_MEDIUM_FLASH; #endif #if MICROPY_HW_HAS_SDCARD // if an SD card is present then mount it on 1:/ - if (sdcard_is_present()) { + if (reset_mode == 1 && sdcard_is_present()) { FRESULT res = f_mount(&fatfs1, "1:", 1); if (res != FR_OK) { printf("[SD] could not mount SD card\n"); @@ -338,7 +376,7 @@ soft_reset: if (first_soft_reset) { // use SD card as medium for the USB MSD #if defined(USE_DEVICE_MODE) - usbd_medium_kind = USBD_STORAGE_MEDIUM_SDCARD; + usb_medium = USB_STORAGE_MEDIUM_SDCARD; #endif } } @@ -353,7 +391,17 @@ soft_reset: pyb_usb_host_init(); #elif defined(USE_DEVICE_MODE) // USB device - pyb_usb_dev_init(USBD_DEVICE_CDC_MSC, usbd_medium_kind); + if (reset_mode == 1) { + usb_device_mode_t usb_mode = USB_DEVICE_MODE_CDC_MSC; + if (pyb_config_usb_mode != MP_OBJ_NULL) { + if (strcmp(mp_obj_str_get_str(pyb_config_usb_mode), "CDC+HID") == 0) { + usb_mode = USB_DEVICE_MODE_CDC_HID; + } + } + pyb_usb_dev_init(usb_mode, usb_medium); + } else { + pyb_usb_dev_init(USB_DEVICE_MODE_CDC_MSC, usb_medium); + } #endif #if MICROPY_HW_ENABLE_RNG @@ -387,7 +435,7 @@ soft_reset: #endif // run main script - { + if (reset_mode == 1) { vstr_t *vstr = vstr_new(); vstr_add_str(vstr, "0:/"); if (pyb_config_source_dir == MP_OBJ_NULL) { @@ -408,41 +456,6 @@ soft_reset: } #if 0 -#if MICROPY_HW_HAS_MMA7660 - // HID example - if (0) { - uint8_t data[4]; - data[0] = 0; - data[1] = 1; - data[2] = -2; - data[3] = 0; - for (;;) { - #if MICROPY_HW_HAS_SWITCH - if (switch_get()) { - data[0] = 0x01; // 0x04 is middle, 0x02 is right - } else { - data[0] = 0x00; - } - #else - data[0] = 0x00; - #endif - accel_start(0x4c /* ACCEL_ADDR */, 1); - accel_send_byte(0); - accel_restart(0x4c /* ACCEL_ADDR */, 0); - for (int i = 0; i <= 1; i++) { - int v = accel_read_ack() & 0x3f; - if (v & 0x20) { - v |= ~0x1f; - } - data[1 + i] = v; - } - accel_read_nack(); - usb_hid_send_report(data); - HAL_Delay(15); - } - } -#endif - #if MICROPY_HW_HAS_WLAN // wifi pyb_wlan_init(); |