xref: /haiku/src/system/boot/platform/openfirmware/real_time_clock.cpp (revision 7749d0bb0c358a3279b1b9cc76d8376e900130a5)
1 /*
2  * Copyright 2006, Ingo Weinhold <bonefish@cs.tu-berlin.de>.
3  * Copyright 2010, Andreas Färber <andreas.faerber@web.de>
4  * All rights reserved. Distributed under the terms of the MIT License.
5  */
6 
7 
8 #include "real_time_clock.h"
9 
10 #include <stdio.h>
11 
12 #include <boot/kernel_args.h>
13 #include <boot/stage2.h>
14 #include <platform/openfirmware/devices.h>
15 #include <platform/openfirmware/openfirmware.h>
16 
17 
18 static int sHandle = OF_FAILED;
19 
20 
21 status_t
22 init_real_time_clock(void)
23 {
24 	// find RTC
25 	int rtcCookie = 0;
26 	if (of_get_next_device(&rtcCookie, 0, "rtc",
27 			gKernelArgs.platform_args.rtc_path,
28 			sizeof(gKernelArgs.platform_args.rtc_path)) != B_OK) {
29 		printf("init_real_time_clock(): Found no RTC device!");
30 		return B_ERROR;
31 	}
32 
33 	sHandle = of_open(gKernelArgs.platform_args.rtc_path);
34 	if (sHandle == OF_FAILED) {
35 		printf("%s(): Could not open RTC device!\n", __func__);
36 		return B_ERROR;
37 	}
38 
39 	return B_OK;
40 }
41 
42 
43 bigtime_t
44 real_time_clock_usecs(void)
45 {
46 	if (sHandle == OF_FAILED)
47 		return OF_FAILED;
48 	int second, minute, hour, day, month, year;
49 	if (of_call_method(sHandle, "get-time", 0, 6, &year, &month, &day,
50 			&hour, &minute, &second) == OF_FAILED)
51 		return OF_FAILED;
52 	int days = day;
53 		// TODO: Apply algorithm from kernel
54 		// to assure monotonically increasing date.
55 	return (((days * 24 + hour) * 60ULL + minute) * 60ULL + second)
56 		* 1000000ULL;
57 }
58