00001 /* timer.h 00002 Copyright 2000, 2003 Free Software Foundation, Inc. 00003 Written by Stephane Carrez (stcarrez@nerim.fr) 00004 00005 This file is part of GEL. 00006 00007 GEL is free software; you can redistribute it and/or modify 00008 it under the terms of the GNU General Public License as published by 00009 the Free Software Foundation; either version 2, or (at your option) 00010 any later version. 00011 00012 GEL is distributed in the hope that it will be useful, 00013 but WITHOUT ANY WARRANTY; without even the implied warranty of 00014 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00015 GNU General Public License for more details. 00016 00017 You should have received a copy of the GNU General Public License 00018 along with GEL; see the file COPYING. If not, write to 00019 the Free Software Foundation, 59 Temple Place - Suite 330, 00020 Boston, MA 02111-1307, USA. */ 00021 00022 #ifndef _GEL_TIMER_H 00023 #define _GEL_TIMER_H 00024 00025 #include <sys/param.h> 00026 00031 00032 #ifndef GEL_PAGE0_ATTRIBUTE 00033 # define GEL_PAGE0_ATTRIBUTE 00034 #endif 00035 00036 #define TIMER_TCNT_CLOCK_UNIT (2) 00037 00038 #ifndef TIMER_TCNT_DIV 00039 # define TIMER_TCNT_DIV (16) 00040 #endif 00041 00042 #if 0 00043 #define TIMER_TCNT_CLOCK_PERIOD \ 00044 (((TIMER_TCNT_DIV * 1000000L) * TIMER_TCNT_CLOCK_UNIT) / M6811_CPU_E_CLOCK) 00045 #endif 00046 00047 #define TIMER_TCNT_PERIOD \ 00048 ((TIMER_TCNT_CLOCK_PERIOD * 65536) / TIMER_TCNT_CLOCK_UNIT) 00049 00050 #define TIMER_TCNT_CLOCK_PERIOD 1 00051 00052 struct timeval 00053 { 00054 long tv_sec; 00055 long tv_usec; 00056 }; 00057 00058 #define ULONG_MAX (0xffffffffUL) 00059 struct timer; 00060 00062 typedef void (* timer_overflow_handler) (void); 00063 00064 typedef void (* timer_handler) (struct timer *t); 00065 00066 #define TIMER_MASK 0x00 00067 #define TIMER_UNMASK 0x01 00068 #define TIMER_SLOW 0x02 00069 #define TIMER_OVERFLOW_INTERRUPT 0x04 00070 #define TIMER_HEAD 0x80 00071 00079 struct timer 00080 { 00081 struct timer *next; 00082 struct timer *prev; 00083 unsigned short flags; 00084 long timeout; 00085 timer_handler handler; 00086 void *data; 00087 }; 00088 00089 #define TIMER_INIT_STATIC(FUNC,FLAGS) { 0, 0, FLAGS, 0, FUNC, 0 } 00090 00105 extern void timer_initialize (void); 00106 00145 extern void timer_create (struct timer *t, 00146 unsigned long timeout, 00147 timer_handler handler, 00148 unsigned char flags); 00149 00162 extern void timer_insert (struct timer *t); 00163 00173 extern void timer_remove (struct timer *t); 00174 00182 extern int timer_is_active (struct timer *t); 00183 00201 extern void timer_gettime (struct timeval *tv); 00202 00212 extern void timer_settime (struct timeval *tv); 00213 00222 extern long timer_adjtime (long adj_usec); 00223 00232 extern void timevalsub (struct timeval *to, struct timeval *val); 00233 00241 extern void timevaladd (struct timeval *to, struct timeval *val); 00242 00243 extern unsigned long timer_current_overflow (void); 00244 extern unsigned long usec_to_tcnt (unsigned long); 00245 extern unsigned long usec_to_overflow (unsigned long); 00246 extern unsigned long tcnt_to_usec (unsigned short); 00247 extern unsigned long tovf_to_usec (unsigned long); 00248 extern unsigned long tovf_to_sec (unsigned long); 00249 00253 extern void __attribute__((interrupt)) timer_overflow_interrupt (void); 00254 00262 extern void __attribute__((interrupt)) timer_interrupt (void); 00263 00265 static void set_timer_overflow_handler (timer_overflow_handler handler); 00266 00267 static inline void 00268 set_timer_overflow_handler (timer_overflow_handler handler) 00269 { 00270 extern timer_overflow_handler _overflow_handler; 00271 00272 _overflow_handler = handler; 00273 } 00274 00275 extern inline unsigned long 00276 timer_current_overflow (void) 00277 { 00278 extern unsigned long _timer_current_overflow; 00279 00280 return _timer_current_overflow; 00281 } 00282 00285 extern inline unsigned long 00286 usec_to_tcnt (unsigned long us) 00287 { 00288 us = us / TIMER_TCNT_CLOCK_PERIOD; 00289 return us * TIMER_TCNT_CLOCK_UNIT; 00290 } 00291 00292 extern inline unsigned long 00293 usec_to_overflow (unsigned long us) 00294 { 00295 return us / TIMER_TCNT_PERIOD; 00296 } 00297 00298 extern inline unsigned long 00299 tcnt_to_usec (unsigned short tcnt) 00300 { 00301 unsigned long usec; 00302 00303 usec = ((unsigned long) (tcnt) * TIMER_TCNT_CLOCK_PERIOD); 00304 usec = usec / TIMER_TCNT_CLOCK_UNIT; 00305 return usec; 00306 } 00307 00308 extern inline unsigned long 00309 tovf_to_usec (unsigned long overflow) 00310 { 00311 unsigned long usec; 00312 00313 usec = overflow * TIMER_TCNT_PERIOD; 00314 usec = usec % 1000000UL; 00315 return usec; 00316 } 00317 00318 extern inline unsigned long 00319 tovf_to_sec (unsigned long overflow) 00320 { 00321 unsigned long sec; 00322 00323 sec = overflow * TIMER_TCNT_PERIOD; 00324 return sec; 00325 } 00326 00327 00328 extern inline int 00329 timer_is_active (struct timer *t) 00330 { 00331 return t->next != 0; 00332 } 00333 00336 #endif