Paul Sokolovsky | 5d7c408 | 2015-12-31 00:51:08 +0200 | [diff] [blame] | 1 | /* |
| 2 | * This file is part of the MicroPython project, http://micropython.org/ |
| 3 | * |
| 4 | * The MIT License (MIT) |
| 5 | * |
| 6 | * Copyright (c) 2013-2015 Damien P. George |
Paul Sokolovsky | 7193086 | 2016-01-05 21:23:23 +0200 | [diff] [blame] | 7 | * Copyright (c) 2016 Paul Sokolovsky |
Paul Sokolovsky | 5d7c408 | 2015-12-31 00:51:08 +0200 | [diff] [blame] | 8 | * |
| 9 | * Permission is hereby granted, free of charge, to any person obtaining a copy |
| 10 | * of this software and associated documentation files (the "Software"), to deal |
| 11 | * in the Software without restriction, including without limitation the rights |
| 12 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
| 13 | * copies of the Software, and to permit persons to whom the Software is |
| 14 | * furnished to do so, subject to the following conditions: |
| 15 | * |
| 16 | * The above copyright notice and this permission notice shall be included in |
| 17 | * all copies or substantial portions of the Software. |
| 18 | * |
| 19 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
| 20 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| 21 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
| 22 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
| 23 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
| 24 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
| 25 | * THE SOFTWARE. |
| 26 | */ |
| 27 | |
| 28 | #include <stdint.h> |
Paul Sokolovsky | 31ad1bb | 2016-08-07 16:20:01 +0300 | [diff] [blame] | 29 | #include <stdio.h> |
Paul Sokolovsky | 5d7c408 | 2015-12-31 00:51:08 +0200 | [diff] [blame] | 30 | |
| 31 | #include "py/obj.h" |
Paul Sokolovsky | 7193086 | 2016-01-05 21:23:23 +0200 | [diff] [blame] | 32 | #include "py/runtime.h" |
Paul Sokolovsky | 5d7c408 | 2015-12-31 00:51:08 +0200 | [diff] [blame] | 33 | #include "extmod/machine_mem.h" |
Paul Sokolovsky | 287180a | 2017-01-01 19:17:00 +0300 | [diff] [blame] | 34 | #include "extmod/machine_signal.h" |
Damien George | cff2b7a | 2016-05-31 14:06:50 +0100 | [diff] [blame] | 35 | #include "extmod/machine_pulse.h" |
Damien George | a525493 | 2016-04-12 13:55:20 +0100 | [diff] [blame] | 36 | #include "extmod/machine_i2c.h" |
Paul Sokolovsky | 8bc3fc2 | 2016-11-06 01:30:19 +0300 | [diff] [blame] | 37 | #include "modmachine.h" |
Paul Sokolovsky | 7193086 | 2016-01-05 21:23:23 +0200 | [diff] [blame] | 38 | |
Damien George | 9a368ae | 2016-05-20 13:30:33 +0100 | [diff] [blame] | 39 | #include "xtirq.h" |
Paul Sokolovsky | 7193086 | 2016-01-05 21:23:23 +0200 | [diff] [blame] | 40 | #include "os_type.h" |
| 41 | #include "osapi.h" |
Paul Sokolovsky | 98b727c | 2016-02-06 01:36:17 +0200 | [diff] [blame] | 42 | #include "etshal.h" |
Damien George | 32d7cf6 | 2016-04-21 11:43:37 +0100 | [diff] [blame] | 43 | #include "ets_alt_task.h" |
Damien George | f7be803 | 2016-02-17 15:19:03 +0000 | [diff] [blame] | 44 | #include "user_interface.h" |
Paul Sokolovsky | 5d7c408 | 2015-12-31 00:51:08 +0200 | [diff] [blame] | 45 | |
| 46 | #if MICROPY_PY_MACHINE |
| 47 | |
Damien George | 32d7cf6 | 2016-04-21 11:43:37 +0100 | [diff] [blame] | 48 | //#define MACHINE_WAKE_IDLE (0x01) |
| 49 | //#define MACHINE_WAKE_SLEEP (0x02) |
| 50 | #define MACHINE_WAKE_DEEPSLEEP (0x04) |
| 51 | |
Paul Sokolovsky | 263aaa7 | 2016-08-28 14:48:49 +0300 | [diff] [blame] | 52 | extern const mp_obj_type_t esp_wdt_type; |
| 53 | |
Damien George | f7be803 | 2016-02-17 15:19:03 +0000 | [diff] [blame] | 54 | STATIC mp_obj_t machine_freq(mp_uint_t n_args, const mp_obj_t *args) { |
| 55 | if (n_args == 0) { |
| 56 | // get |
| 57 | return mp_obj_new_int(system_get_cpu_freq() * 1000000); |
| 58 | } else { |
| 59 | // set |
| 60 | mp_int_t freq = mp_obj_get_int(args[0]) / 1000000; |
| 61 | if (freq != 80 && freq != 160) { |
| 62 | nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, |
| 63 | "frequency can only be either 80Mhz or 160MHz")); |
| 64 | } |
| 65 | system_update_cpu_freq(freq); |
| 66 | return mp_const_none; |
| 67 | } |
| 68 | } |
| 69 | STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(machine_freq_obj, 0, 1, machine_freq); |
| 70 | |
Paul Sokolovsky | 81fd568 | 2016-04-05 00:20:25 +0300 | [diff] [blame] | 71 | STATIC mp_obj_t machine_reset(void) { |
| 72 | system_restart(); |
| 73 | return mp_const_none; |
| 74 | } |
| 75 | STATIC MP_DEFINE_CONST_FUN_OBJ_0(machine_reset_obj, machine_reset); |
| 76 | |
Paul Sokolovsky | 050e645 | 2016-04-15 22:07:28 +0300 | [diff] [blame] | 77 | STATIC mp_obj_t machine_reset_cause(void) { |
| 78 | return MP_OBJ_NEW_SMALL_INT(system_get_rst_info()->reason); |
| 79 | } |
| 80 | STATIC MP_DEFINE_CONST_FUN_OBJ_0(machine_reset_cause_obj, machine_reset_cause); |
| 81 | |
Paul Sokolovsky | de12502 | 2016-04-05 00:57:49 +0300 | [diff] [blame] | 82 | STATIC mp_obj_t machine_unique_id(void) { |
| 83 | uint32_t id = system_get_chip_id(); |
| 84 | return mp_obj_new_bytes((byte*)&id, sizeof(id)); |
| 85 | } |
| 86 | STATIC MP_DEFINE_CONST_FUN_OBJ_0(machine_unique_id_obj, machine_unique_id); |
| 87 | |
Paul Sokolovsky | c2070d7 | 2016-08-07 15:51:04 +0300 | [diff] [blame] | 88 | STATIC mp_obj_t machine_idle(void) { |
Paul Sokolovsky | 52784bf | 2016-10-04 21:20:47 +0300 | [diff] [blame] | 89 | uint32_t t = mp_hal_ticks_cpu(); |
Paul Sokolovsky | c2070d7 | 2016-08-07 15:51:04 +0300 | [diff] [blame] | 90 | asm("waiti 0"); |
Paul Sokolovsky | 52784bf | 2016-10-04 21:20:47 +0300 | [diff] [blame] | 91 | t = mp_hal_ticks_cpu() - t; |
| 92 | return MP_OBJ_NEW_SMALL_INT(t); |
Paul Sokolovsky | c2070d7 | 2016-08-07 15:51:04 +0300 | [diff] [blame] | 93 | } |
| 94 | STATIC MP_DEFINE_CONST_FUN_OBJ_0(machine_idle_obj, machine_idle); |
| 95 | |
Paul Sokolovsky | 31ad1bb | 2016-08-07 16:20:01 +0300 | [diff] [blame] | 96 | STATIC mp_obj_t machine_sleep(void) { |
| 97 | printf("Warning: not yet implemented\n"); |
| 98 | return mp_const_none; |
| 99 | } |
| 100 | STATIC MP_DEFINE_CONST_FUN_OBJ_0(machine_sleep_obj, machine_sleep); |
| 101 | |
Damien George | 32d7cf6 | 2016-04-21 11:43:37 +0100 | [diff] [blame] | 102 | STATIC mp_obj_t machine_deepsleep(void) { |
| 103 | // default to sleep forever |
| 104 | uint32_t sleep_us = 0; |
| 105 | |
| 106 | // see if RTC.ALARM0 should wake the device |
| 107 | if (pyb_rtc_alarm0_wake & MACHINE_WAKE_DEEPSLEEP) { |
| 108 | uint64_t t = pyb_rtc_get_us_since_2000(); |
| 109 | if (pyb_rtc_alarm0_expiry <= t) { |
| 110 | sleep_us = 1; // alarm already expired so wake immediately |
| 111 | } else { |
| 112 | uint64_t delta = pyb_rtc_alarm0_expiry - t; |
| 113 | if (delta <= 0xffffffff) { |
| 114 | // sleep for the desired time |
| 115 | sleep_us = delta; |
| 116 | } else { |
| 117 | // overflow, just set to maximum sleep time |
| 118 | sleep_us = 0xffffffff; |
| 119 | } |
| 120 | } |
| 121 | } |
| 122 | |
puuu | ee12581 | 2016-06-04 00:21:26 +0900 | [diff] [blame] | 123 | // prepare for RTC reset at wake up |
| 124 | rtc_prepare_deepsleep(sleep_us); |
Damien George | 32d7cf6 | 2016-04-21 11:43:37 +0100 | [diff] [blame] | 125 | // put the device in a deep-sleep state |
| 126 | system_deep_sleep_set_option(0); // default power down mode; TODO check this |
| 127 | system_deep_sleep(sleep_us); |
| 128 | |
| 129 | for (;;) { |
| 130 | // we must not return |
| 131 | ets_loop_iter(); |
| 132 | } |
| 133 | |
| 134 | return mp_const_none; |
| 135 | } |
| 136 | STATIC MP_DEFINE_CONST_FUN_OBJ_0(machine_deepsleep_obj, machine_deepsleep); |
| 137 | |
Paul Sokolovsky | 7193086 | 2016-01-05 21:23:23 +0200 | [diff] [blame] | 138 | typedef struct _esp_timer_obj_t { |
| 139 | mp_obj_base_t base; |
| 140 | os_timer_t timer; |
| 141 | mp_obj_t callback; |
| 142 | } esp_timer_obj_t; |
| 143 | |
| 144 | const mp_obj_type_t esp_timer_type; |
| 145 | |
| 146 | STATIC void esp_timer_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) { |
| 147 | esp_timer_obj_t *self = self_in; |
| 148 | mp_printf(print, "Timer(%p)", &self->timer); |
| 149 | } |
| 150 | |
Paul Sokolovsky | eac22e2 | 2017-01-04 16:10:42 +0300 | [diff] [blame] | 151 | STATIC mp_obj_t esp_timer_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { |
Paul Sokolovsky | 7193086 | 2016-01-05 21:23:23 +0200 | [diff] [blame] | 152 | mp_arg_check_num(n_args, n_kw, 1, 1, false); |
| 153 | esp_timer_obj_t *tim = m_new_obj(esp_timer_obj_t); |
| 154 | tim->base.type = &esp_timer_type; |
| 155 | return tim; |
| 156 | } |
| 157 | |
| 158 | STATIC void esp_timer_cb(void *arg) { |
| 159 | esp_timer_obj_t *self = arg; |
Damien George | 31ea158 | 2017-02-20 17:59:18 +1100 | [diff] [blame] | 160 | mp_sched_schedule(self->callback, self); |
Paul Sokolovsky | 7193086 | 2016-01-05 21:23:23 +0200 | [diff] [blame] | 161 | } |
| 162 | |
| 163 | STATIC mp_obj_t esp_timer_init_helper(esp_timer_obj_t *self, mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { |
| 164 | static const mp_arg_t allowed_args[] = { |
| 165 | // { MP_QSTR_freq, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} }, |
| 166 | { MP_QSTR_period, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 0xffffffff} }, |
| 167 | { MP_QSTR_mode, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 1} }, |
| 168 | { MP_QSTR_callback, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} }, |
| 169 | }; |
| 170 | |
| 171 | // parse args |
| 172 | mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; |
| 173 | mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); |
| 174 | |
| 175 | self->callback = args[2].u_obj; |
Paul Sokolovsky | f39bcb3 | 2016-01-07 18:58:52 +0200 | [diff] [blame] | 176 | // Be sure to disarm timer before making any changes |
| 177 | os_timer_disarm(&self->timer); |
Paul Sokolovsky | 7193086 | 2016-01-05 21:23:23 +0200 | [diff] [blame] | 178 | os_timer_setfn(&self->timer, esp_timer_cb, self); |
| 179 | os_timer_arm(&self->timer, args[0].u_int, args[1].u_int); |
| 180 | |
| 181 | return mp_const_none; |
| 182 | } |
| 183 | |
| 184 | STATIC mp_obj_t esp_timer_init(mp_uint_t n_args, const mp_obj_t *args, mp_map_t *kw_args) { |
| 185 | return esp_timer_init_helper(args[0], n_args - 1, args + 1, kw_args); |
| 186 | } |
| 187 | STATIC MP_DEFINE_CONST_FUN_OBJ_KW(esp_timer_init_obj, 1, esp_timer_init); |
| 188 | |
| 189 | STATIC mp_obj_t esp_timer_deinit(mp_obj_t self_in) { |
| 190 | esp_timer_obj_t *self = self_in; |
| 191 | os_timer_disarm(&self->timer); |
| 192 | return mp_const_none; |
| 193 | } |
| 194 | STATIC MP_DEFINE_CONST_FUN_OBJ_1(esp_timer_deinit_obj, esp_timer_deinit); |
| 195 | |
| 196 | STATIC const mp_map_elem_t esp_timer_locals_dict_table[] = { |
| 197 | { MP_OBJ_NEW_QSTR(MP_QSTR_deinit), (mp_obj_t)&esp_timer_deinit_obj }, |
| 198 | { MP_OBJ_NEW_QSTR(MP_QSTR_init), (mp_obj_t)&esp_timer_init_obj }, |
| 199 | // { MP_OBJ_NEW_QSTR(MP_QSTR_callback), (mp_obj_t)&esp_timer_callback_obj }, |
Paul Sokolovsky | c70637b | 2016-03-04 22:26:59 +0200 | [diff] [blame] | 200 | { MP_OBJ_NEW_QSTR(MP_QSTR_ONE_SHOT), MP_OBJ_NEW_SMALL_INT(false) }, |
| 201 | { MP_OBJ_NEW_QSTR(MP_QSTR_PERIODIC), MP_OBJ_NEW_SMALL_INT(true) }, |
Paul Sokolovsky | 7193086 | 2016-01-05 21:23:23 +0200 | [diff] [blame] | 202 | }; |
| 203 | STATIC MP_DEFINE_CONST_DICT(esp_timer_locals_dict, esp_timer_locals_dict_table); |
| 204 | |
| 205 | const mp_obj_type_t esp_timer_type = { |
| 206 | { &mp_type_type }, |
| 207 | .name = MP_QSTR_Timer, |
| 208 | .print = esp_timer_print, |
| 209 | .make_new = esp_timer_make_new, |
| 210 | .locals_dict = (mp_obj_t)&esp_timer_locals_dict, |
| 211 | }; |
| 212 | |
Damien George | 927388e | 2016-06-01 17:26:49 +0100 | [diff] [blame] | 213 | // this bit is unused in the Xtensa PS register |
| 214 | #define ETS_LOOP_ITER_BIT (12) |
| 215 | |
Damien George | 9a368ae | 2016-05-20 13:30:33 +0100 | [diff] [blame] | 216 | STATIC mp_obj_t machine_disable_irq(void) { |
Damien George | 927388e | 2016-06-01 17:26:49 +0100 | [diff] [blame] | 217 | uint32_t state = disable_irq(); |
| 218 | state = (state & ~(1 << ETS_LOOP_ITER_BIT)) | (ets_loop_iter_disable << ETS_LOOP_ITER_BIT); |
| 219 | ets_loop_iter_disable = 1; |
| 220 | return mp_obj_new_int(state); |
Damien George | 9a368ae | 2016-05-20 13:30:33 +0100 | [diff] [blame] | 221 | } |
| 222 | MP_DEFINE_CONST_FUN_OBJ_0(machine_disable_irq_obj, machine_disable_irq); |
| 223 | |
Damien George | 927388e | 2016-06-01 17:26:49 +0100 | [diff] [blame] | 224 | STATIC mp_obj_t machine_enable_irq(mp_obj_t state_in) { |
| 225 | uint32_t state = mp_obj_get_int(state_in); |
| 226 | ets_loop_iter_disable = (state >> ETS_LOOP_ITER_BIT) & 1; |
| 227 | enable_irq(state & ~(1 << ETS_LOOP_ITER_BIT)); |
Damien George | 9a368ae | 2016-05-20 13:30:33 +0100 | [diff] [blame] | 228 | return mp_const_none; |
| 229 | } |
| 230 | MP_DEFINE_CONST_FUN_OBJ_1(machine_enable_irq_obj, machine_enable_irq); |
| 231 | |
Paul Sokolovsky | 5d7c408 | 2015-12-31 00:51:08 +0200 | [diff] [blame] | 232 | STATIC const mp_rom_map_elem_t machine_module_globals_table[] = { |
| 233 | { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_umachine) }, |
| 234 | { MP_ROM_QSTR(MP_QSTR_mem8), MP_ROM_PTR(&machine_mem8_obj) }, |
| 235 | { MP_ROM_QSTR(MP_QSTR_mem16), MP_ROM_PTR(&machine_mem16_obj) }, |
| 236 | { MP_ROM_QSTR(MP_QSTR_mem32), MP_ROM_PTR(&machine_mem32_obj) }, |
Paul Sokolovsky | 7193086 | 2016-01-05 21:23:23 +0200 | [diff] [blame] | 237 | |
Damien George | f7be803 | 2016-02-17 15:19:03 +0000 | [diff] [blame] | 238 | { MP_ROM_QSTR(MP_QSTR_freq), MP_ROM_PTR(&machine_freq_obj) }, |
Paul Sokolovsky | 81fd568 | 2016-04-05 00:20:25 +0300 | [diff] [blame] | 239 | { MP_ROM_QSTR(MP_QSTR_reset), MP_ROM_PTR(&machine_reset_obj) }, |
Paul Sokolovsky | 050e645 | 2016-04-15 22:07:28 +0300 | [diff] [blame] | 240 | { MP_ROM_QSTR(MP_QSTR_reset_cause), MP_ROM_PTR(&machine_reset_cause_obj) }, |
Paul Sokolovsky | de12502 | 2016-04-05 00:57:49 +0300 | [diff] [blame] | 241 | { MP_ROM_QSTR(MP_QSTR_unique_id), MP_ROM_PTR(&machine_unique_id_obj) }, |
Paul Sokolovsky | c2070d7 | 2016-08-07 15:51:04 +0300 | [diff] [blame] | 242 | { MP_ROM_QSTR(MP_QSTR_idle), MP_ROM_PTR(&machine_idle_obj) }, |
Paul Sokolovsky | 31ad1bb | 2016-08-07 16:20:01 +0300 | [diff] [blame] | 243 | { MP_ROM_QSTR(MP_QSTR_sleep), MP_ROM_PTR(&machine_sleep_obj) }, |
Damien George | 32d7cf6 | 2016-04-21 11:43:37 +0100 | [diff] [blame] | 244 | { MP_ROM_QSTR(MP_QSTR_deepsleep), MP_ROM_PTR(&machine_deepsleep_obj) }, |
Damien George | f7be803 | 2016-02-17 15:19:03 +0000 | [diff] [blame] | 245 | |
Damien George | 9a368ae | 2016-05-20 13:30:33 +0100 | [diff] [blame] | 246 | { MP_ROM_QSTR(MP_QSTR_disable_irq), MP_ROM_PTR(&machine_disable_irq_obj) }, |
| 247 | { MP_ROM_QSTR(MP_QSTR_enable_irq), MP_ROM_PTR(&machine_enable_irq_obj) }, |
| 248 | |
Damien George | cff2b7a | 2016-05-31 14:06:50 +0100 | [diff] [blame] | 249 | { MP_ROM_QSTR(MP_QSTR_time_pulse_us), MP_ROM_PTR(&machine_time_pulse_us_obj) }, |
| 250 | |
Damien George | 32d7cf6 | 2016-04-21 11:43:37 +0100 | [diff] [blame] | 251 | { MP_ROM_QSTR(MP_QSTR_RTC), MP_ROM_PTR(&pyb_rtc_type) }, |
Paul Sokolovsky | 7193086 | 2016-01-05 21:23:23 +0200 | [diff] [blame] | 252 | { MP_ROM_QSTR(MP_QSTR_Timer), MP_ROM_PTR(&esp_timer_type) }, |
Paul Sokolovsky | 263aaa7 | 2016-08-28 14:48:49 +0300 | [diff] [blame] | 253 | { MP_ROM_QSTR(MP_QSTR_WDT), MP_ROM_PTR(&esp_wdt_type) }, |
Paul Sokolovsky | 26f0616 | 2016-02-03 15:23:16 +0200 | [diff] [blame] | 254 | { MP_ROM_QSTR(MP_QSTR_Pin), MP_ROM_PTR(&pyb_pin_type) }, |
Paul Sokolovsky | 287180a | 2017-01-01 19:17:00 +0300 | [diff] [blame] | 255 | { MP_ROM_QSTR(MP_QSTR_Signal), MP_ROM_PTR(&machine_signal_type) }, |
Damien George | 632d8ef | 2016-03-02 13:37:27 +0000 | [diff] [blame] | 256 | { MP_ROM_QSTR(MP_QSTR_PWM), MP_ROM_PTR(&pyb_pwm_type) }, |
Damien George | b62bead | 2016-03-08 22:59:58 +0000 | [diff] [blame] | 257 | { MP_ROM_QSTR(MP_QSTR_ADC), MP_ROM_PTR(&pyb_adc_type) }, |
Damien George | 1a0a323 | 2016-04-06 19:45:52 +0300 | [diff] [blame] | 258 | { MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&pyb_uart_type) }, |
Damien George | a525493 | 2016-04-12 13:55:20 +0100 | [diff] [blame] | 259 | { MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&machine_i2c_type) }, |
Damien George | ad16685 | 2016-12-08 14:41:58 +1100 | [diff] [blame] | 260 | { MP_ROM_QSTR(MP_QSTR_SPI), MP_ROM_PTR(&machine_hspi_type) }, |
Damien George | 32d7cf6 | 2016-04-21 11:43:37 +0100 | [diff] [blame] | 261 | |
| 262 | // wake abilities |
| 263 | { MP_ROM_QSTR(MP_QSTR_DEEPSLEEP), MP_ROM_INT(MACHINE_WAKE_DEEPSLEEP) }, |
| 264 | |
| 265 | // reset causes |
Damien George | f3b5480 | 2016-09-08 12:50:38 +1000 | [diff] [blame] | 266 | { MP_ROM_QSTR(MP_QSTR_PWRON_RESET), MP_ROM_INT(REASON_DEFAULT_RST) }, |
Damien George | 32d7cf6 | 2016-04-21 11:43:37 +0100 | [diff] [blame] | 267 | { MP_ROM_QSTR(MP_QSTR_HARD_RESET), MP_ROM_INT(REASON_EXT_SYS_RST) }, |
| 268 | { MP_ROM_QSTR(MP_QSTR_DEEPSLEEP_RESET), MP_ROM_INT(REASON_DEEP_SLEEP_AWAKE) }, |
Paul Sokolovsky | 1708fe3 | 2016-09-04 19:45:58 +0300 | [diff] [blame] | 269 | { MP_ROM_QSTR(MP_QSTR_WDT_RESET), MP_ROM_INT(REASON_WDT_RST) }, |
| 270 | { MP_ROM_QSTR(MP_QSTR_SOFT_RESET), MP_ROM_INT(REASON_SOFT_RESTART) }, |
Paul Sokolovsky | 5d7c408 | 2015-12-31 00:51:08 +0200 | [diff] [blame] | 271 | }; |
| 272 | |
| 273 | STATIC MP_DEFINE_CONST_DICT(machine_module_globals, machine_module_globals_table); |
| 274 | |
| 275 | const mp_obj_module_t mp_module_machine = { |
| 276 | .base = { &mp_type_module }, |
Paul Sokolovsky | 5d7c408 | 2015-12-31 00:51:08 +0200 | [diff] [blame] | 277 | .globals = (mp_obj_dict_t*)&machine_module_globals, |
| 278 | }; |
| 279 | |
| 280 | #endif // MICROPY_PY_MACHINE |