Esempio n. 1
0
rtems_status_code rtems_bsp_enable_interrupt(
    uint32_t bank,
    uint32_t pin,
    rtems_gpio_interrupt interrupt
) {

    /* Enable IRQ generation for the specific pin */
    mmio_set(bbb_reg(bank, AM335X_GPIO_IRQSTATUS_SET_0), BIT(pin));

    switch ( interrupt ) {
    case FALLING_EDGE:
        /* Enables asynchronous falling edge detection. */
        mmio_set(bbb_reg(bank, AM335X_GPIO_FALLINGDETECT), BIT(pin));
        break;
    case RISING_EDGE:
        /* Enables asynchronous rising edge detection. */
        mmio_set(bbb_reg(bank, AM335X_GPIO_RISINGDETECT), BIT(pin));
        break;
    case BOTH_EDGES:
        /* Enables asynchronous falling edge detection. */
        mmio_set(bbb_reg(bank, AM335X_GPIO_FALLINGDETECT), BIT(pin));

        /* Enables asynchronous rising edge detection. */
        mmio_set(bbb_reg(bank, AM335X_GPIO_RISINGDETECT), BIT(pin));
        break;
    case LOW_LEVEL:
        /* Enables pin low level detection. */
        mmio_set(bbb_reg(bank, AM335X_GPIO_LEVELDETECT0), BIT(pin));
        break;
    case HIGH_LEVEL:
        /* Enables pin high level detection. */
        mmio_set(bbb_reg(bank, AM335X_GPIO_LEVELDETECT1), BIT(pin));
        break;
    case BOTH_LEVELS:
        /* Enables pin low level detection. */
        mmio_set(bbb_reg(bank, AM335X_GPIO_LEVELDETECT0), BIT(pin));

        /* Enables pin high level detection. */
        mmio_set(bbb_reg(bank, AM335X_GPIO_LEVELDETECT1), BIT(pin));
        break;
    case NONE:
    default:
        return RTEMS_UNSATISFIED;
    }

    /* The detection starts after 5 clock cycles as per AM335X TRM
     * This period is required to clean the synchronization edge/
     * level detection pipeline
     */
    asm volatile("nop");
    asm volatile("nop");
    asm volatile("nop");
    asm volatile("nop");
    asm volatile("nop");

    return RTEMS_SUCCESSFUL;
}
Esempio n. 2
0
static rtems_status_code bbb_select_pin_function(
  uint32_t bank,
  uint32_t pin,
  uint32_t type
) {

  if ( type == BBB_DIGITAL_IN ) {
    mmio_set(bbb_reg(bank, AM335X_GPIO_OE), BIT(pin));
  } else {
    mmio_clear(bbb_reg(bank, AM335X_GPIO_OE), BIT(pin));
  }

  return RTEMS_SUCCESSFUL;
}
Esempio n. 3
0
uint32_t rtems_gpio_bsp_interrupt_line(rtems_vector_number vector)
{
  uint32_t event_status;
  uint8_t bank_nr = 0;

  /* Following loop will get the bank number from vector number */
  while (bank_nr < GPIO_BANK_COUNT && vector != gpio_bank_vector[bank_nr])
  {
  	bank_nr++;
  }

  /* Retrieve the interrupt event status. */
  event_status = mmio_read(bbb_reg(bank_nr, AM335X_GPIO_IRQSTATUS_0));

  /* Clear the interrupt line. */
  mmio_write(
    (bbb_reg(bank_nr, AM335X_GPIO_IRQSTATUS_0)), event_status);
  
  return event_status;
}
Esempio n. 4
0
uint32_t rtems_gpio_bsp_get_value(uint32_t bank, uint32_t pin)
{
  return (mmio_read(bbb_reg(bank, AM335X_GPIO_DATAIN)) & BIT(pin));
}
Esempio n. 5
0
rtems_status_code rtems_gpio_bsp_clear(uint32_t bank, uint32_t pin)
{
  mmio_set(bbb_reg(bank, AM335X_GPIO_CLEARDATAOUT), BIT(pin));

  return RTEMS_SUCCESSFUL;
}
Esempio n. 6
0
uint32_t rtems_gpio_bsp_multi_read(uint32_t bank, uint32_t bitmask)
{
  return (bbb_reg(bank, AM335X_GPIO_DATAIN) & bitmask);
}
Esempio n. 7
0
rtems_status_code rtems_gpio_bsp_multi_clear(uint32_t bank, uint32_t bitmask)
{
  mmio_set(bbb_reg(bank, AM335X_GPIO_CLEARDATAOUT), bitmask);

  return RTEMS_SUCCESSFUL;
}