| plan 9 kernel history: overview | file list | diff list |
1997/0404/carrera/devrtc.c (diff list | history)
| 1997/0403/sys/src/9/carrera/devrtc.c:20,28 – 1997/0404/sys/src/9/carrera/devrtc.c:20,26 (short | long | prev | next) | ||
| 1993/0916 | int mon; int year; }; | |
| 1997/0327 |
| |
| 1993/0916 | ||
| 1995/0108 | enum { | |
| 1993/0916 | Qrtc = 1, | |
| 1997/0403/sys/src/9/carrera/devrtc.c:39,49 – 1997/0404/sys/src/9/carrera/devrtc.c:37,52 | ||
| 1997/0403 | StatusC= 0x0C, StatusD= 0x0D, | |
| 1993/0916 | ||
| 1997/0404 | Update= 0x80, | |
| 1993/0916 | Nvsize = 4096, | |
| 1997/0403 | Nclock= 6, | |
| 1993/0916 | }; | |
| 1997/0404 | #define GETBCD(v) (((v) & 0x0F) + 10*((v)>>4)) #define PUTBCD(v) ((v) % 10)|((((v)/10) % 10)<<4) | |
| 1993/0916 | Dirtab rtcdir[]={ "nvram", {Qnvram, 0}, Nvsize, 0664, "rtc", {Qrtc, 0}, 0, 0664, | |
| 1997/0403/sys/src/9/carrera/devrtc.c:52,61 – 1997/0404/sys/src/9/carrera/devrtc.c:55,65 | ||
| 1997/0327 | static ulong rtc2sec(Rtc*); static void sec2rtc(ulong, Rtc*); | |
| 1993/0916 | ||
| 1997/0403 |
| |
| 1997/0404 | static int isbinary; static Lock rtclock; | |
| 1997/0403 | static void | |
| 1997/0404 | rtcreset(void) | |
| 1997/0403 | { int i, x; uchar r; | |
| 1997/0403/sys/src/9/carrera/devrtc.c:68,74 – 1997/0404/sys/src/9/carrera/devrtc.c:72,78 | ||
| 1997/0403 | continue; *(uchar*)Rtcindex = x|StatusB; | |
| 1997/0404 | isbinary = *(uchar*)Rtcdata & 0x04; | |
| 1997/0403 | break; } } | |
| 1997/0403/sys/src/9/carrera/devrtc.c:76,82 – 1997/0404/sys/src/9/carrera/devrtc.c:80,85 | ||
| 1997/0327 | static Chan* | |
| 1993/0916 | rtcattach(char *spec) { | |
| 1997/0403 |
| |
| 1993/0916 | return devattach('r', spec); } | |
| 1997/0403/sys/src/9/carrera/devrtc.c:114,219 – 1997/0404/sys/src/9/carrera/devrtc.c:117,167 | ||
| 1993/0916 | USED(c); } | |
| 1994/0225 | ||
| 1993/0916 |
| |
| 1997/0403 |
| |
| 1997/0401 | static long _rtctime(void) | |
| 1993/0916 | { Rtc rtc; | |
| 1997/0401 | int i, x; | |
| 1997/0403 |
| |
| 1997/0404 | uchar r; | |
| 1993/0916 | ||
| 1997/0403 | /* don't do the read until the clock is no longer busy */ | |
| 1997/0401 | for(i = 0; i < 10000; i++){ x = (*(uchar*)Rtcindex)&~0x7f; *(uchar*)Rtcindex = x|Status; | |
| 1997/0403 | r = *(uchar*)Rtcdata; | |
| 1997/0404 | if(r & Update) | |
| 1997/0401 | continue; | |
| 1997/0403 |
| |
| 1993/0916 | ||
| 1997/0403 | /* read clock values */ *(uchar*)Rtcindex = x|Seconds; | |
| 1997/0404 | rtc.sec = *(uchar*)Rtcdata; | |
| 1997/0403 | *(uchar*)Rtcindex = x|Minutes; | |
| 1997/0404 | rtc.min = *(uchar*)Rtcdata; | |
| 1997/0403 | *(uchar*)Rtcindex = x|Hours; | |
| 1997/0404 | rtc.hour = *(uchar*)Rtcdata; | |
| 1997/0403 | *(uchar*)Rtcindex = x|Mday; | |
| 1997/0404 | rtc.mday = *(uchar*)Rtcdata; | |
| 1997/0403 | *(uchar*)Rtcindex = x|Month; | |
| 1997/0404 | rtc.mon = *(uchar*)Rtcdata; | |
| 1997/0403 | *(uchar*)Rtcindex = x|Year; | |
| 1997/0404 | rtc.year = *(uchar*)Rtcdata; | |
| 1997/0401 | *(uchar*)Rtcindex = x|Status; | |
| 1997/0403 | r = *(uchar*)Rtcdata; | |
| 1997/0404 | if((r & Update) == 0) | |
| 1997/0401 | break; } | |
| 1997/0403 |
| |
| 1997/0404 | if(!isbinary){ | |
| 1997/0403 | /* * convert from BCD */ | |
| 1997/0404 | rtc.sec = GETBCD(rtc.sec); rtc.min = GETBCD(rtc.min); rtc.hour = GETBCD(rtc.hour); rtc.mday = GETBCD(rtc.mday); rtc.mon = GETBCD(rtc.mon); rtc.year = GETBCD(rtc.year); | |
| 1997/0403 | } /* | |
| 1997/0403/sys/src/9/carrera/devrtc.c:224,240 – 1997/0404/sys/src/9/carrera/devrtc.c:172,184 | ||
| 1993/0916 | return rtc2sec(&rtc); } | |
| 1997/0401 |
| |
| 1997/0403 |
| |
| 1997/0401 | int i; long t, ot; | |
| 1997/0404 | ilock(&rtclock); | |
| 1997/0401 | /* loop till we get two reads in a row the same */ t = _rtctime(); | |
| 1997/0403/sys/src/9/carrera/devrtc.c:244,265 – 1997/0404/sys/src/9/carrera/devrtc.c:188,201 | ||
| 1997/0401 | if(ot == t) break; } | |
| 1997/0404 | iunlock(&rtclock); | |
| 1997/0401 | ||
| 1997/0403 |
| |
| 1997/0401 | return t; | |
| 1997/0403 |
| |
| 1997/0401 | } | |
| 1997/0327 | static long | |
| 1993/0916 | rtcread(Chan *c, void *buf, long n, ulong offset) { | |
| 1997/0401 |
| |
| 1993/0916 | uchar *f, *to, *e; if(c->qid.path & CHDIR) | |
| 1997/0403/sys/src/9/carrera/devrtc.c:267,278 – 1997/0404/sys/src/9/carrera/devrtc.c:203,209 | ||
| 1993/0916 | switch(c->qid.path){ case Qrtc: | |
| 1997/0401 |
| |
| 1993/0916 |
| |
| 1997/0403 |
| |
| 1997/0401 |
| |
| 1993/0916 |
| |
| 1997/0404 | return readnum(offset, buf, n, rtctime(), 12); | |
| 1993/0916 | case Qnvram: if(offset > Nvsize) return -1; | |
| 1997/0403/sys/src/9/carrera/devrtc.c:289,308 – 1997/0404/sys/src/9/carrera/devrtc.c:220,225 | ||
| 1993/0916 | return 0; } | |
| 1997/0403 | ||
| 1993/0916 |
| |
| 1997/0403 |
| |
| 1993/0916 |
| |
| 1997/0327 | static long | |
| 1993/0916 | rtcwrite(Chan *c, void *buf, long n, ulong offset) { | |
| 1997/0403/sys/src/9/carrera/devrtc.c:310,316 – 1997/0404/sys/src/9/carrera/devrtc.c:227,233 | ||
| 1993/0916 | ulong secs; char *cp, *ep; uchar *f, *t, *e; | |
| 1997/0404 | uchar x; | |
| 1993/0916 | USED(c); switch(c->qid.path){ | |
| 1997/0403/sys/src/9/carrera/devrtc.c:327,345 – 1997/0404/sys/src/9/carrera/devrtc.c:244,280 | ||
| 1993/0916 | } secs = strtoul(cp, 0, 0); sec2rtc(secs, &rtc); | |
| 1997/0401 |
| |
| 1993/0916 |
| |
| 1997/0404 | rtc.year -= 1970; | |
| 1993/0916 | ||
| 1997/0404 | if(!isbinary){ /* * convert to bcd */ rtc.sec = PUTBCD(rtc.sec); rtc.min = PUTBCD(rtc.min); rtc.hour = PUTBCD(rtc.hour); rtc.mday = PUTBCD(rtc.mday); rtc.mon = PUTBCD(rtc.mon); rtc.year = PUTBCD(rtc.year); } ilock(&rtclock); /* set clock values */ x = (*(uchar*)Rtcindex)&~0x7f; *(uchar*)Rtcindex = x|Seconds; *(uchar*)Rtcdata = rtc.sec; *(uchar*)Rtcindex = x|Minutes; *(uchar*)Rtcdata = rtc.min; *(uchar*)Rtcindex = x|Hours; *(uchar*)Rtcdata = rtc.hour; *(uchar*)Rtcindex = x|Mday; *(uchar*)Rtcdata = rtc.mday; *(uchar*)Rtcindex = x|Month; *(uchar*)Rtcdata = rtc.mon; *(uchar*)Rtcindex = x|Year; *(uchar*)Rtcdata = rtc.year; iunlock(&rtclock); | |
| 1993/0916 | return n; case Qnvram: if(offset > Nvsize) | |
| 1997/0403/sys/src/9/carrera/devrtc.c:358,364 – 1997/0404/sys/src/9/carrera/devrtc.c:293,299 | ||
| 1995/0108 | } | |
| 1997/0327 | Dev rtcdevtab = { | |
| 1997/0404 | rtcreset, | |
| 1997/0327 | devinit, rtcattach, devclone, | |