summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStef Walter <stef@thewalter.net>2006-03-15 16:25:52 +0000
committerStef Walter <stef@thewalter.net>2006-03-15 16:25:52 +0000
commit8c4f3c51839c9185f7989249d9e85ca27f574aa3 (patch)
tree3e91122983d6202f57b4690f6c1463423002a030
Initial import of soekris tools
-rw-r--r--Makefile9
-rw-r--r--env4526.c213
-rw-r--r--env4826.c129
3 files changed, 351 insertions, 0 deletions
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 <err.h>
+#include <errno.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <fcntl.h>
+#include <sys/param.h>
+#include <sys/mman.h>
+
+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 <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;
+}