* Copyright (c) 1990 The Regents of the University of California.
* This code is derived from software contributed to Berkeley by
* Added stuff to read the cmos clock on startup - Don Ahn
* @(#)clock.c 5.3 (Berkeley) %G%
* Primitive clock interrupt routines.
/* initialize 8253 clock */
outb (IO_TIMER0
+3, 0x36);
outb (IO_TIMER0
, 1193182/hz
);
outb (IO_TIMER0
, (1193182/hz
)/256);
/* convert 2 digit BCD number */
return ((i
/16)*10 + (i
%16));
/* convert years to seconds (from 1970) */
if (i
% 4) ret
+= 31536000;
/* convert months to seconds */
case 1: case 3: case 5: case 7: case 8: case 10: case 12:
case 4: case 6: case 9: case 11:
if (leap
) ret
+= 2505600;
* Initialize the time of day register, based on the time base which is, e.g.
sec
= bcd(rtcin(9)); leap
= !(sec
% 4); sec
+= ytos(sec
); /* year */
yd
= mtos(bcd(rtcin(8)),leap
); sec
+= yd
; /* month */
t
= (bcd(rtcin(7))-1) * 86400; sec
+= t
; yd
+= t
; /* date */
day_week
= rtcin(6); /* day */
sec
+= bcd(rtcin(4)) * 3600; /* hour */
sec
+= bcd(rtcin(2)) * 60; /* minutes */
sec
+= bcd(rtcin(0)); /* seconds */
/* XXX off by one? Need to calculate DST on SUNDAY */
/* Perhaps we should have the RTC hold GMT time to save */
/* us the bother of converting. */
if ((yd
>= DAYST
) && ( yd
<= DAYEN
)) {
sec
+= tz
.tz_minuteswest
* 60;
* Initialze the time of day register, based on the time base which is, e.g.
outb(IO_RTC
,9); /* year */
printf("%d ",bcd(inb(IO_RTC
+1)));
outb(IO_RTC
,8); /* month */
printf("%d ",bcd(inb(IO_RTC
+1)));
outb(IO_RTC
,7); /* day */
printf("%d ",bcd(inb(IO_RTC
+1)));
outb(IO_RTC
,4); /* hour */
printf("%d ",bcd(inb(IO_RTC
+1)));
outb(IO_RTC
,2); /* minutes */
printf("%d ",bcd(inb(IO_RTC
+1)));
outb(IO_RTC
,0); /* seconds */
printf("%d\n",bcd(inb(IO_RTC
+1)));
* retreve a value from realtime clock
do val
= inb(IO_RTC
+1) ; while (val
!= inb(IO_RTC
+1));