diff options
author | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
---|---|---|
committer | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
commit | e5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch) | |
tree | d8d51eac403f07814b9e936eed0c9a79195e2450 /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-x | sys/src/cmd/usb/lib/dump.c | 176 |
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; +} + |