OSStatus platform_gpio_irq_enable( const platform_gpio_t* gpio, platform_gpio_irq_trigger_t trigger, platform_gpio_irq_callback_t handler, void* arg ) { uint8_t intPort; int i; OSStatus err = kNoErr; platform_mcu_powersave_disable(); require_action_quiet( gpio != NULL && trigger != IRQ_TRIGGER_BOTH_EDGES, exit, err = kParamErr); switch( gpio->port ){ case GPIOA: intPort = GPIO_A_INT; break; case GPIOB: intPort = GPIO_B_INT; break; case GPIOC: intPort = GPIO_C_INT; break; default: err = kParamErr; goto exit; } for( i = 0; i < NUMBER_OF_GPIO_IRQ_LINES; i++ ){ if ( gpio_irq_data[i].port == gpio->port && gpio_irq_data[i].pin == gpio->pin){ /* GPIO IRQ already exist */ gpio_irq_data[ i ].handler = handler; gpio_irq_data[ i ].arg = arg; break; } } if(i == NUMBER_OF_GPIO_IRQ_LINES){ /* GPIO IRQ not exist */ for( i = 0; i < NUMBER_OF_GPIO_IRQ_LINES; i++ ){ if ( gpio_irq_data[i].handler == NULL ){ gpio_irq_data[ i ].port = gpio->port; gpio_irq_data[ i ].pin = gpio->pin; gpio_irq_data[ i ].handler = handler; gpio_irq_data[ i ].arg = arg; break; } } /* No space to add one */ if( i == NUMBER_OF_GPIO_IRQ_LINES) return kNoSpaceErr; } GpioIntClr(intPort, ((uint32_t)1 << gpio->pin)); if( trigger == IRQ_TRIGGER_RISING_EDGE ) GpioIntEn(intPort, ((uint32_t)1 << gpio->pin), GPIO_POS_EDGE_TRIGGER); else GpioIntEn(intPort, ((uint32_t)1 << gpio->pin), GPIO_NEG_EDGE_TRIGGER); exit: platform_mcu_powersave_enable(); return err; }
// Coding key signal-A interrupt. __attribute__((section(".driver.isr"))) void GpioInterrupt(void) { if(GpioIntFlagGet(CODING_KEY_A_PORT_INT) == CODING_KEY_A_BIT) { GpioIntClr(CODING_KEY_A_PORT_INT, CODING_KEY_A_BIT); if((GpioGetReg(CODING_KEY_A_PORT_IN) & CODING_KEY_A_BIT) || (ClockWiseCnt != 0) || (CounterClockWiseCnt != 0)) { return; } if(GpioGetReg(CODING_KEY_B_PORT_IN) & CODING_KEY_B_BIT) { //clockwise rotation ClockWiseCnt++; } else { //counterclockwise rotation CounterClockWiseCnt++; } } }