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