|
@@ -32,8 +32,8 @@ struct Dirtab {
|
|
|
|
|
|
static Dirtab dirtab[] = {
|
|
|
[Qroot] "/", DMDIR|0555,
|
|
|
- [Qdata] "eiaU", 0660,
|
|
|
- [Qctl] "eiaUctl", 0664,
|
|
|
+ [Qdata] "%s", 0660,
|
|
|
+ [Qctl] "%sctl", 0664,
|
|
|
};
|
|
|
|
|
|
static int sdebug;
|
|
@@ -49,8 +49,6 @@ serialfatal(Serial *ser)
|
|
|
|
|
|
for(i = 0; i < ser->nifcs; i++){
|
|
|
p = &ser->p[i];
|
|
|
- if(p->isjtag)
|
|
|
- continue;
|
|
|
usbfsdel(&p->fs);
|
|
|
if(p->w4data != nil)
|
|
|
chanclose(p->w4data);
|
|
@@ -93,8 +91,6 @@ serialreset(Serial *ser)
|
|
|
/* cmd for reset */
|
|
|
for(i = 0; i < ser->nifcs; i++){
|
|
|
p = &ser->p[i];
|
|
|
- if(p->isjtag)
|
|
|
- continue;
|
|
|
serialdrain(p);
|
|
|
}
|
|
|
if(ser->reset != nil)
|
|
@@ -342,7 +338,7 @@ dwalk(Usbfs *fs, Fid *fid, char *name)
|
|
|
|
|
|
p = fs->aux;
|
|
|
for(i = 1; i < nelem(dirtab); i++){
|
|
|
- dname = smprint(dirtab[i].name, p->fs.name);
|
|
|
+ dname = smprint(dirtab[i].name, p->name);
|
|
|
if(strcmp(name, dname) == 0){
|
|
|
qid.path = i | fs->qid;
|
|
|
qid.vers = 0;
|
|
@@ -401,6 +397,8 @@ dopen(Usbfs *fs, Fid *fid, int)
|
|
|
break;
|
|
|
case Qctl:
|
|
|
dsprint(2, "serial, opened ctl\n");
|
|
|
+ if(p->isjtag)
|
|
|
+ return 0;
|
|
|
serialctl(p, "l8 i1"); /* default line parameters */
|
|
|
break;
|
|
|
}
|
|
@@ -409,24 +407,27 @@ dopen(Usbfs *fs, Fid *fid, int)
|
|
|
|
|
|
|
|
|
static void
|
|
|
-filldir(Usbfs *fs, Dir *d, Dirtab *tab, int i)
|
|
|
+filldir(Usbfs *fs, Dir *d, Dirtab *tab, int i, void *v)
|
|
|
{
|
|
|
+ Serialport *p;
|
|
|
+
|
|
|
+ p = v;
|
|
|
d->qid.path = i | fs->qid;
|
|
|
d->mode = tab->mode;
|
|
|
if((d->mode & DMDIR) != 0)
|
|
|
d->qid.type = QTDIR;
|
|
|
else
|
|
|
d->qid.type = QTFILE;
|
|
|
- d->name = tab->name;
|
|
|
+ sprint(d->name, tab->name, p->name); /* hope it fits */
|
|
|
}
|
|
|
|
|
|
static int
|
|
|
-dirgen(Usbfs *fs, Qid, int i, Dir *d, void *)
|
|
|
+dirgen(Usbfs *fs, Qid, int i, Dir *d, void *p)
|
|
|
{
|
|
|
i++; /* skip root */
|
|
|
if(i >= nelem(dirtab))
|
|
|
return -1;
|
|
|
- filldir(fs, d, &dirtab[i], i);
|
|
|
+ filldir(fs, d, &dirtab[i], i, p);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -456,7 +457,7 @@ dread(Usbfs *fs, Fid *fid, void *data, long count, vlong offset)
|
|
|
qlock(ser);
|
|
|
switch(path){
|
|
|
case Qroot:
|
|
|
- count = usbdirread(fs, q, data, count, offset, dirgen, nil);
|
|
|
+ count = usbdirread(fs, q, data, count, offset, dirgen, p);
|
|
|
break;
|
|
|
case Qdata:
|
|
|
if(count > ser->maxread)
|
|
@@ -513,8 +514,10 @@ dread(Usbfs *fs, Fid *fid, void *data, long count, vlong offset)
|
|
|
if(offset != 0)
|
|
|
count = 0;
|
|
|
else {
|
|
|
- e = serdumpst(p, buf, Serbufsize);
|
|
|
- count = usbreadbuf(data, count, 0, buf, e - buf);
|
|
|
+ if(!p->isjtag){
|
|
|
+ e = serdumpst(p, buf, Serbufsize);
|
|
|
+ count = usbreadbuf(data, count, 0, buf, e - buf);
|
|
|
+ }
|
|
|
}
|
|
|
break;
|
|
|
}
|
|
@@ -533,6 +536,8 @@ altwrite(Serialport *p, uchar *buf, long count)
|
|
|
|
|
|
ser = p->s;
|
|
|
do{
|
|
|
+ dsprint(2, "serial: write to bulk %ld\n", count);
|
|
|
+
|
|
|
if(ser->wait4write != nil)
|
|
|
/* unlocked inside later */
|
|
|
nw = ser->wait4write(p, buf, count);
|
|
@@ -543,6 +548,7 @@ altwrite(Serialport *p, uchar *buf, long count)
|
|
|
qlock(ser);
|
|
|
}
|
|
|
rerrstr(err, sizeof err);
|
|
|
+ dsprint(2, "serial: written %s %d\n", err, nw);
|
|
|
} while(nw < 0 && strstr(err, "timed out") != nil);
|
|
|
|
|
|
if(nw != count){
|
|
@@ -572,6 +578,8 @@ dwrite(Usbfs *fs, Fid *fid, void *buf, long count, vlong)
|
|
|
count = altwrite(p, (uchar *)buf, count);
|
|
|
break;
|
|
|
case Qctl:
|
|
|
+ if(p->isjtag)
|
|
|
+ break;
|
|
|
cmd = emallocz(count+1, 1);
|
|
|
memmove(cmd, buf, count);
|
|
|
cmd[count] = 0;
|
|
@@ -610,8 +618,10 @@ openeps(Serialport *p, int epin, int epout, int epintr)
|
|
|
return -1;
|
|
|
}
|
|
|
|
|
|
- devctl(p->epin, "timeout 1000");
|
|
|
- devctl(p->epout, "timeout 1000");
|
|
|
+ if(!p->isjtag){
|
|
|
+ devctl(p->epin, "timeout 1000");
|
|
|
+ devctl(p->epout, "timeout 1000");
|
|
|
+ }
|
|
|
|
|
|
if(ser->hasepintr){
|
|
|
p->epintr = openep(ser->dev, epintr);
|
|
@@ -646,10 +656,8 @@ findendpoints(Serial *ser, int ifc)
|
|
|
{
|
|
|
int i, epin, epout, epintr;
|
|
|
Ep *ep, **eps;
|
|
|
- ///Usbdev *ud;
|
|
|
|
|
|
epintr = epin = epout = -1;
|
|
|
- //ud = ser->dev->usb;
|
|
|
|
|
|
/*
|
|
|
* interfc 0 means start from the start which is equiv to
|
|
@@ -798,12 +806,11 @@ serialmain(Dev *dev, int argc, char* argv[])
|
|
|
for(i = 0; i < ser->nifcs; i++){
|
|
|
p = &ser->p[i];
|
|
|
p->interfc = i;
|
|
|
+ p->s = ser;
|
|
|
+ p->fs = serialfs;
|
|
|
if(i == ser->jtag){
|
|
|
p->isjtag++;
|
|
|
- continue;
|
|
|
}
|
|
|
- p->s = ser;
|
|
|
- p->fs = serialfs;
|
|
|
if(findendpoints(ser, i) < 0){
|
|
|
werrstr("serial: no endpoints found for ifc %d", i);
|
|
|
return -1;
|
|
@@ -816,10 +823,6 @@ serialmain(Dev *dev, int argc, char* argv[])
|
|
|
serialreset(ser);
|
|
|
for(i = 0; i < ser->nifcs; i++){
|
|
|
p = &ser->p[i];
|
|
|
- if(p->isjtag){
|
|
|
- dsprint(2, "serial: ignoring JTAG interface %d %p\n", i, p);
|
|
|
- continue;
|
|
|
- }
|
|
|
dprint(2, "serial: valid interface, calling serinit\n");
|
|
|
if(serinit(p) < 0){
|
|
|
dprint(2, "serial: serinit: %r\n");
|
|
@@ -827,10 +830,17 @@ serialmain(Dev *dev, int argc, char* argv[])
|
|
|
}
|
|
|
|
|
|
dsprint(2, "serial: adding interface %d, %p\n", p->interfc, p);
|
|
|
- if(i == 0)
|
|
|
- snprint(p->fs.name, sizeof p->fs.name, "eiaU%d", devid);
|
|
|
- else
|
|
|
- snprint(p->fs.name, sizeof p->fs.name, "eiaU%d.%d", devid, i);
|
|
|
+ if(p->isjtag){
|
|
|
+ snprint(p->name, sizeof p->name, "jtag");
|
|
|
+ dsprint(2, "serial: JTAG interface %d %p\n", i, p);
|
|
|
+ snprint(p->fs.name, sizeof p->fs.name, "jtag%d.%d", devid, i);
|
|
|
+ } else {
|
|
|
+ snprint(p->name, sizeof p->name, "eiaU");
|
|
|
+ if(i == 0)
|
|
|
+ snprint(p->fs.name, sizeof p->fs.name, "eiaU%d", devid);
|
|
|
+ else
|
|
|
+ snprint(p->fs.name, sizeof p->fs.name, "eiaU%d.%d", devid, i);
|
|
|
+ }
|
|
|
fprint(2, "%s\n", p->fs.name);
|
|
|
p->fs.dev = dev;
|
|
|
incref(dev);
|