diff options
| author | makefu <github@syntax-fehler.de> | 2011-08-20 23:21:48 +0200 |
|---|---|---|
| committer | makefu <github@syntax-fehler.de> | 2011-08-20 23:21:48 +0200 |
| commit | 37e09437c2f20ac269f8d2b7f9c7f7cd325f0585 (patch) | |
| tree | e1ea709db90614f48c7d7b2a2162236b8ef69889 /oncology/dpfhack_display/lcd4linux/.svn/text-base/udelay.c.svn-base | |
| parent | 9bbf4fa73c2d48864e58d624629bd4bac7a69673 (diff) | |
oncology: initial commit
oncology will analyse the current krebs status
Diffstat (limited to 'oncology/dpfhack_display/lcd4linux/.svn/text-base/udelay.c.svn-base')
| -rw-r--r-- | oncology/dpfhack_display/lcd4linux/.svn/text-base/udelay.c.svn-base | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/oncology/dpfhack_display/lcd4linux/.svn/text-base/udelay.c.svn-base b/oncology/dpfhack_display/lcd4linux/.svn/text-base/udelay.c.svn-base new file mode 100644 index 00000000..9ea4a8fb --- /dev/null +++ b/oncology/dpfhack_display/lcd4linux/.svn/text-base/udelay.c.svn-base @@ -0,0 +1,114 @@ +/* $Id$ + * $URL$ + * + * short delays + * + * Copyright (C) 1999, 2000 Michael Reinelt <michael@reinelt.co.at> + * Copyright (C) 2004 The LCD4Linux Team <lcd4linux-devel@users.sourceforge.net> + * + * This file is part of LCD4Linux. + * + * LCD4Linux is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * LCD4Linux is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + */ + +/* + * + * exported fuctions: + * + * void udelay_init (void) + * selects delay method (gettimeofday() ord rdtsc() according + * to processor features + * + * unsigned long timing (const char *driver, const char *section, const char *name, const int defval, const char *unit); + * returns a timing value from config or the default value + * + * 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 + * + */ + +#include "config.h" +#include <stdlib.h> +#include <stdio.h> + + +#include <math.h> +#include <unistd.h> +#include <fcntl.h> +#include <errno.h> +#include <string.h> +#include <sys/time.h> + + +#include "debug.h" +#include "cfg.h" +#include "qprintf.h" +#include "udelay.h" + + + +void udelay_init(void) +{ + info("udelay: using gettimeofday() delay loop"); +} + + +unsigned long timing(const char *driver, const char *section, const char *name, const int defval, const char *unit) +{ + char sec[256]; + int fuzz, val; + + qprintf(sec, sizeof(sec), "%s.Timing", section); + + /* fuzz all timings by given factor */ + cfg_number(sec, "fuzz", 100, 1, -1, &fuzz); + + cfg_number(sec, name, defval, 0, -1, &val); + val = val * fuzz / 100; + + if (val != defval) { + if (fuzz != 100) { + info("%s: timing: %6s = %5d %s (default %d %s, fuzz %d)", driver, name, val, unit, defval, unit, fuzz); + } else { + info("%s: timing: %6s = %5d %s (default %d %s)", driver, name, val, unit, defval, unit); + } + } else { + info("%s: timing: %6s = %5d %s (default)", driver, name, defval, unit); + } + return val; +} + + +void ndelay(const unsigned long nsec) +{ + + 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); +} |
