| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "device/usb/usb_descriptors.h" | 5 #include "device/usb/usb_descriptors.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 #include <memory> | 10 #include <memory> |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 90 << desc->configurations.size() << "."; | 90 << desc->configurations.size() << "."; |
| 91 callback.Run(nullptr); | 91 callback.Run(nullptr); |
| 92 } | 92 } |
| 93 } | 93 } |
| 94 | 94 |
| 95 void OnReadConfigDescriptor(UsbDeviceDescriptor* desc, | 95 void OnReadConfigDescriptor(UsbDeviceDescriptor* desc, |
| 96 const base::Closure& closure, | 96 const base::Closure& closure, |
| 97 UsbTransferStatus status, | 97 UsbTransferStatus status, |
| 98 scoped_refptr<IOBuffer> buffer, | 98 scoped_refptr<IOBuffer> buffer, |
| 99 size_t length) { | 99 size_t length) { |
| 100 if (status == USB_TRANSFER_COMPLETED) { | 100 if (status == UsbTransferStatus::COMPLETED) { |
| 101 if (!desc->Parse( | 101 if (!desc->Parse( |
| 102 std::vector<uint8_t>(buffer->data(), buffer->data() + length))) { | 102 std::vector<uint8_t>(buffer->data(), buffer->data() + length))) { |
| 103 LOG(ERROR) << "Failed to parse configuration descriptor."; | 103 LOG(ERROR) << "Failed to parse configuration descriptor."; |
| 104 } | 104 } |
| 105 } else { | 105 } else { |
| 106 LOG(ERROR) << "Failed to read configuration descriptor."; | 106 LOG(ERROR) << "Failed to read configuration descriptor."; |
| 107 } | 107 } |
| 108 closure.Run(); | 108 closure.Run(); |
| 109 } | 109 } |
| 110 | 110 |
| 111 void OnReadConfigDescriptorHeader(scoped_refptr<UsbDeviceHandle> device_handle, | 111 void OnReadConfigDescriptorHeader(scoped_refptr<UsbDeviceHandle> device_handle, |
| 112 UsbDeviceDescriptor* desc, | 112 UsbDeviceDescriptor* desc, |
| 113 uint8_t index, | 113 uint8_t index, |
| 114 const base::Closure& closure, | 114 const base::Closure& closure, |
| 115 UsbTransferStatus status, | 115 UsbTransferStatus status, |
| 116 scoped_refptr<IOBuffer> header, | 116 scoped_refptr<IOBuffer> header, |
| 117 size_t length) { | 117 size_t length) { |
| 118 if (status == USB_TRANSFER_COMPLETED && length == 4) { | 118 if (status == UsbTransferStatus::COMPLETED && length == 4) { |
| 119 const uint8_t* data = reinterpret_cast<const uint8_t*>(header->data()); | 119 const uint8_t* data = reinterpret_cast<const uint8_t*>(header->data()); |
| 120 uint16_t total_length = data[2] | data[3] << 8; | 120 uint16_t total_length = data[2] | data[3] << 8; |
| 121 scoped_refptr<IOBuffer> buffer = new IOBuffer(total_length); | 121 scoped_refptr<IOBuffer> buffer = new IOBuffer(total_length); |
| 122 device_handle->ControlTransfer( | 122 device_handle->ControlTransfer( |
| 123 USB_DIRECTION_INBOUND, UsbDeviceHandle::STANDARD, | 123 UsbTransferDirection::INBOUND, UsbControlTransferType::STANDARD, |
| 124 UsbDeviceHandle::DEVICE, kGetDescriptorRequest, | 124 UsbControlTransferRecipient::DEVICE, kGetDescriptorRequest, |
| 125 kConfigurationDescriptorType << 8 | index, 0, buffer, total_length, | 125 kConfigurationDescriptorType << 8 | index, 0, buffer, total_length, |
| 126 kControlTransferTimeout, | 126 kControlTransferTimeout, |
| 127 base::Bind(&OnReadConfigDescriptor, desc, closure)); | 127 base::Bind(&OnReadConfigDescriptor, desc, closure)); |
| 128 } else { | 128 } else { |
| 129 LOG(ERROR) << "Failed to read length for configuration " | 129 LOG(ERROR) << "Failed to read length for configuration " |
| 130 << static_cast<int>(index) << "."; | 130 << static_cast<int>(index) << "."; |
| 131 closure.Run(); | 131 closure.Run(); |
| 132 } | 132 } |
| 133 } | 133 } |
| 134 | 134 |
| 135 void OnReadDeviceDescriptor( | 135 void OnReadDeviceDescriptor( |
| 136 scoped_refptr<UsbDeviceHandle> device_handle, | 136 scoped_refptr<UsbDeviceHandle> device_handle, |
| 137 const base::Callback<void(std::unique_ptr<UsbDeviceDescriptor>)>& callback, | 137 const base::Callback<void(std::unique_ptr<UsbDeviceDescriptor>)>& callback, |
| 138 UsbTransferStatus status, | 138 UsbTransferStatus status, |
| 139 scoped_refptr<IOBuffer> buffer, | 139 scoped_refptr<IOBuffer> buffer, |
| 140 size_t length) { | 140 size_t length) { |
| 141 if (status != USB_TRANSFER_COMPLETED) { | 141 if (status != UsbTransferStatus::COMPLETED) { |
| 142 LOG(ERROR) << "Failed to read device descriptor."; | 142 LOG(ERROR) << "Failed to read device descriptor."; |
| 143 callback.Run(nullptr); | 143 callback.Run(nullptr); |
| 144 return; | 144 return; |
| 145 } | 145 } |
| 146 | 146 |
| 147 std::unique_ptr<UsbDeviceDescriptor> desc(new UsbDeviceDescriptor()); | 147 std::unique_ptr<UsbDeviceDescriptor> desc(new UsbDeviceDescriptor()); |
| 148 if (!desc->Parse( | 148 if (!desc->Parse( |
| 149 std::vector<uint8_t>(buffer->data(), buffer->data() + length))) { | 149 std::vector<uint8_t>(buffer->data(), buffer->data() + length))) { |
| 150 LOG(ERROR) << "Device descriptor parsing error."; | 150 LOG(ERROR) << "Device descriptor parsing error."; |
| 151 callback.Run(nullptr); | 151 callback.Run(nullptr); |
| 152 return; | 152 return; |
| 153 } | 153 } |
| 154 | 154 |
| 155 if (desc->num_configurations == 0) { | 155 if (desc->num_configurations == 0) { |
| 156 callback.Run(std::move(desc)); | 156 callback.Run(std::move(desc)); |
| 157 return; | 157 return; |
| 158 } | 158 } |
| 159 | 159 |
| 160 uint8_t num_configurations = desc->num_configurations; | 160 uint8_t num_configurations = desc->num_configurations; |
| 161 UsbDeviceDescriptor* desc_ptr = desc.get(); | 161 UsbDeviceDescriptor* desc_ptr = desc.get(); |
| 162 base::Closure closure = base::BarrierClosure( | 162 base::Closure closure = base::BarrierClosure( |
| 163 num_configurations, | 163 num_configurations, |
| 164 base::Bind(OnDoneReadingConfigDescriptors, device_handle, | 164 base::Bind(OnDoneReadingConfigDescriptors, device_handle, |
| 165 base::Passed(&desc), callback)); | 165 base::Passed(&desc), callback)); |
| 166 for (uint8_t i = 0; i < num_configurations; ++i) { | 166 for (uint8_t i = 0; i < num_configurations; ++i) { |
| 167 scoped_refptr<IOBufferWithSize> header = new IOBufferWithSize(4); | 167 scoped_refptr<IOBufferWithSize> header = new IOBufferWithSize(4); |
| 168 device_handle->ControlTransfer( | 168 device_handle->ControlTransfer( |
| 169 USB_DIRECTION_INBOUND, UsbDeviceHandle::STANDARD, | 169 UsbTransferDirection::INBOUND, UsbControlTransferType::STANDARD, |
| 170 UsbDeviceHandle::DEVICE, kGetDescriptorRequest, | 170 UsbControlTransferRecipient::DEVICE, kGetDescriptorRequest, |
| 171 kConfigurationDescriptorType << 8 | i, 0, header, header->size(), | 171 kConfigurationDescriptorType << 8 | i, 0, header, header->size(), |
| 172 kControlTransferTimeout, | 172 kControlTransferTimeout, |
| 173 base::Bind(&OnReadConfigDescriptorHeader, device_handle, desc_ptr, i, | 173 base::Bind(&OnReadConfigDescriptorHeader, device_handle, desc_ptr, i, |
| 174 closure)); | 174 closure)); |
| 175 } | 175 } |
| 176 } | 176 } |
| 177 | 177 |
| 178 void StoreStringDescriptor(IndexMap::iterator it, | 178 void StoreStringDescriptor(IndexMap::iterator it, |
| 179 const base::Closure& callback, | 179 const base::Closure& callback, |
| 180 const base::string16& string) { | 180 const base::string16& string) { |
| 181 it->second = string; | 181 it->second = string; |
| 182 callback.Run(); | 182 callback.Run(); |
| 183 } | 183 } |
| 184 | 184 |
| 185 void OnReadStringDescriptor( | 185 void OnReadStringDescriptor( |
| 186 const base::Callback<void(const base::string16&)>& callback, | 186 const base::Callback<void(const base::string16&)>& callback, |
| 187 UsbTransferStatus status, | 187 UsbTransferStatus status, |
| 188 scoped_refptr<IOBuffer> buffer, | 188 scoped_refptr<IOBuffer> buffer, |
| 189 size_t length) { | 189 size_t length) { |
| 190 base::string16 string; | 190 base::string16 string; |
| 191 if (status == USB_TRANSFER_COMPLETED && | 191 if (status == UsbTransferStatus::COMPLETED && |
| 192 ParseUsbStringDescriptor( | 192 ParseUsbStringDescriptor( |
| 193 std::vector<uint8_t>(buffer->data(), buffer->data() + length), | 193 std::vector<uint8_t>(buffer->data(), buffer->data() + length), |
| 194 &string)) { | 194 &string)) { |
| 195 callback.Run(string); | 195 callback.Run(string); |
| 196 } else { | 196 } else { |
| 197 callback.Run(base::string16()); | 197 callback.Run(base::string16()); |
| 198 } | 198 } |
| 199 } | 199 } |
| 200 | 200 |
| 201 void ReadStringDescriptor( | 201 void ReadStringDescriptor( |
| 202 scoped_refptr<UsbDeviceHandle> device_handle, | 202 scoped_refptr<UsbDeviceHandle> device_handle, |
| 203 uint8_t index, | 203 uint8_t index, |
| 204 uint16_t language_id, | 204 uint16_t language_id, |
| 205 const base::Callback<void(const base::string16&)>& callback) { | 205 const base::Callback<void(const base::string16&)>& callback) { |
| 206 scoped_refptr<IOBufferWithSize> buffer = new IOBufferWithSize(255); | 206 scoped_refptr<IOBufferWithSize> buffer = new IOBufferWithSize(255); |
| 207 device_handle->ControlTransfer( | 207 device_handle->ControlTransfer( |
| 208 USB_DIRECTION_INBOUND, UsbDeviceHandle::STANDARD, UsbDeviceHandle::DEVICE, | 208 UsbTransferDirection::INBOUND, UsbControlTransferType::STANDARD, |
| 209 kGetDescriptorRequest, kStringDescriptorType << 8 | index, language_id, | 209 UsbControlTransferRecipient::DEVICE, kGetDescriptorRequest, |
| 210 buffer, buffer->size(), kControlTransferTimeout, | 210 kStringDescriptorType << 8 | index, language_id, buffer, buffer->size(), |
| 211 base::Bind(&OnReadStringDescriptor, callback)); | 211 kControlTransferTimeout, base::Bind(&OnReadStringDescriptor, callback)); |
| 212 } | 212 } |
| 213 | 213 |
| 214 void OnReadLanguageIds(scoped_refptr<UsbDeviceHandle> device_handle, | 214 void OnReadLanguageIds(scoped_refptr<UsbDeviceHandle> device_handle, |
| 215 IndexMapPtr index_map, | 215 IndexMapPtr index_map, |
| 216 const base::Callback<void(IndexMapPtr)>& callback, | 216 const base::Callback<void(IndexMapPtr)>& callback, |
| 217 const base::string16& languages) { | 217 const base::string16& languages) { |
| 218 // Default to English unless the device provides a language and then just pick | 218 // Default to English unless the device provides a language and then just pick |
| 219 // the first one. | 219 // the first one. |
| 220 uint16_t language_id = languages.empty() ? 0x0409 : languages[0]; | 220 uint16_t language_id = languages.empty() ? 0x0409 : languages[0]; |
| 221 | 221 |
| (...skipping 25 matching lines...) Expand all Loading... |
| 247 UsbEndpointDescriptor::UsbEndpointDescriptor(uint8_t address, | 247 UsbEndpointDescriptor::UsbEndpointDescriptor(uint8_t address, |
| 248 uint8_t attributes, | 248 uint8_t attributes, |
| 249 uint16_t maximum_packet_size, | 249 uint16_t maximum_packet_size, |
| 250 uint8_t polling_interval) | 250 uint8_t polling_interval) |
| 251 : address(address), | 251 : address(address), |
| 252 maximum_packet_size(maximum_packet_size), | 252 maximum_packet_size(maximum_packet_size), |
| 253 polling_interval(polling_interval) { | 253 polling_interval(polling_interval) { |
| 254 // These fields are defined in Table 9-24 of the USB 3.1 Specification. | 254 // These fields are defined in Table 9-24 of the USB 3.1 Specification. |
| 255 switch (address & 0x80) { | 255 switch (address & 0x80) { |
| 256 case 0x00: | 256 case 0x00: |
| 257 direction = USB_DIRECTION_OUTBOUND; | 257 direction = UsbTransferDirection::OUTBOUND; |
| 258 break; | 258 break; |
| 259 case 0x80: | 259 case 0x80: |
| 260 direction = USB_DIRECTION_INBOUND; | 260 direction = UsbTransferDirection::INBOUND; |
| 261 break; | 261 break; |
| 262 } | 262 } |
| 263 switch (attributes & 0x03) { | 263 switch (attributes & 0x03) { |
| 264 case 0x00: | 264 case 0x00: |
| 265 transfer_type = USB_TRANSFER_CONTROL; | 265 transfer_type = UsbTransferType::CONTROL; |
| 266 break; | 266 break; |
| 267 case 0x01: | 267 case 0x01: |
| 268 transfer_type = USB_TRANSFER_ISOCHRONOUS; | 268 transfer_type = UsbTransferType::ISOCHRONOUS; |
| 269 break; | 269 break; |
| 270 case 0x02: | 270 case 0x02: |
| 271 transfer_type = USB_TRANSFER_BULK; | 271 transfer_type = UsbTransferType::BULK; |
| 272 break; | 272 break; |
| 273 case 0x03: | 273 case 0x03: |
| 274 transfer_type = USB_TRANSFER_INTERRUPT; | 274 transfer_type = UsbTransferType::INTERRUPT; |
| 275 break; | 275 break; |
| 276 } | 276 } |
| 277 switch (attributes & 0x0F) { | 277 switch (attributes & 0x0F) { |
| 278 // Isochronous endpoints only. | 278 // Isochronous endpoints only. |
| 279 case 0x05: | 279 case 0x05: |
| 280 synchronization_type = USB_SYNCHRONIZATION_ASYNCHRONOUS; | 280 synchronization_type = USB_SYNCHRONIZATION_ASYNCHRONOUS; |
| 281 break; | 281 break; |
| 282 case 0x09: | 282 case 0x09: |
| 283 synchronization_type = USB_SYNCHRONIZATION_ADAPTIVE; | 283 synchronization_type = USB_SYNCHRONIZATION_ADAPTIVE; |
| 284 break; | 284 break; |
| (...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 493 | 493 |
| 494 return true; | 494 return true; |
| 495 } | 495 } |
| 496 | 496 |
| 497 void ReadUsbDescriptors(scoped_refptr<UsbDeviceHandle> device_handle, | 497 void ReadUsbDescriptors(scoped_refptr<UsbDeviceHandle> device_handle, |
| 498 const base::Callback<void( | 498 const base::Callback<void( |
| 499 std::unique_ptr<UsbDeviceDescriptor>)>& callback) { | 499 std::unique_ptr<UsbDeviceDescriptor>)>& callback) { |
| 500 scoped_refptr<IOBufferWithSize> buffer = | 500 scoped_refptr<IOBufferWithSize> buffer = |
| 501 new IOBufferWithSize(kDeviceDescriptorLength); | 501 new IOBufferWithSize(kDeviceDescriptorLength); |
| 502 device_handle->ControlTransfer( | 502 device_handle->ControlTransfer( |
| 503 USB_DIRECTION_INBOUND, UsbDeviceHandle::STANDARD, UsbDeviceHandle::DEVICE, | 503 UsbTransferDirection::INBOUND, UsbControlTransferType::STANDARD, |
| 504 kGetDescriptorRequest, kDeviceDescriptorType << 8, 0, buffer, | 504 UsbControlTransferRecipient::DEVICE, kGetDescriptorRequest, |
| 505 buffer->size(), kControlTransferTimeout, | 505 kDeviceDescriptorType << 8, 0, buffer, buffer->size(), |
| 506 kControlTransferTimeout, |
| 506 base::Bind(&OnReadDeviceDescriptor, device_handle, callback)); | 507 base::Bind(&OnReadDeviceDescriptor, device_handle, callback)); |
| 507 } | 508 } |
| 508 | 509 |
| 509 bool ParseUsbStringDescriptor(const std::vector<uint8_t>& descriptor, | 510 bool ParseUsbStringDescriptor(const std::vector<uint8_t>& descriptor, |
| 510 base::string16* output) { | 511 base::string16* output) { |
| 511 if (descriptor.size() < 2 || descriptor[1] != kStringDescriptorType) | 512 if (descriptor.size() < 2 || descriptor[1] != kStringDescriptorType) |
| 512 return false; | 513 return false; |
| 513 | 514 |
| 514 // Let the device return a buffer larger than the actual string but prefer the | 515 // Let the device return a buffer larger than the actual string but prefer the |
| 515 // length reported inside the descriptor. | 516 // length reported inside the descriptor. |
| (...skipping 19 matching lines...) Expand all Loading... |
| 535 callback.Run(std::move(index_map)); | 536 callback.Run(std::move(index_map)); |
| 536 return; | 537 return; |
| 537 } | 538 } |
| 538 | 539 |
| 539 ReadStringDescriptor(device_handle, 0, 0, | 540 ReadStringDescriptor(device_handle, 0, 0, |
| 540 base::Bind(&OnReadLanguageIds, device_handle, | 541 base::Bind(&OnReadLanguageIds, device_handle, |
| 541 base::Passed(&index_map), callback)); | 542 base::Passed(&index_map), callback)); |
| 542 } | 543 } |
| 543 | 544 |
| 544 } // namespace device | 545 } // namespace device |
| OLD | NEW |