changeset 1071:c27fc1b75136

* src/at91_misc.c (hal_hardware_init): Make sure the AIC internal priority level stack is flushed. (hal_IRQ_handler): Calculate active interrupt by dummy read from the IVR, which has the side-effect of updating ISR with the current interrupt source number. (hal_interrupt_acknowledge): Write to ICCR is not needed, as interrupt deassertion is taken care of by read of IVR in hal_IRQ_handler.
author jlarmour
date Tue, 24 Jun 2003 06:32:39 +0000
parents 9d0f5c9517dd
children 7156cfbcb113
files packages/hal/arm/at91/var/current/ChangeLog packages/hal/arm/at91/var/current/src/at91_misc.c
diffstat 2 files changed, 20 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/packages/hal/arm/at91/var/current/ChangeLog
+++ b/packages/hal/arm/at91/var/current/ChangeLog
@@ -1,3 +1,14 @@
+2003-06-04  Daniel Néri  <daniel.neri@sigicom.se>
+
+	* src/at91_misc.c (hal_hardware_init): Make sure the AIC internal
+	priority level stack is flushed.
+	(hal_IRQ_handler): Calculate active interrupt by dummy read from
+	the IVR, which has the side-effect of updating ISR with the
+	current interrupt source number.
+	(hal_interrupt_acknowledge): Write to ICCR is not needed, as
+	interrupt deassertion is taken care of by read of IVR in
+	hal_IRQ_handler.
+
 2003-05-27  Daniel Néri  <daniel.neri@sigicom.se>
 
 	* include/var_io.h: Add missing USART register defines.
--- a/packages/hal/arm/at91/var/current/src/at91_misc.c
+++ b/packages/hal/arm/at91/var/current/src/at91_misc.c
@@ -159,14 +159,17 @@ void hal_delay_us(cyg_int32 usecs)
 
 void hal_hardware_init(void)
 {
+    unsigned i;
+
     // Set up eCos/ROM interfaces
     hal_if_init();
 
     // Reset all interrupts
     HAL_WRITE_UINT32(AT91_AIC+AT91_AIC_IDCR, 0xFFFFFFFF);  
 
-    // Make sure interrupt controller is happy
-    HAL_WRITE_UINT32(AT91_AIC+AT91_AIC_EOI, 0xFFFFFFFF);  
+    // Flush internal priority level stack
+    for (i = 0; i < 8; ++i)
+        HAL_WRITE_UINT32(AT91_AIC+AT91_AIC_EOI, 0xFFFFFFFF);
 }
 
 // -------------------------------------------------------------------------
@@ -176,16 +179,12 @@ void hal_hardware_init(void)
 int hal_IRQ_handler(void)
 {
     cyg_uint32 irq_num;
-    cyg_uint32 ipr, imr;
+    cyg_uint32 ivr;
     
-//    HAL_READ_UINT32(AT91_AIC+AT91_AIC_ISR, irq_num);
+    // Calculate active interrupt (updates ISR)
+    HAL_READ_UINT32(AT91_AIC+AT91_AIC_IVR, ivr);
 
-    HAL_READ_UINT32(AT91_AIC+AT91_AIC_IPR, ipr);        
-    HAL_READ_UINT32(AT91_AIC+AT91_AIC_IMR, imr);        
-
-    ipr &= imr;
-
-    HAL_LSBIT_INDEX( irq_num, ipr );
+    HAL_READ_UINT32(AT91_AIC+AT91_AIC_ISR, irq_num);
     
     return irq_num;
 }
@@ -215,9 +214,6 @@ void hal_interrupt_acknowledge(int vecto
     CYG_ASSERT(vector <= CYGNUM_HAL_ISR_MAX &&
                vector >= CYGNUM_HAL_ISR_MIN , "Invalid vector");
 
-    HAL_WRITE_UINT32(AT91_AIC+AT91_AIC_ICCR, (1<<vector));
-
-    // FIXME - This isn't 100% correct
     HAL_WRITE_UINT32(AT91_AIC+AT91_AIC_EOI, 0xFFFFFFFF);  
 }