Convert to new Doxygen style.
[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.6  2006/07/19 12:56:26  bernie
18  *#* Convert to new Doxygen style.
19  *#*
20  *#* Revision 1.5  2006/02/21 21:28:02  bernie
21  *#* New time handling based on TIMER_TICKS_PER_SEC to support slow timers with ticks longer than 1ms.
22  *#*
23  *#* Revision 1.4  2006/02/17 22:24:21  bernie
24  *#* Update POSIX timer emulator.
25  *#*
26  *#* Revision 1.3  2006/02/10 12:34:52  bernie
27  *#* Remove spurious EXTERN_C.
28  *#*
29  *#* Revision 1.2  2006/01/16 03:30:21  bernie
30  *#* Make header C++ friendly.
31  *#*
32  *#* Revision 1.1  2005/11/27 03:58:18  bernie
33  *#* Add POSIX timer emulator.
34  *#*
35  *#* Revision 1.1  2005/11/27 03:06:36  bernie
36  *#* Qt timer emulation.
37  *#*
38  *#*/
39
40 #include <cfg/compiler.h> // hptime.t
41 #include <os/hptime.h>
42
43 #include <signal.h>       // sigaction()
44 #include <sys/time.h>     // setitimer()
45 #include <string.h>       // memset()
46
47
48 // Forward declaration for the user interrupt server routine.
49 void timer_isr(int);
50
51 /// HW dependent timer initialization.
52 static void timer_hw_init(void)
53 {
54         struct sigaction sa;
55         memset(&sa, 0, sizeof(sa));
56
57         // Setup interrupt callback
58         sa.sa_handler = timer_isr;
59         sigemptyset(&sa.sa_mask);
60         sigaddset(&sa.sa_mask, SIGALRM);
61         sa.sa_flags = SA_RESTART;
62         sigaction(SIGALRM, &sa, NULL);
63
64         // Setup POSIX realtime timer to interrupt every 1/TIMER_TICKS_PER_SEC.
65         static struct itimerval itv =
66         {
67                 { 0, 1000000 / TIMER_TICKS_PER_SEC }, /* it_interval */
68                 { 0, 1000000 / TIMER_TICKS_PER_SEC }  /* it_value */
69         };
70         setitimer(ITIMER_REAL, &itv, NULL);
71 }
72
73 INLINE hptime_t timer_hw_hpread(void)
74 {
75         return hptime_get();
76 }
77