diff --git a/src/system/boot/platform/openfirmware/Jamfile b/src/system/boot/platform/openfirmware/Jamfile index 3a740de1b8..33d8e1439e 100644 --- a/src/system/boot/platform/openfirmware/Jamfile +++ b/src/system/boot/platform/openfirmware/Jamfile @@ -21,6 +21,7 @@ local platform_src = menu.cpp mmu.cpp network.cpp + real_time_clock.cpp start.cpp support.cpp video.cpp diff --git a/src/system/boot/platform/openfirmware/real_time_clock.cpp b/src/system/boot/platform/openfirmware/real_time_clock.cpp new file mode 100644 index 0000000000..fb91a6686b --- /dev/null +++ b/src/system/boot/platform/openfirmware/real_time_clock.cpp @@ -0,0 +1,57 @@ +/* + * Copyright 2006, Ingo Weinhold . + * Copyright 2010, Andreas Färber + * All rights reserved. Distributed under the terms of the MIT License. + */ + + +#include "real_time_clock.h" + +#include + +#include +#include +#include +#include + + +static int sHandle = OF_FAILED; + + +status_t +init_real_time_clock(void) +{ + // find RTC + intptr_t rtcCookie = 0; + if (of_get_next_device(&rtcCookie, 0, "rtc", + gKernelArgs.platform_args.rtc_path, + sizeof(gKernelArgs.platform_args.rtc_path)) != B_OK) { + printf("init_real_time_clock(): Found no RTC device!"); + return B_ERROR; + } + + sHandle = of_open(gKernelArgs.platform_args.rtc_path); + if (sHandle == OF_FAILED) { + printf("%s(): Could not open RTC device!\n", __func__); + return B_ERROR; + } + + 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 new file mode 100644 index 0000000000..8262be4234 --- /dev/null +++ b/src/system/boot/platform/openfirmware/real_time_clock.h @@ -0,0 +1,24 @@ +/* + * Copyright 2006, Ingo Weinhold . + * Copyright 2010, Andreas Färber + * All rights reserved. Distributed under the terms of the MIT License. + */ +#ifndef OPENFIRMWARE_REAL_TIME_CLOCK_H +#define OPENFIRMWARE_REAL_TIME_CLOCK_H + + +#include + + +#ifdef __cplusplus +extern "C" { +#endif + +status_t init_real_time_clock(void); +bigtime_t real_time_clock_usecs(void); + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif /* OPENFIRMWARE_REAL_TIME_CLOCK_H */ diff --git a/src/system/boot/platform/openfirmware/start.cpp b/src/system/boot/platform/openfirmware/start.cpp index fb267eff0c..e49398efdd 100644 --- a/src/system/boot/platform/openfirmware/start.cpp +++ b/src/system/boot/platform/openfirmware/start.cpp @@ -20,6 +20,7 @@ #include "console.h" #include "machine.h" +#include "real_time_clock.h" #define HEAP_SIZE 65536 @@ -125,6 +126,9 @@ start(void *openFirmwareEntry) if (boot_arch_cpu_init() != B_OK) of_exit(); + if (init_real_time_clock() != B_OK) + of_exit(); + // check for key presses once sBootOptions = 0; int key = console_check_for_key();