summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrobert-hh <robert@hammelrath.com>2022-06-05 14:28:08 +0200
committerDamien George <damien@micropython.org>2022-10-06 22:47:52 +1100
commit7d281f6165d50a75ba21eda4d8d253a8982f3543 (patch)
tree0a9829b444254bf12bebe4304f47840a8db0d9e3
parent4b6f6ccf88c652401e39e621b515d06140d35225 (diff)
samd/modmachine: Add disable_irq(), enable_irq() and idle() to machine.
No specific features.
-rw-r--r--ports/samd/modmachine.c23
-rw-r--r--ports/samd/mpconfigport.h12
2 files changed, 35 insertions, 0 deletions
diff --git a/ports/samd/modmachine.c b/ports/samd/modmachine.c
index e0a037846..eafe9972d 100644
--- a/ports/samd/modmachine.c
+++ b/ports/samd/modmachine.c
@@ -120,6 +120,25 @@ STATIC mp_obj_t machine_unique_id(void) {
}
STATIC MP_DEFINE_CONST_FUN_OBJ_0(machine_unique_id_obj, machine_unique_id);
+STATIC mp_obj_t machine_idle(void) {
+ MICROPY_EVENT_POLL_HOOK;
+ return mp_const_none;
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(machine_idle_obj, machine_idle);
+
+STATIC mp_obj_t machine_disable_irq(void) {
+ uint32_t state = MICROPY_BEGIN_ATOMIC_SECTION();
+ return mp_obj_new_int(state);
+}
+MP_DEFINE_CONST_FUN_OBJ_0(machine_disable_irq_obj, machine_disable_irq);
+
+STATIC mp_obj_t machine_enable_irq(mp_obj_t state_in) {
+ uint32_t state = mp_obj_get_int(state_in);
+ MICROPY_END_ATOMIC_SECTION(state);
+ return mp_const_none;
+}
+MP_DEFINE_CONST_FUN_OBJ_1(machine_enable_irq_obj, machine_enable_irq);
+
STATIC const mp_rom_map_elem_t machine_module_globals_table[] = {
{ MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_umachine) },
{ MP_ROM_QSTR(MP_QSTR_reset), MP_ROM_PTR(&machine_reset_obj) },
@@ -136,6 +155,10 @@ STATIC const mp_rom_map_elem_t machine_module_globals_table[] = {
{ MP_ROM_QSTR(MP_QSTR_PWM), MP_ROM_PTR(&machine_pwm_type) },
{ MP_ROM_QSTR(MP_QSTR_SoftI2C), MP_ROM_PTR(&mp_machine_soft_i2c_type) },
{ MP_ROM_QSTR(MP_QSTR_SoftSPI), MP_ROM_PTR(&mp_machine_soft_spi_type) },
+
+ { MP_ROM_QSTR(MP_QSTR_idle), MP_ROM_PTR(&machine_idle_obj) },
+ { MP_ROM_QSTR(MP_QSTR_disable_irq), MP_ROM_PTR(&machine_disable_irq_obj) },
+ { MP_ROM_QSTR(MP_QSTR_enable_irq), MP_ROM_PTR(&machine_enable_irq_obj) },
};
STATIC MP_DEFINE_CONST_DICT(machine_module_globals, machine_module_globals_table);
diff --git a/ports/samd/mpconfigport.h b/ports/samd/mpconfigport.h
index 574d47b03..fba4ee13d 100644
--- a/ports/samd/mpconfigport.h
+++ b/ports/samd/mpconfigport.h
@@ -111,6 +111,18 @@
#define MP_STATE_PORT MP_STATE_VM
// Miscellaneous settings
+__attribute__((always_inline)) static inline void enable_irq(uint32_t state) {
+ __set_PRIMASK(state);
+}
+
+__attribute__((always_inline)) static inline uint32_t disable_irq(void) {
+ uint32_t state = __get_PRIMASK();
+ __disable_irq();
+ return state;
+}
+
+#define MICROPY_BEGIN_ATOMIC_SECTION() disable_irq()
+#define MICROPY_END_ATOMIC_SECTION(state) enable_irq(state)
#define MICROPY_EVENT_POLL_HOOK \
do { \