From 1cd1b0fea245b38739d66bdcc4b0394422654595 Mon Sep 17 00:00:00 2001 From: batt Date: Mon, 8 Oct 2007 12:14:33 +0000 Subject: [PATCH] Fix some review issues. git-svn-id: https://src.develer.com/svnoss/bertos/trunk@832 38d2e660-2303-0410-9eaa-f027e97ec537 --- drv/at91/sysirq.c | 72 +++++++++++++++++++---------------------------- drv/at91/sysirq.h | 7 ++--- drv/at91/timer.c | 10 +++++-- drv/timer.c | 10 +++++++ drv/timer_avr.h | 6 ++++ 5 files changed, 54 insertions(+), 51 deletions(-) diff --git a/drv/at91/sysirq.c b/drv/at91/sysirq.c index b018cd62..fc9f687f 100755 --- a/drv/at91/sysirq.c +++ b/drv/at91/sysirq.c @@ -9,19 +9,19 @@ * * \author Francesco Sacchi * - * \brief System irq handler for Atmel AT91 ARM7 processors. + * \brief System IRQ handler for Atmel AT91 ARM7 processors. * * In Atmel AT91 ARM7TDMI processors, there are various * peripheral interrupt sources. * In general, every source has its own interrupt vector, so it * is possible to assign a specific handler for each interrupt - * indipendently. + * independently. * However, there are a few sources called "system sources" that - * share a common IRQ line and vector, called "system irq". - * So a unic system irq handler is implemented here. + * share a common IRQ line and vector, called "system IRQ". + * So a unique system IRQ handler is implemented here. * This module also contains an interface to manage every source - * indipendently. It is possible to assign to every system irq - * a specific irq handler. + * independently. It is possible to assign to every system IRQ + * a specific IRQ handler. * * \see sysirq_setHandler * \see sysirq_setEnable @@ -33,30 +33,11 @@ #warning Very untested! -/** - * Returns the state of the Periodic Interval Timer - * interrupt. - */ -static bool pit_enable(void) -{ - return PIT_MR & BV(PITIEN); -} - -/** - * Returns the state of the Periodic Interval Timer - * interrupt. - * \return true is PIT has triggered and interrupt, false otherwise - */ -static bool pit_trigger(void) -{ - return PIT_SR & BV(PITS); -} - /** * Enable/disable the Periodic Interrupt Timer * interrupt. */ -static void pit_setEnable(bool enable) +INLINE static void pit_setEnable(bool enable) { if (enable) PIT_MR |= BV(PITIEN); @@ -71,8 +52,7 @@ static SysIrq sysirq_tab[] = { /* PIT, Periodic Interval Timer (System timer)*/ { - .enable = pit_enable, - .trigger = pit_trigger, + .enabled = false, .setEnable = pit_setEnable, .handler = NULL, }, @@ -83,19 +63,18 @@ STATIC_ASSERT(countof(sysirq_tab) == SYSIRQ_CNT); /** - * System IRQ handler. + * System IRQ dispatcher. * This is the entry point for all system IRQs in AT91. * This function checks for interrupt enable state of * various sources (system timer, etc..) and calls * the corresponding handler. */ -static void sysirq_handler(void) +static void sysirq_dispatcher(void) { #warning TODO add IRQ prologue/epilogue for (int i = 0; i < countof(sysirq_tab); i++) { - if (sysirq_tab[i].enable() - && sysirq_tab[i].trigger() + if (sysirq_tab[i].enabled && sysirq_tab[i].handler) sysirq_tab[i].handler(); } @@ -103,8 +82,11 @@ static void sysirq_handler(void) #define SYSIRQ_PRIORITY 0 ///< default priority for system irqs. + +MOD_DEFINE(sysirq); + /** - * Init system irq handling. + * Init system IRQ handling. * \note all system interrupts are disabled. */ void sysirq_init(void) @@ -117,17 +99,19 @@ void sysirq_init(void) sysirq_tab[i].setEnable(false); /* Set the vector. */ - AIC_SVR(SYSC_ID) = sysirq_handler; - /* Initialize to edge triggered with defined priority. */ - AIC_SMR(SYSC_ID) = BV(AIC_SRCTYPE_INT_EDGE_TRIGGERED) | SYSIRQ_PRIORITY; - /* Clear interrupt */ - AIC_ICCR = BV(SYSC_ID); + AIC_SVR(SYSC_ID) = sysirq_handler; + /* Initialize to edge triggered with defined priority. */ + AIC_SMR(SYSC_ID) = BV(AIC_SRCTYPE_INT_EDGE_TRIGGERED) | SYSIRQ_PRIORITY; + /* Clear interrupt */ + AIC_ICCR = BV(SYSC_ID); + IRQ_RESTORE(flags); + MOD_INIT(sysirq); } /** - * Helper function used to set handler for system irq \a irq. + * Helper function used to set handler for system IRQ \a irq. */ void sysirq_setHandler(sysirq_t irq, sysirq_handler_t handler) { @@ -137,21 +121,23 @@ void sysirq_setHandler(sysirq_t irq, sysirq_handler_t handler) } /** - * Helper function used to enable/disable system irq \a irq. + * Helper function used to enable/disable system IRQ \a irq. */ void sysirq_setEnable(sysirq_t irq, bool enable) { ASSERT(irq >= 0); ASSERT(irq < SYSIRQ_CNT); + sysirq_tab[irq].setEnable(enable); + sysirq_enabled = enable; } /** - * Helper function used to get system irq \a irq state. + * Helper function used to get system IRQ \a irq state. */ -bool sysirq_enable(sysirq_t irq) +bool sysirq_enabled(sysirq_t irq) { ASSERT(irq >= 0); ASSERT(irq < SYSIRQ_CNT); - return sysirq_tab[irq].enable(); + return sysirq_tab[irq].enabled; } diff --git a/drv/at91/sysirq.h b/drv/at91/sysirq.h index f58c253a..44f17005 100755 --- a/drv/at91/sysirq.h +++ b/drv/at91/sysirq.h @@ -17,16 +17,13 @@ typedef void (* sysirq_handler_t)(void); ///< Type for system irq handler. typedef void (* sysirq_setEnable_t)(bool); ///< Type for system irq enable/disable function. -typedef bool (* sysirq_enable_t)(void); ///< Type for system irq enable getter. -typedef bool (* sysirq_trigger_t)(void); ///< Type for system irq trigger getter. /** * Structure used to define a system interrupt source. */ typedef struct SysIrq { - sysirq_enable_t enable; ///< Getter for irq enable/disable state. - sysirq_trigger_t trigger; ///< Getter for irq trigger state. + bool enabled; ///< Getter for irq enable/disable state. sysirq_setEnable_t setEnable; ///< Setter for irq enable/disable state. sysirq_handler_t handler; ///< IRQ handler. } SysIrq; @@ -44,6 +41,6 @@ typedef enum sysirq_t void sysirq_init(void); void sysirq_setHandler(sysirq_t irq, sysirq_handler_t handler); void sysirq_setEnable(sysirq_t irq, bool enable); -bool sysirq_enable(sysirq_t irq); +bool sysirq_enabled(sysirq_t irq); #endif /* ARCH_ARM_SYSIRQ_H */ diff --git a/drv/at91/timer.c b/drv/at91/timer.c index 2b396fa1..d4de6a3b 100755 --- a/drv/at91/timer.c +++ b/drv/at91/timer.c @@ -23,12 +23,16 @@ #warning Very untested! INLINE static void timer_hw_irq(void) { - /* Reset counters, this is needed to start timer and interrupt flags */ + /* Reset counters, this is needed to reset timer and interrupt flags */ volatile uint32_t dummy = PIT_PIVR; } + INLINE static bool timer_hw_triggered(void) + { + return PIT_SR & BV(PITS); + } - static void timer_hw_init(void) + INLINE static void timer_hw_init(void) { cpuflags_t flags; IRQ_SAVE_DISABLE(flags); @@ -47,7 +51,7 @@ IRQ_RESTORE(flags); } - INLINE hptime_t timer_hw_hpread(void) + INLINE static hptime_t timer_hw_hpread(void) { /* In the upper part of PIT_PIIR there is unused data */ return PIT_PIIR & 0xfffff; diff --git a/drv/timer.c b/drv/timer.c index 33188771..3877fcf3 100755 --- a/drv/timer.c +++ b/drv/timer.c @@ -14,6 +14,9 @@ /*#* *#* $Log$ + *#* Revision 1.32 2007/10/08 12:14:32 batt + *#* Fix some review issues. + *#* *#* Revision 1.31 2006/07/19 12:56:26 bernie *#* Convert to new Doxygen style. *#* @@ -284,9 +287,16 @@ DEFINE_TIMER_ISR #ifndef CONFIG_TIMER_DISABLE_EVENTS Timer *timer; #endif + /* + * On systems sharing IRQ line and vector, this check is needed + * to ensure that IRQ is generated by timer source. + */ + if (!timer_hw_triggered()) + return; TIMER_STROBE_ON; + /* Perform hw IRQ handling */ timer_hw_irq(); /* Update the master ms counter */ diff --git a/drv/timer_avr.h b/drv/timer_avr.h index 65e20617..c4bff65d 100755 --- a/drv/timer_avr.h +++ b/drv/timer_avr.h @@ -16,6 +16,9 @@ /*#* *#* $Log$ + *#* Revision 1.32 2007/10/08 12:14:32 batt + *#* Fix some review issues. + *#* *#* Revision 1.31 2007/10/07 12:30:55 batt *#* Add default timer for AVR. *#* @@ -150,5 +153,8 @@ /** Not needed, IRQ timer flag cleared automatically */ #define timer_hw_irq() do {} while (0) +/** Not needed, timer IRQ handler called only for timer source */ +#define timer_hw_triggered() (true) + #endif /* DRV_TIMER_AVR_H */ -- 2.25.1