diff options
| author | Charles.Forsyth <devnull@localhost> | 2006-12-22 21:39:35 +0000 |
|---|---|---|
| committer | Charles.Forsyth <devnull@localhost> | 2006-12-22 21:39:35 +0000 |
| commit | 74a4d8c26dd3c1e9febcb717cfd6cb6512991a7a (patch) | |
| tree | c6e220ba61db3a6ea4052e6841296d829654e664 /os/cerf405/uart.c | |
| parent | 46439007cf417cbd9ac8049bb4122c890097a0fa (diff) | |
20060303
Diffstat (limited to 'os/cerf405/uart.c')
| -rw-r--r-- | os/cerf405/uart.c | 139 |
1 files changed, 139 insertions, 0 deletions
diff --git a/os/cerf405/uart.c b/os/cerf405/uart.c new file mode 100644 index 00000000..3d90f5ad --- /dev/null +++ b/os/cerf405/uart.c @@ -0,0 +1,139 @@ +#include "u.h" +#include "../port/lib.h" +#include "mem.h" +#include "dat.h" +#include "fns.h" +#include "io.h" +#include "ureg.h" + +/* + * uart for initial port + */ + +typedef struct Uartregs Uartregs; +struct Uartregs { + uchar rbr; +#define thr rbr +#define dll rbr + uchar ier; +#define dlm ier + uchar fcr; +#define iir fcr + uchar lcr; + uchar mcr; + uchar lsr; + uchar msr; + uchar scr; +}; + +#define UARTREGS(n) ((Uartregs*)(PHYSUART0+(n)*0x100)) + +enum { + /* ier */ + Edssi= 1<<3, + Elsi= 1<<2, + Etbei= 1<<1, + Erbfi= 1<<0, + + /* iir */ + Fci0= 0<<4, + Fci3= 3<<4, + Ipl= 7<<1, + Ip= 1<<0, + + /* fcr */ + Rftl1= 0<<6, /* receiver trigger level 1, 16, 32, 56 */ + Rftl16= 1<<6, + Rftl32= 2<<6, + Rftl56= 3<<6, + Dms= 1<<3, /* =0, single transfer; =1, multiple transfers */ + Tfr= 1<<2, /* transmitter fifo reset */ + Rfr= 1<<1, /* receiver fifo reset */ + Fifoe= 1<<0, /* =0, disable fifos; =1, enable fifos */ + + /* lcr */ + Dlab= 1<<7, /* =0, normal; =1, dll/dlm visible */ + Sb= 1<<6, /* set break */ + Sp= 1<<5, /* =1, enable sticky parity */ + Eps= 1<<4, /* =1, generate even parity */ + Pen= 1<<3, /* =1, enable parity checking */ + Sbs= 1<<2, /* =0, 1 stop bit; =1, 1.5 or 2 stop bits (see Wls) */ + Wls= 3<<0, /* set to nbit-5 for nbit characters */ + + /* mcr */ + Afc= 1<<5, /* =1, auto flow control enabled */ + Loop= 1<<4, /* =1, loop back mode enabled */ + Out2= 1<<3, /* =0, OUT2# active */ + Out1= 1<<2, /* =0, OUT1# active */ + Rts= 1<<1, /* =0, RTS# inactive (1); =1, RTS# active (0) */ + Dtr= 1<<0, /* =0, DTS# inactive; =1, DTS# active */ + + /* lsr */ + Rfe= 1<<7, /* error instances in fifo */ + Temt= 1<<6, /* transmitter empty */ + Thre= 1<<5, /* transmitter holding register/fifo empty */ + Be= 1<<4, /* break (interrupt) */ + Fe= 1<<3, /* framing error */ + Pe= 1<<2, /* parity error */ + Oe= 1<<1, /* overrun error */ + Dr= 1<<0, /* receiver data ready */ + + /* msr */ + Dcd= 1<<7, /* follows Out2 */ + Ri= 1<<6, /* follows Out1 */ + Dsr= 1<<5, /* follows Dtr */ + Cts= 1<<4, /* follows Rts */ + Ddcd= 1<<3, /* Dcd input changed */ + Teri= 1<<2, /* Ri changed from 0 to 1 */ + Ddsr= 1<<1, /* Dsr input changed */ + Dcts= 1<<0, /* Cts input changed */ +}; + +void (*serwrite)(char*, int) = uartputs; + +void +uartinstall(void) +{ +} + +void +uartspecial(int, int, Queue**, Queue**, int (*)(Queue*, int)) +{ +} + +void +uartputc(int c) +{ + Uartregs *r; + + if(c == 0) + return; + r = UARTREGS(0); + while((r->lsr & Thre) == 0) + {} + r->thr = c; + if(c == '\n') + while((r->lsr & Thre) == 0) /* flush xmit fifo */ + {} +} + +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) +{ +} |
