aboutsummaryrefslogtreecommitdiff
path: root/lib/dvb/dvbtime.cpp
diff options
context:
space:
mode:
authorAndreas Monzner <andreas.monzner@multimedia-labs.de>2008-08-26 10:54:46 +0000
committerAndreas Monzner <andreas.monzner@multimedia-labs.de>2008-08-26 10:54:46 +0000
commit92362f1b73f1e61ad0cb1c581b318b360e0bb6fe (patch)
tree1e351add90b8bbd3d9b822d313bc6b4d56a9350e /lib/dvb/dvbtime.cpp
parent92929c357751afc31f7f1acbe3e724bdf307cf23 (diff)
downloadenigma2-92362f1b73f1e61ad0cb1c581b318b360e0bb6fe.tar.gz
enigma2-92362f1b73f1e61ad0cb1c581b318b360e0bb6fe.zip
add support for dm8000 rtc,
add support for dm8000 deepstandby wakeup, go back to deepstandby after deepstandby timer wakeup even when not explicitely selected (this needs new drivers and / or new atmel firmware) add some sanity checks to dont break anything even with old drivers/atmel firmware
Diffstat (limited to 'lib/dvb/dvbtime.cpp')
-rw-r--r--lib/dvb/dvbtime.cpp57
1 files changed, 46 insertions, 11 deletions
diff --git a/lib/dvb/dvbtime.cpp b/lib/dvb/dvbtime.cpp
index 616363f9..6cfaccc8 100644
--- a/lib/dvb/dvbtime.cpp
+++ b/lib/dvb/dvbtime.cpp
@@ -15,26 +15,61 @@ static time_t prev_time;
void setRTC(time_t time)
{
- int fd = open("/dev/dbox/fp0", O_RDWR);
- if ( fd >= 0 )
+ FILE *f = fopen("/proc/stb/fp/rtc", "w");
+ if (f)
{
- if ( ::ioctl(fd, FP_IOCTL_SET_RTC, (void*)&time ) < 0 )
- eDebug("FP_IOCTL_SET_RTC failed(%m)");
+ time_t wakeup=0;
+ FILE *f2 = fopen("/proc/stb/fp/wakeup_time", "r");
+ if (f2)
+ {
+ fscanf(f2, "%u", &wakeup);
+ fclose(f2);
+ }
+ if (wakeup) // atmel firmware okay?
+ {
+ if (fprintf(f, "%u", time))
+ prev_time = time;
+ else
+ eDebug("write /proc/stb/fp/rtc failed (%m)");
+ fclose(f);
+ }
else
- prev_time = time;
- close(fd);
+ eDebug("dont set rtc because of buggy atmel firmware!");
+ }
+ else
+ {
+ int fd = open("/dev/dbox/fp0", O_RDWR);
+ if ( fd >= 0 )
+ {
+ if ( ::ioctl(fd, FP_IOCTL_SET_RTC, (void*)&time ) < 0 )
+ eDebug("FP_IOCTL_SET_RTC failed(%m)");
+ else
+ prev_time = time;
+ close(fd);
+ }
}
}
time_t getRTC()
{
time_t rtc_time=0;
- int fd = open("/dev/dbox/fp0", O_RDWR);
- if ( fd >= 0 )
+ FILE *f = fopen("/proc/stb/fp/rtc", "r");
+ if (f)
+ {
+ // sanity check to detect corrupt atmel firmware
+ if (fscanf(f, "%u", &rtc_time) != 1)
+ eDebug("read /proc/stb/fp/rtc failed (%m)");
+ fclose(f);
+ }
+ else
{
- if ( ::ioctl(fd, FP_IOCTL_GET_RTC, (void*)&rtc_time ) < 0 )
- eDebug("FP_IOCTL_GET_RTC failed(%m)");
- close(fd);
+ int fd = open("/dev/dbox/fp0", O_RDWR);
+ if ( fd >= 0 )
+ {
+ if ( ::ioctl(fd, FP_IOCTL_GET_RTC, (void*)&rtc_time ) < 0 )
+ eDebug("FP_IOCTL_GET_RTC failed(%m)");
+ close(fd);
+ }
}
return rtc_time != prev_time ? rtc_time : 0;
}