diff options
| author | danicampora <danicampora@gmail.com> | 2015-02-25 22:38:33 +0100 |
|---|---|---|
| committer | danicampora <danicampora@gmail.com> | 2015-02-25 23:17:17 +0100 |
| commit | 7a074a14ced0c9ea890793aa7dc43c896cfdf9b9 (patch) | |
| tree | 02fee25f9d1375cde648ff82c87d0d0eacd2610e /cc3200/misc/mperror.c | |
| parent | 8a5aee103d0741efbbcf3fa7d0d0b3d2100eddb2 (diff) | |
cc3200: Implement safe boot pin and system led behaviour.
The safe boot pin, when pulled high during reset rolls back the
firmware to the "factory" image and skips execution of 'boot.py'
and 'main.py'. This is useful to recover from a crash condition.
The system led is used mostly to signal errors.
Diffstat (limited to 'cc3200/misc/mperror.c')
| -rw-r--r-- | cc3200/misc/mperror.c | 72 |
1 files changed, 70 insertions, 2 deletions
diff --git a/cc3200/misc/mperror.c b/cc3200/misc/mperror.c index a615a0f06..bfb17a2b4 100644 --- a/cc3200/misc/mperror.c +++ b/cc3200/misc/mperror.c @@ -32,12 +32,78 @@ #include "py/mpconfig.h" #include MICROPY_HAL_H #include "py/obj.h" -#include "inc/hw_memmap.h" +#include "hw_ints.h" +#include "hw_types.h" +#include "hw_gpio.h" +#include "hw_memmap.h" +#include "hw_gprcm.h" +#include "hw_common_reg.h" +#include "pin.h" +#include "gpio.h" +#include "rom.h" +#include "rom_map.h" +#include "prcm.h" #include "pybuart.h" #include "utils.h" +#define MPERROR_TOOGLE_MS (200) +#define MPERROR_SIGNAL_ERROR_MS (2000) + +#define MPERROR_SAFE_BOOT_REG_IDX (0) + + +void mperror_init0 (void) { + // Enable SYS GPIOs peripheral clocks + MAP_PRCMPeripheralClkEnable(MICROPY_SYS_LED_PRCM, PRCM_RUN_MODE_CLK | PRCM_SLP_MODE_CLK); +#ifdef BOOTLOADER + MAP_PRCMPeripheralClkEnable(MICROPY_SAFE_BOOT_PRCM, PRCM_RUN_MODE_CLK | PRCM_SLP_MODE_CLK); +#endif + + // Configure the bld + MAP_PinTypeGPIO(MICROPY_SYS_LED_PIN_NUM, PIN_MODE_0, false); + MAP_PinConfigSet(MICROPY_SYS_LED_PIN_NUM, PIN_STRENGTH_6MA, PIN_TYPE_STD); + MAP_GPIODirModeSet(MICROPY_SYS_LED_PORT, MICROPY_SYS_LED_PORT_PIN, GPIO_DIR_MODE_OUT); + +#ifdef BOOTLOADER + // Configure the safe boot pin + MAP_PinTypeGPIO(MICROPY_SAFE_BOOT_PIN_NUM, PIN_MODE_0, false); + MAP_PinConfigSet(MICROPY_SAFE_BOOT_PIN_NUM, PIN_STRENGTH_4MA, PIN_TYPE_STD_PD); + MAP_GPIODirModeSet(MICROPY_SAFE_BOOT_PORT, MICROPY_SAFE_BOOT_PORT_PIN, GPIO_DIR_MODE_IN); +#endif +} + +void mperror_deinit_sfe_pin (void) { + // disable the pull-down + MAP_PinConfigSet(MICROPY_SAFE_BOOT_PIN_NUM, PIN_STRENGTH_4MA, PIN_TYPE_STD); +} + +void mperror_signal_error (void) { + uint32_t count = 0; + while ((MPERROR_TOOGLE_MS * count++) > MPERROR_SIGNAL_ERROR_MS) { + // toogle the led + MAP_GPIOPinWrite(MICROPY_SYS_LED_PORT, MICROPY_SYS_LED_PORT_PIN, ~MAP_GPIOPinRead(MICROPY_SYS_LED_PORT, MICROPY_SYS_LED_PORT_PIN)); + UtilsDelay(UTILS_DELAY_US_TO_COUNT(MPERROR_TOOGLE_MS * 1000)); + } +} + +void mperror_request_safe_boot (void) { + MAP_PRCMOCRRegisterWrite(MPERROR_SAFE_BOOT_REG_IDX, 1); +} + +void mperror_clear_safe_boot (void) { + MAP_PRCMOCRRegisterWrite(MPERROR_SAFE_BOOT_REG_IDX, 0); +} + +// returns the last state of the safe boot request and clears the register +bool mperror_safe_boot_requested (void) { + bool ret = MAP_PRCMOCRRegisterRead(MPERROR_SAFE_BOOT_REG_IDX); + mperror_clear_safe_boot(); + return ret; +} + void NORETURN __fatal_error(const char *msg) { +#ifdef DEBUG if (msg != NULL) { // wait for 20ms UtilsDelay(UTILS_DELAY_US_TO_COUNT(20000)); @@ -45,6 +111,9 @@ void NORETURN __fatal_error(const char *msg) { mp_hal_stdout_tx_str(msg); mp_hal_stdout_tx_str("\r\n"); } +#endif + // signal the crash with the system led + MAP_GPIOPinWrite(MICROPY_SYS_LED_PORT, MICROPY_SYS_LED_PORT_PIN, MICROPY_SYS_LED_PORT_PIN); for ( ;; ) {__WFI();} } @@ -63,4 +132,3 @@ void nlr_jump_fail(void *val) { __fatal_error(NULL); #endif } - |
