clock.c revision 1.3
1/*	$NetBSD: clock.c,v 1.3 2009/03/18 10:22:33 cegger Exp $	*/
2
3/*
4 * This is a slightly modified version of mvme68k's standalone clock.c.
5 * As there was no attribution/copyright header on that file, there's
6 * not going to be one for this file.
7 */
8
9#include <sys/types.h>
10
11#include "stand.h"
12#include "net.h"
13#include "libsa.h"
14#include "bugsyscalls.h"
15
16#define FROMBCD(x)      (int)((((unsigned int)(x)) >> 4) * 10 +\
17			      (((unsigned int)(x)) & 0xf))
18
19#define SECDAY          (24 * 60 * 60)
20#define SECYR           (SECDAY * 365)
21#define LEAPYEAR(y)     (((y) & 3) == 0)
22#define YEAR0		68
23
24/*
25 * This code is defunct after 2068.
26 * Will Unix still be here then??
27 */
28const short dayyr[12] =
29{0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};
30
31static u_long
32chiptotime(int sec, int min, int hour, int day, int mon, int year)
33{
34	int days, yr;
35
36	sec = FROMBCD(sec);
37	min = FROMBCD(min);
38	hour = FROMBCD(hour);
39	day = FROMBCD(day);
40	mon = FROMBCD(mon);
41	year = FROMBCD(year) + YEAR0;
42	if (year < 70)
43		year = 70;
44
45	/* simple sanity checks */
46	if (year < 70 || mon < 1 || mon > 12 || day < 1 || day > 31)
47		return (0);
48	days = 0;
49	for (yr = 70; yr < year; yr++)
50		days += LEAPYEAR(yr) ? 366 : 365;
51	days += dayyr[mon - 1] + day - 1;
52	if (LEAPYEAR(yr) && mon > 2)
53		days++;
54	/* now have days since Jan 1, 1970; the rest is easy... */
55	return (days * SECDAY + hour * 3600 + min * 60 + sec);
56}
57
58satime_t
59getsecs(void)
60{
61	struct bug_rtc_rd rr;
62
63	bugsys_rtc_rd(&rr);
64
65	return (chiptotime(rr.rr_second, rr.rr_minute, rr.rr_hour,
66	    rr.rr_dayofmonth, rr.rr_month, rr.rr_year));
67}
68