Skip to content
This repository has been archived by the owner on Apr 3, 2020. It is now read-only.

Commit

Permalink
Revert of Convert device::UsbConfigDescriptor and friends to structs.…
Browse files Browse the repository at this point in the history
… (patchset #2 id:60001 of https://codereview.chromium.org/562763002/)

Reason for revert:
This broken the Linux ASan LSan Tests:
http://build.chromium.org/p/chromium.memory/builders/Linux%20ASan%20LSan%20Tests%20%283%29/builds/7506
http://build.chromium.org/p/chromium.memory/builders/Linux%20ASan%20LSan%20Tests%20%281%29/builds/5717

Sample callstacks:

Direct leak of 400 byte(s) in 10 object(s) allocated from:
    #0 0x55c6eb in __interceptor_malloc (/b/build/slave/Linux_ASan_LSan_Tests__3_/build/src/out/Release/browser_tests+0x55c6eb)
    #1 0xab24bb8 in raw_desc_to_config third_party/libusb/src/libusb/descriptor.c:501:45
    #2 0xab24ab9 in libusb_get_active_config_descriptor third_party/libusb/src/libusb/descriptor.c:601:7
    #3 0xab14aae in device::UsbDeviceImpl::GetConfiguration() device/usb/usb_device_impl.cc:199:9
    #4 0xb37d57b in EnumerateOnFileThread(crypto::RSAPrivateKey*, base::Callback\u003Cvoid (std::__1::vector\u003Cscoped_refptr\u003CAndroidUsbDevice>, std::__1::allocator\u003Cscoped_refptr\u003CAndroidUsbDevice> > > const&)> const&, scoped_refptr\u003Cbase::MessageLoopProxy>) chrome/browser/devtools/device/usb/android_usb_device.cc:262:42
    #5 0xb38aebf in Run base/bind_internal.h:288:12
    #6 0xb38aebf in base::internal::InvokeHelper\u003Cfalse, void, base::internal::RunnableAdapter\u003Cvoid (*)(crypto::RSAPrivateKey*, base::Callback\u003Cvoid (std::__1::vector\u003Cscoped_refptr\u003CAndroidUsbDevice>, std::__1::allocator\u003Cscoped_refptr\u003CAndroidUsbDevice> > > const&)> const&, scoped_refptr\u003Cbase::MessageLoopProxy>)>, void (crypto::RSAPrivateKey* const&, base::Callback\u003Cvoid (std::__1::vector\u003Cscoped_refptr\u003CAndroidUsbDevice>, std::__1::allocator\u003Cscoped_refptr\u003CAndroidUsbDevice> > > const&)> const&, base::MessageLoopProxy*)>::MakeItSo(base::internal::RunnableAdapter\u003Cvoid (*)(crypto::RSAPrivateKey*, base::Callback\u003Cvoid (std::__1::vector\u003Cscoped_refptr\u003CAndroidUsbDevice>, std::__1::allocator\u003Cscoped_refptr\u003CAndroidUsbDevice> > > const&)> const&, scoped_refptr\u003Cbase::MessageLoopProxy>)>, crypto::RSAPrivateKey* const&, base::Callback\u003Cvoid (std::__1::vector\u003Cscoped_refptr\u003CAndroidUsbDevice>, std::__1::allocator\u003Cscoped_refptr\u003CAndroidUsbDevice> > > const&)> const&, base::MessageLoopProxy*) base/bind_internal.h:927
    #7 0x2d58bff in Run base/callback.h:401:12
    #8 0x2d58bff in base::debug::TaskAnnotator::RunTask(char const*, char const*, base::PendingTask const&) base/debug/task_annotator.cc:62
    #9 0x2ca519c in base::MessageLoop::RunTask(base::PendingTask const&) base/message_loop/message_loop.cc:446:3
    #10 0x2ca629e in DeferOrRunPendingTask base/message_loop/message_loop.cc:456:5
    #11 0x2ca629e in base::MessageLoop::DoWork() base/message_loop/message_loop.cc:565
    #12 0x2c23ddf in base::MessagePumpLibevent::Run(base::MessagePump::Delegate*) base/message_loop/message_pump_libevent.cc:232:21
    #13 0x2cd57b4 in base::RunLoop::Run() base/run_loop.cc:49:3
    #14 0x2ca39c4 in base::MessageLoop::Run() base/message_loop/message_loop.cc:308:3
    #15 0x50fd018 in content::BrowserThreadImpl::FileThreadRun(base::MessageLoop*) content/browser/browser_thread_impl.cc:190:3
    #16 0x50fdca7 in content::BrowserThreadImpl::Run(base::MessageLoop*) content/browser/browser_thread_impl.cc:244:14
    #17 0x2d1ebc8 in base::Thread::ThreadMain() base/threading/thread.cc:228:5
    #18 0x2d12b20 in base::(anonymous namespace)::ThreadFunc(void*) base/threading/platform_thread_posix.cc:80:3
    #19 0x7f4d560a3e99 in start_thread /build/buildd/eglibc-2.15/nptl/pthread_create.c:308

Direct leak of 400 byte(s) in 10 object(s) allocated from:
    #0 0x55c6eb in __interceptor_malloc (/b/build/slave/Linux_ASan_LSan_Tests__1_/build/src/out/Release/browser_tests+0x55c6eb)
    #1 0xab24bb8 in raw_desc_to_config third_party/libusb/src/libusb/descriptor.c:501:45
    #2 0xab24ab9 in libusb_get_active_config_descriptor third_party/libusb/src/libusb/descriptor.c:601:7
    #3 0xab14aae in device::UsbDeviceImpl::GetConfiguration() device/usb/usb_device_impl.cc:199:9
    #4 0xb37d57b in EnumerateOnFileThread(crypto::RSAPrivateKey*, base::Callback\u003Cvoid (std::__1::vector\u003Cscoped_refptr\u003CAndroidUsbDevice>, std::__1::allocator\u003Cscoped_refptr\u003CAndroidUsbDevice> > > const&)> const&, scoped_refptr\u003Cbase::MessageLoopProxy>) chrome/browser/devtools/device/usb/android_usb_device.cc:262:42
    #5 0xb38aebf in Run base/bind_internal.h:288:12
    #6 0xb38aebf in base::internal::InvokeHelper\u003Cfalse, void, base::internal::RunnableAdapter\u003Cvoid (*)(crypto::RSAPrivateKey*, base::Callback\u003Cvoid (std::__1::vector\u003Cscoped_refptr\u003CAndroidUsbDevice>, std::__1::allocator\u003Cscoped_refptr\u003CAndroidUsbDevice> > > const&)> const&, scoped_refptr\u003Cbase::MessageLoopProxy>)>, void (crypto::RSAPrivateKey* const&, base::Callback\u003Cvoid (std::__1::vector\u003Cscoped_refptr\u003CAndroidUsbDevice>, std::__1::allocator\u003Cscoped_refptr\u003CAndroidUsbDevice> > > const&)> const&, base::MessageLoopProxy*)>::MakeItSo(base::internal::RunnableAdapter\u003Cvoid (*)(crypto::RSAPrivateKey*, base::Callback\u003Cvoid (std::__1::vector\u003Cscoped_refptr\u003CAndroidUsbDevice>, std::__1::allocator\u003Cscoped_refptr\u003CAndroidUsbDevice> > > const&)> const&, scoped_refptr\u003Cbase::MessageLoopProxy>)>, crypto::RSAPrivateKey* const&, base::Callback\u003Cvoid (std::__1::vector\u003Cscoped_refptr\u003CAndroidUsbDevice>, std::__1::allocator\u003Cscoped_refptr\u003CAndroidUsbDevice> > > const&)> const&, base::MessageLoopProxy*) base/bind_internal.h:927
    #7 0x2d58bff in Run base/callback.h:401:12
    #8 0x2d58bff in base::debug::TaskAnnotator::RunTask(char const*, char const*, base::PendingTask const&) base/debug/task_annotator.cc:62
    #9 0x2ca519c in base::MessageLoop::RunTask(base::PendingTask const&) base/message_loop/message_loop.cc:446:3
    #10 0x2ca629e in DeferOrRunPendingTask base/message_loop/message_loop.cc:456:5
    #11 0x2ca629e in base::MessageLoop::DoWork() base/message_loop/message_loop.cc:565
    #12 0x2c23ddf in base::MessagePumpLibevent::Run(base::MessagePump::Delegate*) base/message_loop/message_pump_libevent.cc:232:21
    #13 0x2cd57b4 in base::RunLoop::Run() base/run_loop.cc:49:3
    #14 0x2ca39c4 in base::MessageLoop::Run() base/message_loop/message_loop.cc:308:3
    #15 0x50fd018 in content::BrowserThreadImpl::FileThreadRun(base::MessageLoop*) content/browser/browser_thread_impl.cc:190:3
    #16 0x50fdca7 in content::BrowserThreadImpl::Run(base::MessageLoop*) content/browser/browser_thread_impl.cc:244:14
    #17 0x2d1ebc8 in base::Thread::ThreadMain() base/threading/thread.cc:228:5
    #18 0x2d12b20 in base::(anonymous namespace)::ThreadFunc(void*) base/threading/platform_thread_posix.cc:80:3
    #19 0x7f4aef980e99 in start_thread /build/buildd/eglibc-2.15/nptl/pthread_create.c:308

Original issue's description:
> Convert device::UsbConfigDescriptor and friends to structs.
>
> These classes do not need to be classes and expecially don't need to be
> abstract classes as this leads to a complicated implementation and
> complicated tests. All USB devices no matter the platform will have the
> same descriptor data.
>
> This change follows the model of device::HidDeviceInfo.
>
> BUG=
>
> Committed: https://crrev.com/be9e363a3af57bd313fbb96ec3b5fa02cef769b5
> Cr-Commit-Position: refs/heads/master@{#294594}

[email protected],[email protected],[email protected],[email protected],[email protected]
NOTREECHECKS=true
NOTRY=true
BUG=

Review URL: https://codereview.chromium.org/567003002

Cr-Commit-Position: refs/heads/master@{#294640}
  • Loading branch information
weitaosu authored and Commit bot committed Sep 12, 2014
1 parent 4c1e40b commit f499548
Show file tree
Hide file tree
Showing 20 changed files with 843 additions and 459 deletions.
154 changes: 124 additions & 30 deletions chrome/browser/devtools/device/usb/android_usb_browsertest.cc
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@
#include "chrome/test/base/in_process_browser_test.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/test/test_utils.h"
#include "device/usb/usb_descriptors.h"
#include "device/usb/usb_device.h"
#include "device/usb/usb_device_handle.h"
#include "device/usb/usb_interface.h"
#include "device/usb/usb_service.h"
#include "testing/gtest/include/gtest/gtest.h"

Expand All @@ -25,6 +25,7 @@ using device::UsbDeviceHandle;
using device::UsbEndpointDescriptor;
using device::UsbEndpointDirection;
using device::UsbInterfaceDescriptor;
using device::UsbInterfaceAltSettingDescriptor;
using device::UsbService;
using device::UsbSynchronizationType;
using device::UsbTransferCallback;
Expand Down Expand Up @@ -103,6 +104,125 @@ const char* GetMockShellResponse(std::string command) {
return "";
}

class MockUsbEndpointDescriptor : public UsbEndpointDescriptor {
public:
virtual int GetAddress() const OVERRIDE { return address_; }

virtual UsbEndpointDirection GetDirection() const OVERRIDE {
return direction_;
}

virtual int GetMaximumPacketSize() const OVERRIDE {
return maximum_packet_size_;
}

virtual UsbSynchronizationType GetSynchronizationType() const OVERRIDE {
return usb_synchronization_type_;
}

virtual UsbTransferType GetTransferType() const OVERRIDE {
return usb_transfer_type_;
}
virtual UsbUsageType GetUsageType() const OVERRIDE { return usb_usage_type_; }

virtual int GetPollingInterval() const OVERRIDE { return polling_interval_; }

int address_;
UsbEndpointDirection direction_;
int maximum_packet_size_;
UsbSynchronizationType usb_synchronization_type_;
UsbTransferType usb_transfer_type_;
UsbUsageType usb_usage_type_;
int polling_interval_;

private:
virtual ~MockUsbEndpointDescriptor() {}
};

template <class T>
class MockUsbInterfaceAltSettingDescriptor
: public UsbInterfaceAltSettingDescriptor {
public:
MockUsbInterfaceAltSettingDescriptor(int interface_number,
int alternate_setting)
: interface_number_(interface_number),
alternate_setting_(alternate_setting) {}

virtual size_t GetNumEndpoints() const OVERRIDE {
// See IsAndroidInterface function in android_usb_device.cc
return 2;
}

virtual scoped_refptr<const UsbEndpointDescriptor> GetEndpoint(
size_t index) const OVERRIDE {
EXPECT_GT(static_cast<size_t>(2), index);
MockUsbEndpointDescriptor* result = new MockUsbEndpointDescriptor();
result->address_ = index + 1;
result->usb_transfer_type_ = device::USB_TRANSFER_BULK;
result->direction_ = ((index == 0) ? device::USB_DIRECTION_INBOUND
: device::USB_DIRECTION_OUTBOUND);
result->maximum_packet_size_ = 1 << 20; // 1Mb maximum packet size
return result;
}

virtual int GetInterfaceNumber() const OVERRIDE { return interface_number_; }

virtual int GetAlternateSetting() const OVERRIDE {
return alternate_setting_;
}

virtual int GetInterfaceClass() const OVERRIDE { return T::kClass; }

virtual int GetInterfaceSubclass() const OVERRIDE { return T::kSubclass; }

virtual int GetInterfaceProtocol() const OVERRIDE { return T::kProtocol; }

protected:
virtual ~MockUsbInterfaceAltSettingDescriptor() {};

private:
const int interface_number_;
const int alternate_setting_;
};

template <class T>
class MockUsbInterfaceDescriptor : public UsbInterfaceDescriptor {
public:
explicit MockUsbInterfaceDescriptor(int interface_number)
: interface_number_(interface_number) {}

virtual size_t GetNumAltSettings() const OVERRIDE {
// See IsAndroidInterface function in android_usb_device.cc
return 1;
}
virtual scoped_refptr<const UsbInterfaceAltSettingDescriptor> GetAltSetting(
size_t index) const OVERRIDE {
EXPECT_EQ(static_cast<size_t>(0), index);
return new MockUsbInterfaceAltSettingDescriptor<T>(interface_number_, 0);
}

protected:
const int interface_number_;
virtual ~MockUsbInterfaceDescriptor() {}
};

template <class T>
class MockUsbConfigDescriptor : public UsbConfigDescriptor {
public:
MockUsbConfigDescriptor() {}

virtual size_t GetNumInterfaces() const OVERRIDE { return 1; }

virtual scoped_refptr<const UsbInterfaceDescriptor> GetInterface(
size_t index) const OVERRIDE {
EXPECT_EQ(static_cast<size_t>(0), index);
return new MockUsbInterfaceDescriptor<T>(index);
}

protected:
virtual ~MockUsbConfigDescriptor() {};
};

template <class T>
class MockUsbDevice;

Expand Down Expand Up @@ -347,37 +467,14 @@ class MockUsbDeviceHandle : public UsbDeviceHandle {
template <class T>
class MockUsbDevice : public UsbDevice {
public:
MockUsbDevice() : UsbDevice(0, 0, 0) {
UsbEndpointDescriptor bulk_in;
bulk_in.address = 0x81;
bulk_in.direction = device::USB_DIRECTION_INBOUND;
bulk_in.maximum_packet_size = 512;
bulk_in.transfer_type = device::USB_TRANSFER_BULK;

UsbEndpointDescriptor bulk_out;
bulk_out.address = 0x01;
bulk_out.direction = device::USB_DIRECTION_OUTBOUND;
bulk_out.maximum_packet_size = 512;
bulk_out.transfer_type = device::USB_TRANSFER_BULK;

UsbInterfaceDescriptor interface_desc;
interface_desc.interface_number = 0;
interface_desc.alternate_setting = 0;
interface_desc.interface_class = T::kClass;
interface_desc.interface_subclass = T::kSubclass;
interface_desc.interface_protocol = T::kProtocol;
interface_desc.endpoints.push_back(bulk_in);
interface_desc.endpoints.push_back(bulk_out);

config_desc_.interfaces.push_back(interface_desc);
}
MockUsbDevice() : UsbDevice(0, 0, 0) {}

virtual scoped_refptr<UsbDeviceHandle> Open() OVERRIDE {
return new MockUsbDeviceHandle<T>(this);
}

virtual const UsbConfigDescriptor& GetConfiguration() OVERRIDE {
return config_desc_;
virtual scoped_refptr<UsbConfigDescriptor> ListInterfaces() OVERRIDE {
return new MockUsbConfigDescriptor<T>();
}

virtual bool Close(scoped_refptr<UsbDeviceHandle> handle) OVERRIDE {
Expand All @@ -400,9 +497,6 @@ class MockUsbDevice : public UsbDevice {

protected:
virtual ~MockUsbDevice() {}

private:
UsbConfigDescriptor config_desc_;
};

class MockUsbService : public UsbService {
Expand Down
88 changes: 48 additions & 40 deletions chrome/browser/devtools/device/usb/android_usb_device.cc
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@
#include "content/public/browser/browser_thread.h"
#include "crypto/rsa_private_key.h"
#include "device/core/device_client.h"
#include "device/usb/usb_descriptors.h"
#include "device/usb/usb_device.h"
#include "device/usb/usb_interface.h"
#include "device/usb/usb_service.h"
#include "net/base/ip_endpoint.h"
#include "net/base/net_errors.h"
Expand All @@ -29,6 +29,7 @@
using device::UsbConfigDescriptor;
using device::UsbDevice;
using device::UsbDeviceHandle;
using device::UsbInterfaceAltSettingDescriptor;
using device::UsbInterfaceDescriptor;
using device::UsbEndpointDescriptor;
using device::UsbService;
Expand Down Expand Up @@ -58,12 +59,17 @@ typedef std::set<scoped_refptr<UsbDevice> > UsbDeviceSet;
base::LazyInstance<std::vector<AndroidUsbDevice*> >::Leaky g_devices =
LAZY_INSTANCE_INITIALIZER;

bool IsAndroidInterface(const UsbInterfaceDescriptor& interface) {
if (interface.alternate_setting != 0 ||
interface.interface_class != kAdbClass ||
interface.interface_subclass != kAdbSubclass ||
interface.interface_protocol != kAdbProtocol ||
interface.endpoints.size() != 2) {
bool IsAndroidInterface(scoped_refptr<const UsbInterfaceDescriptor> interface) {
if (interface->GetNumAltSettings() == 0)
return false;

scoped_refptr<const UsbInterfaceAltSettingDescriptor> idesc =
interface->GetAltSetting(0);

if (idesc->GetInterfaceClass() != kAdbClass ||
idesc->GetInterfaceSubclass() != kAdbSubclass ||
idesc->GetInterfaceProtocol() != kAdbProtocol ||
idesc->GetNumEndpoints() != 2) {
return false;
}
return true;
Expand All @@ -72,40 +78,40 @@ bool IsAndroidInterface(const UsbInterfaceDescriptor& interface) {
scoped_refptr<AndroidUsbDevice> ClaimInterface(
crypto::RSAPrivateKey* rsa_key,
scoped_refptr<UsbDeviceHandle> usb_handle,
const UsbInterfaceDescriptor& interface) {
scoped_refptr<const UsbInterfaceDescriptor> interface,
int interface_id) {
scoped_refptr<const UsbInterfaceAltSettingDescriptor> idesc =
interface->GetAltSetting(0);

int inbound_address = 0;
int outbound_address = 0;
int zero_mask = 0;

for (UsbEndpointDescriptor::Iterator endpointIt = interface.endpoints.begin();
endpointIt != interface.endpoints.end();
++endpointIt) {
if (endpointIt->transfer_type != device::USB_TRANSFER_BULK)
for (size_t i = 0; i < idesc->GetNumEndpoints(); ++i) {
scoped_refptr<const UsbEndpointDescriptor> edesc =
idesc->GetEndpoint(i);
if (edesc->GetTransferType() != device::USB_TRANSFER_BULK)
continue;
if (endpointIt->direction == device::USB_DIRECTION_INBOUND)
inbound_address = endpointIt->address;
if (edesc->GetDirection() == device::USB_DIRECTION_INBOUND)
inbound_address = edesc->GetAddress();
else
outbound_address = endpointIt->address;
zero_mask = endpointIt->maximum_packet_size - 1;
outbound_address = edesc->GetAddress();
zero_mask = edesc->GetMaximumPacketSize() - 1;
}

if (inbound_address == 0 || outbound_address == 0)
return NULL;

if (!usb_handle->ClaimInterface(interface.interface_number))
if (!usb_handle->ClaimInterface(interface_id))
return NULL;

base::string16 serial;
if (!usb_handle->GetSerial(&serial) || serial.empty())
return NULL;

return new AndroidUsbDevice(rsa_key,
usb_handle,
base::UTF16ToASCII(serial),
inbound_address,
outbound_address,
zero_mask,
interface.interface_number);
return new AndroidUsbDevice(rsa_key, usb_handle, base::UTF16ToASCII(serial),
inbound_address, outbound_address, zero_mask,
interface_id);
}

uint32 Checksum(const std::string& data) {
Expand Down Expand Up @@ -201,11 +207,12 @@ static void OpenAndroidDeviceOnFileThread(
bool success) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
if (success) {
const UsbConfigDescriptor& config = device->GetConfiguration();
scoped_refptr<UsbConfigDescriptor> config = device->ListInterfaces();
scoped_refptr<UsbDeviceHandle> usb_handle = device->Open();
if (usb_handle.get()) {
scoped_refptr<AndroidUsbDevice> android_device =
ClaimInterface(rsa_key, usb_handle, config.interfaces[interface_id]);
ClaimInterface(rsa_key, usb_handle, config->GetInterface(interface_id),
interface_id);
if (android_device.get())
devices->push_back(android_device.get());
else
Expand All @@ -222,17 +229,15 @@ static int CountOnFileThread() {
if (service != NULL)
service->GetDevices(&usb_devices);
int device_count = 0;
for (UsbDevices::iterator deviceIt = usb_devices.begin();
deviceIt != usb_devices.end();
++deviceIt) {
const UsbConfigDescriptor& config = (*deviceIt)->GetConfiguration();

for (UsbInterfaceDescriptor::Iterator ifaceIt = config.interfaces.begin();
ifaceIt != config.interfaces.end();
++ifaceIt) {
if (IsAndroidInterface(*ifaceIt)) {
for (UsbDevices::iterator it = usb_devices.begin(); it != usb_devices.end();
++it) {
scoped_refptr<UsbConfigDescriptor> config = (*it)->ListInterfaces();
if (!config.get())
continue;

for (size_t j = 0; j < config->GetNumInterfaces(); ++j) {
if (IsAndroidInterface(config->GetInterface(j)))
++device_count;
}
}
}
return device_count;
Expand All @@ -259,13 +264,16 @@ static void EnumerateOnFileThread(

for (UsbDevices::iterator it = usb_devices.begin(); it != usb_devices.end();
++it) {
const UsbConfigDescriptor& config = (*it)->GetConfiguration();
scoped_refptr<UsbConfigDescriptor> config = (*it)->ListInterfaces();
if (!config.get()) {
barrier.Run();
continue;
}

bool has_android_interface = false;
for (size_t j = 0; j < config.interfaces.size(); ++j) {
if (!IsAndroidInterface(config.interfaces[j])) {
for (size_t j = 0; j < config->GetNumInterfaces(); ++j) {
if (!IsAndroidInterface(config->GetInterface(j)))
continue;
}

// Request permission on Chrome OS.
#if defined(OS_CHROMEOS)
Expand Down
5 changes: 3 additions & 2 deletions device/usb/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,6 @@ source_set("usb") {
sources = [
"usb_context.cc",
"usb_context.h",
"usb_descriptors.cc",
"usb_descriptors.h",
"usb_device_impl.cc",
"usb_device_impl.h",
"usb_device.h",
Expand All @@ -23,6 +21,9 @@ source_set("usb") {
"usb_error.h",
"usb_ids.cc",
"usb_ids.h",
"usb_interface.h",
"usb_interface_impl.cc",
"usb_interface_impl.h",
"usb_service.h",
"usb_service_impl.cc",
generated_ids,
Expand Down
5 changes: 3 additions & 2 deletions device/usb/usb.gyp
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,6 @@
'sources': [
'usb_context.cc',
'usb_context.h',
'usb_descriptors.cc',
'usb_descriptors.h',
'usb_device_impl.cc',
'usb_device_impl.h',
'usb_device.h',
Expand All @@ -33,6 +31,9 @@
'usb_error.h',
'usb_ids.cc',
'usb_ids.h',
'usb_interface.h',
'usb_interface_impl.cc',
'usb_interface_impl.h',
'usb_service.h',
'usb_service_impl.cc',
],
Expand Down
Loading

0 comments on commit f499548

Please sign in to comment.