xref: /plan9-contrib/sys/src/boot/vt4/uart.c (revision da917039c7f233c1a27d212bf012c6afa758af39)
1*da917039SDavid du Colombier /* xilinx uartlite driver (polling) */
2*da917039SDavid du Colombier #include "include.h"
3*da917039SDavid du Colombier 
4*da917039SDavid du Colombier enum {
5*da917039SDavid du Colombier 	/* UART Lite register offsets */
6*da917039SDavid du Colombier 	Rxfifo		= 0,		/* receive FIFO, read only */
7*da917039SDavid du Colombier 	Txfifo		= 4,		/* transmit FIFO, write only */
8*da917039SDavid du Colombier 	Status		= 8,		/* status register, read only */
9*da917039SDavid du Colombier 	Ctl		= 12,		/* control reg, write only */
10*da917039SDavid du Colombier 
11*da917039SDavid du Colombier 	/* control register bit positions */
12*da917039SDavid du Colombier 	Ctlintrena	= 0x10,		/* enable interrupt */
13*da917039SDavid du Colombier 	Rxfiforst	= 0x02,		/* reset receive FIFO */
14*da917039SDavid du Colombier 	Txfiforst	= 0x01,		/* reset transmit FIFO */
15*da917039SDavid du Colombier 
16*da917039SDavid du Colombier 	/* status register bit positions */
17*da917039SDavid du Colombier 	Parerr		= 0x80,
18*da917039SDavid du Colombier 	Framerr		= 0x40,
19*da917039SDavid du Colombier 	Overrunerr	= 0x20,
20*da917039SDavid du Colombier 	Stsintrena	= 0x10,		/* interrupt enabled */
21*da917039SDavid du Colombier 	Txfifofull	= 0x08,		/* transmit FIFO full */
22*da917039SDavid du Colombier 	Txfifoempty	= 0x04,		/* transmit FIFO empty */
23*da917039SDavid du Colombier 	Rxfifofull	= 0x02,		/* receive FIFO full */
24*da917039SDavid du Colombier 	Rxfifohasdata	= 0x01,		/* data in receive FIFO */
25*da917039SDavid du Colombier 
26*da917039SDavid du Colombier 	FIFO_SIZE	= 16,		/* bytes in tx or rx fifo */
27*da917039SDavid du Colombier };
28*da917039SDavid du Colombier 
29*da917039SDavid du Colombier #define Uartctl		((ulong *)(Uartlite + Ctl))
30*da917039SDavid du Colombier #define Uartstatus	((ulong *)(Uartlite + Status))
31*da917039SDavid du Colombier #define Uartrxfifo	((ulong *)(Uartlite + Rxfifo))
32*da917039SDavid du Colombier /* #define Uarttxfifo	((ulong *)(Uartlite + Txfifo)) /* see prototype.h */
33*da917039SDavid du Colombier 
34*da917039SDavid du Colombier void
vuartputc(int c)35*da917039SDavid du Colombier vuartputc(int c)
36*da917039SDavid du Colombier {
37*da917039SDavid du Colombier 	int i;
38*da917039SDavid du Colombier 
39*da917039SDavid du Colombier 	coherence();
40*da917039SDavid du Colombier 	i = 2000000;		/* allow > 1.04 ms per char @ 9600 baud */
41*da917039SDavid du Colombier 	while(*Uartstatus & Txfifofull && i-- > 0)
42*da917039SDavid du Colombier 		;
43*da917039SDavid du Colombier 	*Uarttxfifo = (uchar)c;
44*da917039SDavid du Colombier 	coherence();
45*da917039SDavid du Colombier }
46*da917039SDavid du Colombier 
47*da917039SDavid du Colombier int
vuartputs(char * s,int len)48*da917039SDavid du Colombier vuartputs(char *s, int len)
49*da917039SDavid du Colombier {
50*da917039SDavid du Colombier 	while (len-- > 0) {
51*da917039SDavid du Colombier 		if (*s == '\n')
52*da917039SDavid du Colombier 			vuartputc('\r');
53*da917039SDavid du Colombier 		vuartputc(*s++);
54*da917039SDavid du Colombier 	}
55*da917039SDavid du Colombier 	return len;
56*da917039SDavid du Colombier }
57*da917039SDavid du Colombier 
58*da917039SDavid du Colombier int
vuartgetc(void)59*da917039SDavid du Colombier vuartgetc(void)
60*da917039SDavid du Colombier {
61*da917039SDavid du Colombier 	while((*Uartstatus & Rxfifohasdata) == 0)
62*da917039SDavid du Colombier 		;
63*da917039SDavid du Colombier 	return (uchar)*Uartrxfifo;
64*da917039SDavid du Colombier }
65