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

1991/0823/pc/devuart.c (diff list | history)

1991/0822/sys/src/9/pc/devuart.c:1,41991/0823/sys/src/9/pc/devuart.c:1,4 (short | long | prev | next)
1991/0808    

#include	"u.h" 
1991/0823    
#include	"u.h" 
1991/0801    
#include	"lib.h" 
#include	"mem.h" 
#include	"dat.h" 
1991/0822/sys/src/9/pc/devuart.c:18,231991/0823/sys/src/9/pc/devuart.c:18,27
1991/0801    
	 */ 
	Data=	0,		/* xmit/rcv buffer */ 
	Iena=	1,		/* interrupt enable */ 
1991/0823    
	 Ircv=	(1<<0),		/*  for char rcv'd */ 
	 Ixmt=	(1<<1),		/*  for xmit buffer empty */ 
	 Irstat=(1<<2),		/*  for change in rcv'er status */ 
	 Imstat=(1<<3),		/*  for change in modem status */ 
1991/0808    
	Istat=	2,		/* interrupt flag (read) */ 
	Tctl=	2,		/* test control (write) */ 
1991/0801    
	Format=	3,		/* byte format */ 
1991/0822/sys/src/9/pc/devuart.c:36,421991/0823/sys/src/9/pc/devuart.c:40,48
1991/0801    
	 Loop=	(1<<4),		/*  loop bask */ 
	Lstat=	5,		/* line status */ 
	 Inready=(1<<0),	/*  receive buffer full */ 
1991/0822    
	 Overrun=(1<<1),	/*  we lost an input char */ 
1991/0823    
	 Oerror=(1<<1),		/*  receiver overrun */ 
	 Perror=(1<<2),		/*  receiver parity error */ 
	 Ferror=(1<<3),		/*  rcv framing error */ 
1991/0803    
	 Outready=(1<<5),	/*  output buffer full */ 
1991/0801    
	Mstat=	6,		/* modem status */ 
	Scratch=7,		/* scratchpad */ 
1991/0822/sys/src/9/pc/devuart.c:67,721991/0823/sys/src/9/pc/devuart.c:73,82
1991/0801    
	Alarm	*a;		/* alarm for waking the kernel process */ 
 	int	kstarted;	/* kproc started */ 
	uchar	delim[256/8];	/* characters that act as delimiters */ 
1991/0823    
 
	/* error statistics */ 
	ulong	frame; 
	ulong	overrun; 
1991/0801    
}; 
 
Uart uart[2]; 
1991/0822/sys/src/9/pc/devuart.c:213,2261991/0823/sys/src/9/pc/devuart.c:223,237
1991/0801    
	IOQ *cq; 
1991/0806    
	int s, l; 
1991/0801    
 
1991/0822    
	/* 
	 *  the for loop takes care of multiple events per interrupt 
	 */ 
1991/0810    
	for(;;){ 
		s = uartrdreg(up, Istat); 
		switch(s){ 
		case 6:	/* receiver line status */ 
			l = uartrdreg(up, Lstat); 
1991/0823    
			if(l & Ferror) 
				up->frame++; 
			if(l & Oerror) 
				up->overrun++; 
1991/0810    
			break; 
	 
		case 4:	/* received data available */ 
1991/0822/sys/src/9/pc/devuart.c:233,2411991/0823/sys/src/9/pc/devuart.c:244,249
1991/0810    
				if(up->delim[ch/8] & (1<<(ch&7)) ) 
					wakeup(&cq->r); 
			} 
1991/0822    
			l = uartrdreg(up, Lstat); 
			if(l & Overrun) 
				screenputc('!'); 
1991/0810    
			break; 
	 
		case 2:	/* transmitter empty */ 
1991/0822/sys/src/9/pc/devuart.c:257,2631991/0823/sys/src/9/pc/devuart.c:265,271
1991/0810    
		default: 
			if(s&1) 
				return; 
			print("weird modem interrupt\n"); 
1991/0823    
/*			print("weird modem interrupt\n");/**/ 
1991/0810    
			break; 
1991/0801    
		} 
	} 
1991/0822/sys/src/9/pc/devuart.c:290,2951991/0823/sys/src/9/pc/devuart.c:298,308
1991/0807    
	} 
1991/0808    
 
	/* 
1991/0823    
	 *  speed up the clock to poll the uart 
	fclockinit(); 
	 */ 
 
	/* 
1991/0801    
	 *  set up i/o routines 
	 */ 
	if(up->oq){ 
1991/0822/sys/src/9/pc/devuart.c:304,3101991/0823/sys/src/9/pc/devuart.c:317,323
1991/0801    
	/* 
 	 *  turn on interrupts 
	 */ 
1991/0810    
	up->sticky[Iena] = 0x7; 
1991/0823    
	up->sticky[Iena] = Ircv | Ixmt | Irstat; 
1991/0801    
	uartwrreg(up, Iena, 0); 
 
	/* 
1991/0822/sys/src/9/pc/devuart.c:514,5191991/0823/sys/src/9/pc/devuart.c:527,533
1991/0801    
	IOQ *cq = up->iq; 
	Block *bp; 
	int n; 
1991/0823    
	ulong frame, overrun; 
1991/0801    
 
1991/0808    
	if(waserror()) 
		print("uartkproc got an error\n"); 
1991/0822/sys/src/9/pc/devuart.c:531,5361991/0823/sys/src/9/pc/devuart.c:545,558
1991/0808    
			PUTNEXT(RD(up->wq), bp); 
		} 
		qunlock(up); 
1991/0823    
		if(up->frame != frame){ 
			kprint("uart%d: %d framing\n", up-uart, up->frame); 
			frame = up->frame; 
		} 
		if(up->overrun != overrun){ 
			kprint("uart%d: %d overruns\n", up-uart, up->overrun); 
			overrun = up->overrun; 
		} 
1991/0801    
	} 
} 
 


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