1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chrome/browser/usb/usb_interface.h"
6
7 #include "base/logging.h"
8 #include "third_party/libusb/src/libusb/libusb.h"
9
UsbEndpointDescriptor(scoped_refptr<const UsbConfigDescriptor> config,PlatformUsbEndpointDescriptor descriptor)10 UsbEndpointDescriptor::UsbEndpointDescriptor(
11 scoped_refptr<const UsbConfigDescriptor> config,
12 PlatformUsbEndpointDescriptor descriptor)
13 : config_(config), descriptor_(descriptor) {
14 }
15
~UsbEndpointDescriptor()16 UsbEndpointDescriptor::~UsbEndpointDescriptor() {}
17
GetAddress() const18 int UsbEndpointDescriptor::GetAddress() const {
19 return descriptor_->bEndpointAddress & LIBUSB_ENDPOINT_ADDRESS_MASK;
20 }
21
GetDirection() const22 UsbEndpointDirection UsbEndpointDescriptor::GetDirection() const {
23 switch (descriptor_->bEndpointAddress & LIBUSB_ENDPOINT_DIR_MASK) {
24 case LIBUSB_ENDPOINT_IN:
25 return USB_DIRECTION_INBOUND;
26 case LIBUSB_ENDPOINT_OUT:
27 return USB_DIRECTION_OUTBOUND;
28 default:
29 NOTREACHED();
30 return USB_DIRECTION_INBOUND;
31 }
32 }
33
GetMaximumPacketSize() const34 int UsbEndpointDescriptor::GetMaximumPacketSize() const {
35 return descriptor_->wMaxPacketSize;
36 }
37
GetSynchronizationType() const38 UsbSynchronizationType UsbEndpointDescriptor::GetSynchronizationType() const {
39 switch (descriptor_->bmAttributes & LIBUSB_ISO_SYNC_TYPE_MASK) {
40 case LIBUSB_ISO_SYNC_TYPE_NONE:
41 return USB_SYNCHRONIZATION_NONE;
42 case LIBUSB_ISO_SYNC_TYPE_ASYNC:
43 return USB_SYNCHRONIZATION_ASYNCHRONOUS;
44 case LIBUSB_ISO_SYNC_TYPE_ADAPTIVE:
45 return USB_SYNCHRONIZATION_ADAPTIVE;
46 case LIBUSB_ISO_SYNC_TYPE_SYNC:
47 return USB_SYNCHRONIZATION_SYNCHRONOUS;
48 default:
49 NOTREACHED();
50 return USB_SYNCHRONIZATION_NONE;
51 }
52 }
53
GetTransferType() const54 UsbTransferType UsbEndpointDescriptor::GetTransferType() const {
55 switch (descriptor_->bmAttributes & LIBUSB_TRANSFER_TYPE_MASK) {
56 case LIBUSB_TRANSFER_TYPE_CONTROL:
57 return USB_TRANSFER_CONTROL;
58 case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS:
59 return USB_TRANSFER_ISOCHRONOUS;
60 case LIBUSB_TRANSFER_TYPE_BULK:
61 return USB_TRANSFER_BULK;
62 case LIBUSB_TRANSFER_TYPE_INTERRUPT:
63 return USB_TRANSFER_INTERRUPT;
64 default:
65 NOTREACHED();
66 return USB_TRANSFER_CONTROL;
67 }
68 }
69
GetUsageType() const70 UsbUsageType UsbEndpointDescriptor::GetUsageType() const {
71 switch (descriptor_->bmAttributes & LIBUSB_ISO_USAGE_TYPE_MASK) {
72 case LIBUSB_ISO_USAGE_TYPE_DATA:
73 return USB_USAGE_DATA;
74 case LIBUSB_ISO_USAGE_TYPE_FEEDBACK:
75 return USB_USAGE_FEEDBACK;
76 case LIBUSB_ISO_USAGE_TYPE_IMPLICIT:
77 return USB_USAGE_EXPLICIT_FEEDBACK;
78 default:
79 NOTREACHED();
80 return USB_USAGE_DATA;
81 }
82 }
83
GetPollingInterval() const84 int UsbEndpointDescriptor::GetPollingInterval() const {
85 return descriptor_->bInterval;
86 }
87
UsbInterfaceAltSettingDescriptor(scoped_refptr<const UsbConfigDescriptor> config,PlatformUsbInterfaceDescriptor descriptor)88 UsbInterfaceAltSettingDescriptor::UsbInterfaceAltSettingDescriptor(
89 scoped_refptr<const UsbConfigDescriptor> config,
90 PlatformUsbInterfaceDescriptor descriptor)
91 : config_(config), descriptor_(descriptor) {
92 }
93
~UsbInterfaceAltSettingDescriptor()94 UsbInterfaceAltSettingDescriptor::~UsbInterfaceAltSettingDescriptor() {}
95
GetNumEndpoints() const96 size_t UsbInterfaceAltSettingDescriptor::GetNumEndpoints() const {
97 return descriptor_->bNumEndpoints;
98 }
99
100 scoped_refptr<const UsbEndpointDescriptor>
GetEndpoint(size_t index) const101 UsbInterfaceAltSettingDescriptor::GetEndpoint(size_t index) const {
102 return new UsbEndpointDescriptor(config_, &descriptor_->endpoint[index]);
103 }
104
GetInterfaceNumber() const105 int UsbInterfaceAltSettingDescriptor::GetInterfaceNumber() const {
106 return descriptor_->bInterfaceNumber;
107 }
108
GetAlternateSetting() const109 int UsbInterfaceAltSettingDescriptor::GetAlternateSetting() const {
110 return descriptor_->bAlternateSetting;
111 }
112
GetInterfaceClass() const113 int UsbInterfaceAltSettingDescriptor::GetInterfaceClass() const {
114 return descriptor_->bInterfaceClass;
115 }
116
GetInterfaceSubclass() const117 int UsbInterfaceAltSettingDescriptor::GetInterfaceSubclass() const {
118 return descriptor_->bInterfaceSubClass;
119 }
120
GetInterfaceProtocol() const121 int UsbInterfaceAltSettingDescriptor::GetInterfaceProtocol() const {
122 return descriptor_->bInterfaceProtocol;
123 }
124
UsbInterfaceDescriptor(scoped_refptr<const UsbConfigDescriptor> config,PlatformUsbInterface usbInterface)125 UsbInterfaceDescriptor::UsbInterfaceDescriptor(
126 scoped_refptr<const UsbConfigDescriptor> config,
127 PlatformUsbInterface usbInterface)
128 : config_(config), interface_(usbInterface) {
129 }
130
~UsbInterfaceDescriptor()131 UsbInterfaceDescriptor::~UsbInterfaceDescriptor() {}
132
GetNumAltSettings() const133 size_t UsbInterfaceDescriptor::GetNumAltSettings() const {
134 return interface_->num_altsetting;
135 }
136
137 scoped_refptr<const UsbInterfaceAltSettingDescriptor>
GetAltSetting(size_t index) const138 UsbInterfaceDescriptor::GetAltSetting(size_t index) const {
139 return new UsbInterfaceAltSettingDescriptor(config_,
140 &interface_->altsetting[index]);
141 }
142
UsbConfigDescriptor(PlatformUsbConfigDescriptor config)143 UsbConfigDescriptor::UsbConfigDescriptor(PlatformUsbConfigDescriptor config)
144 : config_(config) {
145 }
146
~UsbConfigDescriptor()147 UsbConfigDescriptor::~UsbConfigDescriptor() {
148 if (config_ != NULL) {
149 libusb_free_config_descriptor(config_);
150 config_ = NULL;
151 }
152 }
153
GetNumInterfaces() const154 size_t UsbConfigDescriptor::GetNumInterfaces() const {
155 return config_->bNumInterfaces;
156 }
157
158 scoped_refptr<const UsbInterfaceDescriptor>
GetInterface(size_t index) const159 UsbConfigDescriptor::GetInterface(size_t index) const {
160 return new UsbInterfaceDescriptor(this, &config_->interface[index]);
161 }
162