diff options
author | Stef Walter <stef@thewalter.net> | 2008-11-28 16:36:58 +0000 |
---|---|---|
committer | Stef Walter <stef@thewalter.net> | 2008-11-28 16:36:58 +0000 |
commit | 378985a6c3007d9128fc32416cb2666f44dcf260 (patch) | |
tree | 3e91122983d6202f57b4690f6c1463423002a030 /env4826.c |
Import project for detecting environment variables on net4826 and
net4526 boxes.
Diffstat (limited to 'env4826.c')
-rw-r--r-- | env4826.c | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/env4826.c b/env4826.c new file mode 100644 index 0000000..ead49a9 --- /dev/null +++ b/env4826.c @@ -0,0 +1,129 @@ +#include <err.h> +#include <errno.h> +#include <stdio.h> +#include <unistd.h> +#include <fcntl.h> +#include <sys/time.h> +#include <sys/param.h> +#include <sys/mman.h> +#include <machine/cpufunc.h> + +#define BASE 0x200 + +static void +usage() +{ + fprintf(stderr, "usage: env4826 [-i seconds]\n"); + exit(2); +} + +static void +pollb(void) +{ + int j, k, l; + + j = 0; + do { + if (++j > 1000) + break; + l = inb (BASE + 1); + } while (!(l & 0x40)); +} + +static int +read_temp() +{ + u_int u; + + u = inl(0x6000 + 0x30); + u &= ~(1 << 19); + u |= 1 << 19; + outl(0x6000 + 0x30, u); + u = inl(0x6000 + 0x30); + + outb(0x15c, 0x07); outb(0x15d, 0x06); /* ACB2 */ + outb(0x15c, 0x60); outb(0x15d, BASE >> 8); /* base addr MSB */ + outb(0x15c, 0x61); outb(0x15d, BASE & 0xff); /* base addr LSB */ + outb(0x15c, 0x30); outb(0x15d, 0x01); /* enable */ + outb(0x15c, 0xf0); outb(0x15d, 0x02); /* internal pull-up */ + + outb(BASE + 5, 0); + + outb(BASE + 5, 0xfe | 0x01); + + usleep(100000); + outb(BASE + 3, 0x01); + pollb(); + outb(BASE + 0, 0x90); + pollb(); + outb(BASE + 0, 0x00); + pollb(); + outb(BASE + 3, 0x02); + + outb(BASE + 3, 0x01); + + pollb(); + + outb(BASE + 0, 0x91); + + pollb(); + + outb(BASE + 3, 0x10); + + u = inb(BASE + 0) << 8; + + pollb(); + + u |= inb(BASE + 0); + + outb(BASE + 3, 0x02); + + printf("lm75: %.2fC\n", u / 256.0); + + outb(BASE + 5, 0); + usleep(100000); + + return 0; +} + +int +main(int argc, char **argv) +{ + int seconds = 0; + char *t; + FILE *f; + int ch; + + while ((ch = getopt (argc, argv, "i:")) != -1) { + switch(ch) { + case 'i': + seconds = strtol (optarg, &t, 10); + if (*t || seconds < 0) + usage (); + break; + default: + usage (); + break; + } + } + + argc -= optind; + argv += optind; + + if (argc != 0) + usage (); + + f = fopen("/dev/io", "r"); + if (!f) + err (1, "couldn't open /dev/io"); + + for (;;) { + read_temp (); + fflush(stdout); + if (!seconds) + break; + sleep (seconds); + } + + return 0; +} |