Listing 3
#include <fcntl.h> #include <linux/mc146818rtc.h> #include <sys/ioctl.h> // The file descriptor for the rtc device int rtc_fd; // This will hold the status response from // /dev/rtc when an interrupt returns unsigned long rtc_status; int thread_main(void*) { // Open the /dev/rtc device file rtc_fd = open("/dev/rtc", O_RDONLY); if(rtc_ft < 0) return -1; // Enable periodic interrupts, and set the interval to 32 Hz if(ioctl(rtc_fd, RTC_PIE_ON, 0) < 0) return -1; if(ioctl(rtc_fd, RTC_IRQP_SET, 32) < 0) return -1; while(!video_finished()) { show_next_frame(); // Read from the rtc device. // This will return when the next timer interrupt is raised if(read(rtc_fd, &data, sizeof(unsigned long)) < 0) break; // Check for missed interrupts, and skip frames if necessary. // We need to do the shift because the lower byte of the // returned unsigned long contains the type of the interrupt // (i.e. whether it's an alarm or a periodic interrupt) data >>= 8; while(data-- > 1) skip_frame(); } // Turn the periodic interrupt off if(ioctl(rtc_fd, RTC_PIE_OFF, 0) < 0) return -1; return 0; }