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