summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2015-08-02 23:51:46 +0100
committerDamien George <damien.p.george@gmail.com>2015-08-03 00:14:44 +0100
commit6f1c00869c761ff84b21939a057d7752e0c01be9 (patch)
treea8e18080abbfe9fd0bce35da4fd2a75cc389de94
parent1934dca6deceb8f05843173e362178700e811133 (diff)
stmhal: Factor out USRSW boot-up code and support boards with 1 LED.
Thanks to Dave Hylands for the patch.
-rw-r--r--stmhal/main.c119
1 files changed, 87 insertions, 32 deletions
diff --git a/stmhal/main.c b/stmhal/main.c
index 2e072b998..ea385030b 100644
--- a/stmhal/main.c
+++ b/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) {
// TODO disable JTAG
@@ -324,42 +399,16 @@ int main(void) {
soft_reset:
// check if user switch held to select the reset mode
+#if defined(MICROPY_HW_LED2)
led_state(1, 0);
led_state(2, 1);
+#else
+ led_state(1, 1);
+ led_state(2, 0);
+#endif
led_state(3, 0);
led_state(4, 0);
- 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(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
+ uint reset_mode = update_reset_mode(1);
#if MICROPY_HW_ENABLE_RTC
if (first_soft_reset) {
@@ -482,6 +531,12 @@ soft_reset:
}
// 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(3, 0);
led_state(4, 0);