timer.h00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef _GEL_TIMER_H
00023 #define _GEL_TIMER_H
00024
00029
00030 #define TIMER_TCNT_CLOCK_UNIT (2)
00031
00032 #ifndef TIMER_TCNT_DIV
00033 # define TIMER_TCNT_DIV (16)
00034 #endif
00035
00036 #if 0
00037 #define TIMER_TCNT_CLOCK_PERIOD \
00038 (((TIMER_TCNT_DIV * 1000000L) * TIMER_TCNT_CLOCK_UNIT) / M6811_CPU_E_CLOCK)
00039 #endif
00040
00041 #define TIMER_TCNT_PERIOD \
00042 ((TIMER_TCNT_CLOCK_PERIOD * 65536) / TIMER_TCNT_CLOCK_UNIT)
00043
00044 #define TIMER_TCNT_CLOCK_PERIOD 1
00045
00046 struct timeval
00047 {
00048 long tv_sec;
00049 long tv_usec;
00050 };
00051
00052 #define ULONG_MAX (0xffffffffUL)
00053 struct timer;
00054
00056 typedef void (* timer_overflow_handler) (void);
00057
00058 typedef void (* timer_handler) (struct timer *t);
00059
00060 #define TIMER_MASK 0x00
00061 #define TIMER_UNMASK 0x01
00062 #define TIMER_SLOW 0x02
00063 #define TIMER_OVERFLOW_INTERRUPT 0x04
00064 #define TIMER_HEAD 0x80
00065
00073 struct timer
00074 {
00075 struct timer *next;
00076 struct timer *prev;
00077 unsigned short flags;
00078 long timeout;
00079 timer_handler handler;
00080 void *data;
00081 };
00082
00083 #define TIMER_INIT_STATIC(FUNC,FLAGS) { 0, 0, FLAGS, 0, FUNC, 0 }
00084
00099 extern void timer_initialize (void);
00100
00139 extern void timer_create (struct timer *t,
00140 unsigned long timeout,
00141 timer_handler handler,
00142 unsigned char flags);
00143
00156 extern void timer_insert (struct timer *t);
00157
00167 extern void timer_remove (struct timer *t);
00168
00176 extern int timer_is_active (struct timer *t);
00177
00195 extern void timer_gettime (struct timeval *tv);
00196
00206 extern void timer_settime (struct timeval *tv);
00207
00216 extern long timer_adjtime (long adj_usec);
00217
00226 extern void timevalsub (struct timeval *to, struct timeval *val);
00227
00235 extern void timevaladd (struct timeval *to, struct timeval *val);
00236
00237 extern unsigned long timer_current_overflow (void);
00238 extern unsigned long usec_to_tcnt (unsigned long);
00239 extern unsigned long usec_to_overflow (unsigned long);
00240 extern unsigned long tcnt_to_usec (unsigned short);
00241 extern unsigned long tovf_to_usec (unsigned long);
00242 extern unsigned long tovf_to_sec (unsigned long);
00243
00247 extern void __attribute__((interrupt)) timer_overflow_interrupt (void);
00248
00256 extern void __attribute__((interrupt)) timer_interrupt (void);
00257
00259 static void set_timer_overflow_handler (timer_overflow_handler handler);
00260
00261 static inline void
00262 set_timer_overflow_handler (timer_overflow_handler handler)
00263 {
00264 extern timer_overflow_handler _overflow_handler;
00265
00266 _overflow_handler = handler;
00267 }
00268
00269 extern inline unsigned long
00270 timer_current_overflow (void)
00271 {
00272 extern unsigned long _timer_current_overflow;
00273
00274 return _timer_current_overflow;
00275 }
00276
00279 extern inline unsigned long
00280 usec_to_tcnt (unsigned long us)
00281 {
00282 us = us / TIMER_TCNT_CLOCK_PERIOD;
00283 return us * TIMER_TCNT_CLOCK_UNIT;
00284 }
00285
00286 extern inline unsigned long
00287 usec_to_overflow (unsigned long us)
00288 {
00289 return us / TIMER_TCNT_PERIOD;
00290 }
00291
00292 extern inline unsigned long
00293 tcnt_to_usec (unsigned short tcnt)
00294 {
00295 unsigned long usec;
00296
00297 usec = ((unsigned long) (tcnt) * TIMER_TCNT_CLOCK_PERIOD);
00298 usec = usec / TIMER_TCNT_CLOCK_UNIT;
00299 return usec;
00300 }
00301
00302 extern inline unsigned long
00303 tovf_to_usec (unsigned long overflow)
00304 {
00305 unsigned long usec;
00306
00307 usec = overflow * TIMER_TCNT_PERIOD;
00308 usec = usec % 1000000UL;
00309 return usec;
00310 }
00311
00312 extern inline unsigned long
00313 tovf_to_sec (unsigned long overflow)
00314 {
00315 unsigned long sec;
00316
00317 sec = overflow * TIMER_TCNT_PERIOD;
00318 return sec;
00319 }
00320
00321
00322 extern inline int
00323 timer_is_active (struct timer *t)
00324 {
00325 return t->next != 0;
00326 }
00327
00330 #endif
|