/* * Real Time Clock Driver Test/Example Program * * Compile with: * cc -Wall rtctest2.c -o rtctest2 * * Copyright (C) 2005 Martin Habets. * * Released under the GNU General Public License, version 2, * included herein by reference. * */ #include #include #include #include #include #include #include #include #include #define LOOPCNT 20 int main(void) { int i, fd, retval, irqcount = 0; unsigned long tmp, data; struct timeval tv1, tv2; unsigned long diff, loopdiff, looplen, deviation; fd = open ("/dev/rtc", O_RDONLY); if (fd == -1) { perror("/dev/rtc"); exit(errno); } /* Read periodic IRQ rate */ retval = ioctl(fd, RTC_IRQP_READ, &tmp); if (retval == -1) { perror("ioctl"); exit(errno); } fprintf(stderr, "Periodic IRQ rate was %ldHz.\n\n", tmp); fflush(stderr); /* The frequencies 128Hz, 256Hz, ... 8192Hz are only allowed for root. */ for (tmp=2; tmp<=8192; tmp*=2) { retval = ioctl(fd, RTC_IRQP_SET, tmp); if (retval == -1) { fprintf(stderr, "\n"); perror("ioctl"); break; } /* Enable periodic interrupts */ retval = ioctl(fd, RTC_PIE_ON, 0); if (retval == -1) { perror("ioctl"); exit(errno); } retval = gettimeofday(&tv1, NULL); if (retval == -1) { perror("gettimeofday"); exit(errno); } for (i=1; i<=LOOPCNT; i++) { /* This blocks */ retval = read(fd, &data, sizeof(unsigned long)); if (retval == -1) { perror("read"); exit(errno); } irqcount++; } retval = gettimeofday(&tv2, NULL); if (retval == -1) { perror("gettimeofday"); exit(errno); } /* Disable periodic interrupts */ retval = ioctl(fd, RTC_PIE_OFF, 0); if (retval == -1) { perror("ioctl"); exit(errno); } diff = (tv2.tv_sec-tv1.tv_sec)*1000000 + tv2.tv_usec - tv1.tv_usec; loopdiff = diff/20; looplen = 1000000/tmp; deviation = abs(loopdiff-looplen); fprintf(stderr, "20 loops at %ldHz = %ld usec, %ld usec/loop. ", tmp, diff, loopdiff); fprintf(stderr, "deviation is %ld usec (%d%%).\n", deviation, (int)(100*deviation/looplen)); fflush(stderr); } fprintf(stderr, "Test complete\n"); close(fd); return 0; } /* end main */