// ActiveConfig returns the config id (not the index) of the active configuration. // This corresponds to the ConfigInfo.Config field. func (d *Device) ActiveConfig() (uint8, error) { var cfg C.int if errno := C.libusb_get_configuration(d.handle, &cfg); errno < 0 { return 0, usbError(errno) } return uint8(cfg), nil }
// Return the active configuration func (h *DeviceHandle) GetConfiguration() (int, *UsbError) { var res C.int if err := returnUsbError(C.libusb_get_configuration(h.handle, &res)); err != nil { return 0, err } return int(res), nil }
// Determine the ConfigurationValue of the currently active configuration. func (h *DeviceHandle) GetConfiguration() (byte, error) { var r C.int err := C.libusb_get_configuration(h.me(), &r) return byte(r), toErr(err) }
func (d *Device) OpenEndpoint(conf, iface, setup, epoint uint8) (Endpoint, error) { end := &endpoint{ Device: d, } var setAlternate bool for _, c := range d.Configs { if c.Config != conf { continue } debug.Printf("found conf: %#v\n", c) for _, i := range c.Interfaces { if i.Number != iface { continue } debug.Printf("found iface: %#v\n", i) for i, s := range i.Setups { if s.Alternate != setup { continue } setAlternate = i != 0 debug.Printf("found setup: %#v [default: %v]\n", s, !setAlternate) for _, e := range s.Endpoints { debug.Printf("ep %02x search: %#v\n", epoint, s) if e.Address != epoint { continue } end.InterfaceSetup = s end.EndpointInfo = e switch tt := TransferType(e.Attributes) & TRANSFER_TYPE_MASK; tt { case TRANSFER_TYPE_BULK: end.xfer = bulk_xfer case TRANSFER_TYPE_INTERRUPT: end.xfer = interrupt_xfer case TRANSFER_TYPE_ISOCHRONOUS: end.xfer = isochronous_xfer default: return nil, fmt.Errorf("usb: %s transfer is unsupported", tt) } goto found } return nil, fmt.Errorf("usb: unknown endpoint %02x", epoint) } return nil, fmt.Errorf("usb: unknown setup %02x", setup) } return nil, fmt.Errorf("usb: unknown interface %02x", iface) } return nil, fmt.Errorf("usb: unknown configuration %02x", conf) found: // Set the configuration var activeConf C.int if errno := C.libusb_get_configuration(d.handle, &activeConf); errno < 0 { return nil, fmt.Errorf("usb: getcfg: %s", usbError(errno)) } if int(activeConf) != int(conf) { if errno := C.libusb_set_configuration(d.handle, C.int(conf)); errno < 0 { return nil, fmt.Errorf("usb: setcfg: %s", usbError(errno)) } } // Claim the interface if errno := C.libusb_claim_interface(d.handle, C.int(iface)); errno < 0 { return nil, fmt.Errorf("usb: claim: %s", usbError(errno)) } // Increment the claim count d.lock.Lock() d.claimed[iface]++ d.lock.Unlock() // unlock immediately because the next calls may block // Choose the alternate if setAlternate { if errno := C.libusb_set_interface_alt_setting(d.handle, C.int(iface), C.int(setup)); errno < 0 { debug.Printf("altsetting error: %s", usbError(errno)) return nil, fmt.Errorf("usb: setalt: %s", usbError(errno)) } } return end, nil }