diff --git a/cc3200/mods/pybpin.c b/cc3200/mods/pybpin.c index 8efc3cd6ad..6584198863 100644 --- a/cc3200/mods/pybpin.c +++ b/cc3200/mods/pybpin.c @@ -92,15 +92,17 @@ /****************************************************************************** DECLARE PRIVATE FUNCTIONS ******************************************************************************/ +STATIC void pin_obj_configure (const pin_obj_t *self); +STATIC void pin_get_hibernate_pin_and_idx (const pin_obj_t *self, uint *wake_pin, uint *idx); +STATIC void pin_extint_enable (mp_obj_t self_in); +STATIC void pin_extint_disable (mp_obj_t self_in); +STATIC void pin_verify_af (uint af); +STATIC void pin_extint_register(pin_obj_t *self, uint32_t intmode, uint32_t priority); STATIC void GPIOA0IntHandler (void); STATIC void GPIOA1IntHandler (void); STATIC void GPIOA2IntHandler (void); STATIC void GPIOA3IntHandler (void); STATIC void EXTI_Handler(uint port); -STATIC void pin_obj_configure (const pin_obj_t *self); -STATIC void pin_get_hibernate_pin_and_idx (const pin_obj_t *self, uint *wake_pin, uint *idx); -STATIC void pin_extint_enable (mp_obj_t self_in); -STATIC void pin_extint_disable (mp_obj_t self_in); /****************************************************************************** DEFINE CONSTANTS @@ -159,12 +161,6 @@ pin_obj_t *pin_find(mp_obj_t user_obj) { nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, mpexception_value_invalid_arguments)); } -void pin_verify_af (uint af) { - if (af > PIN_MODE_15) { - nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, mpexception_value_invalid_arguments)); - } -} - void pin_config (pin_obj_t *self, uint af, uint mode, uint type, uint strength) { // configure the pin in analog mode self->af = af, self->mode = mode, self->type = type, self->strength = strength; @@ -175,37 +171,6 @@ void pin_config (pin_obj_t *self, uint af, uint mode, uint type, uint strength) pybsleep_add ((const mp_obj_t)self, (WakeUpCB_t)pin_obj_configure); } -void pin_extint_register(pin_obj_t *self, uint32_t intmode, uint32_t priority) { - void *handler; - uint32_t intnum; - - // configure the interrupt type - MAP_GPIOIntTypeSet(self->port, self->bit, intmode); - switch (self->port) { - case GPIOA0_BASE: - handler = GPIOA0IntHandler; - intnum = INT_GPIOA0; - break; - case GPIOA1_BASE: - handler = GPIOA1IntHandler; - intnum = INT_GPIOA1; - break; - case GPIOA2_BASE: - handler = GPIOA2IntHandler; - intnum = INT_GPIOA2; - break; - case GPIOA3_BASE: - default: - handler = GPIOA3IntHandler; - intnum = INT_GPIOA3; - break; - } - MAP_GPIOIntRegister(self->port, handler); - // set the interrupt to the lowest priority, to make sure that - // no other ISRs will be preemted by this one - MAP_IntPrioritySet(intnum, priority); -} - /****************************************************************************** DEFINE PRIVATE FUNCTIONS ******************************************************************************/ @@ -326,6 +291,77 @@ STATIC void pin_extint_disable (mp_obj_t self_in) { MAP_GPIOIntDisable(self->port, self->bit); } +STATIC void pin_verify_af (uint af) { + if (af > PIN_MODE_15) { + nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, mpexception_value_invalid_arguments)); + } +} + +STATIC void pin_extint_register(pin_obj_t *self, uint32_t intmode, uint32_t priority) { + void *handler; + uint32_t intnum; + + // configure the interrupt type + MAP_GPIOIntTypeSet(self->port, self->bit, intmode); + switch (self->port) { + case GPIOA0_BASE: + handler = GPIOA0IntHandler; + intnum = INT_GPIOA0; + break; + case GPIOA1_BASE: + handler = GPIOA1IntHandler; + intnum = INT_GPIOA1; + break; + case GPIOA2_BASE: + handler = GPIOA2IntHandler; + intnum = INT_GPIOA2; + break; + case GPIOA3_BASE: + default: + handler = GPIOA3IntHandler; + intnum = INT_GPIOA3; + break; + } + MAP_GPIOIntRegister(self->port, handler); + // set the interrupt to the lowest priority, to make sure that + // no other ISRs will be preemted by this one + MAP_IntPrioritySet(intnum, priority); +} + +STATIC void GPIOA0IntHandler (void) { + EXTI_Handler(GPIOA0_BASE); +} + +STATIC void GPIOA1IntHandler (void) { + EXTI_Handler(GPIOA1_BASE); +} + +STATIC void GPIOA2IntHandler (void) { + EXTI_Handler(GPIOA2_BASE); +} + +STATIC void GPIOA3IntHandler (void) { + EXTI_Handler(GPIOA3_BASE); +} + +// common interrupt handler +STATIC void EXTI_Handler(uint port) { + uint32_t bits = MAP_GPIOIntStatus(port, true); + MAP_GPIOIntClear(port, bits); + + // might be that we have more than one Pin interrupt pending + // therefore we must loop through all of the 8 possible bits + for (int i = 0; i < 8; i++) { + uint32_t bit = (1 << i); + if (bit & bits) { + pin_obj_t *self = (pin_obj_t *)pin_find_pin_by_port_bit(&pin_cpu_pins_locals_dict, port, bit); + mp_obj_t _callback = mpcallback_find(self); + mpcallback_handler(_callback); + } + } +} + + /******************************************************************************/ // Micro Python bindings @@ -747,36 +783,3 @@ STATIC const mp_cb_methods_t pin_cb_methods = { .disable = pin_extint_disable, }; -STATIC void GPIOA0IntHandler (void) { - EXTI_Handler(GPIOA0_BASE); -} - -STATIC void GPIOA1IntHandler (void) { - EXTI_Handler(GPIOA1_BASE); -} - -STATIC void GPIOA2IntHandler (void) { - EXTI_Handler(GPIOA2_BASE); -} - -STATIC void GPIOA3IntHandler (void) { - EXTI_Handler(GPIOA3_BASE); -} - -// common interrupt handler -STATIC void EXTI_Handler(uint port) { - uint32_t bits = MAP_GPIOIntStatus(port, true); - MAP_GPIOIntClear(port, bits); - - // might be that we have more than one Pin interrupt pending - // therefore we must loop through all of the 8 possible bits - for (int i = 0; i < 8; i++) { - uint32_t bit = (1 << i); - if (bit & bits) { - pin_obj_t *self = (pin_obj_t *)pin_find_pin_by_port_bit(&pin_cpu_pins_locals_dict, port, bit); - mp_obj_t _callback = mpcallback_find(self); - mpcallback_handler(_callback); - } - } -} - diff --git a/cc3200/mods/pybpin.h b/cc3200/mods/pybpin.h index a31a41528f..6f969d0a40 100644 --- a/cc3200/mods/pybpin.h +++ b/cc3200/mods/pybpin.h @@ -67,14 +67,9 @@ extern const mp_obj_type_t pin_cpu_pins_obj_type; extern const mp_obj_dict_t pin_cpu_pins_locals_dict; void pin_init0(void); -void pin_verify_af (uint af); void pin_config(pin_obj_t *self, uint af, uint mode, uint type, uint strength); -void pin_extint_register(pin_obj_t *self, uint32_t intmode, uint32_t priority); pin_obj_t *pin_find(mp_obj_t user_obj); pin_obj_t *pin_find_named_pin(const mp_obj_dict_t *named_pins, mp_obj_t name); pin_obj_t *pin_find_pin_by_port_bit (const mp_obj_dict_t *named_pins, uint port, uint bit); -uint32_t pin_get_mode(const pin_obj_t *self); -uint32_t pin_get_type(const pin_obj_t *self); -uint32_t pin_get_strenght(const pin_obj_t *self); #endif // PYBPIN_H_