func newDescriptor(dev *C.libusb_device) (*Descriptor, error) { var desc C.struct_libusb_device_descriptor if errno := C.libusb_get_device_descriptor(dev, &desc); errno < 0 { return nil, usbError(errno) } // Enumerate configurations var cfgs []ConfigInfo for i := 0; i < int(desc.bNumConfigurations); i++ { var cfg *C.struct_libusb_config_descriptor if errno := C.libusb_get_config_descriptor(dev, C.uint8_t(i), &cfg); errno < 0 { return nil, usbError(errno) } cfgs = append(cfgs, newConfig(dev, cfg)) C.libusb_free_config_descriptor(cfg) } return &Descriptor{ Bus: uint8(C.libusb_get_bus_number(dev)), Address: uint8(C.libusb_get_device_address(dev)), Spec: BCD(desc.bcdUSB), Device: BCD(desc.bcdDevice), Vendor: ID(desc.idVendor), Product: ID(desc.idProduct), Class: uint8(desc.bDeviceClass), SubClass: uint8(desc.bDeviceSubClass), Protocol: uint8(desc.bDeviceProtocol), SerialNumber: getSerialNumber(dev, desc.iSerialNumber), Configs: cfgs, dev: dev, }, nil }
// Get the number of the bus that a device is connected to. func (d *Device) GetBusNumber() uint8 { return uint8(C.libusb_get_bus_number(d.me())) }
// ID returns a string suitable for uniquely identifying the device. func (d *Device) ID() string { return fmt.Sprintf("%d:%d", C.libusb_get_bus_number(d.dev), C.libusb_get_device_address(d.dev)) }
func (dev *Device) GetDeviceAddress() (bus, addr int) { bus = int(C.libusb_get_bus_number(dev.device)) addr = int(C.libusb_get_device_address(dev.device)) return }