summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>2011-07-13 20:24:19 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>2011-07-13 20:24:19 +0000
commit39601584068c27eb80739b3dd0387b429be58766 (patch)
tree21e3e5fb8d7b38e16e4fa75a2e792a3103e77e6e
parent2011-07-13 Till Straumann <strauman@slac.stanford.edu> (diff)
downloadrtems-39601584068c27eb80739b3dd0387b429be58766.tar.bz2
2011-07-13 Sebastian Huber <sebastian.huber@embedded-brains.de>
PR 1832/libcpu * at91rm9200/irq/irq.c: he bsp_interrupt_dispatch routine does not determine the correct interrupt source number. According to the datasheet, the reading of the interrupt vector register (AIC_IVR) notifies the hardware that the OS is taken care of the interrupt. Only after AIC_IVR have been read can the correct source number be read from the interrupt status register (AIC_ISR).
-rw-r--r--c/src/lib/libcpu/arm/ChangeLog10
-rw-r--r--c/src/lib/libcpu/arm/at91rm9200/irq/irq.c8
2 files changed, 17 insertions, 1 deletions
diff --git a/c/src/lib/libcpu/arm/ChangeLog b/c/src/lib/libcpu/arm/ChangeLog
index a4330a8094..12ec5c0ed5 100644
--- a/c/src/lib/libcpu/arm/ChangeLog
+++ b/c/src/lib/libcpu/arm/ChangeLog
@@ -1,3 +1,13 @@
+2011-07-13 Sebastian Huber <sebastian.huber@embedded-brains.de>
+
+ PR 1832/libcpu
+ * at91rm9200/irq/irq.c: he bsp_interrupt_dispatch routine does not
+ determine the correct interrupt source number. According to the
+ datasheet, the reading of the interrupt vector register (AIC_IVR)
+ notifies the hardware that the OS is taken care of the interrupt.
+ Only after AIC_IVR have been read can the correct source number be
+ read from the interrupt status register (AIC_ISR).
+
2011-02-02 Ralf Corsépius <ralf.corsepius@rtems.org>
* configure.ac: Require autoconf-2.68, automake-1.11.1.
diff --git a/c/src/lib/libcpu/arm/at91rm9200/irq/irq.c b/c/src/lib/libcpu/arm/at91rm9200/irq/irq.c
index a2b34d4525..12a0df6f6f 100644
--- a/c/src/lib/libcpu/arm/at91rm9200/irq/irq.c
+++ b/c/src/lib/libcpu/arm/at91rm9200/irq/irq.c
@@ -21,7 +21,7 @@
void bsp_interrupt_dispatch(void)
{
- rtems_vector_number vector = AIC_CTL_REG(AIC_ISR);
+ rtems_vector_number vector = AIC_CTL_REG(AIC_IVR);
bsp_interrupt_handler_dispatch(vector);
@@ -44,6 +44,12 @@ rtems_status_code bsp_interrupt_vector_disable(rtems_vector_number vector)
rtems_status_code bsp_interrupt_facility_initialize(void)
{
+ unsigned long i = 0;
+
+ for (i = 0; i < 32; ++i) {
+ AIC_SVR_REG(i<<2) = i;
+ }
+
/* disable all interrupts */
AIC_CTL_REG(AIC_IDCR) = 0xffffffff;