|
38 | 38 | #include "pin.h" |
39 | 39 | #include "modmachine.h" |
40 | 40 | #include "fsl_wdog.h" |
| 41 | +#include "fsl_romapi.h" |
41 | 42 |
|
42 | 43 | #if MICROPY_PY_MACHINE |
43 | 44 |
|
@@ -108,6 +109,24 @@ STATIC mp_obj_t machine_enable_irq(mp_obj_t state_in) { |
108 | 109 | } |
109 | 110 | MP_DEFINE_CONST_FUN_OBJ_1(machine_enable_irq_obj, machine_enable_irq); |
110 | 111 |
|
| 112 | +NORETURN mp_obj_t machine_bootloader(size_t n_args, const mp_obj_t *args) { |
| 113 | + #if defined(MICROPY_BOARD_ENTER_BOOTLOADER) |
| 114 | + // If a board has a custom bootloader, call it first. |
| 115 | + MICROPY_BOARD_ENTER_BOOTLOADER(n_args, args); |
| 116 | + #elif FSL_ROM_HAS_RUNBOOTLOADER_API |
| 117 | + // If not, enter ROM bootloader in serial downloader / USB mode. |
| 118 | + uint32_t arg = 0xEB110000; |
| 119 | + ROM_RunBootloader(&arg); |
| 120 | + #else |
| 121 | + // No custom bootloader, or run bootloader API, then just reset. |
| 122 | + WDOG_TriggerSystemSoftwareReset(WDOG1); |
| 123 | + #endif |
| 124 | + while (1) { |
| 125 | + ; |
| 126 | + } |
| 127 | +} |
| 128 | +STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(machine_bootloader_obj, 0, 1, machine_bootloader); |
| 129 | + |
111 | 130 | STATIC const mp_rom_map_elem_t machine_module_globals_table[] = { |
112 | 131 | { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_umachine) }, |
113 | 132 | { MP_ROM_QSTR(MP_QSTR_unique_id), MP_ROM_PTR(&machine_unique_id_obj) }, |
@@ -144,6 +163,7 @@ STATIC const mp_rom_map_elem_t machine_module_globals_table[] = { |
144 | 163 |
|
145 | 164 | { MP_ROM_QSTR(MP_QSTR_disable_irq), MP_ROM_PTR(&machine_disable_irq_obj) }, |
146 | 165 | { MP_ROM_QSTR(MP_QSTR_enable_irq), MP_ROM_PTR(&machine_enable_irq_obj) }, |
| 166 | + { MP_ROM_QSTR(MP_QSTR_bootloader), MP_ROM_PTR(&machine_bootloader_obj) }, |
147 | 167 |
|
148 | 168 | #if MICROPY_PY_MACHINE_BITSTREAM |
149 | 169 | { MP_ROM_QSTR(MP_QSTR_bitstream), MP_ROM_PTR(&machine_bitstream_obj) }, |
|
0 commit comments