/* * Program for eksempel 4. * Kompileres med: gcc -O eks4.c -o eks4 */ #define PORTADRESSE 0x378 /* evt. 0x278 */ #include /*#include /* kreves av: ioperm() */ #include /* kreves av: read() */ #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) { if ( (port != 0x278) && (port != 0x378)) { fprintf(stderr, "enable_port: kun lov å angi adressen til en parallellport"); return -1; } if (ioperm(port, 3, 1) != 0) { perror("enable_port: ioperm"); return -1; } return 0; } int disable_port(const port) { if (ioperm(port, 3, 0) != 0) { perror("disable_port: ioperm"); return -1; } return 0; } int main(int argc, /* antall parametre på kommandolinja */ char **argv, /* kommandolinjeparameterene */ char **env) /* omgivelsesvariablene */ { int fd; 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); } if (enable_port(PORTADRESSE) != 0) { exit(-1); } write_lpcontrol(PORTADRESSE, 0x0c); while (1) { retval = read(fd, &data, sizeof(u_long)); /* Vent på avbrudd */ write_lpdata(PORTADRESSE, 0xff); /* Sett databit 0 høy */ retval = read(fd, &data, sizeof(u_long)); /* Vent på avbrudd */ write_lpdata(PORTADRESSE, 0x00); /* Sett databit 0 lav */ } }