summaryrefslogtreecommitdiff
path: root/src/components/transport_manager/src/usb/libusb/usb_handler.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/components/transport_manager/src/usb/libusb/usb_handler.cc')
-rw-r--r--src/components/transport_manager/src/usb/libusb/usb_handler.cc222
1 files changed, 132 insertions, 90 deletions
diff --git a/src/components/transport_manager/src/usb/libusb/usb_handler.cc b/src/components/transport_manager/src/usb/libusb/usb_handler.cc
index 776bb56c5d..c62e80d1be 100644
--- a/src/components/transport_manager/src/usb/libusb/usb_handler.cc
+++ b/src/components/transport_manager/src/usb/libusb/usb_handler.cc
@@ -76,15 +76,15 @@ class UsbHandler::ControlTransferSequenceState {
};
UsbHandler::UsbHandler()
- : shutdown_requested_(false),
- thread_(NULL),
- usb_device_listeners_(),
- devices_(),
- transfer_sequences_(),
- device_handles_to_close_(),
- libusb_context_(NULL),
- arrived_callback_handle_(),
- left_callback_handle_() {
+ : shutdown_requested_(false)
+ , thread_(NULL)
+ , usb_device_listeners_()
+ , devices_()
+ , transfer_sequences_()
+ , device_handles_to_close_()
+ , libusb_context_(NULL)
+ , arrived_callback_handle_()
+ , left_callback_handle_() {
thread_ = threads::CreateThread("UsbHandler", new UsbHandlerDelegate(this));
}
@@ -113,7 +113,8 @@ void UsbHandler::DeviceArrived(libusb_device* device_libusb) {
libusb_device_descriptor descriptor;
int libusb_ret = libusb_get_device_descriptor(device_libusb, &descriptor);
if (LIBUSB_SUCCESS != libusb_ret) {
- LOG4CXX_ERROR(logger_, "libusb_get_device_descriptor failed: " << libusb_ret);
+ LOG4CXX_ERROR(logger_,
+ "libusb_get_device_descriptor failed: " << libusb_ret);
LOG4CXX_TRACE(logger_, "exit. Condition: LIBUSB_SUCCESS != libusb_ret");
return;
}
@@ -121,7 +122,8 @@ void UsbHandler::DeviceArrived(libusb_device* device_libusb) {
libusb_device_handle* device_handle_libusb;
libusb_ret = libusb_open(device_libusb, &device_handle_libusb);
if (libusb_ret != LIBUSB_SUCCESS) {
- LOG4CXX_ERROR(logger_, "libusb_open failed: " << libusb_error_name(libusb_ret));
+ LOG4CXX_ERROR(logger_,
+ "libusb_open failed: " << libusb_error_name(libusb_ret));
LOG4CXX_TRACE(logger_, "exit. Condition: libusb_ret != LIBUSB_SUCCESS");
return;
}
@@ -129,17 +131,20 @@ void UsbHandler::DeviceArrived(libusb_device* device_libusb) {
int configuration;
libusb_ret = libusb_get_configuration(device_handle_libusb, &configuration);
if (LIBUSB_SUCCESS != libusb_ret) {
- LOG4CXX_INFO(logger_, "libusb_get_configuration failed: " << libusb_error_name(
- libusb_ret));
+ LOG4CXX_INFO(
+ logger_,
+ "libusb_get_configuration failed: " << libusb_error_name(libusb_ret));
LOG4CXX_TRACE(logger_, "exit. Condition: LIBUSB_SUCCESS != libusb_ret");
return;
}
if (configuration != kUsbConfiguration) {
- libusb_ret = libusb_set_configuration(device_handle_libusb, kUsbConfiguration);
+ libusb_ret =
+ libusb_set_configuration(device_handle_libusb, kUsbConfiguration);
if (LIBUSB_SUCCESS != libusb_ret) {
- LOG4CXX_INFO(logger_, "libusb_set_configuration failed: " << libusb_error_name(
- libusb_ret));
+ LOG4CXX_INFO(
+ logger_,
+ "libusb_set_configuration failed: " << libusb_error_name(libusb_ret));
LOG4CXX_TRACE(logger_, "exit. Condition: LIBUSB_SUCCESS != libusb_ret");
return;
}
@@ -147,20 +152,25 @@ void UsbHandler::DeviceArrived(libusb_device* device_libusb) {
libusb_ret = libusb_claim_interface(device_handle_libusb, 0);
if (LIBUSB_SUCCESS != libusb_ret) {
- LOG4CXX_INFO(logger_, "libusb_claim_interface failed: " << libusb_error_name(libusb_ret));
+ LOG4CXX_INFO(
+ logger_,
+ "libusb_claim_interface failed: " << libusb_error_name(libusb_ret));
CloseDeviceHandle(device_handle_libusb);
LOG4CXX_TRACE(logger_, "exit. Condition: LIBUSB_SUCCESS != libusb_ret");
return;
}
- PlatformUsbDevice* device(new PlatformUsbDevice(bus_number, device_address,
- descriptor, device_libusb,
- device_handle_libusb));
+ PlatformUsbDevice* device(new PlatformUsbDevice(bus_number,
+ device_address,
+ descriptor,
+ device_libusb,
+ device_handle_libusb));
devices_.push_back(device);
for (std::list<UsbDeviceListener*>::iterator it =
- usb_device_listeners_.begin();
- it != usb_device_listeners_.end(); ++it) {
+ usb_device_listeners_.begin();
+ it != usb_device_listeners_.end();
+ ++it) {
(*it)->OnDeviceArrived(device);
}
LOG4CXX_TRACE(logger_, "exit");
@@ -181,8 +191,9 @@ void UsbHandler::DeviceLeft(libusb_device* device_libusb) {
}
for (std::list<UsbDeviceListener*>::iterator it =
- usb_device_listeners_.begin();
- it != usb_device_listeners_.end(); ++it) {
+ usb_device_listeners_.begin();
+ it != usb_device_listeners_.end();
+ ++it) {
(*it)->OnDeviceLeft(device);
}
@@ -202,12 +213,13 @@ void UsbHandler::DeviceLeft(libusb_device* device_libusb) {
}
void UsbHandler::StartControlTransferSequence(
- UsbControlTransferSequence* sequence, PlatformUsbDevice* device) {
- LOG4CXX_TRACE(logger_, "enter. UsbControlTransferSequence* " << sequence <<
- "PlatformUsbDevice* " << device);
+ UsbControlTransferSequence* sequence, PlatformUsbDevice* device) {
+ LOG4CXX_TRACE(logger_,
+ "enter. UsbControlTransferSequence* "
+ << sequence << "PlatformUsbDevice* " << device);
TransferSequences::iterator it = transfer_sequences_.insert(
- transfer_sequences_.end(),
- new ControlTransferSequenceState(this, sequence, device));
+ transfer_sequences_.end(),
+ new ControlTransferSequenceState(this, sequence, device));
SubmitControlTransfer(*it);
LOG4CXX_TRACE(logger_, "exit");
}
@@ -216,26 +228,32 @@ void UsbHandler::CloseDeviceHandle(libusb_device_handle* device_handle) {
device_handles_to_close_.push_back(device_handle);
}
-int ArrivedCallback(libusb_context* context, libusb_device* device,
- libusb_hotplug_event event, void* data) {
- LOG4CXX_TRACE(logger_, "enter. libusb device arrived (bus number "
- << static_cast<int>(libusb_get_bus_number(device))
- << ", device address "
- << static_cast<int>(
- libusb_get_device_address(device)) << ")");
+int ArrivedCallback(libusb_context* context,
+ libusb_device* device,
+ libusb_hotplug_event event,
+ void* data) {
+ LOG4CXX_TRACE(logger_,
+ "enter. libusb device arrived (bus number "
+ << static_cast<int>(libusb_get_bus_number(device))
+ << ", device address "
+ << static_cast<int>(libusb_get_device_address(device))
+ << ")");
UsbHandler* usb_handler = static_cast<UsbHandler*>(data);
usb_handler->DeviceArrived(device);
LOG4CXX_TRACE(logger_, "exit with 0");
return 0;
}
-int LeftCallback(libusb_context* context, libusb_device* device,
- libusb_hotplug_event event, void* data) {
- LOG4CXX_TRACE(logger_, "enter libusb device left (bus number "
- << static_cast<int>(libusb_get_bus_number(device))
- << ", device address "
- << static_cast<int>(
- libusb_get_device_address(device)) << ")");
+int LeftCallback(libusb_context* context,
+ libusb_device* device,
+ libusb_hotplug_event event,
+ void* data) {
+ LOG4CXX_TRACE(logger_,
+ "enter libusb device left (bus number "
+ << static_cast<int>(libusb_get_bus_number(device))
+ << ", device address "
+ << static_cast<int>(libusb_get_device_address(device))
+ << ")");
UsbHandler* usb_handler = static_cast<UsbHandler*>(data);
usb_handler->DeviceLeft(device);
LOG4CXX_TRACE(logger_, "exit with 0");
@@ -249,49 +267,63 @@ TransportAdapter::Error UsbHandler::Init() {
if (LIBUSB_SUCCESS != libusb_ret) {
LOG4CXX_ERROR(logger_, "libusb_init failed: " << libusb_ret);
LOG4CXX_TRACE(logger_,
- "exit with TransportAdapter::FAIL. Condition: LIBUSB_SUCCESS != libusb_ret");
+ "exit with TransportAdapter::FAIL. Condition: LIBUSB_SUCCESS "
+ "!= libusb_ret");
return TransportAdapter::FAIL;
}
if (!libusb_has_capability(LIBUSB_CAP_HAS_HOTPLUG)) {
LOG4CXX_ERROR(logger_, "LIBUSB_CAP_HAS_HOTPLUG not supported");
LOG4CXX_TRACE(logger_,
- "exit with TransportAdapter::FAIL. Condition: !libusb_has_capability(LIBUSB_CAP_HAS_HOTPLUG)");
+ "exit with TransportAdapter::FAIL. Condition: "
+ "!libusb_has_capability(LIBUSB_CAP_HAS_HOTPLUG)");
return TransportAdapter::FAIL;
}
- libusb_ret = libusb_hotplug_register_callback(
- libusb_context_, LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED,
- LIBUSB_HOTPLUG_ENUMERATE, LIBUSB_HOTPLUG_MATCH_ANY,
- LIBUSB_HOTPLUG_MATCH_ANY, LIBUSB_HOTPLUG_MATCH_ANY, ArrivedCallback, this,
- &arrived_callback_handle_);
+ libusb_ret =
+ libusb_hotplug_register_callback(libusb_context_,
+ LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED,
+ LIBUSB_HOTPLUG_ENUMERATE,
+ LIBUSB_HOTPLUG_MATCH_ANY,
+ LIBUSB_HOTPLUG_MATCH_ANY,
+ LIBUSB_HOTPLUG_MATCH_ANY,
+ ArrivedCallback,
+ this,
+ &arrived_callback_handle_);
if (LIBUSB_SUCCESS != libusb_ret) {
LOG4CXX_ERROR(logger_,
"libusb_hotplug_register_callback failed: " << libusb_ret);
LOG4CXX_TRACE(logger_,
- "exit with TransportAdapter::FAIL. Condition: LIBUSB_SUCCESS != libusb_ret");
+ "exit with TransportAdapter::FAIL. Condition: LIBUSB_SUCCESS "
+ "!= libusb_ret");
return TransportAdapter::FAIL;
}
- libusb_ret = libusb_hotplug_register_callback(
- libusb_context_, LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT,
- static_cast<libusb_hotplug_flag>(0), LIBUSB_HOTPLUG_MATCH_ANY,
- LIBUSB_HOTPLUG_MATCH_ANY, LIBUSB_HOTPLUG_MATCH_ANY, LeftCallback, this,
- &left_callback_handle_);
+ libusb_ret =
+ libusb_hotplug_register_callback(libusb_context_,
+ LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT,
+ static_cast<libusb_hotplug_flag>(0),
+ LIBUSB_HOTPLUG_MATCH_ANY,
+ LIBUSB_HOTPLUG_MATCH_ANY,
+ LIBUSB_HOTPLUG_MATCH_ANY,
+ LeftCallback,
+ this,
+ &left_callback_handle_);
if (LIBUSB_SUCCESS != libusb_ret) {
LOG4CXX_ERROR(logger_,
"libusb_hotplug_register_callback failed: " << libusb_ret);
LOG4CXX_TRACE(logger_,
- "exit with TransportAdapter::FAIL. Condition: LIBUSB_SUCCESS != libusb_ret");
+ "exit with TransportAdapter::FAIL. Condition: LIBUSB_SUCCESS "
+ "!= libusb_ret");
return TransportAdapter::FAIL;
}
if (!thread_->start()) {
- LOG4CXX_ERROR(logger_, "USB device scanner thread start failed, error code");
- LOG4CXX_TRACE(logger_,
- "exit with TransportAdapter::FAIL.");
+ LOG4CXX_ERROR(logger_,
+ "USB device scanner thread start failed, error code");
+ LOG4CXX_TRACE(logger_, "exit with TransportAdapter::FAIL.");
return TransportAdapter::FAIL;
}
return TransportAdapter::OK;
@@ -315,7 +347,7 @@ void UsbHandler::Thread() {
}
for (std::list<libusb_device_handle*>::iterator it =
- device_handles_to_close_.begin();
+ device_handles_to_close_.begin();
it != device_handles_to_close_.end();
it = device_handles_to_close_.erase(it)) {
libusb_close(*it);
@@ -327,14 +359,16 @@ void UsbHandler::Thread() {
void UsbTransferSequenceCallback(libusb_transfer* transfer) {
LOG4CXX_TRACE(logger_, "enter. libusb_transfer* " << transfer);
UsbHandler::ControlTransferSequenceState* sequence_state =
- static_cast<UsbHandler::ControlTransferSequenceState*>(transfer->user_data);
+ static_cast<UsbHandler::ControlTransferSequenceState*>(
+ transfer->user_data);
sequence_state->usb_handler()->ControlTransferCallback(transfer);
LOG4CXX_TRACE(logger_, "exit");
}
void UsbHandler::SubmitControlTransfer(
- ControlTransferSequenceState* sequence_state) {
- LOG4CXX_TRACE(logger_, "enter. ControlTransferSequenceState* " << sequence_state);
+ ControlTransferSequenceState* sequence_state) {
+ LOG4CXX_TRACE(logger_,
+ "enter. ControlTransferSequenceState* " << sequence_state);
UsbControlTransfer* transfer = sequence_state->CurrentTransfer();
if (NULL == transfer) {
LOG4CXX_TRACE(logger_, "exit. Condition: NULL == transfer");
@@ -366,7 +400,7 @@ void UsbHandler::SubmitControlTransfer(
const uint16_t length = transfer->Length();
unsigned char* buffer =
- static_cast<unsigned char*>(malloc(length + LIBUSB_CONTROL_SETUP_SIZE));
+ static_cast<unsigned char*>(malloc(length + LIBUSB_CONTROL_SETUP_SIZE));
if (NULL == buffer) {
LOG4CXX_ERROR(logger_, "buffer allocation failed");
libusb_free_transfer(libusb_transfer);
@@ -375,22 +409,26 @@ void UsbHandler::SubmitControlTransfer(
return;
}
- libusb_fill_control_setup(buffer, request_type | endpoint_direction, request,
- value, index, length);
+ libusb_fill_control_setup(
+ buffer, request_type | endpoint_direction, request, value, index, length);
if (0 != length && endpoint_direction == LIBUSB_ENDPOINT_OUT) {
const char* data = static_cast<UsbControlOutTransfer*>(transfer)->Data();
memcpy(buffer + LIBUSB_CONTROL_SETUP_SIZE, data, length);
}
- libusb_fill_control_transfer(
- libusb_transfer, sequence_state->device()->GetLibusbHandle(), buffer,
- UsbTransferSequenceCallback, sequence_state, 0);
+ libusb_fill_control_transfer(libusb_transfer,
+ sequence_state->device()->GetLibusbHandle(),
+ buffer,
+ UsbTransferSequenceCallback,
+ sequence_state,
+ 0);
libusb_transfer->flags = LIBUSB_TRANSFER_FREE_BUFFER;
const int libusb_ret = libusb_submit_transfer(libusb_transfer);
if (LIBUSB_SUCCESS != libusb_ret) {
- LOG4CXX_ERROR(logger_, "libusb_submit_transfer failed: "
- << libusb_error_name(libusb_ret));
+ LOG4CXX_ERROR(
+ logger_,
+ "libusb_submit_transfer failed: " << libusb_error_name(libusb_ret));
libusb_free_transfer(libusb_transfer);
sequence_state->Finish();
}
@@ -400,7 +438,7 @@ void UsbHandler::SubmitControlTransfer(
void UsbHandler::ControlTransferCallback(libusb_transfer* transfer) {
LOG4CXX_TRACE(logger_, "enter. libusb_transfer* " << transfer);
ControlTransferSequenceState* sequence_state =
- static_cast<ControlTransferSequenceState*>(transfer->user_data);
+ static_cast<ControlTransferSequenceState*>(transfer->user_data);
if (transfer->status == LIBUSB_TRANSFER_COMPLETED) {
LOG4CXX_INFO(logger_, "USB control transfer completed");
UsbControlTransfer* current_transfer = sequence_state->CurrentTransfer();
@@ -408,8 +446,8 @@ void UsbHandler::ControlTransferCallback(libusb_transfer* transfer) {
if (current_transfer &&
current_transfer->Direction() == UsbControlTransfer::IN) {
submit_next =
- static_cast<UsbControlInTransfer*>(current_transfer)
- ->OnCompleted(libusb_control_transfer_get_data(transfer));
+ static_cast<UsbControlInTransfer*>(current_transfer)
+ ->OnCompleted(libusb_control_transfer_get_data(transfer));
}
sequence_state->Next();
@@ -427,13 +465,14 @@ void UsbHandler::ControlTransferCallback(libusb_transfer* transfer) {
}
UsbHandler::ControlTransferSequenceState::ControlTransferSequenceState(
- UsbHandler* usb_handler, UsbControlTransferSequence* sequence,
- PlatformUsbDevice* device)
- : usb_handler_(usb_handler),
- device_(device),
- finished_(false),
- sequence_(sequence),
- current_transfer_(sequence->transfers().begin()) {}
+ UsbHandler* usb_handler,
+ UsbControlTransferSequence* sequence,
+ PlatformUsbDevice* device)
+ : usb_handler_(usb_handler)
+ , device_(device)
+ , finished_(false)
+ , sequence_(sequence)
+ , current_transfer_(sequence->transfers().begin()) {}
UsbHandler::ControlTransferSequenceState::~ControlTransferSequenceState() {
delete sequence_;
@@ -448,16 +487,21 @@ UsbControlTransfer* UsbHandler::ControlTransferSequenceState::Next() {
if (++current_transfer_ == sequence_->transfers().end()) {
Finish();
LOG4CXX_TRACE(logger_,
- "exit with NULL. Condition: ++current_transfer_ == sequence_->transfers().end()");
+ "exit with NULL. Condition: ++current_transfer_ == "
+ "sequence_->transfers().end()");
return NULL;
} else {
- LOG4CXX_TRACE(logger_, "exit with UsbControlTransfer* " << *current_transfer_ <<
- ".Condition: ++current_transfer_ !== sequence_->transfers().end()");
+ LOG4CXX_TRACE(logger_,
+ "exit with UsbControlTransfer* "
+ << *current_transfer_
+ << ".Condition: ++current_transfer_ !== "
+ "sequence_->transfers().end()");
return *current_transfer_;
}
}
-UsbControlTransfer* UsbHandler::ControlTransferSequenceState::CurrentTransfer() {
+UsbControlTransfer*
+UsbHandler::ControlTransferSequenceState::CurrentTransfer() {
return finished_ ? NULL : *current_transfer_;
}
@@ -465,10 +509,8 @@ void UsbHandler::ControlTransferSequenceState::Finish() {
finished_ = true;
}
-UsbHandler::UsbHandlerDelegate::UsbHandlerDelegate(
- UsbHandler* handler)
- : handler_(handler) {
-}
+UsbHandler::UsbHandlerDelegate::UsbHandlerDelegate(UsbHandler* handler)
+ : handler_(handler) {}
void UsbHandler::UsbHandlerDelegate::threadMain() {
LOG4CXX_AUTO_TRACE(logger_);