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*);
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*);