summaryrefslogtreecommitdiffstatshomepage
path: root/stmhal/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'stmhal/main.c')
-rw-r--r--stmhal/main.c169
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();