diff options
| author | Andreas Monzner <andreas.monzner@multimedia-labs.de> | 2008-08-26 10:54:46 +0000 |
|---|---|---|
| committer | Andreas Monzner <andreas.monzner@multimedia-labs.de> | 2008-08-26 10:54:46 +0000 |
| commit | 92362f1b73f1e61ad0cb1c581b318b360e0bb6fe (patch) | |
| tree | 1e351add90b8bbd3d9b822d313bc6b4d56a9350e /lib/dvb/dvbtime.cpp | |
| parent | 92929c357751afc31f7f1acbe3e724bdf307cf23 (diff) | |
| download | enigma2-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.cpp | 57 |
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; } |
