X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/17f0a48b8816b223f684b8deb227ab333e9e8725..e52de875e255153a9d15656d459fc784614fe4a6:/lib/dvb/dvbtime.cpp diff --git a/lib/dvb/dvbtime.cpp b/lib/dvb/dvbtime.cpp index 616363f9..42b12e85 100644 --- a/lib/dvb/dvbtime.cpp +++ b/lib/dvb/dvbtime.cpp @@ -15,26 +15,49 @@ 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)"); - else + if (fprintf(f, "%u", time)) prev_time = time; - close(fd); + else + eDebug("write /proc/stb/fp/rtc failed (%m)"); + fclose(f); + } + 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) { - if ( ::ioctl(fd, FP_IOCTL_GET_RTC, (void*)&rtc_time ) < 0 ) - eDebug("FP_IOCTL_GET_RTC failed(%m)"); - close(fd); + // 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 + { + 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; }