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;
}
Exemple #2
0
// 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);
}