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

1991/1003/gnot/devduart.c (diff list | history)

1991/0614/sys/src/9/gnot/devduart.c:98,1061991/1003/sys/src/9/gnot/devduart.c:98,104 (short | long | prev | next)
1991/0605    
	Queue	*wq;		/* write queue */ 
	Rendez	r;		/* kproc waiting for input */ 
	Alarm	*a;		/* alarm for waking the kernel process */ 
	int	delay;		/* between character input and waking kproc */ 
 	int	kstarted;	/* kproc started */ 
1991/0606    
	uchar	delim[256/8];	/* characters that act as delimiters */ 
1991/0605    
}; 
Duartport	duartport[1]; 
 
1991/0614/sys/src/9/gnot/devduart.c:424,4341991/1003/sys/src/9/gnot/devduart.c:422,440
1991/0605    
		(*cq->putc)(cq, ch); 
	else { 
		putc(cq, ch); 
1991/0606    
		if(dp->delim[ch/8] & (1<<(ch&7)) ) 
1991/0605    
			wakeup(&cq->r); 
	} 
} 
1991/1003    
void 
duartclock(void) 
{ 
	Duartport *dp = duartport; 
	IOQ *cq; 
1991/0605    
 
1991/1003    
	cq = dp->iq; 
	if(cangetc(cq)) 
		wakeup(&cq->r); 
} 
 
1991/0605    
/* 
 *  a serial line output interrupt 
 */ 
1991/0614/sys/src/9/gnot/devduart.c:606,6121991/1003/sys/src/9/gnot/devduart.c:612,617
1991/0605    
	duartbaud(baud); 
} 
 
static void	duarttimer(Alarm*); 
static int	duartputc(IOQ *, int); 
static void	duartstopen(Queue*, Stream*); 
static void	duartstclose(Queue*); 
1991/0614/sys/src/9/gnot/devduart.c:621,6591991/1003/sys/src/9/gnot/devduart.c:626,632
1991/0605    
	"duart" 
}; 
 
/* 
 *  wakeup the helper process to do input 
 */ 
static void 
duarttimer(Alarm *a) 
{ 
	Duartport *dp = a->arg; 
                 
	cancel(a); 
	dp->a = 0; 
	wakeup(&dp->iq->r); 
} 
                 
static int 
duartputc(IOQ *cq, int ch) 
{ 
	Duartport *dp = cq->ptr; int r; 
                 
	r = putc(cq, ch); 
                 
	/* 
	 *  pass upstream within dp->delay milliseconds 
	 */ 
	if(dp->a==0){ 
		if(dp->delay == 0) 
			wakeup(&cq->r); 
		else 
			dp->a = alarm(dp->delay, duarttimer, dp); 
	} 
	return r; 
} 
                 
static void 
duartstopen(Queue *q, Stream *s) 
{ 
	Duartport *dp; 
1991/0614/sys/src/9/gnot/devduart.c:667,6791991/1003/sys/src/9/gnot/devduart.c:640,647
1991/0605    
	dp->wq = WR(q); 
	WR(q)->ptr = dp; 
	RD(q)->ptr = dp; 
	dp->delay = 64; 
	dp->iq->putc = duartputc; 
	qunlock(dp); 
 
	/* start with all characters as delimiters */ 
	memset(dp->delim, 1, sizeof(dp->delim)); 
	                 
	if(dp->kstarted == 0){ 
		dp->kstarted = 1; 
		sprint(name, "duart%d", s->id); 
1991/0614/sys/src/9/gnot/devduart.c:733,7401991/1003/sys/src/9/gnot/devduart.c:701,707
1991/0605    
			break; 
		case 'W': 
		case 'w': 
			if(n>=0 && n<1000) 
				dp->delay = n; 
1991/1003    
			/* obsolete */ 
1991/0605    
			break; 
		} 
	}else while((m = BLEN(bp)) > 0){ 


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