/*- * 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.3 (Berkeley) 10/11/92 */ /* * Primitive clock interrupt routines. */ #include #include #include #include #include #include #include #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); /* 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_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); } /* 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 /* * Restart the clock. */ resettodr() { } /* * Wire clock interrupt in. */ #define V(s) __CONCAT(V, s) extern V(clk)(); enablertclock() { INTREN(IRQ0); setidt(ICU_OFFSET+0, &V(clk), SDT_SYS386IGT, SEL_KPL); splnone(); }