typedef struct Serial Serial;
typedef struct Serialops Serialops;
typedef struct Serialport Serialport;
struct Serialops {
int (*seteps)(Serialport*);
int (*init)(Serialport*);
int (*getparam)(Serialport*);
int (*setparam)(Serialport*);
int (*clearpipes)(Serialport*);
int (*reset)(Serial*, Serialport*);
int (*sendlines)(Serialport*);
int (*modemctl)(Serialport*, int);
int (*setbreak)(Serialport*, int);
int (*readstatus)(Serialport*);
int (*wait4data)(Serialport*, uchar *, int);
int (*wait4write)(Serialport*, uchar *, int);
};
enum {
DataBufSz = 8*1024,
Maxifc = 16,
};
struct Serialport {
char name[32];
Serial *s; /* device we belong to */
int isjtag;
Dev *epintr; /* may not exist */
Dev *epin;
Dev *epout;
Usbfs fs;
uchar ctlstate;
/* serial parameters */
uint baud;
int stop;
int mctl;
int parity;
int bits;
int fifo;
int limit;
int rts;
int cts;
int dsr;
int dcd;
int dtr;
int rlsd;
vlong timer;
int blocked; /* for sw flow ctl. BUG: not implemented yet */
int nbreakerr;
int ring;
int nframeerr;
int nparityerr;
int novererr;
int enabled;
int interfc; /* interfc on the device for ftdi */
Channel *w4data;
Channel *gotdata;
Channel *readc; /* to uncouple reads, only used in ftdi... */
int ndata;
uchar data[DataBufSz];
};
struct Serial {
QLock;
Dev *dev; /* usb device*/
int type; /* serial model subtype */
int recover; /* # of non-fatal recovery tries */
Serialops;
int hasepintr;
int jtag; /* index of jtag interface, -1 none */
int nifcs; /* # of serial interfaces, including JTAG */
Serialport p[Maxifc];
int maxrtrans;
int maxwtrans;
int maxread;
int maxwrite;
int inhdrsz;
int outhdrsz;
int baudbase; /* for special baud base settings, see ftdi */
};
enum {
/* soft flow control chars */
CTLS = 023,
CTLQ = 021,
CtlDTR = 1,
CtlRTS = 2,
};
/*
* !hget http://lxr.linux.no/source/drivers/usb/serial/pl2303.h|htmlfmt
* !hget http://lxr.linux.no/source/drivers/usb/serial/pl2303.c|htmlfmt
*/
int serialmain(Dev *d, int argc, char *argv[]);
typedef struct Cinfo Cinfo;
struct Cinfo {
int vid; /* usb vendor id */
int did; /* usb device/product id */
int cid; /* controller id assigned by us */
};
extern Cinfo plinfo[];
extern Cinfo uconsinfo[];
extern int serialdebug;
#define dsprint if(serialdebug)fprint
int serialrecover(Serial *ser, Serialport *p, Dev *ep, char *err);
int serialreset(Serial *ser);
char *serdumpst(Serialport *p, char *buf, int bufsz);
|