15e4f5c78SDavid du Colombier typedef struct Serial Serial; 2d5789509SDavid du Colombier typedef struct Serialops Serialops; 3d5789509SDavid du Colombier typedef struct Serialport Serialport; 45e4f5c78SDavid du Colombier 55e4f5c78SDavid du Colombier struct Serialops { 6d5789509SDavid du Colombier int (*seteps)(Serialport*); 7d5789509SDavid du Colombier int (*init)(Serialport*); 8d5789509SDavid du Colombier int (*getparam)(Serialport*); 9d5789509SDavid du Colombier int (*setparam)(Serialport*); 10d5789509SDavid du Colombier int (*clearpipes)(Serialport*); 11*c8a340cdSDavid du Colombier int (*reset)(Serial*, Serialport*); 12d5789509SDavid du Colombier int (*sendlines)(Serialport*); 13d5789509SDavid du Colombier int (*modemctl)(Serialport*, int); 14d5789509SDavid du Colombier int (*setbreak)(Serialport*, int); 15d5789509SDavid du Colombier int (*readstatus)(Serialport*); 16d5789509SDavid du Colombier int (*wait4data)(Serialport*, uchar *, int); 17d5789509SDavid du Colombier int (*wait4write)(Serialport*, uchar *, int); 185e4f5c78SDavid du Colombier }; 195e4f5c78SDavid du Colombier 2080e9508eSDavid du Colombier enum { 2180e9508eSDavid du Colombier DataBufSz = 8*1024, 22d5789509SDavid du Colombier Maxifc = 16, 2380e9508eSDavid du Colombier }; 2480e9508eSDavid du Colombier 25d5789509SDavid du Colombier 26d5789509SDavid du Colombier struct Serialport { 27d584e620SDavid du Colombier char name[32]; 28d5789509SDavid du Colombier Serial *s; /* device we belong to */ 29d5789509SDavid du Colombier int isjtag; 30d5789509SDavid du Colombier 31d5789509SDavid du Colombier Dev *epintr; /* may not exist */ 32d5789509SDavid du Colombier 335e4f5c78SDavid du Colombier Dev *epin; 345e4f5c78SDavid du Colombier Dev *epout; 355e4f5c78SDavid du Colombier 36d5789509SDavid du Colombier Usbfs fs; 375e4f5c78SDavid du Colombier uchar ctlstate; 38d5789509SDavid du Colombier 395e4f5c78SDavid du Colombier /* serial parameters */ 405e4f5c78SDavid du Colombier uint baud; 415e4f5c78SDavid du Colombier int stop; 425e4f5c78SDavid du Colombier int mctl; 435e4f5c78SDavid du Colombier int parity; 445e4f5c78SDavid du Colombier int bits; 455e4f5c78SDavid du Colombier int fifo; 465e4f5c78SDavid du Colombier int limit; 475e4f5c78SDavid du Colombier int rts; 485e4f5c78SDavid du Colombier int cts; 495e4f5c78SDavid du Colombier int dsr; 505e4f5c78SDavid du Colombier int dcd; 515e4f5c78SDavid du Colombier int dtr; 5280e9508eSDavid du Colombier int rlsd; 5380e9508eSDavid du Colombier 545e4f5c78SDavid du Colombier vlong timer; 555e4f5c78SDavid du Colombier int blocked; /* for sw flow ctl. BUG: not implemented yet */ 565e4f5c78SDavid du Colombier int nbreakerr; 575e4f5c78SDavid du Colombier int ring; 585e4f5c78SDavid du Colombier int nframeerr; 595e4f5c78SDavid du Colombier int nparityerr; 605e4f5c78SDavid du Colombier int novererr; 615e4f5c78SDavid du Colombier int enabled; 625e4f5c78SDavid du Colombier 63d5789509SDavid du Colombier int interfc; /* interfc on the device for ftdi */ 64d5789509SDavid du Colombier 65d5789509SDavid du Colombier Channel *w4data; 66d5789509SDavid du Colombier Channel *gotdata; 67d5789509SDavid du Colombier Channel *readc; /* to uncouple reads, only used in ftdi... */ 68d5789509SDavid du Colombier int ndata; 69d5789509SDavid du Colombier uchar data[DataBufSz]; 70d5789509SDavid du Colombier }; 71d5789509SDavid du Colombier 72d5789509SDavid du Colombier struct Serial { 73d5789509SDavid du Colombier QLock; 74d5789509SDavid du Colombier Dev *dev; /* usb device*/ 75d5789509SDavid du Colombier 76d5789509SDavid du Colombier int type; /* serial model subtype */ 77d5789509SDavid du Colombier int recover; /* # of non-fatal recovery tries */ 78d5789509SDavid du Colombier Serialops; 79d5789509SDavid du Colombier 80d5789509SDavid du Colombier int hasepintr; 81d5789509SDavid du Colombier 82d5789509SDavid du Colombier int jtag; /* index of jtag interface, -1 none */ 83d5789509SDavid du Colombier int nifcs; /* # of serial interfaces, including JTAG */ 84d5789509SDavid du Colombier Serialport p[Maxifc]; 85d5789509SDavid du Colombier int maxrtrans; 86d5789509SDavid du Colombier int maxwtrans; 87d5789509SDavid du Colombier 8880e9508eSDavid du Colombier int maxread; 8980e9508eSDavid du Colombier int maxwrite; 9080e9508eSDavid du Colombier 9180e9508eSDavid du Colombier int inhdrsz; 9280e9508eSDavid du Colombier int outhdrsz; 9380e9508eSDavid du Colombier int baudbase; /* for special baud base settings, see ftdi */ 945e4f5c78SDavid du Colombier }; 955e4f5c78SDavid du Colombier 965e4f5c78SDavid du Colombier enum { 975e4f5c78SDavid du Colombier /* soft flow control chars */ 985e4f5c78SDavid du Colombier CTLS = 023, 995e4f5c78SDavid du Colombier CTLQ = 021, 10080e9508eSDavid du Colombier CtlDTR = 1, 10180e9508eSDavid du Colombier CtlRTS = 2, 1025e4f5c78SDavid du Colombier }; 1035e4f5c78SDavid du Colombier 1045e4f5c78SDavid du Colombier /* 1055e4f5c78SDavid du Colombier * !hget http://lxr.linux.no/source/drivers/usb/serial/pl2303.h|htmlfmt 1065e4f5c78SDavid du Colombier * !hget http://lxr.linux.no/source/drivers/usb/serial/pl2303.c|htmlfmt 1075e4f5c78SDavid du Colombier */ 1085e4f5c78SDavid du Colombier 1095e4f5c78SDavid du Colombier int serialmain(Dev *d, int argc, char *argv[]); 1105e4f5c78SDavid du Colombier 1115e4f5c78SDavid du Colombier typedef struct Cinfo Cinfo; 1125e4f5c78SDavid du Colombier struct Cinfo { 1135e4f5c78SDavid du Colombier int vid; /* usb vendor id */ 1145e4f5c78SDavid du Colombier int did; /* usb device/product id */ 1155e4f5c78SDavid du Colombier int cid; /* controller id assigned by us */ 1165e4f5c78SDavid du Colombier }; 1175e4f5c78SDavid du Colombier 1184d52e0f0SDavid du Colombier extern Cinfo plinfo[]; 1194d52e0f0SDavid du Colombier extern Cinfo uconsinfo[]; 1205e4f5c78SDavid du Colombier extern int serialdebug; 1215e4f5c78SDavid du Colombier 1225e4f5c78SDavid du Colombier #define dsprint if(serialdebug)fprint 1235e4f5c78SDavid du Colombier 124*c8a340cdSDavid du Colombier int serialrecover(Serial *ser, Serialport *p, Dev *ep, char *err); 1255e4f5c78SDavid du Colombier int serialreset(Serial *ser); 126d5789509SDavid du Colombier char *serdumpst(Serialport *p, char *buf, int bufsz); 127