nusb/serial: more cleanup
This commit is contained in:
parent
336e605a11
commit
502247bf92
6 changed files with 52 additions and 81 deletions
|
@ -1167,20 +1167,14 @@ ftgettype(Serial *ser)
|
|||
}
|
||||
|
||||
int
|
||||
ftmatch(Serial *ser, char *info)
|
||||
ftprobe(Serial *ser)
|
||||
{
|
||||
Cinfo *ip;
|
||||
char buf[50];
|
||||
Usbdev *ud = ser->dev->usb;
|
||||
|
||||
for(ip = ftinfo; ip->vid != 0; ip++){
|
||||
snprint(buf, sizeof buf, "vid %#06x did %#06x", ip->vid, ip->did);
|
||||
dsprint(2, "serial: %s %s\n", buf, info);
|
||||
if(strstr(info, buf) != nil){
|
||||
ftgettype(ser);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
if(matchid(ftinfo, ud->vid, ud->did) == nil)
|
||||
return -1;
|
||||
ftgettype(ser);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
|
|
|
@ -231,22 +231,15 @@ Cinfo plinfo[] = {
|
|||
static Serialops plops;
|
||||
|
||||
int
|
||||
plmatch(Serial *ser, char *info)
|
||||
plprobe(Serial *ser)
|
||||
{
|
||||
Cinfo *ip;
|
||||
char buf[50];
|
||||
Usbdev *ud = ser->dev->usb;
|
||||
|
||||
for(ip = plinfo; ip->vid != 0; ip++){
|
||||
snprint(buf, sizeof buf, "vid %#06x did %#06x",
|
||||
ip->vid, ip->did);
|
||||
dsprint(2, "serial: %s %s\n", buf, info);
|
||||
if(strstr(info, buf) != nil){
|
||||
ser->hasepintr = 1;
|
||||
ser->Serialops = plops;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
if(matchid(plinfo, ud->vid, ud->did) == nil)
|
||||
return -1;
|
||||
ser->hasepintr = 1;
|
||||
ser->Serialops = plops;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void statusreader(void *u);
|
||||
|
|
|
@ -12,11 +12,7 @@
|
|||
#include "usb.h"
|
||||
#include "serial.h"
|
||||
|
||||
|
||||
|
||||
int serialdebug;
|
||||
static int sdebug;
|
||||
|
||||
Serialport **ports;
|
||||
int nports;
|
||||
|
||||
|
@ -308,6 +304,17 @@ serdumpst(Serialport *p, char *buf, int bufsz)
|
|||
return s;
|
||||
}
|
||||
|
||||
Cinfo*
|
||||
matchid(Cinfo *tab, int vid, int did)
|
||||
{
|
||||
while(tab->vid != 0){
|
||||
if(tab->vid == vid && (tab->did == did || did == 0))
|
||||
return tab;
|
||||
tab++;
|
||||
}
|
||||
return nil;
|
||||
}
|
||||
|
||||
static int
|
||||
serinit(Serialport *p)
|
||||
{
|
||||
|
@ -755,10 +762,10 @@ static Srv serialfs = {
|
|||
.end = dend,
|
||||
};
|
||||
|
||||
int ftmatch(Serial *ser, char *info);
|
||||
int plmatch(Serial *ser, char *info);
|
||||
int slmatch(Serial *ser, char *info);
|
||||
int uconsmatch(Serial *ser, char *info);
|
||||
extern int ftprobe(Serial *ser);
|
||||
extern int plprobe(Serial *ser);
|
||||
extern int slprobe(Serial *ser);
|
||||
extern int uconsprobe(Serial *ser);
|
||||
|
||||
void
|
||||
threadmain(int argc, char* argv[])
|
||||
|
@ -790,14 +797,11 @@ threadmain(int argc, char* argv[])
|
|||
ser->jtag = -1;
|
||||
ser->nifcs = 1;
|
||||
|
||||
snprint(buf, sizeof buf, "vid %#06x did %#06x",
|
||||
dev->usb->vid, dev->usb->did);
|
||||
|
||||
/* probe all the drivers */
|
||||
if(plmatch(ser, buf)
|
||||
&& uconsmatch(ser, buf)
|
||||
&& ftmatch(ser, buf)
|
||||
&& slmatch(ser, buf))
|
||||
if(plprobe(ser)
|
||||
&& uconsprobe(ser)
|
||||
&& ftprobe(ser)
|
||||
&& slprobe(ser))
|
||||
sysfatal("no serial devices found");
|
||||
|
||||
for(i = 0; i < ser->nifcs; i++){
|
||||
|
@ -818,9 +822,8 @@ threadmain(int argc, char* argv[])
|
|||
for(i = 0; i < ser->nifcs; i++){
|
||||
p = &ser->p[i];
|
||||
dprint(2, "serial: valid interface, calling serinit\n");
|
||||
if(serinit(p) < 0){
|
||||
if(serinit(p) < 0)
|
||||
sysfatal("wserinit: %r");
|
||||
}
|
||||
|
||||
dsprint(2, "serial: adding interface %d, %p\n", p->interfc, p);
|
||||
if(ser->nifcs == 1)
|
||||
|
@ -835,10 +838,7 @@ threadmain(int argc, char* argv[])
|
|||
}
|
||||
qunlock(ser);
|
||||
|
||||
if(nports == 0)
|
||||
threadexits("no ports");
|
||||
|
||||
snprint(buf, sizeof buf, "%d.serial", dev->id);
|
||||
threadpostsharesrv(&serialfs, nil, "usb", buf);
|
||||
threadexits(0);
|
||||
threadexits(nil);
|
||||
}
|
||||
|
|
|
@ -22,7 +22,6 @@ enum {
|
|||
Maxifc = 16,
|
||||
};
|
||||
|
||||
|
||||
struct Serialport {
|
||||
char name[32];
|
||||
Serial *s; /* device we belong to */
|
||||
|
@ -110,17 +109,14 @@ enum {
|
|||
* !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 */
|
||||
|
||||
int cid; /* assigned for us */
|
||||
};
|
||||
|
||||
extern Cinfo plinfo[];
|
||||
extern Cinfo uconsinfo[];
|
||||
extern int serialdebug;
|
||||
|
||||
#define dsprint if(serialdebug)fprint
|
||||
|
@ -128,3 +124,4 @@ extern int serialdebug;
|
|||
int serialrecover(Serial *ser, Serialport *p, Dev *ep, char *err);
|
||||
int serialreset(Serial *ser);
|
||||
char *serdumpst(Serialport *p, char *buf, int bufsz);
|
||||
Cinfo *matchid(Cinfo *tab, int vid, int did);
|
||||
|
|
|
@ -31,20 +31,14 @@ static Cinfo slinfo[] = {
|
|||
|
||||
static Serialops slops;
|
||||
|
||||
slmatch(Serial *ser, char *info)
|
||||
slprobe(Serial *ser)
|
||||
{
|
||||
Cinfo *ip;
|
||||
char buf[50];
|
||||
Usbdev *ud = ser->dev->usb;
|
||||
|
||||
for(ip = slinfo; ip->vid != 0; ip++){
|
||||
snprint(buf, sizeof buf, "vid %#06x did %#06x",
|
||||
ip->vid, ip->did);
|
||||
if(strstr(info, buf) != nil){
|
||||
ser->Serialops = slops;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
if(matchid(slinfo, ud->vid, ud->did) == nil)
|
||||
return -1;
|
||||
ser->Serialops = slops;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
|
|
|
@ -15,26 +15,19 @@ enum {
|
|||
};
|
||||
|
||||
Cinfo uconsinfo[] = {
|
||||
{ Net20DCVid, Net20DCDid },
|
||||
{ HuaweiVid, HuaweiE220 },
|
||||
{ 0, 0 },
|
||||
{ Net20DCVid, Net20DCDid, 1 },
|
||||
{ HuaweiVid, HuaweiE220, 2 },
|
||||
{ 0, 0, 0 },
|
||||
};
|
||||
|
||||
int
|
||||
uconsmatch(Serial *ser, char *info)
|
||||
uconsprobe(Serial *ser)
|
||||
{
|
||||
Usbdev *ud = ser->dev->usb;
|
||||
Cinfo *ip;
|
||||
char buf[50];
|
||||
|
||||
for(ip = uconsinfo; ip->vid != 0; ip++){
|
||||
snprint(buf, sizeof buf, "vid %#06x did %#06x",
|
||||
ip->vid, ip->did);
|
||||
dsprint(2, "serial: %s %s\n", buf, info);
|
||||
if(strstr(info, buf) != nil){
|
||||
if(ip->vid == HuaweiVid && ip->did == HuaweiE220)
|
||||
ser->nifcs = 2;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
if((ip = matchid(uconsinfo, ud->vid, ud->did)) == nil)
|
||||
return -1;
|
||||
ser->nifcs = ip->cid;
|
||||
return 0;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue