diff options
author | Andre Marques <andre.lousa.marques@gmail.com> | 2015-07-27 17:01:44 +0100 |
---|---|---|
committer | Gedare Bloom <gedare@rtems.org> | 2015-08-06 10:53:46 -0400 |
commit | 61e7c698a44137afbc1447ed328b14a0d9e55016 (patch) | |
tree | d253c7a028c02c17089283eab1078b8533fde4b8 /c/src/lib/libbsp/arm/raspberrypi/irq/irq.c | |
parent | RTEMS GPIO API definition and implementation. (diff) | |
download | rtems-61e7c698a44137afbc1447ed328b14a0d9e55016.tar.bz2 |
Raspberry Pi implementation for the RTEMS GPIO API.
Added support for the new RTEMS GPIO API functions.
Test cases can be found in https://github.com/asuol/RTEMS_rpi_testing/tree/master/GPIO
Diffstat (limited to 'c/src/lib/libbsp/arm/raspberrypi/irq/irq.c')
-rw-r--r-- | c/src/lib/libbsp/arm/raspberrypi/irq/irq.c | 105 |
1 files changed, 96 insertions, 9 deletions
diff --git a/c/src/lib/libbsp/arm/raspberrypi/irq/irq.c b/c/src/lib/libbsp/arm/raspberrypi/irq/irq.c index 4132ef9693..0867b6b2f1 100644 --- a/c/src/lib/libbsp/arm/raspberrypi/irq/irq.c +++ b/c/src/lib/libbsp/arm/raspberrypi/irq/irq.c @@ -1,5 +1,5 @@ /** - * @file + * @file irq.c * * @ingroup raspberrypi_interrupt * @@ -7,6 +7,8 @@ */ /* + * Copyright (c) 2014 Andre Marques <andre.lousa.marques at gmail.com> + * * Copyright (c) 2009 * embedded brains GmbH * Obere Lagerstr. 30 @@ -52,22 +54,47 @@ void bsp_interrupt_dispatch(void) rtems_vector_number vector = 255; /* ARM timer */ - if (BCM2835_REG(BCM2835_IRQ_BASIC) && 0x1) + if ( BCM2835_REG(BCM2835_IRQ_BASIC) & 0x1 ) { vector = BCM2835_IRQ_ID_TIMER_0; - } /* UART 0 */ - else if ( BCM2835_REG(BCM2835_IRQ_BASIC) && BCM2835_BIT(19)) + else if ( BCM2835_REG(BCM2835_IRQ_BASIC) & BCM2835_BIT(19) ) { vector = BCM2835_IRQ_ID_UART; } + /* GPIO 0*/ + else if ( BCM2835_REG(BCM2835_IRQ_PENDING2) & BCM2835_BIT(17) ) + { + vector = BCM2835_IRQ_ID_GPIO_0; + } + else if ( BCM2835_REG(BCM2835_IRQ_PENDING2) & BCM2835_BIT(18) ) + { + vector = BCM2835_IRQ_ID_GPIO_1; + } + else if ( BCM2835_REG(BCM2835_IRQ_PENDING2) & BCM2835_BIT(19) ) + { + vector = BCM2835_IRQ_ID_GPIO_2; + } + else if ( BCM2835_REG(BCM2835_IRQ_PENDING2) & BCM2835_BIT(20) ) + { + vector = BCM2835_IRQ_ID_GPIO_3; + } + /* I2C */ + else if ( BCM2835_REG(BCM2835_IRQ_PENDING2) & BCM2835_BIT(21) ) + { + vector = BCM2835_IRQ_ID_I2C; + } + /* SPI */ + else if ( BCM2835_REG(BCM2835_IRQ_PENDING2) & BCM2835_BIT(22) ) + { + vector = BCM2835_IRQ_ID_SPI; + } if ( vector < 255 ) { bsp_interrupt_handler_dispatch(vector); } - } rtems_status_code bsp_interrupt_vector_enable(rtems_vector_number vector) @@ -75,8 +102,8 @@ rtems_status_code bsp_interrupt_vector_enable(rtems_vector_number vector) rtems_interrupt_level level; rtems_interrupt_disable(level); - - /* ARM Timer */ + + /* ARM Timer */ if ( vector == BCM2835_IRQ_ID_TIMER_0 ) { BCM2835_REG(BCM2835_IRQ_ENABLE_BASIC) = 0x1; @@ -85,8 +112,38 @@ rtems_status_code bsp_interrupt_vector_enable(rtems_vector_number vector) else if ( vector == BCM2835_IRQ_ID_UART ) { BCM2835_REG(BCM2835_IRQ_ENABLE2) = BCM2835_BIT(25); - } + /* GPIO 0 */ + else if ( vector == BCM2835_IRQ_ID_GPIO_0 ) + { + BCM2835_REG(BCM2835_IRQ_ENABLE2) = BCM2835_BIT(17); + } + /* GPIO 1 */ + else if ( vector == BCM2835_IRQ_ID_GPIO_1 ) + { + BCM2835_REG(BCM2835_IRQ_ENABLE2) = BCM2835_BIT(18); + } + /* GPIO 2 */ + else if ( vector == BCM2835_IRQ_ID_GPIO_2 ) + { + BCM2835_REG(BCM2835_IRQ_ENABLE2) = BCM2835_BIT(19); + } + /* GPIO 3 */ + else if ( vector == BCM2835_IRQ_ID_GPIO_3 ) + { + BCM2835_REG(BCM2835_IRQ_ENABLE2) = BCM2835_BIT(20); + } + /* I2C */ + else if ( vector == BCM2835_IRQ_ID_I2C ) + { + BCM2835_REG(BCM2835_IRQ_ENABLE2) = BCM2835_BIT(21); + } + /* SPI */ + else if ( vector == BCM2835_IRQ_ID_SPI ) + { + BCM2835_REG(BCM2835_IRQ_ENABLE2) = BCM2835_BIT(22); + } + rtems_interrupt_enable(level); return RTEMS_SUCCESSFUL; @@ -106,12 +163,42 @@ rtems_status_code bsp_interrupt_vector_disable(rtems_vector_number vector) { BCM2835_REG(BCM2835_IRQ_DISABLE2) = BCM2835_BIT(25); } + /* GPIO 0 */ + else if ( vector == BCM2835_IRQ_ID_GPIO_0 ) + { + BCM2835_REG(BCM2835_IRQ_DISABLE2) = BCM2835_BIT(17); + } + /* GPIO 1 */ + else if ( vector == BCM2835_IRQ_ID_GPIO_1 ) + { + BCM2835_REG(BCM2835_IRQ_DISABLE2) = BCM2835_BIT(18); + } + /* GPIO 2 */ + else if ( vector == BCM2835_IRQ_ID_GPIO_2 ) + { + BCM2835_REG(BCM2835_IRQ_DISABLE2) = BCM2835_BIT(19); + } + /* GPIO 3 */ + else if ( vector == BCM2835_IRQ_ID_GPIO_3 ) + { + BCM2835_REG(BCM2835_IRQ_DISABLE2) = BCM2835_BIT(20); + } + /* I2C */ + else if ( vector == BCM2835_IRQ_ID_I2C ) + { + BCM2835_REG(BCM2835_IRQ_DISABLE2) = BCM2835_BIT(21); + } + /* SPI */ + else if ( vector == BCM2835_IRQ_ID_SPI ) + { + BCM2835_REG(BCM2835_IRQ_DISABLE2) = BCM2835_BIT(22); + } + rtems_interrupt_enable(level); return RTEMS_SUCCESSFUL; } - void bsp_interrupt_handler_default(rtems_vector_number vector) { printk("spurious interrupt: %u\n", vector); |