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

1998/0910/pc/ns16552.h (diff list | history)

1998/0910/sys/src/9/pc/ns16552.h:1,1531998/0918/sys/src/9/pc/ns16552.h:1,153 (short | long | prev | next)
Change Vector* to Irq*.
rsc Fri Mar 4 12:44:25 2005
1994/0902    
/* 
 *  PC specific code for the ns16552.  It includes support for the 2 built 
 *  in uarts plus up to 5 MP-008 8 uart ISA cards. 
 */ 
enum 
{ 
	Maxcard= 5,		/* max serial cards */ 
	UartFREQ= 1843200, 
 
	Serial=	0, 
	Modem=	1, 
}; 
 
#define uartwrreg(u,r,v)	outb((u)->port + r, (u)->sticky[r] | (v)) 
#define uartrdreg(u,r)		inb((u)->port + r) 
 
1994/1108    
void	ns16552setup(ulong, ulong, char*); 
1997/0327    
void	ns16552special(int, int, Queue**, Queue**, int (*)(Queue*, int)); 
void	uartclock(void); 
1994/0902    
/* 
 *  definition of an optional serial card 
 */ 
typedef struct Scard 
{ 
	ISAConf;	/* card configuration */ 
	int	first;	/* number of first port */ 
} Scard; 
static Scard *scard[Maxcard]; 	/* configs for the serial card */ 
 
/* power management currently only makes sense on the AT&T safari */ 
static void 
uartpower(int dev, int onoff) 
{ 
	switch(dev){ 
	case Modem: 
1997/0327    
		if((*arch->modempower)(onoff) < 0) 
1994/0902    
			print("can't turn %s modem speaker\n", onoff?"on":"off"); 
		break; 
	case Serial: 
1997/0327    
		if((*arch->serialpower)(onoff) < 0) 
1994/0902    
			print("can't turn %s serial port power\n", onoff?"on":"off"); 
		break; 
	} 
} 
 
/* 
 *  handle an interrupt to a single uart 
 */ 
static void 
1997/0327    
ns16552intrx(Ureg*, void* arg) 
1994/0902    
{ 
	ns16552intr((ulong)arg); 
} 
 
/* 
 *  interrupts from the multiport card, MP-008.  A polling port 
 *  tells which of 8 devices interrupted. 
 */ 
static void 
1997/0327    
mp008intr(Ureg* ureg, void* arg) 
1994/0902    
{ 
	int i, loops; 
	uchar n; 
	Scard *mp; 
 
	mp = arg; 
1994/1006    
	for(loops = 0; loops < 1024; loops++){ 
1994/0902    
		n = ~inb(mp->mem); 
		if(n == 0) 
			return; 
		for(i = 0; n; i++){ 
			if(n & 1) 
1997/0327    
				ns16552intrx(ureg, (void*)(mp->first+i)); 
1994/0902    
			n >>= 1; 
		} 
	} 
} 
 
/* 
 *  install the uarts (called by reset) 
 */ 
1994/1007    
void 
1994/0902    
ns16552install(void) 
{ 
1994/1118    
	int i, j, port, nscard; 
1997/0327    
	char *p, *q; 
1994/0902    
	Scard *sc; 
1994/1108    
	char name[NAMELEN]; 
1994/1007    
	static int already; 
1994/0902    
 
1994/1007    
	if(already) 
		return; 
	already = 1; 
 
1994/0902    
	/* first two ports are always there and always the normal frequency */ 
1994/1108    
	ns16552setup(0x3F8, UartFREQ, "eia0"); 
1998/0910    
	intrenable(IrqUART0, ns16552intrx, (void*)0, BUSUNKNOWN); 
1994/1108    
	ns16552setup(0x2F8, UartFREQ, "eia1"); 
1998/0910    
	intrenable(IrqUART1, ns16552intrx, (void*)1, BUSUNKNOWN); 
1997/0327    
	addclock0link(uartclock); 
1994/1007    
 
	/* set up a serial console */ 
1997/0327    
	if(p = getconf("console")){ 
		port = strtol(p, &q, 0); 
		if(p != q && (port == 0 || port == 1)) 
			ns16552special(port, 9600, &kbdq, &printq, kbdcr2nl); 
	} 
1994/0902    
 
	/* the rest come out of plan9.ini */ 
1994/1118    
	nscard = 0; 
1994/0902    
	for(i = 0; i < Maxcard; i++){ 
1994/1118    
		sc = scard[nscard] = xalloc(sizeof(Scard)); 
1994/0902    
		if(isaconfig("serial", i, sc) == 0){ 
			xfree(sc); 
1994/1118    
			scard[nscard] = 0; 
			continue; 
1994/0902    
		} 
 
1995/0222    
		if(cistrcmp(sc->type, "MP008") == 0){ 
1994/0902    
			/* 
			 *  port gives base port address for uarts 
			 *  irq is interrupt 
			 *  mem is the polling port 
			 *  size is the number of serial ports on the same polling port 
			 *  freq is the baud rate generator frequency 
			 */ 
			if(sc->size == 0) 
				sc->size = 8; 
			if(sc->freq == 0) 
				sc->freq = UartFREQ; 
			sc->first = nuart; 
1997/0327    
			intrenable(VectorPIC+sc->irq, mp008intr, sc, BUSUNKNOWN); 
1998/0918    
			intrenable(sc->irq, mp008intr, sc, BUSUNKNOWN); 
1994/0902    
			port = sc->port; 
			for(j=0; j < sc->size; j++){ 
1994/1118    
				sprint(name, "eia%d%2.2d", nscard, j); 
1994/1108    
				ns16552setup(port, sc->freq, name); 
1994/0902    
				port += 8; 
			} 
1998/0221    
		} else if(cistrcmp(sc->type, "com") == 0 && sc->port != 0x3F8 && sc->port != 0x2F8){ 
1994/0902    
			/* 
			 *  port gives base port address for the uart 
			 *  irq is interrupt 
			 *  freq is the baud rate generator frequency 
			 */ 
1994/1106    
			if(sc->freq == 0) 
				sc->freq = UartFREQ; 
1994/1118    
			sprint(name, "eia%d00", nscard); 
1994/1108    
			ns16552setup(sc->port, sc->freq, name); 
1997/0327    
			intrenable(VectorPIC+sc->irq, ns16552intrx, (void*)(nuart-1), BUSUNKNOWN); 
1998/0918    
			intrenable(sc->irq, ns16552intrx, (void*)(nuart-1), BUSUNKNOWN); 
1994/0902    
		} 
1994/1118    
		nscard++; 
1994/0902    
	} 
} 


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