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_device_handle_impl.h" | 5 #include "device/usb/usb_device_handle_impl.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
11 #include "base/location.h" | 11 #include "base/location.h" |
12 #include "base/single_thread_task_runner.h" | 12 #include "base/single_thread_task_runner.h" |
13 #include "base/stl_util.h" | 13 #include "base/stl_util.h" |
14 #include "base/strings/string16.h" | 14 #include "base/strings/string16.h" |
15 #include "base/synchronization/lock.h" | 15 #include "base/synchronization/lock.h" |
16 #include "base/thread_task_runner_handle.h" | 16 #include "base/thread_task_runner_handle.h" |
| 17 #include "components/device_event_log/device_event_log.h" |
17 #include "device/usb/usb_context.h" | 18 #include "device/usb/usb_context.h" |
18 #include "device/usb/usb_descriptors.h" | 19 #include "device/usb/usb_descriptors.h" |
19 #include "device/usb/usb_device_impl.h" | 20 #include "device/usb/usb_device_impl.h" |
20 #include "device/usb/usb_error.h" | 21 #include "device/usb/usb_error.h" |
21 #include "device/usb/usb_service.h" | 22 #include "device/usb/usb_service.h" |
22 #include "third_party/libusb/src/libusb/libusb.h" | 23 #include "third_party/libusb/src/libusb/libusb.h" |
23 | 24 |
24 namespace device { | 25 namespace device { |
25 | 26 |
26 typedef libusb_device* PlatformUsbDevice; | 27 typedef libusb_device* PlatformUsbDevice; |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
138 alternate_setting_(0) { | 139 alternate_setting_(0) { |
139 } | 140 } |
140 | 141 |
141 UsbDeviceHandleImpl::InterfaceClaimer::~InterfaceClaimer() { | 142 UsbDeviceHandleImpl::InterfaceClaimer::~InterfaceClaimer() { |
142 libusb_release_interface(handle_->handle(), interface_number_); | 143 libusb_release_interface(handle_->handle(), interface_number_); |
143 } | 144 } |
144 | 145 |
145 bool UsbDeviceHandleImpl::InterfaceClaimer::Claim() const { | 146 bool UsbDeviceHandleImpl::InterfaceClaimer::Claim() const { |
146 const int rv = libusb_claim_interface(handle_->handle(), interface_number_); | 147 const int rv = libusb_claim_interface(handle_->handle(), interface_number_); |
147 if (rv != LIBUSB_SUCCESS) { | 148 if (rv != LIBUSB_SUCCESS) { |
148 VLOG(1) << "Failed to claim interface: " | 149 USB_LOG(EVENT) << "Failed to claim interface " << interface_number_ << ": " |
149 << ConvertPlatformUsbErrorToString(rv); | 150 << ConvertPlatformUsbErrorToString(rv); |
150 } | 151 } |
151 return rv == LIBUSB_SUCCESS; | 152 return rv == LIBUSB_SUCCESS; |
152 } | 153 } |
153 | 154 |
154 // This inner class owns the underlying libusb_transfer and may outlast | 155 // This inner class owns the underlying libusb_transfer and may outlast |
155 // the UsbDeviceHandle that created it. | 156 // the UsbDeviceHandle that created it. |
156 class UsbDeviceHandleImpl::Transfer { | 157 class UsbDeviceHandleImpl::Transfer { |
157 public: | 158 public: |
158 static scoped_ptr<Transfer> CreateControlTransfer( | 159 static scoped_ptr<Transfer> CreateControlTransfer( |
159 uint8 type, | 160 uint8 type, |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
226 uint16 length, | 227 uint16 length, |
227 scoped_refptr<net::IOBuffer> buffer, | 228 scoped_refptr<net::IOBuffer> buffer, |
228 unsigned int timeout, | 229 unsigned int timeout, |
229 const UsbTransferCallback& callback) { | 230 const UsbTransferCallback& callback) { |
230 scoped_ptr<Transfer> transfer(new Transfer(USB_TRANSFER_CONTROL, buffer, | 231 scoped_ptr<Transfer> transfer(new Transfer(USB_TRANSFER_CONTROL, buffer, |
231 length + LIBUSB_CONTROL_SETUP_SIZE, | 232 length + LIBUSB_CONTROL_SETUP_SIZE, |
232 callback)); | 233 callback)); |
233 | 234 |
234 transfer->platform_transfer_ = libusb_alloc_transfer(0); | 235 transfer->platform_transfer_ = libusb_alloc_transfer(0); |
235 if (!transfer->platform_transfer_) { | 236 if (!transfer->platform_transfer_) { |
236 LOG(ERROR) << "Failed to allocate control transfer."; | 237 USB_LOG(ERROR) << "Failed to allocate control transfer."; |
237 return nullptr; | 238 return nullptr; |
238 } | 239 } |
239 | 240 |
240 libusb_fill_control_setup(reinterpret_cast<uint8*>(buffer->data()), type, | 241 libusb_fill_control_setup(reinterpret_cast<uint8*>(buffer->data()), type, |
241 request, value, index, length); | 242 request, value, index, length); |
242 libusb_fill_control_transfer(transfer->platform_transfer_, | 243 libusb_fill_control_transfer(transfer->platform_transfer_, |
243 nullptr, /* filled in by Submit() */ | 244 nullptr, /* filled in by Submit() */ |
244 reinterpret_cast<uint8*>(buffer->data()), | 245 reinterpret_cast<uint8*>(buffer->data()), |
245 &UsbDeviceHandleImpl::Transfer::PlatformCallback, | 246 &UsbDeviceHandleImpl::Transfer::PlatformCallback, |
246 transfer.get(), timeout); | 247 transfer.get(), timeout); |
247 | 248 |
248 return transfer.Pass(); | 249 return transfer.Pass(); |
249 } | 250 } |
250 | 251 |
251 // static | 252 // static |
252 scoped_ptr<UsbDeviceHandleImpl::Transfer> | 253 scoped_ptr<UsbDeviceHandleImpl::Transfer> |
253 UsbDeviceHandleImpl::Transfer::CreateBulkTransfer( | 254 UsbDeviceHandleImpl::Transfer::CreateBulkTransfer( |
254 uint8 endpoint, | 255 uint8 endpoint, |
255 scoped_refptr<net::IOBuffer> buffer, | 256 scoped_refptr<net::IOBuffer> buffer, |
256 int length, | 257 int length, |
257 unsigned int timeout, | 258 unsigned int timeout, |
258 const UsbTransferCallback& callback) { | 259 const UsbTransferCallback& callback) { |
259 scoped_ptr<Transfer> transfer( | 260 scoped_ptr<Transfer> transfer( |
260 new Transfer(USB_TRANSFER_BULK, buffer, length, callback)); | 261 new Transfer(USB_TRANSFER_BULK, buffer, length, callback)); |
261 | 262 |
262 transfer->platform_transfer_ = libusb_alloc_transfer(0); | 263 transfer->platform_transfer_ = libusb_alloc_transfer(0); |
263 if (!transfer->platform_transfer_) { | 264 if (!transfer->platform_transfer_) { |
264 LOG(ERROR) << "Failed to allocate bulk transfer."; | 265 USB_LOG(ERROR) << "Failed to allocate bulk transfer."; |
265 return nullptr; | 266 return nullptr; |
266 } | 267 } |
267 | 268 |
268 libusb_fill_bulk_transfer(transfer->platform_transfer_, | 269 libusb_fill_bulk_transfer(transfer->platform_transfer_, |
269 nullptr, /* filled in by Submit() */ | 270 nullptr, /* filled in by Submit() */ |
270 endpoint, reinterpret_cast<uint8*>(buffer->data()), | 271 endpoint, reinterpret_cast<uint8*>(buffer->data()), |
271 static_cast<int>(length), | 272 static_cast<int>(length), |
272 &UsbDeviceHandleImpl::Transfer::PlatformCallback, | 273 &UsbDeviceHandleImpl::Transfer::PlatformCallback, |
273 transfer.get(), timeout); | 274 transfer.get(), timeout); |
274 | 275 |
275 return transfer.Pass(); | 276 return transfer.Pass(); |
276 } | 277 } |
277 | 278 |
278 // static | 279 // static |
279 scoped_ptr<UsbDeviceHandleImpl::Transfer> | 280 scoped_ptr<UsbDeviceHandleImpl::Transfer> |
280 UsbDeviceHandleImpl::Transfer::CreateInterruptTransfer( | 281 UsbDeviceHandleImpl::Transfer::CreateInterruptTransfer( |
281 uint8 endpoint, | 282 uint8 endpoint, |
282 scoped_refptr<net::IOBuffer> buffer, | 283 scoped_refptr<net::IOBuffer> buffer, |
283 int length, | 284 int length, |
284 unsigned int timeout, | 285 unsigned int timeout, |
285 const UsbTransferCallback& callback) { | 286 const UsbTransferCallback& callback) { |
286 scoped_ptr<Transfer> transfer( | 287 scoped_ptr<Transfer> transfer( |
287 new Transfer(USB_TRANSFER_INTERRUPT, buffer, length, callback)); | 288 new Transfer(USB_TRANSFER_INTERRUPT, buffer, length, callback)); |
288 | 289 |
289 transfer->platform_transfer_ = libusb_alloc_transfer(0); | 290 transfer->platform_transfer_ = libusb_alloc_transfer(0); |
290 if (!transfer->platform_transfer_) { | 291 if (!transfer->platform_transfer_) { |
291 LOG(ERROR) << "Failed to allocate interrupt transfer."; | 292 USB_LOG(ERROR) << "Failed to allocate interrupt transfer."; |
292 return nullptr; | 293 return nullptr; |
293 } | 294 } |
294 | 295 |
295 libusb_fill_interrupt_transfer( | 296 libusb_fill_interrupt_transfer( |
296 transfer->platform_transfer_, nullptr, /* filled in by Submit() */ | 297 transfer->platform_transfer_, nullptr, /* filled in by Submit() */ |
297 endpoint, reinterpret_cast<uint8*>(buffer->data()), | 298 endpoint, reinterpret_cast<uint8*>(buffer->data()), |
298 static_cast<int>(length), | 299 static_cast<int>(length), |
299 &UsbDeviceHandleImpl::Transfer::PlatformCallback, transfer.get(), | 300 &UsbDeviceHandleImpl::Transfer::PlatformCallback, transfer.get(), |
300 timeout); | 301 timeout); |
301 | 302 |
(...skipping 11 matching lines...) Expand all Loading... |
313 unsigned int timeout, | 314 unsigned int timeout, |
314 const UsbTransferCallback& callback) { | 315 const UsbTransferCallback& callback) { |
315 DCHECK(packets <= length && (packets * packet_length) <= length) | 316 DCHECK(packets <= length && (packets * packet_length) <= length) |
316 << "transfer length is too small"; | 317 << "transfer length is too small"; |
317 | 318 |
318 scoped_ptr<Transfer> transfer( | 319 scoped_ptr<Transfer> transfer( |
319 new Transfer(USB_TRANSFER_ISOCHRONOUS, buffer, length, callback)); | 320 new Transfer(USB_TRANSFER_ISOCHRONOUS, buffer, length, callback)); |
320 | 321 |
321 transfer->platform_transfer_ = libusb_alloc_transfer(packets); | 322 transfer->platform_transfer_ = libusb_alloc_transfer(packets); |
322 if (!transfer->platform_transfer_) { | 323 if (!transfer->platform_transfer_) { |
323 LOG(ERROR) << "Failed to allocate isochronous transfer."; | 324 USB_LOG(ERROR) << "Failed to allocate isochronous transfer."; |
324 return nullptr; | 325 return nullptr; |
325 } | 326 } |
326 | 327 |
327 libusb_fill_iso_transfer( | 328 libusb_fill_iso_transfer( |
328 transfer->platform_transfer_, nullptr, /* filled in by Submit() */ | 329 transfer->platform_transfer_, nullptr, /* filled in by Submit() */ |
329 endpoint, reinterpret_cast<uint8*>(buffer->data()), | 330 endpoint, reinterpret_cast<uint8*>(buffer->data()), |
330 static_cast<int>(length), packets, &Transfer::PlatformCallback, | 331 static_cast<int>(length), packets, &Transfer::PlatformCallback, |
331 transfer.get(), timeout); | 332 transfer.get(), timeout); |
332 libusb_set_iso_packet_lengths(transfer->platform_transfer_, packet_length); | 333 libusb_set_iso_packet_lengths(transfer->platform_transfer_, packet_length); |
333 | 334 |
(...skipping 29 matching lines...) Expand all Loading... |
363 // GetClaimedInterfaceForEndpoint may return nullptr. libusb_submit_transfer | 364 // GetClaimedInterfaceForEndpoint may return nullptr. libusb_submit_transfer |
364 // will fail if it requires an interface we didn't claim. | 365 // will fail if it requires an interface we didn't claim. |
365 claimed_interface_ = device_handle->GetClaimedInterfaceForEndpoint( | 366 claimed_interface_ = device_handle->GetClaimedInterfaceForEndpoint( |
366 platform_transfer_->endpoint); | 367 platform_transfer_->endpoint); |
367 platform_transfer_->dev_handle = device_handle_->handle_; | 368 platform_transfer_->dev_handle = device_handle_->handle_; |
368 | 369 |
369 const int rv = libusb_submit_transfer(platform_transfer_); | 370 const int rv = libusb_submit_transfer(platform_transfer_); |
370 if (rv == LIBUSB_SUCCESS) { | 371 if (rv == LIBUSB_SUCCESS) { |
371 return true; | 372 return true; |
372 } else { | 373 } else { |
373 VLOG(1) << "Failed to submit transfer: " | 374 USB_LOG(EVENT) << "Failed to submit transfer: " |
374 << ConvertPlatformUsbErrorToString(rv); | 375 << ConvertPlatformUsbErrorToString(rv); |
375 Complete(USB_TRANSFER_ERROR, 0); | 376 Complete(USB_TRANSFER_ERROR, 0); |
376 return false; | 377 return false; |
377 } | 378 } |
378 } | 379 } |
379 | 380 |
380 void UsbDeviceHandleImpl::Transfer::Cancel() { | 381 void UsbDeviceHandleImpl::Transfer::Cancel() { |
381 if (!cancelled_) { | 382 if (!cancelled_) { |
382 libusb_cancel_transfer(platform_transfer_); | 383 libusb_cancel_transfer(platform_transfer_); |
383 claimed_interface_ = nullptr; | 384 claimed_interface_ = nullptr; |
384 } | 385 } |
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
518 for (Transfer* transfer : transfers_) { | 519 for (Transfer* transfer : transfers_) { |
519 transfer->Cancel(); | 520 transfer->Cancel(); |
520 } | 521 } |
521 claimed_interfaces_.clear(); | 522 claimed_interfaces_.clear(); |
522 | 523 |
523 int rv = libusb_set_configuration(handle_, configuration_value); | 524 int rv = libusb_set_configuration(handle_, configuration_value); |
524 if (rv == LIBUSB_SUCCESS) { | 525 if (rv == LIBUSB_SUCCESS) { |
525 device_->RefreshConfiguration(); | 526 device_->RefreshConfiguration(); |
526 RefreshEndpointMap(); | 527 RefreshEndpointMap(); |
527 } else { | 528 } else { |
528 VLOG(1) << "Failed to set configuration " << configuration_value << ": " | 529 USB_LOG(EVENT) << "Failed to set configuration " << configuration_value |
529 << ConvertPlatformUsbErrorToString(rv); | 530 << ": " << ConvertPlatformUsbErrorToString(rv); |
530 } | 531 } |
531 return rv == LIBUSB_SUCCESS; | 532 return rv == LIBUSB_SUCCESS; |
532 } | 533 } |
533 | 534 |
534 bool UsbDeviceHandleImpl::ClaimInterface(const int interface_number) { | 535 bool UsbDeviceHandleImpl::ClaimInterface(const int interface_number) { |
535 DCHECK(thread_checker_.CalledOnValidThread()); | 536 DCHECK(thread_checker_.CalledOnValidThread()); |
536 if (!device_) | 537 if (!device_) |
537 return false; | 538 return false; |
538 if (ContainsKey(claimed_interfaces_, interface_number)) | 539 if (ContainsKey(claimed_interfaces_, interface_number)) |
539 return true; | 540 return true; |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
578 return false; | 579 return false; |
579 if (!ContainsKey(claimed_interfaces_, interface_number)) | 580 if (!ContainsKey(claimed_interfaces_, interface_number)) |
580 return false; | 581 return false; |
581 const int rv = libusb_set_interface_alt_setting( | 582 const int rv = libusb_set_interface_alt_setting( |
582 handle_, interface_number, alternate_setting); | 583 handle_, interface_number, alternate_setting); |
583 if (rv == LIBUSB_SUCCESS) { | 584 if (rv == LIBUSB_SUCCESS) { |
584 claimed_interfaces_[interface_number]->set_alternate_setting( | 585 claimed_interfaces_[interface_number]->set_alternate_setting( |
585 alternate_setting); | 586 alternate_setting); |
586 RefreshEndpointMap(); | 587 RefreshEndpointMap(); |
587 } else { | 588 } else { |
588 VLOG(1) << "Failed to set interface (" << interface_number << ", " | 589 USB_LOG(EVENT) << "Failed to set interface " << interface_number |
589 << alternate_setting | 590 << " to alternate setting " << alternate_setting << ": " |
590 << "): " << ConvertPlatformUsbErrorToString(rv); | 591 << ConvertPlatformUsbErrorToString(rv); |
591 } | 592 } |
592 return rv == LIBUSB_SUCCESS; | 593 return rv == LIBUSB_SUCCESS; |
593 } | 594 } |
594 | 595 |
595 bool UsbDeviceHandleImpl::ResetDevice() { | 596 bool UsbDeviceHandleImpl::ResetDevice() { |
596 DCHECK(thread_checker_.CalledOnValidThread()); | 597 DCHECK(thread_checker_.CalledOnValidThread()); |
597 if (!device_) | 598 if (!device_) |
598 return false; | 599 return false; |
599 | 600 |
600 const int rv = libusb_reset_device(handle_); | 601 const int rv = libusb_reset_device(handle_); |
601 if (rv != LIBUSB_SUCCESS) { | 602 if (rv != LIBUSB_SUCCESS) { |
602 VLOG(1) << "Failed to reset device: " | 603 USB_LOG(EVENT) << "Failed to reset device: " |
603 << ConvertPlatformUsbErrorToString(rv); | 604 << ConvertPlatformUsbErrorToString(rv); |
604 } | 605 } |
605 return rv == LIBUSB_SUCCESS; | 606 return rv == LIBUSB_SUCCESS; |
606 } | 607 } |
607 | 608 |
608 bool UsbDeviceHandleImpl::GetStringDescriptor(uint8 string_id, | 609 bool UsbDeviceHandleImpl::GetStringDescriptor(uint8 string_id, |
609 base::string16* string) { | 610 base::string16* string) { |
610 if (!GetSupportedLanguages()) { | 611 if (!GetSupportedLanguages()) { |
611 return false; | 612 return false; |
612 } | 613 } |
613 | 614 |
614 std::map<uint8, base::string16>::const_iterator it = strings_.find(string_id); | 615 std::map<uint8, base::string16>::const_iterator it = strings_.find(string_id); |
615 if (it != strings_.end()) { | 616 if (it != strings_.end()) { |
616 *string = it->second; | 617 *string = it->second; |
617 return true; | 618 return true; |
618 } | 619 } |
619 | 620 |
620 for (size_t i = 0; i < languages_.size(); ++i) { | 621 for (size_t i = 0; i < languages_.size(); ++i) { |
621 // Get the string using language ID. | 622 // Get the string using language ID. |
622 uint16 language_id = languages_[i]; | 623 uint16 language_id = languages_[i]; |
623 // The 1-byte length field limits the descriptor to 256-bytes (128 char16s). | 624 // The 1-byte length field limits the descriptor to 256-bytes (128 char16s). |
624 base::char16 text[128]; | 625 base::char16 text[128]; |
625 int size = | 626 int size = |
626 libusb_get_string_descriptor(handle_, | 627 libusb_get_string_descriptor(handle_, |
627 string_id, | 628 string_id, |
628 language_id, | 629 language_id, |
629 reinterpret_cast<unsigned char*>(&text[0]), | 630 reinterpret_cast<unsigned char*>(&text[0]), |
630 sizeof(text)); | 631 sizeof(text)); |
631 if (size < 0) { | 632 if (size < 0) { |
632 VLOG(1) << "Failed to get string descriptor " << string_id << " (langid " | 633 USB_LOG(EVENT) << "Failed to get string descriptor " << string_id |
633 << language_id << "): " << ConvertPlatformUsbErrorToString(size); | 634 << " (langid " << language_id |
| 635 << "): " << ConvertPlatformUsbErrorToString(size); |
634 continue; | 636 continue; |
635 } else if (size < 2) { | 637 } else if (size < 2) { |
636 VLOG(1) << "String descriptor " << string_id << " (langid " << language_id | 638 USB_LOG(EVENT) << "String descriptor " << string_id << " (langid " |
637 << ") has no header."; | 639 << language_id << ") has no header."; |
638 continue; | 640 continue; |
639 // The first 2 bytes of the descriptor are the total length and type tag. | 641 // The first 2 bytes of the descriptor are the total length and type tag. |
640 } else if ((text[0] & 0xff) != size) { | 642 } else if ((text[0] & 0xff) != size) { |
641 VLOG(1) << "String descriptor " << string_id << " (langid " << language_id | 643 USB_LOG(EVENT) << "String descriptor " << string_id << " (langid " |
642 << ") size mismatch: " << (text[0] & 0xff) << " != " << size; | 644 << language_id << ") size mismatch: " << (text[0] & 0xff) |
| 645 << " != " << size; |
643 continue; | 646 continue; |
644 } else if ((text[0] >> 8) != LIBUSB_DT_STRING) { | 647 } else if ((text[0] >> 8) != LIBUSB_DT_STRING) { |
645 VLOG(1) << "String descriptor " << string_id << " (langid " << language_id | 648 USB_LOG(EVENT) << "String descriptor " << string_id << " (langid " |
646 << ") is not a string descriptor."; | 649 << language_id << ") is not a string descriptor."; |
647 continue; | 650 continue; |
648 } | 651 } |
649 | 652 |
650 *string = base::string16(text + 1, (size - 2) / 2); | 653 *string = base::string16(text + 1, (size - 2) / 2); |
651 strings_[string_id] = *string; | 654 strings_[string_id] = *string; |
652 return true; | 655 return true; |
653 } | 656 } |
654 | 657 |
655 return false; | 658 return false; |
656 } | 659 } |
657 | 660 |
658 void UsbDeviceHandleImpl::ControlTransfer(UsbEndpointDirection direction, | 661 void UsbDeviceHandleImpl::ControlTransfer(UsbEndpointDirection direction, |
659 TransferRequestType request_type, | 662 TransferRequestType request_type, |
660 TransferRecipient recipient, | 663 TransferRecipient recipient, |
661 uint8 request, | 664 uint8 request, |
662 uint16 value, | 665 uint16 value, |
663 uint16 index, | 666 uint16 index, |
664 net::IOBuffer* buffer, | 667 net::IOBuffer* buffer, |
665 size_t length, | 668 size_t length, |
666 unsigned int timeout, | 669 unsigned int timeout, |
667 const UsbTransferCallback& callback) { | 670 const UsbTransferCallback& callback) { |
668 if (length > UINT16_MAX) { | 671 if (length > UINT16_MAX) { |
669 LOG(ERROR) << "Transfer too long."; | 672 USB_LOG(USER) << "Transfer too long."; |
670 callback.Run(USB_TRANSFER_ERROR, buffer, 0); | 673 callback.Run(USB_TRANSFER_ERROR, buffer, 0); |
671 return; | 674 return; |
672 } | 675 } |
673 | 676 |
674 const size_t resized_length = LIBUSB_CONTROL_SETUP_SIZE + length; | 677 const size_t resized_length = LIBUSB_CONTROL_SETUP_SIZE + length; |
675 scoped_refptr<net::IOBuffer> resized_buffer( | 678 scoped_refptr<net::IOBuffer> resized_buffer( |
676 new net::IOBufferWithSize(static_cast<int>(resized_length))); | 679 new net::IOBufferWithSize(static_cast<int>(resized_length))); |
677 if (!resized_buffer.get()) { | 680 if (!resized_buffer.get()) { |
678 callback.Run(USB_TRANSFER_ERROR, buffer, 0); | 681 callback.Run(USB_TRANSFER_ERROR, buffer, 0); |
679 return; | 682 return; |
(...skipping 12 matching lines...) Expand all Loading... |
692 PostOrSubmitTransfer(transfer.Pass()); | 695 PostOrSubmitTransfer(transfer.Pass()); |
693 } | 696 } |
694 | 697 |
695 void UsbDeviceHandleImpl::BulkTransfer(const UsbEndpointDirection direction, | 698 void UsbDeviceHandleImpl::BulkTransfer(const UsbEndpointDirection direction, |
696 const uint8 endpoint, | 699 const uint8 endpoint, |
697 net::IOBuffer* buffer, | 700 net::IOBuffer* buffer, |
698 const size_t length, | 701 const size_t length, |
699 const unsigned int timeout, | 702 const unsigned int timeout, |
700 const UsbTransferCallback& callback) { | 703 const UsbTransferCallback& callback) { |
701 if (length > INT_MAX) { | 704 if (length > INT_MAX) { |
702 LOG(ERROR) << "Transfer too long."; | 705 USB_LOG(USER) << "Transfer too long."; |
703 callback.Run(USB_TRANSFER_ERROR, buffer, 0); | 706 callback.Run(USB_TRANSFER_ERROR, buffer, 0); |
704 return; | 707 return; |
705 } | 708 } |
706 | 709 |
707 scoped_ptr<Transfer> transfer = Transfer::CreateBulkTransfer( | 710 scoped_ptr<Transfer> transfer = Transfer::CreateBulkTransfer( |
708 ConvertTransferDirection(direction) | endpoint, buffer, | 711 ConvertTransferDirection(direction) | endpoint, buffer, |
709 static_cast<int>(length), timeout, callback); | 712 static_cast<int>(length), timeout, callback); |
710 | 713 |
711 PostOrSubmitTransfer(transfer.Pass()); | 714 PostOrSubmitTransfer(transfer.Pass()); |
712 } | 715 } |
713 | 716 |
714 void UsbDeviceHandleImpl::InterruptTransfer( | 717 void UsbDeviceHandleImpl::InterruptTransfer( |
715 UsbEndpointDirection direction, | 718 UsbEndpointDirection direction, |
716 uint8 endpoint, | 719 uint8 endpoint, |
717 net::IOBuffer* buffer, | 720 net::IOBuffer* buffer, |
718 size_t length, | 721 size_t length, |
719 unsigned int timeout, | 722 unsigned int timeout, |
720 const UsbTransferCallback& callback) { | 723 const UsbTransferCallback& callback) { |
721 if (length > INT_MAX) { | 724 if (length > INT_MAX) { |
722 LOG(ERROR) << "Transfer too long."; | 725 USB_LOG(USER) << "Transfer too long."; |
723 callback.Run(USB_TRANSFER_ERROR, buffer, 0); | 726 callback.Run(USB_TRANSFER_ERROR, buffer, 0); |
724 return; | 727 return; |
725 } | 728 } |
726 | 729 |
727 scoped_ptr<Transfer> transfer = Transfer::CreateInterruptTransfer( | 730 scoped_ptr<Transfer> transfer = Transfer::CreateInterruptTransfer( |
728 ConvertTransferDirection(direction) | endpoint, buffer, | 731 ConvertTransferDirection(direction) | endpoint, buffer, |
729 static_cast<int>(length), timeout, callback); | 732 static_cast<int>(length), timeout, callback); |
730 | 733 |
731 PostOrSubmitTransfer(transfer.Pass()); | 734 PostOrSubmitTransfer(transfer.Pass()); |
732 } | 735 } |
733 | 736 |
734 void UsbDeviceHandleImpl::IsochronousTransfer( | 737 void UsbDeviceHandleImpl::IsochronousTransfer( |
735 const UsbEndpointDirection direction, | 738 const UsbEndpointDirection direction, |
736 const uint8 endpoint, | 739 const uint8 endpoint, |
737 net::IOBuffer* buffer, | 740 net::IOBuffer* buffer, |
738 const size_t length, | 741 const size_t length, |
739 const unsigned int packets, | 742 const unsigned int packets, |
740 const unsigned int packet_length, | 743 const unsigned int packet_length, |
741 const unsigned int timeout, | 744 const unsigned int timeout, |
742 const UsbTransferCallback& callback) { | 745 const UsbTransferCallback& callback) { |
743 if (length > INT_MAX) { | 746 if (length > INT_MAX) { |
744 LOG(ERROR) << "Transfer too long."; | 747 USB_LOG(USER) << "Transfer too long."; |
745 callback.Run(USB_TRANSFER_ERROR, buffer, 0); | 748 callback.Run(USB_TRANSFER_ERROR, buffer, 0); |
746 return; | 749 return; |
747 } | 750 } |
748 | 751 |
749 scoped_ptr<Transfer> transfer = Transfer::CreateIsochronousTransfer( | 752 scoped_ptr<Transfer> transfer = Transfer::CreateIsochronousTransfer( |
750 ConvertTransferDirection(direction) | endpoint, buffer, | 753 ConvertTransferDirection(direction) | endpoint, buffer, |
751 static_cast<int>(length), packets, packet_length, timeout, callback); | 754 static_cast<int>(length), packets, packet_length, timeout, callback); |
752 | 755 |
753 PostOrSubmitTransfer(transfer.Pass()); | 756 PostOrSubmitTransfer(transfer.Pass()); |
754 } | 757 } |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
820 | 823 |
821 // The 1-byte length field limits the descriptor to 256-bytes (128 uint16s). | 824 // The 1-byte length field limits the descriptor to 256-bytes (128 uint16s). |
822 uint16 languages[128]; | 825 uint16 languages[128]; |
823 int size = libusb_get_string_descriptor( | 826 int size = libusb_get_string_descriptor( |
824 handle_, | 827 handle_, |
825 0, | 828 0, |
826 0, | 829 0, |
827 reinterpret_cast<unsigned char*>(&languages[0]), | 830 reinterpret_cast<unsigned char*>(&languages[0]), |
828 sizeof(languages)); | 831 sizeof(languages)); |
829 if (size < 0) { | 832 if (size < 0) { |
830 VLOG(1) << "Failed to get list of supported languages: " | 833 USB_LOG(EVENT) << "Failed to get list of supported languages: " |
831 << ConvertPlatformUsbErrorToString(size); | 834 << ConvertPlatformUsbErrorToString(size); |
832 return false; | 835 return false; |
833 } else if (size < 2) { | 836 } else if (size < 2) { |
834 VLOG(1) << "String descriptor zero has no header."; | 837 USB_LOG(EVENT) << "String descriptor zero has no header."; |
835 return false; | 838 return false; |
836 // The first 2 bytes of the descriptor are the total length and type tag. | 839 // The first 2 bytes of the descriptor are the total length and type tag. |
837 } else if ((languages[0] & 0xff) != size) { | 840 } else if ((languages[0] & 0xff) != size) { |
838 VLOG(1) << "String descriptor zero size mismatch: " << (languages[0] & 0xff) | 841 USB_LOG(EVENT) << "String descriptor zero size mismatch: " |
839 << " != " << size; | 842 << (languages[0] & 0xff) << " != " << size; |
840 return false; | 843 return false; |
841 } else if ((languages[0] >> 8) != LIBUSB_DT_STRING) { | 844 } else if ((languages[0] >> 8) != LIBUSB_DT_STRING) { |
842 VLOG(1) << "String descriptor zero is not a string descriptor."; | 845 USB_LOG(EVENT) << "String descriptor zero is not a string descriptor."; |
843 return false; | 846 return false; |
844 } | 847 } |
845 | 848 |
846 languages_.assign(languages[1], languages[(size - 2) / 2]); | 849 languages_.assign(languages[1], languages[(size - 2) / 2]); |
847 return true; | 850 return true; |
848 } | 851 } |
849 | 852 |
850 void UsbDeviceHandleImpl::InternalClose() { | 853 void UsbDeviceHandleImpl::InternalClose() { |
851 DCHECK(thread_checker_.CalledOnValidThread()); | 854 DCHECK(thread_checker_.CalledOnValidThread()); |
852 if (!device_) | 855 if (!device_) |
853 return; | 856 return; |
854 | 857 |
855 // Cancel all the transfers. | 858 // Cancel all the transfers. |
856 for (Transfer* transfer : transfers_) { | 859 for (Transfer* transfer : transfers_) { |
857 // The callback will be called some time later. | 860 // The callback will be called some time later. |
858 transfer->Cancel(); | 861 transfer->Cancel(); |
859 } | 862 } |
860 | 863 |
861 // Attempt-release all the interfaces. | 864 // Attempt-release all the interfaces. |
862 // It will be retained until the transfer cancellation is finished. | 865 // It will be retained until the transfer cancellation is finished. |
863 claimed_interfaces_.clear(); | 866 claimed_interfaces_.clear(); |
864 | 867 |
865 // Cannot close device handle here. Need to wait for libusb_cancel_transfer to | 868 // Cannot close device handle here. Need to wait for libusb_cancel_transfer to |
866 // finish. | 869 // finish. |
867 device_ = NULL; | 870 device_ = NULL; |
868 } | 871 } |
869 | 872 |
870 } // namespace device | 873 } // namespace device |
OLD | NEW |