summaryrefslogtreecommitdiff
path: root/sys/src/cmd/nusb/serial/serial.c
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@gmx.de>2013-01-25 17:12:15 +0100
committercinap_lenrek <cinap_lenrek@gmx.de>2013-01-25 17:12:15 +0100
commit68c5dc801409a8a24cfe48977df62e040e92cc90 (patch)
tree12afffc3b91fdf86fde99f6b273bfdc30a290752 /sys/src/cmd/nusb/serial/serial.c
parent98dd0aebef1c3bbc05750d534582392695f801f5 (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.c23
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");
}