diff --git a/lsusb/.gitignore b/lsusb/.gitignore new file mode 100644 index 0000000..b460668 --- /dev/null +++ b/lsusb/.gitignore @@ -0,0 +1 @@ +lsusb diff --git a/lsusb/main.go b/lsusb/main.go new file mode 100644 index 0000000..3edb40b --- /dev/null +++ b/lsusb/main.go @@ -0,0 +1,72 @@ +package main + +import ( + "fmt" + "flag" + "log" + + "github.com/kylelemons/gousb/usb" + "github.com/kylelemons/gousb/usbid" +) + +var ( + ctx = usb.NewContext() +) + +var ( + debug = flag.Int("debug", 0, "libusb debug level (0..3)") +) + +func main() { + flag.Parse() + ctx.Debug(*debug) + + devs, err := ctx.ListDevices(func(bus, addr int, desc *usb.Descriptor) bool { return true }) + defer func() { + for _, d := range devs { + d.Close() + } + }() + if err != nil { + log.Fatalf("list: %s", err) + } + + for _, dev := range devs { + desc, err := dev.Descriptor() + if err != nil { + log.Printf("desc: %s", err) + continue + } + bus := dev.BusNumber() + addr := dev.Address() + + fmt.Printf("%03d:%03d %s\n", bus, addr, usbid.Describe(desc)) + fmt.Printf(" Protocol: %s\n", usbid.Classify(desc)) + + cfgs, err := dev.Configurations() + defer func() { + for _, cfg := range cfgs { + cfg.Close() + } + }() + if err != nil { + log.Printf(" - configs: %s", err) + continue + } + + for _, cfg := range cfgs { + fmt.Printf(" %s:\n", cfg) + for _, alt := range cfg.Interfaces { + fmt.Printf(" --------------\n") + for _, iface := range alt { + fmt.Printf(" %s\n", iface) + fmt.Printf(" %s\n", usbid.Classify(iface)) + for _, end := range iface.Endpoints { + fmt.Printf(" %s\n", end) + } + } + } + fmt.Printf(" --------------\n") + } + } +} diff --git a/usb/config.go b/usb/config.go index cdb1b18..37fc715 100644 --- a/usb/config.go +++ b/usb/config.go @@ -6,7 +6,6 @@ import "C" import ( "fmt" - "log" "reflect" "runtime" "unsafe" @@ -126,7 +125,7 @@ func newConfig(cfg *C.struct_libusb_config_descriptor) *Config { // *sigh* runtime.SetFinalizer(c, (*Config).Close) - log.Printf("config %p initialized", c.cfg) + //log.Printf("config %p initialized", c.cfg) return c } @@ -134,7 +133,7 @@ func newConfig(cfg *C.struct_libusb_config_descriptor) *Config { // code. It should be called exactly once! func (c *Config) Close() error { if c.cfg != nil { - log.Printf("config %p closed", c.cfg) + //log.Printf("config %p closed", c.cfg) C.libusb_free_config_descriptor(c.cfg) } c.cfg = nil diff --git a/usb/device.go b/usb/device.go index 89e4833..3788866 100644 --- a/usb/device.go +++ b/usb/device.go @@ -5,7 +5,6 @@ package usb import "C" import ( - "log" "reflect" "runtime" "time" @@ -27,7 +26,7 @@ func newDeviceInfo(dev *C.libusb_device) *DeviceInfo { // I still can't get this to be called runtime.SetFinalizer(d, (*DeviceInfo).Close) - log.Printf("deviceInfo %p initialized", d.dev) + //log.Printf("deviceInfo %p initialized", d.dev) return d } @@ -60,7 +59,7 @@ func (d *DeviceInfo) Open() (*Device, error) { // code. It should be called exactly once! func (d *DeviceInfo) Close() error { if d.dev != nil { - log.Printf("deviceInfo %p closed", d.dev) + //log.Printf("deviceInfo %p closed", d.dev) C.libusb_unref_device(d.dev) } d.dev = nil @@ -79,7 +78,7 @@ func newDevice(handle *C.libusb_device_handle) *Device { // :( runtime.SetFinalizer(d, (*Device).Close) - log.Printf("device %p initialized", d.handle) + //log.Printf("device %p initialized", d.handle) return d } @@ -125,7 +124,7 @@ func (d *Device) SetConfig(cfg int) error { func (d *Device) Close() error { if d.handle != nil { - log.Printf("device %p closed", d.handle) + //log.Printf("device %p closed", d.handle) C.libusb_unref_device(d.handle) } d.handle = nil diff --git a/usb/usb.go b/usb/usb.go index 7ca546a..614e6f9 100644 --- a/usb/usb.go +++ b/usb/usb.go @@ -5,7 +5,6 @@ package usb import "C" import ( - "log" "reflect" "runtime" "unsafe" @@ -22,7 +21,7 @@ func (c *Context) Debug(level int) { func NewContext() *Context { c := new(Context) - log.Printf("gousb initialized") + //log.Printf("gousb initialized") if errno := C.libusb_init(&c.ctx); errno != 0 { panic(usbError(errno)) } @@ -69,7 +68,7 @@ func (c *Context) ListDevices(each func(bus, addr int, desc *Descriptor) bool) ( func (c *Context) Close() error { if c.ctx != nil { C.libusb_exit(c.ctx) - log.Printf("gousb finished") + //log.Printf("gousb finished") } c.ctx = nil return nil