Add Page header for BattFS.
[bertos.git] / cpu / arm / drv / sysirq_at91.c
index d943e89f09d44a724bea68fc8f3fd31d416bb0c7..7b12af2d8f4993d2b918467a0f3280adbdf74443 100644 (file)
@@ -53,8 +53,9 @@
  */
 
 #include "sysirq_at91.h"
-#include <io/at91sam7s.h>
-#include <cpu/cpu.h>
+#include <io/arm.h>
+#include <cpu/irq.h>
+#include <cpu/types.h>
 #include <cfg/module.h>
 #include <cfg/macros.h>
 
@@ -86,26 +87,6 @@ static SysIrq sysirq_tab[] =
 
 STATIC_ASSERT(countof(sysirq_tab) == SYSIRQ_CNT);
 
-/*!
- * \brief Interrupt entry.
- */
-#define IRQ_ENTRY() \
-    asm volatile("sub   lr, lr,#4"          "\n\t"  /* Adjust LR */ \
-                 "stmfd sp!,{r0-r12,lr}"    "\n\t"  /* Save registers on IRQ stack. */ \
-                 "mrs   r1, spsr"           "\n\t"  /* Save SPSR */ \
-                 "stmfd sp!,{r1}"           "\n\t")     /* */
-
-/*!
- * \brief Interrupt exit.
- */
-#define IRQ_EXIT() \
-    asm volatile("ldmfd sp!, {r1}"          "\n\t"  /* Restore SPSR */ \
-                 "msr   spsr_c, r1"         "\n\t"  /* */ \
-                 "ldr   r0, =0xFFFFF000"    "\n\t"  /* End of interrupt. */ \
-                 "str   r0, [r0, #0x130]"   "\n\t"  /* */ \
-                 "ldmfd sp!, {r0-r12, pc}^" "\n\t")     /* Restore registers and return. */
-
-
 /**
  * System IRQ dispatcher.
  * This is the entry point for all system IRQs in AT91.
@@ -117,12 +98,14 @@ static void sysirq_dispatcher(void) __attribute__ ((naked));
 static void sysirq_dispatcher(void)
 {
        IRQ_ENTRY();
-       for (unsigned i = 0; i < countof(sysirq_tab); i++)
-       {
-               if (sysirq_tab[i].enabled
-                && sysirq_tab[i].handler)
-                       sysirq_tab[i].handler();
-       }
+
+       /* PIT */
+       if ((PIT_MR & BV(PITIEN))
+           && (PIT_SR & BV(PITS))
+           && sysirq_tab[SYSIRQ_PIT].handler)
+               sysirq_tab[SYSIRQ_PIT].handler();
+
+       /* TODO: add other system sources here */
 
        IRQ_EXIT();
 }
@@ -142,8 +125,8 @@ void sysirq_init(void)
        IRQ_SAVE_DISABLE(flags);
 
        /* Disable all system interrupts */
-       for (unsigned i = 0; i < countof(sysirq_tab); i++)
-               sysirq_tab[i].setEnable(false);
+       PIT_MR &= BV(PITIEN);
+       /* TODO: add other system sources here */
 
        /* Set the vector. */
        AIC_SVR(SYSC_ID) = sysirq_dispatcher;
@@ -164,7 +147,6 @@ void sysirq_init(void)
  */
 void sysirq_setHandler(sysirq_t irq, sysirq_handler_t handler)
 {
-       ASSERT(irq >= 0);
        ASSERT(irq < SYSIRQ_CNT);
        sysirq_tab[irq].handler = handler;
 }
@@ -174,7 +156,6 @@ void sysirq_setHandler(sysirq_t irq, sysirq_handler_t handler)
  */
 void sysirq_setEnable(sysirq_t irq, bool enable)
 {
-       ASSERT(irq >= 0);
        ASSERT(irq < SYSIRQ_CNT);
 
        sysirq_tab[irq].setEnable(enable);
@@ -186,7 +167,6 @@ void sysirq_setEnable(sysirq_t irq, bool enable)
  */
 bool sysirq_enabled(sysirq_t irq)
 {
-       ASSERT(irq >= 0);
        ASSERT(irq < SYSIRQ_CNT);
 
        return sysirq_tab[irq].enabled;