/* $Id: ioploop.c,v 1.1 2009/02/28 15:01:23 kostik Exp kostik $ */ #include #include #include #include #include #include #include static const unsigned int port_num = 0x130; unsigned char inb(unsigned int port) { unsigned char data; __asm __volatile("inb %%dx,%0" : "=a" (data) : "d" (port)); return (data); } void sigalarm_handler(int signo) { inb(port_num); } int main(int argc, char *argv[]) { struct sigaction sa; struct timespec rqtp; struct itimerval it; int io_fd; int i; memset(&rqtp, 0, sizeof(rqtp)); rqtp.tv_sec = 0; rqtp.tv_nsec = 100000000; i = 0; memset(&sa, 0, sizeof(sa)); sa.sa_handler = sigalarm_handler; if (sigaction(SIGALRM, &sa, NULL) == -1) { fprintf(stderr, "sigaction(SIGALRM): %s\n", strerror(errno)); return (1); } memset(&it, 0, sizeof(it)); it.it_interval.tv_sec = 0; it.it_interval.tv_usec = 333333; it.it_value = it.it_interval; if (setitimer(ITIMER_REAL, &it, NULL) == -1) { fprintf(stderr, "setitimer: %s\n", strerror(errno)); return (1); } io_fd = open("/dev/io", O_RDWR); if (io_fd == -1) { fprintf(stderr, "Opening /dev/io: %s\n", strerror(errno)); return (1); } for (;;) { inb(port_num + i); if (++i == 10) i = 0; nanosleep(&rqtp, NULL); } return (0); }