X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=cpu%2Farm%2Fdrv%2Fsysirq_at91.c;h=7b12af2d8f4993d2b918467a0f3280adbdf74443;hb=71ef544fea9e991379181432011abb47166fec7b;hp=a942c0957dd964adaaf7da75a7e5f30f35834cab;hpb=df330fe6711957e5fb0434b8b7147d1edc05e414;p=bertos.git diff --git a/cpu/arm/drv/sysirq_at91.c b/cpu/arm/drv/sysirq_at91.c index a942c095..7b12af2d 100644 --- a/cpu/arm/drv/sysirq_at91.c +++ b/cpu/arm/drv/sysirq_at91.c @@ -52,9 +52,10 @@ * \see sysirq_setEnable */ -#include "sysirq.h" -#include "at91sam7s.h" -#include +#include "sysirq_at91.h" +#include +#include +#include #include #include @@ -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;