/* * Program eks16b.c for Eksempel 16b i boka. Bruk Makefile.eks16b for * å kompilere. Dvs. du må endre navn på Makefile.eks16b * til bare "Makefile". */ #include #include #include #include #include #include #include #include /* Definerer funksjoner som inline-funksjoner. Disse vil kompilatoren * oversette til instruksjoner som legges rett i koden (ikke subrutinekall). * Gir bedre hastighet der vi trenger det. */ int __inline__ read_lpstatus(const port) { return inb(port+1); } int __inline__ read_lpcontrol(const port) { return inb(port+2); } int __inline__ read_lpdata(const port) { return inb(port); } void write_lpdata(const port, int d) { outb(d, port); } void write_lpcontrol(const port, int d) { outb(d,port+2); } /* Gi programmet aksess til område med IO-adresser */ int enable_port(const port) { /* Sjekk at adressen tilhører en parallelport */ if ( (port != 0x278) || (port != 0x378)) return 1; return (ioperm(port, 3, 1)); } int disable_port(const port) { return (ioperm(port, 3, 0)); } int main(int argc, char **argv) { int fd; int port = 0x378; u_long retval, data; /* Aktivér driver "rtc" og skaff en fildeskriptor til den */ fd = open("/dev/rtc", O_RDONLY); /* Set IRQ periodisk rate til 2 Hz */ retval = ioctl(fd, RTC_IRQP_SET, 2); if (retval == -1) { perror("ioctl"); exit(errno); } /* Skru på periodisk IRQ */ retval = ioctl(fd, RTC_PIE_ON, 0); if (retval == -1) { perror("ioctl"); exit(errno); } enable_port(port); while (1) { retval = read(fd, &data, sizeof(unsigned long)); /* Vent på avbrudd */ write_lpdata(port, 1); /* Sett porten høy */ retval = read(fd, &data, sizeof(unsigned long)); /* Vent på avbrudd */ write_lpdata(port, 0); /* Sett porten lav */ } }