|
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
AF6D
| + #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