1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
|
typedef struct PhysUart PhysUart;
typedef struct Uart Uart;
/*
* routines to access UART hardware
*/
struct PhysUart
{
char* name;
Uart* (*pnp)(void);
void (*enable)(Uart*, int);
void (*disable)(Uart*);
void (*kick)(Uart*);
void (*dobreak)(Uart*, int);
int (*baud)(Uart*, int);
int (*bits)(Uart*, int);
int (*stop)(Uart*, int);
int (*parity)(Uart*, int);
void (*modemctl)(Uart*, int);
void (*rts)(Uart*, int);
void (*dtr)(Uart*, int);
long (*status)(Uart*, void*, long, long);
void (*fifo)(Uart*, int);
void (*power)(Uart*, int);
int (*getc)(Uart*); /* polling versions, for iprint, rdb */
void (*putc)(Uart*, int);
};
enum {
Stagesize= 1024
};
/*
* software UART
*/
struct Uart
{
void* regs; /* hardware stuff */
void* saveregs; /* place to put registers on power down */
char* name; /* internal name */
ulong freq; /* clock frequency */
int bits; /* bits per character */
int stop; /* stop bits */
int parity; /* even, odd or no parity */
int baud; /* baud rate */
PhysUart*phys;
int console; /* used as a serial console */
int special; /* internal kernel device */
Uart* next; /* list of allocated uarts */
QLock;
int type; /* ?? */
int dev;
int opens;
int enabled;
Uart *elist; /* next enabled interface */
int perr; /* parity errors */
int ferr; /* framing errors */
int oerr; /* rcvr overruns */
int berr; /* no input buffers */
int serr; /* input queue overflow */
/* buffers */
int (*putc)(Queue*, int);
Queue *iq;
Queue *oq;
Lock rlock;
uchar istage[Stagesize];
uchar *iw;
uchar *ir;
uchar *ie;
Lock tlock; /* transmit */
uchar ostage[Stagesize];
uchar *op;
uchar *oe;
int drain;
int modem; /* hardware flow control on */
int xonoff; /* software flow control on */
int blocked;
int cts, dsr, dcd, dcdts; /* keep track of modem status */
int ctsbackoff;
int hup_dsr, hup_dcd; /* send hangup upstream? */
int dohup;
Rendez r;
};
extern Uart* consuart;
extern int uartctl(Uart*, char*);
extern int uartgetc(void);
extern void uartkick(void*);
extern void uartmouse(Uart*, int (*)(Queue*, int), int);
extern void uartsetmouseputc(Uart*, int (*)(Queue*, int));
extern void uartputc(int);
extern void uartputs(char*, int);
extern void uartrecv(Uart*, char);
extern Uart* uartsetup(Uart*);
extern int uartstageoutput(Uart*);
|