From 378985a6c3007d9128fc32416cb2666f44dcf260 Mon Sep 17 00:00:00 2001 From: Stef Walter Date: Fri, 28 Nov 2008 16:36:58 +0000 Subject: Import project for detecting environment variables on net4826 and net4526 boxes. --- Makefile | 9 +++ env4526.c | 213 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ env4826.c | 129 +++++++++++++++++++++++++++++++++++++ 3 files changed, 351 insertions(+) create mode 100644 Makefile create mode 100644 env4526.c create mode 100644 env4826.c diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..d023dda --- /dev/null +++ b/Makefile @@ -0,0 +1,9 @@ + +all: env4826 env4526 + +env4826: env4826.c + gcc -o env4826 env4826.c + +env4526: env4526.c + gcc -o env4526 env4526.c + diff --git a/env4526.c b/env4526.c new file mode 100644 index 0000000..a97c68c --- /dev/null +++ b/env4526.c @@ -0,0 +1,213 @@ +#include +#include +#include +#include +#include +#include +#include + +uint16_t *mmcr; +static int dir; + +static void +usage() +{ + fprintf(stderr, "usage: env4526 [-i seconds]\n"); + exit(2); +} + +static void +W(int a, unsigned d) +{ + mmcr[a / 2] = d; +} + +static unsigned +R(int a) +{ + return (mmcr[a/2]); +} + +static void +BO(int i) +{ + u_int u; + + if (i) + W(0xc34, 0x0080); + else + W(0xc38, 0x0080); + if (dir == 0) { + u = R(0xc2a); + W(0xc2a, u | 0x0080); + dir = 1; + } + W(0xc34, 0x0100); + W(0xc34, 0x0100); + W(0xc34, 0x0100); + W(0xc34, 0x0100); + W(0xc38, 0x0100); + W(0xc38, 0x0100); + W(0xc38, 0x0100); + W(0xc38, 0x0100); +} + +static int +BI(void) +{ + u_int u; + + if (dir == 1) { + u = R(0xc2a); + W(0xc2a, u & ~0x0080); + dir = 0; + } + W(0xc34, 0x0100); + W(0xc34, 0x0100); + W(0xc34, 0x0100); + W(0xc34, 0x0100); + u = R(0xc30) & 0x0080; + W(0xc38, 0x0100); + W(0xc38, 0x0100); + W(0xc38, 0x0100); + W(0xc38, 0x0100); + return (u ? 1 : 0); +} + +static void +START(void) +{ + u_int u; + + W(0xc34, 0x0180); + if (dir == 0) { + u = R(0xc2a); + W(0xc2a, u | 0x0080); + dir = 1; + } + W(0xc38, 0x0080); + W(0xc38, 0x0100); + W(0xc38, 0x0100); +} + +static void +STOP(void) +{ + u_int u; + + W(0xc38, 0x0080); + if (dir == 0) { + u = R(0xc2a); + W(0xc2a, u | 0x0080); + dir = 1; + } + W(0xc34, 0x0100); + W(0xc34, 0x0100); + W(0xc34, 0x0100); + W(0xc34, 0x0100); + W(0xc34, 0x0080); +} + +static void +read_temp() +{ + int i; + u_int j, u; + char buf1[20]; + char buf2[20]; + + u = R(0xc2a); + W(0xc2a, u | 0x0180); + W(0xc34, 0x0180); + + u = 0; + START(); + BO(1); + BO(0); + BO(0); + BO(1); + BO(u & 4); + BO(u & 2); + BO(u & 1); + BO(0); + BI(); + for (i = 0; i < 6; i++) + BO(0); + BO(0); + BO(0); + BI(); + STOP(); + + START(); + BO(1); + BO(0); + BO(0); + BO(1); + BO(u & 4); + BO(u & 2); + BO(u & 1); + BO(1); + for (i = 0; i < 9; i++) + buf1[i] = BI(); + BO(0); + for (i = 0; i < 8; i++) + buf2[i] = BI(); + BO(1); + STOP(); + + j = 0; + for (i = 1; i < 9; i++) { + j |= buf1[i]; + j += j; + } + for (i = 0; i < 8; i++) { + j |= buf2[i]; + j += j; + } + + printf("lm75: %.2fC\n", j / 512.0); +} + +int +main(int argc, char **argv) +{ + int seconds = 0; + char *t; + FILE *f; + int ch; + int fd; + + 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 (); + + fd = open ("/dev/elan-mmcr", O_RDWR); + if (fd < 0) + err (1, "couldn't open: /dev/elan-mmcr"); + mmcr = mmap (NULL, 4096, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); + + for (;;) { + read_temp (); + fflush (stdout); + if (!seconds) + break; + sleep (seconds); + } + + return 0; +} 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 +#include +#include +#include +#include +#include +#include +#include +#include + +#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; +} -- cgit v1.2.3