/*- * Copyright (c) 1990 The Regents of the University of California. * All rights reserved. * * This code is derived from software contributed to Berkeley by * William Jolitz and Don Ahn. * * %sccs.include.redist.c% * * @(#)clock.c 7.1 (Berkeley) 05/09/91 */ /* * Primitive clock interrupt routines. */ #include "param.h" #include "time.h" #include "kernel.h" #include "machine/segments.h" #include "i386/isa/icu.h" #include "i386/isa/isa.h" #include "i386/isa/rtc.h" #define DAYST 119 #define DAYEN 303 startrtclock() { int s; /* initialize 8253 clock */ outb (IO_TIMER1+3, 0x36); outb (IO_TIMER1, 1193182/hz); outb (IO_TIMER1, (1193182/hz)/256); #ifdef notdef /* NMI fail safe 1/4 sec */ /* initialize 8253 clock */ outb(0x461,0); outb (IO_TIMER2+3, 0x30); outb (IO_TIMER2, 298300*40); outb (IO_TIMER2, (298300*40)/256); outb(0x461,4); printf("armed "); #endif /* initialize brain-dead battery powered clock */ outb (IO_RTC, RTC_STATUSA); outb (IO_RTC+1, 0x26); outb (IO_RTC, RTC_STATUSB); outb (IO_RTC+1, 2); /*outb (IO_RTC, RTC_STATUSD); if((inb(IO_RTC+1) & 0x80) == 0) printf("rtc lost power\n"); outb (IO_RTC, RTC_STATUSD); outb (IO_RTC+1, 0x80);*/ outb (IO_RTC, RTC_DIAG); if (s = inb (IO_RTC+1)) printf("RTC BIOS diagnostic error %b\n", s, RTCDG_BITS); outb (IO_RTC, RTC_DIAG); outb (IO_RTC+1, 0); } #ifdef ARGOx reprimefailsafe(){ outb(0x461,0); outb (IO_TIMER2+3, 0x30); outb (IO_TIMER2, 298300*40); outb (IO_TIMER2, (298300*40)/256); outb(0x461,4); } #endif /* convert 2 digit BCD number */ bcd(i) int i; { return ((i/16)*10 + (i%16)); } /* convert years to seconds (from 1970) */ unsigned long ytos(y) int y; { int i; unsigned long ret; ret = 0; y = y - 70; for(i=0;i= DAYST) && ( yd <= DAYEN)) { sec -= 60*60; } #endif sec += tz.tz_minuteswest * 60; time.tv_sec = sec; } #ifdef garbage /* * Initialze the time of day register, based on the time base which is, e.g. * from a filesystem. */ test_inittodr(base) time_t base; { 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))); time.tv_sec = base; } #endif #ifdef notdef /* * retreve a value from realtime clock */ u_char rtcin(n) { u_char val; /*outb(IO_RTC, RTC_STATUSA); do val = inb(IO_RTC+1) ; while (val&0x80);*/ outb(IO_RTC,n); DELAY(100); if (inb(IO_RTC) != n) { outb(IO_RTC,n); DELAY(100); } do val = inb(IO_RTC+1) ; while (val != inb(IO_RTC+1)); return (val); } #endif /* * Restart the clock. */ resettodr() { } #define V(s) __CONCAT(V, s) extern V(clk)(); enablertclock() { INTREN(IRQ0); setidt(ICU_OFFSET+0, &V(clk), SDT_SYS386IGT, SEL_KPL); splnone(); }