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 }
func (dev *Device) GetConfigDescriptor(config_index int) (ConfigDescriptor, *UsbError) { var desc *C.struct_libusb_config_descriptor err := returnUsbError(C.libusb_get_config_descriptor(dev.device, C.uint8_t(config_index), &desc)) if err != nil { return ConfigDescriptor{}, err } ret := parseConfigDescriptor(desc) C.libusb_free_config_descriptor(desc) return ret, nil }
func (d *Device) GetConfigDescriptor(config byte) (*ConfigDescriptor, error) { var desc *C.struct_libusb_config_descriptor r := C.libusb_get_config_descriptor(d.me(), C.uint8_t(config), &desc) if r < 0 { return nil, toErr(r) } var cd ConfigDescriptor cd.fromC(desc) C.libusb_free_config_descriptor(desc) return &cd, nil }