aboutsummaryrefslogtreecommitdiffstats
path: root/vendor/github.com/karalabe/gousb/usb/descriptor.go
blob: 2551dfc23433509718fc76fcf507fc1ef7d1e619 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
// Copyright 2013 Google Inc.  All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package usb

/*
#ifndef OS_WINDOWS
    #include "os/threads_posix.h"
#endif
#include "libusbi.h"
#include "libusb.h"
*/
import "C"

type Descriptor struct {
    // Bus information
    Bus     uint8 // The bus on which the device was detected
    Address uint8 // The address of the device on the bus

    // Version information
    Spec   BCD // USB Specification Release Number
    Device BCD // The device version

    // Product information
    Vendor  ID // The Vendor identifer
    Product ID // The Product identifier

    // Protocol information
    Class    uint8 // The class of this device
    SubClass uint8 // The sub-class (within the class) of this device
    Protocol uint8 // The protocol (within the sub-class) of this device

    // Configuration information
    Configs []ConfigInfo
}

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),
        Configs:  cfgs,
    }, nil
}