shithub: purgatorio

ref: ee695eff4329234e20abb68ff3100d3b15929418
dir: /os/cerf405/uart.h/

View raw version
/*
 *  405EP specific code for its uart.
 */

#define	UR(p,r)	((uchar*)(p))[r]
#define uartwr(u,r,v)	(UR(u->regs,r) = (v))
#define uartwrreg(u,r,v)	(UR(u->regs,r)= (u)->sticky[r] | (v))
#define uartrdreg(u,r)		UR(u->regs,r)

extern void	uartsetup(ulong, void*, ulong, char*);
extern void	uartclock(void);

static void
uartportpower(Uart*, int)
{
	/* TO DO: power control */
}

/*
 *  handle an interrupt to a single uart
 */
static void
uartintrx(Ureg*, void* arg)
{
	uartintr(arg);
}

/*
 *  install the uarts (called by reset)
 */
void
uartinstall(void)
{
	static int already;

	if(already)
		return;
	already = 1;

	/* first two ports are always there */
	uartsetup(0, (void*)PHYSUART0, 0, "eia0");
	intrenable(VectorUART0, uartintrx, uart[0], BUSUNKNOWN, "uart0");
	uartsetup(1, (void*)PHYSUART1, 0, "eia1");
	intrenable(VectorUART1, uartintrx, uart[1], BUSUNKNOWN, "uart1");
	addclock0link(uartclock, 22);
}

/*
 * If the UART's receiver can be connected to a DMA channel,
 * this function does what is necessary to create the
 * connection and returns the DMA channel number.
 * If the UART's receiver cannot be connected to a DMA channel,
 * a -1 is returned.
 */
char
uartdmarcv(int dev)
{
 
	USED(dev);
	return -1;
}

void
uartputc(int c)
{
	uchar *p;

	if(c == 0)
		return;
	p = (uchar*)PHYSUART0;
	while((UR(p,Lstat) & Outready) == 0){
		;
	}
	UR(p,Data) = c;
	eieio();
	if(c == '\n')
		while((UR(p,Lstat) & Outready) == 0){	/* let fifo drain */
			;
		}
}

void
uartputs(char *data, int len)
{
	int s;

//	if(!uartspcl && !redirectconsole)
//		return;
	s = splhi();
	while(--len >= 0){
		if(*data == '\n')
			uartputc('\r');
		uartputc(*data++);
	}
	splx(s);
}

void
uartwait(void)
{
}