Fix off-by-one bug in [v]snprintf().
[bertos.git] / drv / timer_dsp56k.h
index 5a0db05aeb6463a25949efc7128cf8cc1b538a17..f0ff8843ba87347c1ef860800fbc05e607cc7cf3 100755 (executable)
  * \brief Driver module for DSP56K
  */
 
-/*
- * $Log$
- * Revision 1.2  2004/06/03 11:27:09  bernie
- * Add dual-license information.
- *
- * Revision 1.1  2004/05/23 18:23:30  bernie
- * Import drv/timer module.
- *
- */
+/*#*
+ *#* $Log$
+ *#* Revision 1.5  2004/08/25 14:12:08  rasky
+ *#* Aggiornato il comment block dei log RCS
+ *#*
+ *#* Revision 1.4  2004/07/30 14:27:49  rasky
+ *#* Aggiornati alcuni file DSP56k per la nuova libreria di IRQ management
+ *#*
+ *#* Revision 1.3  2004/06/06 18:30:34  bernie
+ *#* Import DSP56800 changes from SC.
+ *#*
+ *#* Revision 1.2  2004/06/03 11:27:09  bernie
+ *#* Add dual-license information.
+ *#*
+ *#* Revision 1.1  2004/05/23 18:23:30  bernie
+ *#* Import drv/timer module.
+ *#*
+ *#*/
 
 #ifndef DRV_TIMER_DSP56K_H
 #define DRV_TIMER_DSP56K_H
 
+#include "timer.h"
 #include <DSP56F807.h>
 #include <compiler.h>
+#include <hw.h>
+#include <drv/irq.h>
 
-//! The system timer for events is currently TMRA0. We prefer A/B over C/D because
-//  A/B share the pin with the quadrature decoder module, and we do not need
-//  pins for our system timer.
-//  If you want to change this setting, you need also to modify the IRQ vector table.
-#define REG_SYSTEM_TIMER          (REG_TIMER_A + 0)
-#define SYSTEM_TIMER_IRQ_VECTOR   42   /* TMRA0 */
+// Calculate register pointer and irq vector from hw.h setting
+#define REG_SYSTEM_TIMER          PP_CAT(REG_TIMER_, SYSTEM_TIMER)
+#define SYSTEM_TIMER_IRQ_VECTOR   PP_CAT(IRQ_TIMER_, SYSTEM_TIMER)
 
+//! Prescaler for the system timer
 #define TIMER_PRESCALER           16
 
 //! Frequency of the hardware high precision timer
@@ -44,6 +54,8 @@
 //! Type of time expressed in ticks of the hardware high precision timer
 typedef uint16_t hptime_t;
 
+static void system_timer_isr(UNUSED(IPTR, arg));
+
 static void timer_hw_init(void)
 {
        uint16_t compare;
@@ -63,13 +75,12 @@ static void timer_hw_init(void)
        // The value for reload (at initializationa and after compare is met) is zero
        REG_SYSTEM_TIMER->LOAD = 0;
 
-       // Set the interrupt priority
+       // Set the interrupt handler and priority
+       irq_install(SYSTEM_TIMER_IRQ_VECTOR, &system_timer_isr, NULL);
        irq_setpriority(SYSTEM_TIMER_IRQ_VECTOR, IRQ_PRIORITY_SYSTEM_TIMER);
 
        // Small preprocessor trick to generate the REG_TIMER_CTRL_PRIMARY_IPBYNN macro
        //  needed to set the prescaler
-       #define PP_CAT2(x,y)                      x ## y
-       #define PP_CAT(x,y)                       PP_CAT2(x,y)
        #define REG_CONTROL_PRESCALER             PP_CAT(REG_TIMER_CTRL_PRIMARY_IPBY, TIMER_PRESCALER)
 
        // Setup the counter and start counting
@@ -90,9 +101,7 @@ INLINE hptime_t timer_hw_hpread(void)
        return REG_SYSTEM_TIMER->CNTR;
 }
 
-void system_timer_isr(void);
-
 #define DEFINE_TIMER_ISR \
-       void system_timer_isr(void)
+       static void system_timer_isr(UNUSED(IPTR, arg))
 
 #endif /* DRV_TIMER_DSP56_H */