-debug
[lptgpib.git] / parport.c
1 #include <stdio.h>
2 #include <termios.h>
3 #include <stdint.h>
4 #include <sys/io.h>
5 #include <stdlib.h>
6 #include <assert.h>
7 #include <unistd.h>
8 #include <poll.h>
9
10 static const int port=0x37a;
11 static const int port_ecr=0x37a+0x400;
12
13 #define LENGTH(x) (sizeof(x)/sizeof(*(x)))
14
15 static volatile struct termios tios;
16
17 static void cleanup(void) {
18   tcsetattr(0,TCSANOW,(struct termios *)&tios);
19 }
20
21 int main(void) {
22   uint8_t out=0x24;
23   if (iopl(3)!=0) {
24     fprintf(stderr,"iopl 3: %m\n");
25     exit(EXIT_FAILURE);
26   }
27   outb(0x00,port_ecr); // Standard Mode
28   int i=tcgetattr(0,(struct termios *)&tios);
29   assert(i==0);
30   atexit(cleanup);
31   struct termios tios_raw=tios;
32   cfmakeraw(&tios_raw);
33   i=tcsetattr(0,TCSANOW,&tios_raw);
34   assert(i==0);
35   for (;;) {
36     static const struct item {
37       const char *name;
38       uint8_t mask;
39       char key;
40     } items[]={
41       {"DAV=pin1"  ,0x01,'1'},
42       {"NRFD=pin14",0x02,'2'},
43       {"NDAC=pin16",0x04,'4'},
44       {"ATN=pin17" ,0x08,'8'},
45       {"bidir"     ,0x20,'b'},
46     };
47     outb(out,port);
48     usleep(1000000/10);
49     uint8_t in=inb(port);
50     printf("out=0x%02x in=0x%02x",out,in);
51     for (const struct item *item=items;item<items+LENGTH(items);item++)
52       printf(" %s:out=%d,in=%d;'%c'",item->name,!!(out&item->mask),!!(in&item->mask),item->key);
53     putchar('\r');
54     fflush(stdout);
55     struct pollfd pollfd;
56     pollfd.fd=STDIN_FILENO;
57     pollfd.events=POLLIN;
58     switch (poll(&pollfd,1,0)) {
59       case 1: {
60         char c;
61         ssize_t got=read(STDIN_FILENO,&c,1);
62         assert(got==1);
63         if (c==27||c==3||c=='\r') {
64           putchar('\n');
65           exit(EXIT_FAILURE);
66         }
67         for (const struct item *item=items;item<items+LENGTH(items);item++)
68           if (c==item->key)
69             out^=item->mask;
70         } break;
71       case 0:
72         break;
73       case -1:
74         abort();
75     }
76   }
77 }