Branch data Line data Source code
1 : : /*
2 : : * This file is part of the MicroPython project, http://micropython.org/
3 : : *
4 : : * The MIT License (MIT)
5 : : *
6 : : * Copyright (c) 2023 Damien P. George
7 : : *
8 : : * Permission is hereby granted, free of charge, to any person obtaining a copy
9 : : * of this software and associated documentation files (the "Software"), to deal
10 : : * in the Software without restriction, including without limitation the rights
11 : : * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12 : : * copies of the Software, and to permit persons to whom the Software is
13 : : * furnished to do so, subject to the following conditions:
14 : : *
15 : : * The above copyright notice and this permission notice shall be included in
16 : : * all copies or substantial portions of the Software.
17 : : *
18 : : * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 : : * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 : : * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21 : : * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 : : * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23 : : * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24 : : * THE SOFTWARE.
25 : : */
26 : :
27 : : #include "py/builtin.h"
28 : : #include "py/runtime.h"
29 : :
30 : : #if MICROPY_PY_MACHINE
31 : :
32 : : #include "extmod/modmachine.h"
33 : : #include "shared/runtime/pyexec.h"
34 : :
35 : : #if MICROPY_PY_MACHINE_DHT_READINTO
36 : : #include "drivers/dht/dht.h"
37 : : #endif
38 : :
39 : : #if !MICROPY_PY_SYS_EXIT
40 : : #error MICROPY_PY_MACHINE requires MICROPY_PY_SYS_EXIT
41 : : #endif
42 : :
43 : : // The port must provide implementations of these low-level machine functions.
44 : :
45 : : static void mp_machine_idle(void);
46 : :
47 : : #if MICROPY_PY_MACHINE_BOOTLOADER
48 : : NORETURN void mp_machine_bootloader(size_t n_args, const mp_obj_t *args);
49 : : #endif
50 : :
51 : : #if MICROPY_PY_MACHINE_RESET
52 : : NORETURN static void mp_machine_reset(void);
53 : : static mp_int_t mp_machine_reset_cause(void);
54 : : #endif
55 : :
56 : : #if MICROPY_PY_MACHINE_BARE_METAL_FUNCS
57 : : static mp_obj_t mp_machine_unique_id(void);
58 : : static mp_obj_t mp_machine_get_freq(void);
59 : : static void mp_machine_set_freq(size_t n_args, const mp_obj_t *args);
60 : : static void mp_machine_lightsleep(size_t n_args, const mp_obj_t *args);
61 : : NORETURN static void mp_machine_deepsleep(size_t n_args, const mp_obj_t *args);
62 : : #endif
63 : :
64 : : // The port can provide additional machine-module implementation in this file.
65 : : #ifdef MICROPY_PY_MACHINE_INCLUDEFILE
66 : : #include MICROPY_PY_MACHINE_INCLUDEFILE
67 : : #endif
68 : :
69 : : #if MICROPY_PY_MACHINE_BOOTLOADER
70 : : NORETURN mp_obj_t machine_bootloader(size_t n_args, const mp_obj_t *args) {
71 : : mp_machine_bootloader(n_args, args);
72 : : }
73 : : MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(machine_bootloader_obj, 0, 1, machine_bootloader);
74 : : #endif
75 : :
76 : 0 : static mp_obj_t machine_idle(void) {
77 : 0 : mp_machine_idle();
78 : 0 : return mp_const_none;
79 : : }
80 : : static MP_DEFINE_CONST_FUN_OBJ_0(machine_idle_obj, machine_idle);
81 : :
82 : : #if MICROPY_PY_MACHINE_RESET
83 : :
84 : : NORETURN static mp_obj_t machine_reset(void) {
85 : : mp_machine_reset();
86 : : }
87 : : MP_DEFINE_CONST_FUN_OBJ_0(machine_reset_obj, machine_reset);
88 : :
89 : : static mp_obj_t machine_reset_cause(void) {
90 : : return MP_OBJ_NEW_SMALL_INT(mp_machine_reset_cause());
91 : : }
92 : : MP_DEFINE_CONST_FUN_OBJ_0(machine_reset_cause_obj, machine_reset_cause);
93 : :
94 : : #endif
95 : :
96 : : #if MICROPY_PY_MACHINE_BARE_METAL_FUNCS
97 : :
98 : : static mp_obj_t machine_unique_id(void) {
99 : : return mp_machine_unique_id();
100 : : }
101 : : MP_DEFINE_CONST_FUN_OBJ_0(machine_unique_id_obj, machine_unique_id);
102 : :
103 : : static mp_obj_t machine_freq(size_t n_args, const mp_obj_t *args) {
104 : : if (n_args == 0) {
105 : : return mp_machine_get_freq();
106 : : } else {
107 : : mp_machine_set_freq(n_args, args);
108 : : return mp_const_none;
109 : : }
110 : : }
111 : : MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(machine_freq_obj, 0, MICROPY_PY_MACHINE_FREQ_NUM_ARGS_MAX, machine_freq);
112 : :
113 : : static mp_obj_t machine_lightsleep(size_t n_args, const mp_obj_t *args) {
114 : : mp_machine_lightsleep(n_args, args);
115 : : return mp_const_none;
116 : : }
117 : : MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(machine_lightsleep_obj, 0, 1, machine_lightsleep);
118 : :
119 : : NORETURN static mp_obj_t machine_deepsleep(size_t n_args, const mp_obj_t *args) {
120 : : mp_machine_deepsleep(n_args, args);
121 : : }
122 : : MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(machine_deepsleep_obj, 0, 1, machine_deepsleep);
123 : :
124 : : #endif
125 : :
126 : : #if MICROPY_PY_MACHINE_DISABLE_IRQ_ENABLE_IRQ
127 : :
128 : : static mp_obj_t machine_disable_irq(void) {
129 : : uint32_t state = MICROPY_BEGIN_ATOMIC_SECTION();
130 : : return mp_obj_new_int(state);
131 : : }
132 : : static MP_DEFINE_CONST_FUN_OBJ_0(machine_disable_irq_obj, machine_disable_irq);
133 : :
134 : : static mp_obj_t machine_enable_irq(mp_obj_t state_in) {
135 : : uint32_t state = mp_obj_get_int(state_in);
136 : : MICROPY_END_ATOMIC_SECTION(state);
137 : : return mp_const_none;
138 : : }
139 : : static MP_DEFINE_CONST_FUN_OBJ_1(machine_enable_irq_obj, machine_enable_irq);
140 : :
141 : : #endif
142 : :
143 : : static const mp_rom_map_elem_t machine_module_globals_table[] = {
144 : : { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_machine) },
145 : :
146 : : // Memory access objects.
147 : : #if MICROPY_PY_MACHINE_MEMX
148 : : { MP_ROM_QSTR(MP_QSTR_mem8), MP_ROM_PTR(&machine_mem8_obj) },
149 : : { MP_ROM_QSTR(MP_QSTR_mem16), MP_ROM_PTR(&machine_mem16_obj) },
150 : : { MP_ROM_QSTR(MP_QSTR_mem32), MP_ROM_PTR(&machine_mem32_obj) },
151 : : #endif
152 : :
153 : : // Miscellaneous functions.
154 : : #if MICROPY_PY_MACHINE_BARE_METAL_FUNCS
155 : : { MP_ROM_QSTR(MP_QSTR_unique_id), MP_ROM_PTR(&machine_unique_id_obj) },
156 : : #endif
157 : :
158 : : // Reset related functions.
159 : : { MP_ROM_QSTR(MP_QSTR_soft_reset), MP_ROM_PTR(&mp_sys_exit_obj) },
160 : : #if MICROPY_PY_MACHINE_BOOTLOADER
161 : : { MP_ROM_QSTR(MP_QSTR_bootloader), MP_ROM_PTR(&machine_bootloader_obj) },
162 : : #endif
163 : : #if MICROPY_PY_MACHINE_RESET
164 : : { MP_ROM_QSTR(MP_QSTR_reset), MP_ROM_PTR(&machine_reset_obj) },
165 : : { MP_ROM_QSTR(MP_QSTR_reset_cause), MP_ROM_PTR(&machine_reset_cause_obj) },
166 : : #endif
167 : :
168 : : // Power related functions.
169 : : { MP_ROM_QSTR(MP_QSTR_idle), MP_ROM_PTR(&machine_idle_obj) },
170 : : #if MICROPY_PY_MACHINE_BARE_METAL_FUNCS
171 : : { MP_ROM_QSTR(MP_QSTR_freq), MP_ROM_PTR(&machine_freq_obj) },
172 : : { MP_ROM_QSTR(MP_QSTR_lightsleep), MP_ROM_PTR(&machine_lightsleep_obj) },
173 : : { MP_ROM_QSTR(MP_QSTR_deepsleep), MP_ROM_PTR(&machine_deepsleep_obj) },
174 : : #endif
175 : :
176 : : // Interrupt related functions.
177 : : #if MICROPY_PY_MACHINE_DISABLE_IRQ_ENABLE_IRQ
178 : : { MP_ROM_QSTR(MP_QSTR_disable_irq), MP_ROM_PTR(&machine_disable_irq_obj) },
179 : : { MP_ROM_QSTR(MP_QSTR_enable_irq), MP_ROM_PTR(&machine_enable_irq_obj) },
180 : : #endif
181 : :
182 : : // Functions for bit protocols.
183 : : #if MICROPY_PY_MACHINE_BITSTREAM
184 : : { MP_ROM_QSTR(MP_QSTR_bitstream), MP_ROM_PTR(&machine_bitstream_obj) },
185 : : #endif
186 : : #if MICROPY_PY_MACHINE_DHT_READINTO
187 : : { MP_ROM_QSTR(MP_QSTR_dht_readinto), MP_ROM_PTR(&dht_readinto_obj) },
188 : : #endif
189 : : #if MICROPY_PY_MACHINE_PULSE
190 : : { MP_ROM_QSTR(MP_QSTR_time_pulse_us), MP_ROM_PTR(&machine_time_pulse_us_obj) },
191 : : #endif
192 : :
193 : : // Classes for PinBase and Signal.
194 : : #if MICROPY_PY_MACHINE_PIN_BASE
195 : : { MP_ROM_QSTR(MP_QSTR_PinBase), MP_ROM_PTR(&machine_pinbase_type) },
196 : : #endif
197 : : #if MICROPY_PY_MACHINE_SIGNAL
198 : : { MP_ROM_QSTR(MP_QSTR_Signal), MP_ROM_PTR(&machine_signal_type) },
199 : : #endif
200 : :
201 : : // Classes for software bus protocols.
202 : : #if MICROPY_PY_MACHINE_SOFTI2C
203 : : { MP_ROM_QSTR(MP_QSTR_SoftI2C), MP_ROM_PTR(&mp_machine_soft_i2c_type) },
204 : : #endif
205 : : #if MICROPY_PY_MACHINE_SOFTSPI
206 : : { MP_ROM_QSTR(MP_QSTR_SoftSPI), MP_ROM_PTR(&mp_machine_soft_spi_type) },
207 : : #endif
208 : :
209 : : // Classes for hardware peripherals.
210 : : #if MICROPY_PY_MACHINE_ADC
211 : : { MP_ROM_QSTR(MP_QSTR_ADC), MP_ROM_PTR(&machine_adc_type) },
212 : : #endif
213 : : #if MICROPY_PY_MACHINE_ADC_BLOCK
214 : : { MP_ROM_QSTR(MP_QSTR_ADCBlock), MP_ROM_PTR(&machine_adc_block_type) },
215 : : #endif
216 : : #if MICROPY_PY_MACHINE_DAC
217 : : { MP_ROM_QSTR(MP_QSTR_DAC), MP_ROM_PTR(&machine_dac_type) },
218 : : #endif
219 : : #if MICROPY_PY_MACHINE_I2C
220 : : { MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&machine_i2c_type) },
221 : : #endif
222 : : #if MICROPY_PY_MACHINE_I2S
223 : : { MP_ROM_QSTR(MP_QSTR_I2S), MP_ROM_PTR(&machine_i2s_type) },
224 : : #endif
225 : : #if MICROPY_PY_MACHINE_PWM
226 : : { MP_ROM_QSTR(MP_QSTR_PWM), MP_ROM_PTR(&machine_pwm_type) },
227 : : #endif
228 : : #if MICROPY_PY_MACHINE_SPI
229 : : { MP_ROM_QSTR(MP_QSTR_SPI), MP_ROM_PTR(&machine_spi_type) },
230 : : #endif
231 : : #if MICROPY_PY_MACHINE_UART
232 : : { MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&machine_uart_type) },
233 : : #endif
234 : : #if MICROPY_HW_ENABLE_USB_RUNTIME_DEVICE
235 : : { MP_ROM_QSTR(MP_QSTR_USBDevice), MP_ROM_PTR(&machine_usb_device_type) },
236 : : #endif
237 : : #if MICROPY_PY_MACHINE_WDT
238 : : { MP_ROM_QSTR(MP_QSTR_WDT), MP_ROM_PTR(&machine_wdt_type) },
239 : : #endif
240 : :
241 : : // A port can add extra entries to the module by defining the following macro.
242 : : #ifdef MICROPY_PY_MACHINE_EXTRA_GLOBALS
243 : : MICROPY_PY_MACHINE_EXTRA_GLOBALS
244 : : #endif
245 : : };
246 : : static MP_DEFINE_CONST_DICT(machine_module_globals, machine_module_globals_table);
247 : :
248 : : const mp_obj_module_t mp_module_machine = {
249 : : .base = { &mp_type_module },
250 : : .globals = (mp_obj_dict_t *)&machine_module_globals,
251 : : };
252 : :
253 : : MP_REGISTER_EXTENSIBLE_MODULE(MP_QSTR_machine, mp_module_machine);
254 : :
255 : : #endif // MICROPY_PY_MACHINE
|