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;
}