diff options
Diffstat (limited to 'cc3200/misc')
| -rw-r--r-- | cc3200/misc/FreeRTOSHooks.c | 11 | ||||
| -rw-r--r-- | cc3200/misc/mperror.c | 72 | ||||
| -rw-r--r-- | cc3200/misc/mperror.h | 16 |
3 files changed, 86 insertions, 13 deletions
diff --git a/cc3200/misc/FreeRTOSHooks.c b/cc3200/misc/FreeRTOSHooks.c index 4268980d6..9383000b0 100644 --- a/cc3200/misc/FreeRTOSHooks.c +++ b/cc3200/misc/FreeRTOSHooks.c @@ -35,6 +35,7 @@ #include "pybuart.h" #include "osi.h" #include "pybwdt.h" +#include "mperror.h" //***************************************************************************** @@ -66,15 +67,13 @@ void vApplicationIdleHook (void) void vApplicationMallocFailedHook (void) { #ifdef DEBUG - // Break into the debugger + // break into the debugger __asm volatile ("bkpt #0 \n"); - - printf("\nFATAL ERROR: FreeRTOS malloc failed!\n"); #endif for ( ; ; ) { - // TODO: Blink the BLD + __fatal_error("FreeRTOS malloc failed!"); } } @@ -92,13 +91,11 @@ void vApplicationStackOverflowHook (OsiTaskHandle *pxTask, signed char *pcTaskNa #ifdef DEBUG // Break into the debugger __asm volatile ("bkpt #0 \n"); - - printf("\nFATAL ERROR: Application: %s stack overflow!\n", pcTaskName); #endif for ( ; ; ) { - // TODO: Blink the BLD + __fatal_error("Stack overflow!"); } } 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 } - diff --git a/cc3200/misc/mperror.h b/cc3200/misc/mperror.h index 89a2abe8e..827d00a9f 100644 --- a/cc3200/misc/mperror.h +++ b/cc3200/misc/mperror.h @@ -25,8 +25,16 @@ * THE SOFTWARE. */ -#ifdef DEBUG +#ifndef MPERROR_H_ +#define MPERROR_H_ + extern void NORETURN __fatal_error(const char *msg); -#else -#define __fatal_error(...) for ( ;; ) {__WFI();} -#endif + +void mperror_init0 (void); +void mperror_deinit_sfe_pin (void); +void mperror_signal_error (void); +void mperror_request_safe_boot (void); +void mperror_clear_safe_boot (void); +bool mperror_safe_boot_requested (void); + +#endif // MPERROR_H_ |
