2003-10-24 14:21:10 +04:00
|
|
|
/*
|
|
|
|
** Copyright 2003, Jeff Ward, jeff@r2d2.stcloudstate.edu. All rights reserved.
|
|
|
|
** Distributed under the terms of the OpenBeOS License.
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
#include <OS.h>
|
|
|
|
#include <debug.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
|
|
|
#include <arch/real_time_clock.h>
|
|
|
|
#include <real_time_clock.h>
|
|
|
|
|
2004-11-06 20:37:00 +03:00
|
|
|
#define RTC_REGION_SIZE B_PAGE_SIZE
|
2003-10-24 16:01:25 +04:00
|
|
|
|
2004-11-06 20:37:00 +03:00
|
|
|
static bigtime_t *sBootTime;
|
|
|
|
static region_id sRtcArea;
|
2003-10-24 16:01:25 +04:00
|
|
|
|
2003-10-24 14:21:10 +04:00
|
|
|
|
|
|
|
/** Write the system time to CMOS. */
|
|
|
|
|
2003-10-24 16:01:25 +04:00
|
|
|
static void
|
|
|
|
rtc_system_to_hw(void)
|
|
|
|
{
|
2003-10-24 14:21:10 +04:00
|
|
|
uint32 seconds;
|
2003-10-24 16:01:25 +04:00
|
|
|
|
2004-11-06 20:37:00 +03:00
|
|
|
seconds = (*sBootTime + system_time()) / 1000000;
|
2003-10-24 14:21:10 +04:00
|
|
|
arch_rtc_set_hw_time(seconds);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/** Read the CMOS clock and update the system time accordingly. */
|
|
|
|
|
2003-10-24 16:01:25 +04:00
|
|
|
static void
|
|
|
|
rtc_hw_to_system(void)
|
|
|
|
{
|
2003-10-24 14:21:10 +04:00
|
|
|
uint32 current_time;
|
2003-10-24 16:01:25 +04:00
|
|
|
|
2003-10-24 14:21:10 +04:00
|
|
|
current_time = arch_rtc_get_hw_time();
|
2003-10-28 16:12:13 +03:00
|
|
|
set_real_time_clock(current_time);
|
2003-10-24 14:21:10 +04:00
|
|
|
}
|
|
|
|
|
2003-10-24 16:01:25 +04:00
|
|
|
|
2003-10-24 14:21:10 +04:00
|
|
|
bigtime_t
|
2003-10-24 16:01:25 +04:00
|
|
|
rtc_boot_time(void)
|
|
|
|
{
|
2004-11-06 20:37:00 +03:00
|
|
|
return *sBootTime;
|
2003-10-24 14:21:10 +04:00
|
|
|
}
|
2003-10-24 16:09:20 +04:00
|
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
rtc_print(void)
|
|
|
|
{
|
|
|
|
uint32 currentTime;
|
|
|
|
|
2004-11-06 20:37:00 +03:00
|
|
|
currentTime = (*sBootTime + system_time()) / 1000000;
|
2004-03-15 00:53:48 +03:00
|
|
|
dprintf("system_time: %Ld\n", system_time());
|
2004-11-06 20:37:00 +03:00
|
|
|
dprintf("boot_time: %Ld\n", *sBootTime);
|
2004-03-29 03:52:11 +04:00
|
|
|
dprintf("current_time: %lu\n", currentTime);
|
2003-10-24 16:09:20 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static int
|
|
|
|
rtc_debug(int argc, char **argv)
|
|
|
|
{
|
|
|
|
if (argc < 2) {
|
|
|
|
// If no arguments were given, output all usefull data.
|
|
|
|
rtc_print();
|
|
|
|
} else {
|
|
|
|
// If there was an argument, reset the system and hw time.
|
2003-10-28 16:12:13 +03:00
|
|
|
set_real_time_clock(strtoul(argv[1], NULL, 10));
|
2003-10-24 16:09:20 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
status_t
|
|
|
|
rtc_init(kernel_args *ka)
|
|
|
|
{
|
|
|
|
//dprintf("rtc_init: entry\n");
|
|
|
|
add_debugger_command("rtc", &rtc_debug, "Set and test the real-time clock");
|
|
|
|
|
2004-11-06 20:37:00 +03:00
|
|
|
sRtcArea = create_area("rtc_region", (void**)&sBootTime, B_ANY_KERNEL_ADDRESS,
|
|
|
|
RTC_REGION_SIZE, B_NO_LOCK, B_READ_AREA);
|
|
|
|
if (sRtcArea < 0) {
|
|
|
|
panic("rtc_init: error creating rtc region\n");
|
|
|
|
return B_NO_MEMORY;
|
|
|
|
}
|
|
|
|
|
2003-10-24 16:09:20 +04:00
|
|
|
rtc_hw_to_system();
|
|
|
|
|
|
|
|
return B_OK;
|
|
|
|
}
|
|
|
|
|
2003-10-24 18:53:02 +04:00
|
|
|
|
|
|
|
// #pragma mark -
|
|
|
|
// public kernel API
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
set_real_time_clock(uint32 currentTime)
|
|
|
|
{
|
2004-11-06 20:37:00 +03:00
|
|
|
*sBootTime = currentTime * 1000000LL - system_time();
|
2004-03-15 00:53:48 +03:00
|
|
|
rtc_system_to_hw();
|
2003-10-24 18:53:02 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2003-11-08 05:13:19 +03:00
|
|
|
uint32
|
|
|
|
real_time_clock(void)
|
|
|
|
{
|
|
|
|
// ToDo: implement me - they might be used directly from libroot/os/time.c
|
2004-11-06 20:37:00 +03:00
|
|
|
return (*sBootTime + system_time()) / 1000000;
|
2003-11-08 05:13:19 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bigtime_t
|
|
|
|
real_time_clock_usecs(void)
|
|
|
|
{
|
|
|
|
// ToDo: implement me - they might be used directly from libroot/os/time.c
|
2004-11-06 20:37:00 +03:00
|
|
|
return *sBootTime + system_time();
|
2003-11-08 05:13:19 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2003-10-24 18:53:02 +04:00
|
|
|
// #pragma mark -
|
|
|
|
// public userland API
|
|
|
|
|
|
|
|
|
2004-11-05 19:08:00 +03:00
|
|
|
status_t
|
2003-10-24 18:53:02 +04:00
|
|
|
_user_set_real_time_clock(uint32 time)
|
|
|
|
{
|
2004-11-05 19:08:00 +03:00
|
|
|
if (geteuid() != 0)
|
|
|
|
return B_NOT_ALLOWED;
|
|
|
|
|
2003-10-24 18:53:02 +04:00
|
|
|
set_real_time_clock(time);
|
2004-11-05 19:08:00 +03:00
|
|
|
return B_OK;
|
2003-10-24 18:53:02 +04:00
|
|
|
}
|
|
|
|
|