* the GNU General Public License.
*
* Copyright 2003, 2004, 2005 Develer S.r.l. (http://www.develer.com/)
- * Copyright 2000 Bernardo Innocenti <bernie@develer.com>
- *
+ * Copyright 2000, 2008 Bernie Innocenti <bernie@codewiz.org>
* -->
*
* \brief Hardware independent timer driver (interface)
*
* \version $Id$
- *
- * \author Bernardo Innocenti <bernie@develer.com>
- *
+ * \author Bernie Innocenti <bernie@codewiz.org>
*/
#ifndef DRV_TIMER_H
* Try the CPU specific one for bare-metal environments.
*/
#if OS_HOSTED
- #include OS_HEADER(timer)
+ //#include OS_HEADER(timer)
+ #include <emul/timer_posix.h>
#else
#include CPU_HEADER(timer)
#endif
-#include <cfg/cfg_timer.h>
+#include "cfg/cfg_timer.h"
#include <cfg/debug.h>
#include <cfg/compiler.h>
-#include <mware/list.h>
+#include <struct/list.h>
+/*
+ * Sanity check for config parameters required by this module.
+ */
+#if !defined(CONFIG_TIMER_EVENTS) || ((CONFIG_TIMER_EVENTS != 0) && CONFIG_TIMER_EVENTS != 1)
+ #error CONFIG_TIMER_EVENTS must be set to either 0 or 1 in cfg_timer.h
+#endif
+#if !defined(CONFIG_TIMER_UDELAY) || ((CONFIG_TIMER_UDELAY != 0) && CONFIG_TIMER_EVENTS != 1)
+ #error CONFIG_TIMER_UDELAY must be set to either 0 or 1 in cfg_timer.h
+#endif
+#if defined(CONFIG_TIMER_DISABLE_UDELAY)
+ #error Obosolete config option CONFIG_TIMER_DISABLE_UDELAY. Use CONFIG_TIMER_UDELAY
+#endif
+#if defined(CONFIG_TIMER_DISABLE_EVENTS)
+ #error Obosolete config option CONFIG_TIMER_DISABLE_EVENTS. Use CONFIG_TIMER_EVENTS
+#endif
extern volatile ticks_t _clock;
* The following code is safe:
*
* \code
+ * drop_teabag();
* ticks_t tea_start_time = timer_clock();
*
- * boil_water();
- *
- * if (timer_clock() - tea_start_time > TEAPOT_DELAY)
- * printf("Your tea, Sir.\n");
+ * for (;;)
+ * {
+ * if (timer_clock() - tea_start_time > TEAPOT_DELAY)
+ * {
+ * printf("Your tea, Sir.\n");
+ * break;
+ * }
+ * patience();
+ * }
* \endcode
*
* \note This function must disable interrupts on 8/16bit CPUs because the
#endif /* TIMER_HW_HPTICKS_PER_SEC < 100000UL */
}
-
-void timer_init(void);
void timer_delayTicks(ticks_t delay);
INLINE void timer_delay(mtime_t delay)
{
timer_delayTicks(ms_to_ticks(delay));
}
-#if !defined(CONFIG_TIMER_DISABLE_UDELAY)
+void timer_init(void);
+void timer_cleanup(void);
+
+int timer_testSetup(void);
+int timer_testRun(void);
+int timer_testTearDown(void);
+
+#if CONFIG_TIMER_UDELAY
void timer_busyWait(hptime_t delay);
void timer_delayHp(hptime_t delay);
INLINE void timer_udelay(utime_t delay)
}
#endif
-#ifndef CONFIG_TIMER_DISABLE_EVENTS
+#if CONFIG_TIMER_EVENTS
#include <mware/event.h>
typedef struct Timer
{
Node link; /**< Link into timers queue */
- ticks_t _delay; /**< Timer delay in ms */
- ticks_t tick; /**< Timer will expire at this tick */
+ ticks_t _delay; /**< [ticks] Timer delay */
+ ticks_t tick; /**< [ticks] When this timer will expire */
Event expire; /**< Event to execute when the timer expires */
DB(uint16_t magic;)
} Timer;
#define TIMER_MAGIC_ACTIVE 0xABBA
#define TIMER_MAGIC_INACTIVE 0xBAAB
-extern void timer_add(Timer *timer);
-extern Timer *timer_abort(Timer *timer);
+void timer_add(Timer *timer);
+Timer *timer_abort(Timer *timer);
/** Set the timer so that it calls an user hook when it expires */
-INLINE void timer_set_event_softint(Timer *timer, Hook func, iptr_t user_data)
+INLINE void timer_setSoftint(Timer *timer, Hook func, iptr_t user_data)
{
event_initSoftInt(&timer->expire, func, user_data);
}
+// OBSOLETE
+#define timer_set_event_softint timer_setSoftint
+
/** Set the timer delay (the time before the event will be triggered) */
INLINE void timer_setDelay(Timer *timer, ticks_t delay)
{
timer->_delay = delay;
}
-#endif /* CONFIG_TIMER_DISABLE_EVENTS */
+#endif /* CONFIG_TIMER_EVENTS */
#if defined(CONFIG_KERN_SIGNALS) && CONFIG_KERN_SIGNALS
/** Set the timer so that it sends a signal when it expires */
-INLINE void timer_set_event_signal(Timer *timer, struct Process *proc, sigmask_t sigs)
+INLINE void timer_setSignal(Timer *timer, struct Process *proc, sigmask_t sigs)
{
event_initSignal(&timer->expire, proc, sigs);
}
-#endif /* CONFIG_KERN_SIGNALS */
+#define timer_set_event_signal timer_setSignal
+#endif /* CONFIG_KERN_SIGNALS */
#endif /* DRV_TIMER_H */