stmhal: Factor out USRSW boot-up code and support boards with 1 LED.
Thanks to Dave Hylands for the patch.
This commit is contained in:
parent
1934dca6de
commit
6f1c00869c
117
stmhal/main.c
117
stmhal/main.c
|
@ -244,6 +244,81 @@ void init_flash_fs(uint reset_mode) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
STATIC uint update_reset_mode(uint reset_mode) {
|
||||||
|
#if MICROPY_HW_HAS_SWITCH
|
||||||
|
if (switch_get()) {
|
||||||
|
|
||||||
|
// The original method used on the pyboard is appropriate if you have 2
|
||||||
|
// or more LEDs.
|
||||||
|
#if defined(MICROPY_HW_LED2)
|
||||||
|
for (uint i = 0; i < 3000; i++) {
|
||||||
|
if (!switch_get()) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
HAL_Delay(20);
|
||||||
|
if (i % 30 == 29) {
|
||||||
|
if (++reset_mode > 3) {
|
||||||
|
reset_mode = 1;
|
||||||
|
}
|
||||||
|
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);
|
||||||
|
|
||||||
|
#elif defined(MICROPY_HW_LED1)
|
||||||
|
|
||||||
|
// For boards with only a single LED, we'll flash that LED the
|
||||||
|
// appropriate number of times, with a pause between each one
|
||||||
|
for (uint i = 0; i < 10; i++) {
|
||||||
|
led_state(1, 0);
|
||||||
|
for (uint j = 0; j < reset_mode; j++) {
|
||||||
|
if (!switch_get()) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
led_state(1, 1);
|
||||||
|
HAL_Delay(100);
|
||||||
|
led_state(1, 0);
|
||||||
|
HAL_Delay(200);
|
||||||
|
}
|
||||||
|
HAL_Delay(400);
|
||||||
|
if (!switch_get()) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (++reset_mode > 3) {
|
||||||
|
reset_mode = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Flash the selected reset mode
|
||||||
|
for (uint i = 0; i < 2; i++) {
|
||||||
|
for (uint j = 0; j < reset_mode; j++) {
|
||||||
|
led_state(1, 1);
|
||||||
|
HAL_Delay(100);
|
||||||
|
led_state(1, 0);
|
||||||
|
HAL_Delay(200);
|
||||||
|
}
|
||||||
|
HAL_Delay(400);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
#error Need a reset mode update method
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return reset_mode;
|
||||||
|
}
|
||||||
|
|
||||||
int main(void) {
|
int main(void) {
|
||||||
// TODO disable JTAG
|
// TODO disable JTAG
|
||||||
|
|
||||||
|
@ -324,42 +399,16 @@ int main(void) {
|
||||||
soft_reset:
|
soft_reset:
|
||||||
|
|
||||||
// check if user switch held to select the reset mode
|
// check if user switch held to select the reset mode
|
||||||
|
#if defined(MICROPY_HW_LED2)
|
||||||
led_state(1, 0);
|
led_state(1, 0);
|
||||||
led_state(2, 1);
|
led_state(2, 1);
|
||||||
led_state(3, 0);
|
#else
|
||||||
led_state(4, 0);
|
led_state(1, 1);
|
||||||
uint reset_mode = 1;
|
|
||||||
|
|
||||||
#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) {
|
|
||||||
if (++reset_mode > 3) {
|
|
||||||
reset_mode = 1;
|
|
||||||
}
|
|
||||||
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(2, 0);
|
||||||
|
#endif
|
||||||
led_state(3, 0);
|
led_state(3, 0);
|
||||||
led_state(4, 0);
|
led_state(4, 0);
|
||||||
HAL_Delay(50);
|
uint reset_mode = update_reset_mode(1);
|
||||||
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
|
#if MICROPY_HW_ENABLE_RTC
|
||||||
if (first_soft_reset) {
|
if (first_soft_reset) {
|
||||||
|
@ -482,6 +531,12 @@ soft_reset:
|
||||||
}
|
}
|
||||||
|
|
||||||
// turn boot-up LEDs off
|
// turn boot-up LEDs off
|
||||||
|
#if !defined(MICROPY_HW_LED2)
|
||||||
|
// If there is only one LED on the board then it's used to signal boot-up
|
||||||
|
// and so we turn it off here. Otherwise LED(1) is used to indicate dirty
|
||||||
|
// flash cache and so we shouldn't change its state.
|
||||||
|
led_state(1, 0);
|
||||||
|
#endif
|
||||||
led_state(2, 0);
|
led_state(2, 0);
|
||||||
led_state(3, 0);
|
led_state(3, 0);
|
||||||
led_state(4, 0);
|
led_state(4, 0);
|
||||||
|
|
Loading…
Reference in New Issue