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

1991/1003/port/devscc.c (diff list | history)

1991/0727/sys/src/9/port/devscc.c:99,1071991/1003/sys/src/9/port/devscc.c:99,105 (short | long | prev | next)
1991/0601    
	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/0601    
}; 
SCC	scc[2]; 
 
1991/0727/sys/src/9/port/devscc.c:293,3031991/1003/sys/src/9/port/devscc.c:291,298
1991/0601    
			ch = *sp->data; 
			if(cq->putc) 
				(*cq->putc)(cq, ch); 
			else { 
1991/1003    
			else 
1991/0601    
				putc(cq, ch); 
1991/0606    
				if(sp->delim[ch/8] & (1<<(ch&7)) ) 
1991/0601    
					wakeup(&cq->r); 
			} 
		} 
	} 
	if(x & TxPendB){ 
1991/0727/sys/src/9/port/devscc.c:324,3291991/1003/sys/src/9/port/devscc.c:319,337
1991/0601    
	sccintr0(&scc[0], x>>3); 
} 
 
1991/1003    
void 
sccclock(void) 
{ 
	SCC *sp; 
	IOQ *cq; 
 
	for(sp = scc; sp < &scc[2]; sp++){ 
		cq = sp->iq; 
		if(sp->wq && cangetc(cq)) 
			wakeup(&cq->r); 
	} 
} 
 
1991/0601    
/* 
 *  turn on a port's interrupts.  set DTR and RTS 
 */ 
1991/0727/sys/src/9/port/devscc.c:380,3861991/1003/sys/src/9/port/devscc.c:388,393
1991/0727    
	} 
1991/0601    
} 
 
static void	scctimer(Alarm*); 
static int	sccputc(IOQ *, int); 
static void	sccstopen(Queue*, Stream*); 
static void	sccstclose(Queue*); 
1991/0727/sys/src/9/port/devscc.c:395,4331991/1003/sys/src/9/port/devscc.c:402,408
1991/0601    
	"scc" 
}; 
 
/* 
 *  create a helper process per port 
 */ 
static void 
scctimer(Alarm *a) 
{ 
	SCC *sp = a->arg; 
                 
	cancel(a); 
	sp->a = 0; 
	wakeup(&sp->iq->r); 
} 
                 
static int 
sccputc(IOQ *cq, int ch) 
{ 
	SCC *sp = cq->ptr; int r; 
                 
	r = putc(cq, ch); 
                 
	/* 
	 *  pass upstream within sp->delay milliseconds 
	 */ 
	if(sp->a==0){ 
		if(sp->delay == 0) 
			wakeup(&cq->r); 
		else 
			sp->a = alarm(sp->delay, scctimer, sp); 
	} 
	return r; 
} 
                 
static void 
sccstopen(Queue *q, Stream *s) 
{ 
	SCC *sp; 
1991/0727/sys/src/9/port/devscc.c:440,4521991/1003/sys/src/9/port/devscc.c:415,422
1991/0601    
	sp->wq = WR(q); 
	WR(q)->ptr = sp; 
	RD(q)->ptr = sp; 
	sp->delay = 64; 
	sp->iq->putc = sccputc; 
	qunlock(sp); 
 
	/* start with all characters as delimiters */ 
	memset(sp->delim, 1, sizeof(sp->delim)); 
	                 
	if(sp->kstarted == 0){ 
		sp->kstarted = 1; 
		sprint(name, "scc%d", s->id); 
1991/0727/sys/src/9/port/devscc.c:507,5141991/1003/sys/src/9/port/devscc.c:477,483
1991/0601    
			break; 
		case 'W': 
		case 'w': 
			if(n>=0 && n<1000) 
				sp->delay = n; 
1991/1003    
			/* obsolete */ 
1991/0601    
			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)