1 typedef struct Serial Serial; 2 typedef struct Serialops Serialops; 3 typedef struct Serialport Serialport; 4 5 struct Serialops { 6 int (*seteps)(Serialport*); 7 int (*init)(Serialport*); 8 int (*getparam)(Serialport*); 9 int (*setparam)(Serialport*); 10 int (*clearpipes)(Serialport*); 11 int (*reset)(Serial*, Serialport*); 12 int (*sendlines)(Serialport*); 13 int (*modemctl)(Serialport*, int); 14 int (*setbreak)(Serialport*, int); 15 int (*readstatus)(Serialport*); 16 int (*wait4data)(Serialport*, uchar *, int); 17 int (*wait4write)(Serialport*, uchar *, int); 18 }; 19 20 enum { 21 DataBufSz = 8*1024, 22 Maxifc = 16, 23 }; 24 25 26 struct Serialport { 27 char name[32]; 28 Serial *s; /* device we belong to */ 29 int isjtag; 30 31 Dev *epintr; /* may not exist */ 32 33 Dev *epin; 34 Dev *epout; 35 36 Usbfs fs; 37 uchar ctlstate; 38 39 /* serial parameters */ 40 uint baud; 41 int stop; 42 int mctl; 43 int parity; 44 int bits; 45 int fifo; 46 int limit; 47 int rts; 48 int cts; 49 int dsr; 50 int dcd; 51 int dtr; 52 int rlsd; 53 54 vlong timer; 55 int blocked; /* for sw flow ctl. BUG: not implemented yet */ 56 int nbreakerr; 57 int ring; 58 int nframeerr; 59 int nparityerr; 60 int novererr; 61 int enabled; 62 63 int interfc; /* interfc on the device for ftdi */ 64 65 Channel *w4data; 66 Channel *gotdata; 67 Channel *readc; /* to uncouple reads, only used in ftdi... */ 68 int ndata; 69 uchar data[DataBufSz]; 70 }; 71 72 struct Serial { 73 QLock; 74 Dev *dev; /* usb device*/ 75 76 int type; /* serial model subtype */ 77 int recover; /* # of non-fatal recovery tries */ 78 Serialops; 79 80 int hasepintr; 81 82 int jtag; /* index of jtag interface, -1 none */ 83 int nifcs; /* # of serial interfaces, including JTAG */ 84 Serialport p[Maxifc]; 85 int maxrtrans; 86 int maxwtrans; 87 88 int maxread; 89 int maxwrite; 90 91 int inhdrsz; 92 int outhdrsz; 93 int baudbase; /* for special baud base settings, see ftdi */ 94 }; 95 96 enum { 97 /* soft flow control chars */ 98 CTLS = 023, 99 CTLQ = 021, 100 CtlDTR = 1, 101 CtlRTS = 2, 102 }; 103 104 /* 105 * !hget http://lxr.linux.no/source/drivers/usb/serial/pl2303.h|htmlfmt 106 * !hget http://lxr.linux.no/source/drivers/usb/serial/pl2303.c|htmlfmt 107 */ 108 109 int serialmain(Dev *d, int argc, char *argv[]); 110 111 typedef struct Cinfo Cinfo; 112 struct Cinfo { 113 int vid; /* usb vendor id */ 114 int did; /* usb device/product id */ 115 int cid; /* controller id assigned by us */ 116 }; 117 118 extern Cinfo plinfo[]; 119 extern Cinfo uconsinfo[]; 120 extern int serialdebug; 121 122 #define dsprint if(serialdebug)fprint 123 124 int serialrecover(Serial *ser, Serialport *p, Dev *ep, char *err); 125 int serialreset(Serial *ser); 126 char *serdumpst(Serialport *p, char *buf, int bufsz); 127