aboutsummaryrefslogtreecommitdiffstats
AgeCommit message (Expand)AuthorFilesLines
2005-11-04[lcd4linux @ 2005-11-04 04:53:08 by reinelt]reinelt7-16/+54
2005-11-04[lcd4linux @ 2005-11-04 04:44:52 by reinelt]reinelt8-58/+118
2005-10-02[lcd4linux @ 2005-10-02 07:58:48 by reinelt]reinelt2-8/+11
2005-09-14[lcd4linux @ 2005-09-14 15:08:32 by reinelt]reinelt2-2/+8
2005-09-07[lcd4linux @ 2005-09-07 06:51:44 by reinelt]reinelt1-19/+23
2005-09-02[lcd4linux @ 2005-09-02 05:27:08 by reinelt]reinelt1-37/+71
2005-08-27[lcd4linux @ 2005-08-27 07:02:25 by reinelt]reinelt7-114/+268
2005-08-22[lcd4linux @ 2005-08-22 05:44:43 by reinelt]reinelt10-45/+381
2005-08-21[lcd4linux @ 2005-08-21 08:18:56 by reinelt]reinelt3-73/+141
2005-08-20[lcd4linux @ 2005-08-20 10:10:13 by reinelt]reinelt2-22/+63
2005-07-06[lcd4linux @ 2005-07-06 04:40:18 by reinelt]reinelt3-10/+35
2005-06-19[lcd4linux @ 2005-06-19 17:57:06 by reinelt]reinelt2-20/+24
2005-06-15[lcd4linux @ 2005-06-15 05:24:35 by reinelt]reinelt2-22/+44
2005-06-13[lcd4linux @ 2005-06-13 03:43:46 by reinelt]reinelt1-1/+6
2005-06-13[lcd4linux @ 2005-06-13 03:38:25 by reinelt]reinelt1-6/+9
2005-06-11[lcd4linux @ 2005-06-11 10:57:45 by reinelt]reinelt2-12/+12
2005-06-11[lcd4linux @ 2005-06-11 04:14:05 by reinelt]reinelt1-0/+7
2005-06-10[lcd4linux @ 2005-06-10 11:22:28 by reinelt]reinelt3-5/+180
2005-06-10[lcd4linux @ 2005-06-10 09:51:44 by reinelt]reinelt1-0/+0
2005-06-10[lcd4linux @ 2005-06-10 05:02:28 by reinelt]reinelt1-1/+67
2005-06-10[lcd4linux @ 2005-06-10 05:00:36 by reinelt]reinelt4-15/+16
2005-06-10[lcd4linux @ 2005-06-10 04:54:10 by reinelt]reinelt1-6425/+0
2005-06-10[lcd4linux @ 2005-06-10 04:53:44 by reinelt]reinelt1-7040/+0
2005-06-09[lcd4linux @ 2005-06-09 17:41:47 by reinelt]reinelt3-160/+312
2005-06-06[lcd4linux @ 2005-06-06 09:24:07 by reinelt]reinelt2-6/+9
2005-06-03[lcd4linux @ 2005-06-03 17:04:52 by reinelt]reinelt3-205/+10
2005-06-03[lcd4linux @ 2005-06-03 04:45:57 by reinelt]reinelt3-4/+8
2005-06-01[lcd4linux @ 2005-06-01 12:50:25 by reinelt]reinelt1-184/+178
2005-06-01[lcd4linux @ 2005-06-01 12:46:31 by reinelt]reinelt4-22/+52
2005-06-01[lcd4linux @ 2005-06-01 12:09:11 by reinelt]reinelt5-672/+641
2005-06-01[lcd4linux @ 2005-06-01 11:17:54 by pk_richman]pk_richman1-1497/+1500
2005-05-31[lcd4linux @ 2005-05-31 21:30:56 by lfcorreia]lfcorreia3-11/+14
2005-05-31[lcd4linux @ 2005-05-31 21:28:42 by lfcorreia]lfcorreia1-11/+11
2005-05-31[lcd4linux @ 2005-05-31 21:26:56 by lfcorreia]lfcorreia1-2/+5
2005-05-31[lcd4linux @ 2005-05-31 21:06:36 by lfcorreia]lfcorreia1-0/+4
2005-05-31[lcd4linux @ 2005-05-31 20:42:54 by lfcorreia]lfcorreia8-1819/+2408
2005-05-28[lcd4linux @ 2005-05-28 09:08:30 by reinelt]reinelt1-1/+1
2005-05-28[lcd4linux @ 2005-05-28 09:06:14 by reinelt]reinelt2-21/+25
2005-05-13[lcd4linux @ 2005-05-13 05:44:44 by reinelt]reinelt1-0/+87
2005-05-13[lcd4linux @ 2005-05-13 05:43:25 by reinelt]reinelt5-3/+8
2005-05-12[lcd4linux @ 2005-05-12 14:55:47 by reinelt]reinelt2-6/+114
2005-05-12[lcd4linux @ 2005-05-12 05:52:43 by reinelt]reinelt1-16/+28
2005-05-11[lcd4linux @ 2005-05-11 04:27:49 by reinelt]reinelt1-11/+6
2005-05-10[lcd4linux @ 2005-05-10 13:20:10 by reinelt]reinelt9-22/+511
2005-05-08[lcd4linux @ 2005-05-08 04:32:43 by reinelt]reinelt94-15305/+16121
2005-05-06[lcd4linux @ 2005-05-06 06:41:53 by reinelt]reinelt1-1/+1
2005-05-06[lcd4linux @ 2005-05-06 06:37:34 by reinelt]reinelt3-31/+112
2005-05-06[lcd4linux @ 2005-05-06 05:40:02 by reinelt]reinelt20-2167/+0
2005-05-06[lcd4linux @ 2005-05-06 05:36:58 by reinelt]reinelt6-238/+0
2005-05-05[lcd4linux @ 2005-05-05 08:36:12 by reinelt]reinelt6-15/+34
"cm"> * first try to integrate the Evaluator into a display driver (MatrixOrbital here) * small warning in processor.c fixed (thanks to Zachary Giles) * workaround for udelay() on alpha (no msr.h avaliable) (thanks to Zachary Giles) * * Revision 1.13 2003/10/05 17:58:50 reinelt * libtool junk; copyright messages cleaned up * * Revision 1.12 2003/07/18 04:43:14 reinelt * udelay: unnecessary sanity check removed * * Revision 1.11 2003/04/04 06:02:04 reinelt * new parallel port abstraction scheme * * Revision 1.10 2003/02/27 07:43:11 reinelt * * asm/msr.h: included hard-coded definition of rdtscl() if msr.h cannot be found. * * autoconf/automake/autoanything: switched back to 1.4. Hope it works again. * * Revision 1.9 2002/08/21 06:09:53 reinelt * some T6963 fixes, ndelay wrap * * Revision 1.8 2002/08/17 14:14:21 reinelt * * USBLCD fixes * * Revision 1.7 2002/04/29 11:00:28 reinelt * * added Toshiba T6963 driver * added ndelay() with nanosecond resolution * * Revision 1.6 2001/08/08 05:40:24 reinelt * * renamed CLK_TCK to CLOCKS_PER_SEC * * Revision 1.5 2001/03/12 13:44:58 reinelt * * new udelay() using Time Stamp Counters * * Revision 1.4 2001/03/12 12:39:36 reinelt * * reworked autoconf a lot: drivers may be excluded, #define's went to config.h * * Revision 1.3 2001/03/01 22:33:50 reinelt * * renamed Raster_flush() to PPM_flush() * * Revision 1.2 2000/07/31 10:43:44 reinelt * * some changes to support kernel-2.4 (different layout of various files in /proc) * * Revision 1.1 2000/04/15 16:56:52 reinelt * * moved delay loops to udelay.c * renamed -d (debugging) switch to -v (verbose) * new switch -d to calibrate delay loop * 'Delay' entry for HD44780 back again * delay loops will not calibrate automatically, because this will fail with hich CPU load * */ /* * * exported fuctions: * * void udelay (unsigned long usec) * delays program execution for usec microseconds * uses global variable 'loops_per_usec', which has to be set before. * This function does busy-waiting! so use only for delays smaller * than 10 msec * * void udelay_calibrate (void) (if USE_OLD_UDELAY is defined) * does a binary approximation for 'loops_per_usec' * should be called several times on an otherwise idle machine * the maximum value should be used * * void udelay_init (void) * selects delay method (gettimeofday() ord rdtsc() according * to processor features * */ #include "config.h" #include <stdlib.h> #include <stdio.h> #ifdef USE_OLD_UDELAY #include <time.h> #else #include <math.h> #include <unistd.h> #include <fcntl.h> #include <errno.h> #include <string.h> #include <sys/time.h> #ifdef HAVE_ASM_MSR_H #include <asm/msr.h> #endif #endif #include "debug.h" #include "udelay.h" #ifdef USE_OLD_UDELAY unsigned long loops_per_usec; void ndelay (unsigned long nsec) { unsigned long loop=(nsec*loops_per_usec+999)/1000; __asm__ (".align 16\n" "1:\tdecl %0\n" "\tjne 1b" : /* no result */ :"a" (loop)); } /* adopted from /usr/src/linux/init/main.c */ void udelay_calibrate (void) { clock_t tick; unsigned long bit; loops_per_usec=1; while (loops_per_usec<<=1) { tick=clock(); while (clock()==tick); tick=clock(); ndelay(1000000000/CLOCKS_PER_SEC); if (clock()>tick) break; } loops_per_usec>>=1; bit=loops_per_usec; while (bit>>=1) { loops_per_usec|=bit; tick=clock(); while (clock()==tick); tick=clock(); ndelay(1000000000/CLOCKS_PER_SEC); if (clock()>tick) loops_per_usec&=~bit; } } #else static unsigned int ticks_per_usec=0; static void getCPUinfo (int *hasTSC, double *MHz) { int fd; char buffer[4096], *p; *hasTSC=0; *MHz=-1; fd=open("/proc/cpuinfo", O_RDONLY); if (fd==-1) { error ("open(/proc/cpuinfo) failed: %s", strerror(errno)); return; } if (read (fd, &buffer, sizeof(buffer)-1)==-1) { error ("read(/proc/cpuinfo) failed: %s", strerror(errno)); close (fd); return; } close (fd); p=strstr(buffer, "flags"); if (p==NULL) { debug ("/proc/cpuinfo has no 'flags' line"); } else { p=strstr(p, "tsc"); if (p==NULL) { debug ("CPU does not support Time Stamp Counter"); } else { debug ("CPU supports Time Stamp Counter"); *hasTSC=1; } } p=strstr(buffer, "cpu MHz"); if (p==NULL) { debug ("/proc/cpuinfo has no 'cpu MHz' line"); } else { if (sscanf(p+7, " : %lf", MHz)!=1) { error ("parse(/proc/cpuinfo) failed: unknown 'cpu MHz' format"); *MHz=-1; } else { debug ("CPU runs at %f MHz", *MHz); } } } void udelay_init (void) { #ifdef HAVE_ASM_MSR_H int tsc; double mhz; getCPUinfo (&tsc, &mhz); if (tsc && mhz>0.0) { ticks_per_usec=ceil(mhz); debug ("using TSC delay loop, %u ticks per microsecond", ticks_per_usec); } else #endif { ticks_per_usec=0; debug ("using gettimeofday() delay loop"); } } void ndelay (unsigned long nsec) { #ifdef HAVE_ASM_MSR_H if (ticks_per_usec) { unsigned int t1, t2; nsec=(nsec*ticks_per_usec+999)/1000; rdtscl(t1); do { rep_nop(); rdtscl(t2); } while ((t2-t1)<nsec); } else #endif { struct timeval now, end; gettimeofday (&end, NULL); end.tv_usec+=(nsec+999)/1000; while (end.tv_usec>1000000) { end.tv_usec-=1000000; end.tv_sec++; } do { rep_nop(); gettimeofday(&now, NULL); } while (now.tv_sec==end.tv_sec?now.tv_usec<end.tv_usec:now.tv_sec<end.tv_sec); } } #endif