/******************************************************************************* * BRtc.h Real Time Clock interface * T.Barnaby, BEAM Ltd, 19/5/04 ******************************************************************************* */ #include <BRtc.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <unistd.h> #include <fcntl.h> #include <sys/ioctl.h> #include <linux/rtc.h> BRtc::BRtc(){ ofd = -1; orate = 0; } BRtc::~BRtc(){ if(ofd > 0) close(ofd); } BError BRtc::init(int rate){ BError err; orate = rate; if((ofd = open("/dev/rtc", O_RDONLY)) < 0) err.set(1, BString("Unable to open /dev/rtc: ") + strerror(errno)); if(!err && (ioctl(ofd, RTC_IRQP_SET, orate) < 0)) err.set(1, BString("Unable to set RTC rate: ") + strerror(errno)); if(!err && (ioctl(ofd, RTC_PIE_ON, 0) < 0)) err.set(1, BString("Unable to set RTC interrupt: ") + strerror(errno)); return err; } void BRtc::wait(int delayUs){ int n; unsigned long data; n = (orate * delayUs) / 1000000; if(n < 1) n = 1; while(n--) read(ofd, &data, sizeof(data)); } BRtcThreaded::BRtcThreaded(){ orate = 0; } BRtcThreaded::~BRtcThreaded(){ } BError BRtcThreaded::init(int rate){ BError err; orate = rate; if(! (err = ortc.init(rate))){ setInitStackSize(100 * 1024); start(); } return err; } void* BRtcThreaded::function(){ while(1){ ortc.wait(1000000 / orate); ocond.signal(); } } void BRtcThreaded::wait(int delayUs){ int n; n = (orate * delayUs) / 1000000; if(n < 1) n = 1; while(n--) ocond.wait(); }