Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(172)

Unified Diff: device/usb/usb_device_impl.cc

Issue 826283002: Add support for sending a USB SET_CONFIGURATION request. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebased. Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « device/usb/usb_device_impl.h ('k') | extensions/browser/api/usb/usb_api.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: device/usb/usb_device_impl.cc
diff --git a/device/usb/usb_device_impl.cc b/device/usb/usb_device_impl.cc
index bc3d68978e50376a0f27e3c8964fa18fbe07e5f0..782b0caa182a01c94c6601c5e59c36fc3fd21e29 100644
--- a/device/usb/usb_device_impl.cc
+++ b/device/usb/usb_device_impl.cc
@@ -113,12 +113,11 @@ UsbDeviceImpl::UsbDeviceImpl(
uint32 unique_id)
: UsbDevice(vendor_id, product_id, unique_id),
platform_device_(platform_device),
- current_configuration_cached_(false),
context_(context),
ui_task_runner_(ui_task_runner) {
CHECK(platform_device) << "platform_device cannot be NULL";
libusb_ref_device(platform_device);
-
+ RefreshConfiguration();
#if defined(USE_UDEV)
ScopedUdevPtr udev(udev_new());
ScopedUdevEnumeratePtr enumerate(udev_enumerate_new(udev.get()));
@@ -217,13 +216,8 @@ scoped_refptr<UsbDeviceHandle> UsbDeviceImpl::Open() {
PlatformUsbDeviceHandle handle;
const int rv = libusb_open(platform_device_, &handle);
if (LIBUSB_SUCCESS == rv) {
- GetConfiguration();
- if (!current_configuration_cached_) {
- libusb_close(handle);
- return NULL;
- }
scoped_refptr<UsbDeviceHandleImpl> device_handle =
- new UsbDeviceHandleImpl(context_, this, handle, current_configuration_);
+ new UsbDeviceHandleImpl(context_, this, handle);
handles_.push_back(device_handle);
return device_handle;
} else {
@@ -246,78 +240,9 @@ bool UsbDeviceImpl::Close(scoped_refptr<UsbDeviceHandle> handle) {
return false;
}
-const UsbConfigDescriptor& UsbDeviceImpl::GetConfiguration() {
+const UsbConfigDescriptor* UsbDeviceImpl::GetConfiguration() {
DCHECK(thread_checker_.CalledOnValidThread());
-
- if (!current_configuration_cached_) {
- libusb_config_descriptor* platform_config;
- const int rv =
- libusb_get_active_config_descriptor(platform_device_, &platform_config);
- if (rv != LIBUSB_SUCCESS) {
- VLOG(1) << "Failed to get config descriptor: "
- << ConvertPlatformUsbErrorToString(rv);
- return current_configuration_;
- }
-
- current_configuration_.configuration_value =
- platform_config->bConfigurationValue;
- current_configuration_.self_powered =
- (platform_config->bmAttributes & 0x40) != 0;
- current_configuration_.remote_wakeup =
- (platform_config->bmAttributes & 0x20) != 0;
- current_configuration_.maximum_power = platform_config->MaxPower * 2;
-
- for (size_t i = 0; i < platform_config->bNumInterfaces; ++i) {
- const struct libusb_interface* platform_interface =
- &platform_config->interface[i];
- for (int j = 0; j < platform_interface->num_altsetting; ++j) {
- const struct libusb_interface_descriptor* platform_alt_setting =
- &platform_interface->altsetting[j];
- UsbInterfaceDescriptor interface;
-
- interface.interface_number = platform_alt_setting->bInterfaceNumber;
- interface.alternate_setting = platform_alt_setting->bAlternateSetting;
- interface.interface_class = platform_alt_setting->bInterfaceClass;
- interface.interface_subclass = platform_alt_setting->bInterfaceSubClass;
- interface.interface_protocol = platform_alt_setting->bInterfaceProtocol;
-
- for (size_t k = 0; k < platform_alt_setting->bNumEndpoints; ++k) {
- const struct libusb_endpoint_descriptor* platform_endpoint =
- &platform_alt_setting->endpoint[k];
- UsbEndpointDescriptor endpoint;
-
- endpoint.address = platform_endpoint->bEndpointAddress;
- endpoint.direction = GetDirection(platform_endpoint);
- endpoint.maximum_packet_size = platform_endpoint->wMaxPacketSize;
- endpoint.synchronization_type =
- GetSynchronizationType(platform_endpoint);
- endpoint.transfer_type = GetTransferType(platform_endpoint);
- endpoint.usage_type = GetUsageType(platform_endpoint);
- endpoint.polling_interval = platform_endpoint->bInterval;
- endpoint.extra_data = std::vector<uint8_t>(
- platform_endpoint->extra,
- platform_endpoint->extra + platform_endpoint->extra_length);
-
- interface.endpoints.push_back(endpoint);
- }
-
- interface.extra_data = std::vector<uint8_t>(
- platform_alt_setting->extra,
- platform_alt_setting->extra + platform_alt_setting->extra_length);
-
- current_configuration_.interfaces.push_back(interface);
- }
- }
-
- current_configuration_.extra_data = std::vector<uint8_t>(
- platform_config->extra,
- platform_config->extra + platform_config->extra_length);
-
- libusb_free_config_descriptor(platform_config);
- current_configuration_cached_ = true;
- }
-
- return current_configuration_;
+ return configuration_.get();
}
bool UsbDeviceImpl::GetManufacturer(base::string16* manufacturer) {
@@ -372,6 +297,71 @@ void UsbDeviceImpl::OnDisconnect() {
}
}
+void UsbDeviceImpl::RefreshConfiguration() {
+ libusb_config_descriptor* platform_config;
+ int rv =
+ libusb_get_active_config_descriptor(platform_device_, &platform_config);
+ if (rv != LIBUSB_SUCCESS) {
+ VLOG(1) << "Failed to get config descriptor: "
+ << ConvertPlatformUsbErrorToString(rv);
+ return;
+ }
+
+ configuration_.reset(new UsbConfigDescriptor());
+ configuration_->configuration_value = platform_config->bConfigurationValue;
+ configuration_->self_powered = (platform_config->bmAttributes & 0x40) != 0;
+ configuration_->remote_wakeup = (platform_config->bmAttributes & 0x20) != 0;
+ configuration_->maximum_power = platform_config->MaxPower * 2;
+
+ for (size_t i = 0; i < platform_config->bNumInterfaces; ++i) {
+ const struct libusb_interface* platform_interface =
+ &platform_config->interface[i];
+ for (int j = 0; j < platform_interface->num_altsetting; ++j) {
+ const struct libusb_interface_descriptor* platform_alt_setting =
+ &platform_interface->altsetting[j];
+ UsbInterfaceDescriptor interface;
+
+ interface.interface_number = platform_alt_setting->bInterfaceNumber;
+ interface.alternate_setting = platform_alt_setting->bAlternateSetting;
+ interface.interface_class = platform_alt_setting->bInterfaceClass;
+ interface.interface_subclass = platform_alt_setting->bInterfaceSubClass;
+ interface.interface_protocol = platform_alt_setting->bInterfaceProtocol;
+
+ for (size_t k = 0; k < platform_alt_setting->bNumEndpoints; ++k) {
+ const struct libusb_endpoint_descriptor* platform_endpoint =
+ &platform_alt_setting->endpoint[k];
+ UsbEndpointDescriptor endpoint;
+
+ endpoint.address = platform_endpoint->bEndpointAddress;
+ endpoint.direction = GetDirection(platform_endpoint);
+ endpoint.maximum_packet_size = platform_endpoint->wMaxPacketSize;
+ endpoint.synchronization_type =
+ GetSynchronizationType(platform_endpoint);
+ endpoint.transfer_type = GetTransferType(platform_endpoint);
+ endpoint.usage_type = GetUsageType(platform_endpoint);
+ endpoint.polling_interval = platform_endpoint->bInterval;
+ endpoint.extra_data = std::vector<uint8_t>(
+ platform_endpoint->extra,
+ platform_endpoint->extra + platform_endpoint->extra_length);
+
+ interface.endpoints.push_back(endpoint);
+ }
+
+ interface.extra_data = std::vector<uint8_t>(
+ platform_alt_setting->extra,
+ platform_alt_setting->extra + platform_alt_setting->extra_length);
+
+ configuration_->interfaces.push_back(interface);
+ }
+ }
+
+ configuration_->extra_data = std::vector<uint8_t>(
+ platform_config->extra,
+ platform_config->extra + platform_config->extra_length);
+
+ libusb_free_config_descriptor(platform_config);
+}
+
#if !defined(USE_UDEV)
void UsbDeviceImpl::CacheStrings() {
DCHECK(thread_checker_.CalledOnValidThread());
« no previous file with comments | « device/usb/usb_device_impl.h ('k') | extensions/browser/api/usb/usb_api.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698