plan 9 kernel history: overview | file list | diff list

1997/0208/pc/devrtc.c (diff list | history)

1996/0223/sys/src/9/pc/devrtc.c:118,1411997/0208/sys/src/9/pc/devrtc.c:118,148 (short | long | prev | next)
1991/0911    
 
#define GETBCD(o) ((bcdclock[o]&0xf) + 10*(bcdclock[o]>>4)) 
 
long	  
rtctime(void) 
1997/0208    
static long	  
_rtctime(void) 
1991/0911    
{ 
	uchar bcdclock[Nbcd]; 
	Rtc rtc; 
1992/1208    
	int i; 
1991/0911    
 
1997/0208    
	/* don't do the read until the clock is no longer busy */ 
1992/1208    
	for(i = 0; i < 10000; i++){ 
		outb(Paddr, Status); 
		if((inb(Pdata) & 1) == 0) 
1997/0208    
		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) 
1992/1208    
			break; 
	} 
1991/0911    
	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); 
 
	/* 
	 *  convert from BCD 
1996/0223/sys/src/9/pc/devrtc.c:157,1661997/0208/sys/src/9/pc/devrtc.c:164,198
1991/0911    
	return rtc2sec(&rtc); 
} 
 
1997/0208    
Lock rtlock; 
 
long 
rtctime(void) 
{ 
	int i; 
	long t, ot; 
 
	ilock(&rtlock); 
 
	/* loop till we get two reads in a row the same */ 
	t = _rtctime(); 
	for(i = 0; i < 100; i++){ 
		ot = t; 
		t = _rtctime(); 
		if(ot == t) 
			break; 
	} 
	if(i == 100) print("we are boofheads\n"); 
 
	iunlock(&rtlock); 
 
	return t; 
} 
 
1991/0911    
long	  
rtcread(Chan *c, void *buf, long n, ulong offset) 
{ 
	ulong t, ot; 
1997/0208    
	ulong t; 
1993/0319    
	char *a; 
1991/0911    
 
	if(c->qid.path & CHDIR) 
1996/0223/sys/src/9/pc/devrtc.c:170,1791997/0208/sys/src/9/pc/devrtc.c:202,207
1993/0319    
	case Qrtc: 
		qlock(&rtclock); 
		t = rtctime(); 
		do{ 
			ot = t; 
			t = rtctime();	/* make sure there's no skew */ 
		}while(t != ot); 
		qunlock(&rtclock); 
		n = readnum(offset, buf, n, t, 12); 
		return n; 


source code copyright © 1990-2005 Lucent Technologies; see license
Plan 9 distribution
comments to russ cox (rsc@swtch.com)