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; }
// Initialize coding key scan (GPIO) operation. // Config interrupt at negative edge of signal-A void CodingKeyInit(void) { //enable pull up resister. GpioClrRegOneBit(CODING_KEY_A_PORT_OE, CODING_KEY_A_BIT); GpioClrRegOneBit(CODING_KEY_A_PORT_PU, CODING_KEY_A_BIT); GpioClrRegOneBit(CODING_KEY_A_PORT_PD, CODING_KEY_A_BIT); //enable pull up resister. GpioClrRegOneBit(CODING_KEY_B_PORT_OE, CODING_KEY_B_BIT); GpioClrRegOneBit(CODING_KEY_B_PORT_PU, CODING_KEY_B_BIT); GpioClrRegOneBit(CODING_KEY_B_PORT_PD, CODING_KEY_B_BIT); //enable int GpioIntEn(CODING_KEY_A_PORT_INT, CODING_KEY_A_BIT, GPIO_NEG_EDGE_TRIGGER); ClockWiseCnt = 0; CounterClockWiseCnt = 0; //enable gpio irqc NVIC_EnableIRQ(GPIO_IRQn); }