summaryrefslogtreecommitdiff
path: root/sys/src/cmd/usb/lib/dump.c
diff options
context:
space:
mode:
authorTaru Karttunen <taruti@taruti.net>2011-03-30 15:46:40 +0300
committerTaru Karttunen <taruti@taruti.net>2011-03-30 15:46:40 +0300
commite5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch)
treed8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/cmd/usb/lib/dump.c
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/cmd/usb/lib/dump.c')
-rwxr-xr-xsys/src/cmd/usb/lib/dump.c176
1 files changed, 176 insertions, 0 deletions
diff --git a/sys/src/cmd/usb/lib/dump.c b/sys/src/cmd/usb/lib/dump.c
new file mode 100755
index 000000000..8ba766b62
--- /dev/null
+++ b/sys/src/cmd/usb/lib/dump.c
@@ -0,0 +1,176 @@
+#include <u.h>
+#include <libc.h>
+#include <thread.h>
+#include <bio.h>
+#include "usb.h"
+
+int usbdebug;
+
+static char *edir[] = {"in", "out", "inout"};
+static char *etype[] = {"ctl", "iso", "bulk", "intr"};
+static char* cnames[] =
+{
+ "none", "audio", "comms", "hid", "",
+ "", "", "printer", "storage", "hub", "data"
+};
+static char* devstates[] =
+{
+ "detached", "attached", "enabled", "assigned", "configured"
+};
+
+char*
+classname(int c)
+{
+ static char buf[30];
+
+ if(c >= 0 && c < nelem(cnames))
+ return cnames[c];
+ else{
+ seprint(buf, buf+30, "%d", c);
+ return buf;
+ }
+}
+
+char *
+hexstr(void *a, int n)
+{
+ int i;
+ char *dbuff, *s, *e;
+ uchar *b;
+
+ b = a;
+ dbuff = s = emallocz(1024, 0);
+ *s = 0;
+ e = s + 1024;
+ for(i = 0; i < n; i++)
+ s = seprint(s, e, " %.2ux", b[i]);
+ if(s == e)
+ fprint(2, "%s: usb/lib: hexdump: bug: small buffer\n", argv0);
+ return dbuff;
+}
+
+static char *
+seprintiface(char *s, char *e, Iface *i)
+{
+ int j;
+ Altc *a;
+ Ep *ep;
+ char *eds, *ets;
+
+ s = seprint(s, e, "\t\tiface csp %s.%uld.%uld\n",
+ classname(Class(i->csp)), Subclass(i->csp), Proto(i->csp));
+ for(j = 0; j < Naltc; j++){
+ a=i->altc[j];
+ if(a == nil)
+ break;
+ s = seprint(s, e, "\t\t alt %d attr %d ival %d",
+ j, a->attrib, a->interval);
+ if(a->aux != nil)
+ s = seprint(s, e, " devspec %p\n", a->aux);
+ else
+ s = seprint(s, e, "\n");
+ }
+ for(j = 0; j < Nep; j++){
+ ep = i->ep[j];
+ if(ep == nil)
+ break;
+ eds = ets = "";
+ if(ep->dir <= nelem(edir))
+ eds = edir[ep->dir];
+ if(ep->type <= nelem(etype))
+ ets = etype[ep->type];
+ s = seprint(s, e, "\t\t ep id %d addr %d dir %s type %s"
+ " itype %d maxpkt %d ntds %d\n",
+ ep->id, ep->addr, eds, ets, ep->isotype,
+ ep->maxpkt, ep->ntds);
+ }
+ return s;
+}
+
+static char*
+seprintconf(char *s, char *e, Usbdev *d, int ci)
+{
+ int i;
+ Conf *c;
+ char *hd;
+
+ c = d->conf[ci];
+ s = seprint(s, e, "\tconf: cval %d attrib %x %d mA\n",
+ c->cval, c->attrib, c->milliamps);
+ for(i = 0; i < Niface; i++)
+ if(c->iface[i] == nil)
+ break;
+ else
+ s = seprintiface(s, e, c->iface[i]);
+ for(i = 0; i < Nddesc; i++)
+ if(d->ddesc[i] == nil)
+ break;
+ else if(d->ddesc[i]->conf == c){
+ hd = hexstr((uchar*)&d->ddesc[i]->data,
+ d->ddesc[i]->data.bLength);
+ s = seprint(s, e, "\t\tdev desc %x[%d]: %s\n",
+ d->ddesc[i]->data.bDescriptorType,
+ d->ddesc[i]->data.bLength, hd);
+ free(hd);
+ }
+ return s;
+}
+
+int
+Ufmt(Fmt *f)
+{
+ int i;
+ Dev *d;
+ Usbdev *ud;
+ char buf[1024];
+ char *s, *e;
+
+ s = buf;
+ e = buf+sizeof(buf);
+ d = va_arg(f->args, Dev*);
+ if(d == nil)
+ return fmtprint(f, "<nildev>\n");
+ s = seprint(s, e, "%s", d->dir);
+ ud = d->usb;
+ if(ud == nil)
+ return fmtprint(f, "%s %ld refs\n", buf, d->ref);
+ s = seprint(s, e, " csp %s.%uld.%uld",
+ classname(Class(ud->csp)), Subclass(ud->csp), Proto(ud->csp));
+ s = seprint(s, e, " vid %#ux did %#ux", ud->vid, ud->did);
+ s = seprint(s, e, " refs %ld\n", d->ref);
+ s = seprint(s, e, "\t%s %s %s\n", ud->vendor, ud->product, ud->serial);
+ for(i = 0; i < Nconf; i++){
+ if(ud->conf[i] == nil)
+ break;
+ else
+ s = seprintconf(s, e, ud, i);
+ }
+ return fmtprint(f, "%s", buf);
+}
+
+char*
+estrdup(char *s)
+{
+ char *d;
+
+ d = strdup(s);
+ if(d == nil)
+ sysfatal("strdup: %r");
+ setmalloctag(d, getcallerpc(&s));
+ return d;
+}
+
+void*
+emallocz(ulong size, int zero)
+{
+ void *x;
+
+ x = malloc(size);
+ if(x == nil)
+ sysfatal("malloc: %r");
+ if(zero)
+ memset(x, 0, size);
+ setmalloctag(x, getcallerpc(&size));
+ return x;
+}
+