Subversion Repositories planix.SVN

Rev

Rev 2 | Blame | Compare with Previous | Last modification | View Log | RSS feed

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