diff options
author | cinap_lenrek <cinap_lenrek@gmx.de> | 2013-01-25 17:12:15 +0100 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@gmx.de> | 2013-01-25 17:12:15 +0100 |
commit | 68c5dc801409a8a24cfe48977df62e040e92cc90 (patch) | |
tree | 12afffc3b91fdf86fde99f6b273bfdc30a290752 /sys/src/cmd/nusb/serial/serial.c | |
parent | 98dd0aebef1c3bbc05750d534582392695f801f5 (diff) |
nusb/serial: add silabs driver (from sources)
Diffstat (limited to 'sys/src/cmd/nusb/serial/serial.c')
-rw-r--r-- | sys/src/cmd/nusb/serial/serial.c | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/sys/src/cmd/nusb/serial/serial.c b/sys/src/cmd/nusb/serial/serial.c index 426d84bdf..2c41398f9 100644 --- a/sys/src/cmd/nusb/serial/serial.c +++ b/sys/src/cmd/nusb/serial/serial.c @@ -14,6 +14,7 @@ #include "prolific.h" #include "ucons.h" #include "ftdi.h" +#include "silabs.h" int serialdebug; static int sdebug; @@ -637,7 +638,11 @@ openeps(Serialport *p, int epin, int epout, int epintr) fprint(2, "serial: openep %d: %r\n", epin); return -1; } - p->epout = openep(ser->dev, epout); + if(epin == epout){ + incref(p->epin); + p->epout = p->epin; + } else + p->epout = openep(ser->dev, epout); if(p->epout == nil){ fprint(2, "serial: openep %d: %r\n", epout); closedev(p->epin); @@ -663,9 +668,13 @@ openeps(Serialport *p, int epin, int epout, int epintr) if(ser->seteps!= nil) ser->seteps(p); - opendevdata(p->epin, OREAD); - opendevdata(p->epout, OWRITE); - if(p->epin->dfd < 0 ||p->epout->dfd < 0 || + if(p->epin == p->epout) + opendevdata(p->epin, ORDWR); + else { + opendevdata(p->epin, OREAD); + opendevdata(p->epout, OWRITE); + } + if(p->epin->dfd < 0 || p->epout->dfd < 0 || (ser->hasepintr && p->epintr->dfd < 0)){ fprint(2, "serial: open i/o ep data: %r\n"); closedev(p->epin); @@ -698,9 +707,9 @@ findendpoints(Serial *ser, int ifc) ep->dir == Ein && epintr == -1) epintr = ep->id; if(ep->type == Ebulk){ - if(ep->dir == Ein && epin == -1) + if((ep->dir == Ein || ep->dir == Eboth) && epin == -1) epin = ep->id; - if(ep->dir == Eout && epout == -1) + if((ep->dir == Eout || ep->dir == Eboth) && epout == -1) epout = ep->id; } } @@ -822,6 +831,8 @@ threadmain(int argc, char* argv[]) ser->Serialops = uconsops; else if(ftmatch(ser, buf) == 0) ser->Serialops = ftops; + else if(slmatch(buf) == 0) + ser->Serialops = slops; else { sysfatal("no serial devices found"); } |