#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; }