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

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

1991/1001/sys/src/9/pc/devuart.c:72,781991/1113/sys/src/9/pc/devuart.c:72,77 (short | long | prev | next)
1991/0801    
	Rendez	r;		/* kproc waiting for input */ 
	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; 
1991/1001/sys/src/9/pc/devuart.c:239,2491991/1113/sys/src/9/pc/devuart.c:238,245
1991/0810    
			ch = uartrdreg(up, Data) & 0xff; 
			if(cq->putc) 
				(*cq->putc)(cq, ch); 
			else { 
1991/1113    
			else 
1991/0810    
				putc(cq, ch); 
				if(up->delim[ch/8] & (1<<(ch&7)) ) 
					wakeup(&cq->r); 
			} 
			break; 
	 
		case 2:	/* transmitter empty */ 
1991/1001/sys/src/9/pc/devuart.c:281,2861991/1113/sys/src/9/pc/devuart.c:277,296
1991/0810    
	uartintr(&uart[1]); 
1991/0801    
} 
 
1991/1113    
void 
uartclock(void) 
{ 
	Uart *up; 
	IOQ *cq; 
 
	for(up = uart; up < &uart[2]; up++){ 
		cq = up->iq; 
		if(up->wq && cangetc(cq)) 
			wakeup(&cq->r); 
	} 
} 
 
 
1991/0801    
/* 
 *  turn on a port's interrupts.  set DTR and RTS 
 */ 
1991/1001/sys/src/9/pc/devuart.c:301,3111991/1113/sys/src/9/pc/devuart.c:311,316
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/1001/sys/src/9/pc/devuart.c:431,4391991/1113/sys/src/9/pc/devuart.c:436,441
1991/0801    
	RD(q)->ptr = up; 
	qunlock(up); 
 
	/* start with all characters as delimiters */ 
1991/0808    
	memset(up->delim, 0xff, sizeof(up->delim)); 
1991/0801    
	                 
	if(up->kstarted == 0){ 
		up->kstarted = 1; 
		sprint(name, "uart%d", s->id); 
1991/1001/sys/src/9/pc/devuart.c:486,5031991/1113/sys/src/9/pc/devuart.c:488,493
1991/0801    
		case 'd': 
			uartdtr(up, n); 
			break; 
1991/0808    
		case 'e': 
		case 'E': 
			/* 
			 *  the characters in the block are the message 
			 *  delimiters to use upstream 
			 */ 
			memset(up->delim, 0, sizeof(up->delim)); 
			while(++(bp->rptr) < bp->wptr){ 
				m = *bp->rptr; 
				up->delim[m/8] |= 1<<(m&7); 
			} 
			break; 
1991/0801    
		case 'K': 
		case 'k': 
			uartbreak(up, n); 
1991/1001/sys/src/9/pc/devuart.c:531,5361991/1113/sys/src/9/pc/devuart.c:521,527
1991/0801    
	Block *bp; 
	int n; 
1991/0823    
	ulong frame, overrun; 
1991/1113    
	static ulong ints; 
1991/0904    
 
	frame = 0; 
	overrun = 0; 
1991/1001/sys/src/9/pc/devuart.c:540,5451991/1113/sys/src/9/pc/devuart.c:531,538
1991/0808    
 
	for(;;){ 
1991/0801    
		sleep(&cq->r, cangetc, cq); 
1991/1113    
		if((ints++ & 0x1f) == 0) 
			owl(ints>>5); 
1991/0808    
		qlock(up); 
		if(up->wq == 0){ 
			cq->out = cq->in; 


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