Update POSIX timer emulator.
[bertos.git] / drv / timer_posix.c
1 /*!
2  * \file
3  * <!--
4  * Copyright 2005 Develer S.r.l. (http://www.develer.com/)
5  * This file is part of DevLib - See README.devlib for information.
6  * -->
7  *
8  * \version $Id$
9  *
10  * \author Bernardo Innocenti <bernie@develer.com>
11  *
12  * \brief Low-level timer module for Qt emulator (implementation).
13  */
14
15 /*#*
16  *#* $Log$
17  *#* Revision 1.4  2006/02/17 22:24:21  bernie
18  *#* Update POSIX timer emulator.
19  *#*
20  *#* Revision 1.3  2006/02/10 12:34:52  bernie
21  *#* Remove spurious EXTERN_C.
22  *#*
23  *#* Revision 1.2  2006/01/16 03:30:21  bernie
24  *#* Make header C++ friendly.
25  *#*
26  *#* Revision 1.1  2005/11/27 03:58:18  bernie
27  *#* Add POSIX timer emulator.
28  *#*
29  *#* Revision 1.1  2005/11/27 03:06:36  bernie
30  *#* Qt timer emulation.
31  *#*
32  *#*/
33
34 #include <cfg/compiler.h> // hptime.t
35 #include <os/hptime.h>
36
37 #include <signal.h>       // sigaction()
38 #include <sys/time.h>     // setitimer()
39 #include <string.h>       // memset()
40
41
42 // Forward declaration for the user interrupt server routine.
43 void timer_isr(int);
44
45 /// HW dependent timer initialization.
46 static void timer_hw_init(void)
47 {
48         struct sigaction sa;
49         memset(&sa, 0, sizeof(sa));
50
51         // Setup interrupt callback
52         sa.sa_handler = timer_isr;
53         sigemptyset(&sa.sa_mask);
54         sigaddset(&sa.sa_mask, SIGALRM);
55         sa.sa_flags = SA_RESTART;
56         sigaction(SIGALRM, &sa, NULL);
57
58         // Setup POSIX realtime timer to interrupt every 10ms.
59         static struct itimerval itv =
60         {
61                 { 0, 1000 / TIMER_TICKS_PER_MSEC }, /* it_interval */
62                 { 0, 1000 / TIMER_TICKS_PER_MSEC }  /* it_value */
63         };
64         setitimer(ITIMER_REAL, &itv, NULL);
65 }
66
67 INLINE hptime_t timer_hw_hpread(void)
68 {
69         return hptime_get();
70 }
71