static long rtctime(void) { struct RTCdev *dev; Rtc rtc; dev = nvr.rtc; dev->control |= RTCREAD; wbflush(); rtc.sec = bcd2dec(dev->sec) & 0x7F; rtc.min = bcd2dec(dev->min & 0x7F); rtc.hour = bcd2dec(dev->hour & 0x3F); rtc.mday = bcd2dec(dev->mday & 0x3F); rtc.mon = bcd2dec(dev->mon & 0x3F); rtc.year = bcd2dec(dev->year); dev->control &= ~RTCREAD; wbflush(); if (rtc.mon < 1 || rtc.mon > 12) return 0; /* * the world starts Jan 1 1970 */ if(rtc.year < 70) rtc.year += 2000; else rtc.year += 1900; return rtc2sec(&rtc); }
static long _rtctime(void) { Rtc rtc; int i; /* don't do the read until the clock is no longer busy */ for(i = 0; i < 10000; i++){ outb(Paddr, Status); if(inb(Pdata) & 0x80) continue; /* read clock values */ outb(Paddr, Seconds); rtc.sec = inb(Pdata); outb(Paddr, Minutes); rtc.min = inb(Pdata); outb(Paddr, Hours); rtc.hour = inb(Pdata); outb(Paddr, Mday); rtc.mday = inb(Pdata); outb(Paddr, Month); rtc.mon = inb(Pdata); outb(Paddr, Year); rtc.year = inb(Pdata); outb(Paddr, Status); if((inb(Pdata) & 0x80) == 0) break; } /* * the world starts jan 1 1970 */ if(rtc.year < 70) rtc.year += 2000; else rtc.year += 1900; return rtc2sec(&rtc); }
static long _rtctime(void) { uchar bcdclock[Nbcd]; Rtc rtc; int i; /* don't do the read until the clock is no longer busy */ for(i = 0; i < 10000; i++){ outb(Paddr, Status); if(inb(Pdata) & 0x80) continue; /* read clock values */ outb(Paddr, Seconds); bcdclock[0] = inb(Pdata); outb(Paddr, Minutes); bcdclock[1] = inb(Pdata); outb(Paddr, Hours); bcdclock[2] = inb(Pdata); outb(Paddr, Mday); bcdclock[3] = inb(Pdata); outb(Paddr, Month); bcdclock[4] = inb(Pdata); outb(Paddr, Year); bcdclock[5] = inb(Pdata); outb(Paddr, Status); if((inb(Pdata) & 0x80) == 0) break; } /* * convert from BCD */ rtc.sec = GETBCD(0); rtc.min = GETBCD(1); rtc.hour = GETBCD(2); rtc.mday = GETBCD(3); rtc.mon = GETBCD(4); rtc.year = GETBCD(5); /* * the world starts jan 1 1970 */ if(rtc.year < 70) rtc.year += 2000; else rtc.year += 1900; return rtc2sec(&rtc); }