From 58b1d4608a2c5d6658fb4510061d7503e6c33219 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20F=C3=A4rber?= Date: Tue, 31 Aug 2010 18:42:57 +0000 Subject: [PATCH] boot_loader_openfirmware: Implement real_time_clock_usecs() Partially revert r38465 and move the code from system_time() into a new real_time_clock_usecs() function. The system_time() implementation was correct in relying on of_milliseconds(), as pointed out by Axel. Add the correct function for the desired functionality. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@38481 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../platform/openfirmware/real_time_clock.cpp | 22 ++++++++++++++++--- .../platform/openfirmware/real_time_clock.h | 3 +-- .../boot/platform/openfirmware/support.cpp | 22 ++----------------- 3 files changed, 22 insertions(+), 25 deletions(-) diff --git a/src/system/boot/platform/openfirmware/real_time_clock.cpp b/src/system/boot/platform/openfirmware/real_time_clock.cpp index 2fb0aab5df..3ea8bf522e 100644 --- a/src/system/boot/platform/openfirmware/real_time_clock.cpp +++ b/src/system/boot/platform/openfirmware/real_time_clock.cpp @@ -15,7 +15,7 @@ #include -int gRTC = OF_FAILED; +static int sHandle = OF_FAILED; status_t @@ -30,8 +30,8 @@ init_real_time_clock(void) return B_ERROR; } - gRTC = of_open(gKernelArgs.platform_args.rtc_path); - if (gRTC == OF_FAILED) { + sHandle = of_open(gKernelArgs.platform_args.rtc_path); + if (sHandle == OF_FAILED) { printf("%s(): Could not open RTC device!\n", __func__); return B_ERROR; } @@ -39,3 +39,19 @@ init_real_time_clock(void) return B_OK; } + +bigtime_t +real_time_clock_usecs(void) +{ + if (sHandle == OF_FAILED) + return OF_FAILED; + int second, minute, hour, day, month, year; + if (of_call_method(sHandle, "get-time", 0, 6, &year, &month, &day, + &hour, &minute, &second) == OF_FAILED) + return OF_FAILED; + int days = day; + // TODO: Apply algorithm from kernel + // to assure monotonically increasing date. + return (((days * 24 + hour) * 60ULL + minute) * 60ULL + second) + * 1000000ULL; +} diff --git a/src/system/boot/platform/openfirmware/real_time_clock.h b/src/system/boot/platform/openfirmware/real_time_clock.h index e0bbfc55df..8262be4234 100644 --- a/src/system/boot/platform/openfirmware/real_time_clock.h +++ b/src/system/boot/platform/openfirmware/real_time_clock.h @@ -14,9 +14,8 @@ extern "C" { #endif -extern int gRTC; - status_t init_real_time_clock(void); +bigtime_t real_time_clock_usecs(void); #ifdef __cplusplus } // extern "C" diff --git a/src/system/boot/platform/openfirmware/support.cpp b/src/system/boot/platform/openfirmware/support.cpp index 806f3a869c..2333b8eb24 100644 --- a/src/system/boot/platform/openfirmware/support.cpp +++ b/src/system/boot/platform/openfirmware/support.cpp @@ -1,6 +1,5 @@ /* * Copyright 2005, Ingo Weinhold . - * Copyright 2010, Andreas Färber * All rights reserved. Distributed under the terms of the MIT License. */ @@ -9,27 +8,10 @@ #include -#include "real_time_clock.h" - bigtime_t system_time(void) { - int milliseconds = of_milliseconds(); - if (milliseconds == OF_FAILED) - milliseconds = 0; - bigtime_t result = milliseconds; - int second, minute, hour, day, month, year; - if (gRTC != OF_FAILED) { - if (of_call_method(gRTC, "get-time", 0, 6, &year, &month, &day, - &hour, &minute, &second) != OF_FAILED) { - result %= 1000; - int days = day; - // TODO: Apply algorithm from kernel - // to assure monotonically increasing date. - result += (((days * 24 + hour) * 60ULL + minute) * 60ULL + second) - * 1000ULL; - } - } - return result * 1000; + int result = of_milliseconds(); + return (result == OF_FAILED ? 0 : bigtime_t(result) * 1000); }