summaryrefslogtreecommitdiff
path: root/utils/hwstub/lib/hwstub_usb.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'utils/hwstub/lib/hwstub_usb.cpp')
-rw-r--r--utils/hwstub/lib/hwstub_usb.cpp26
1 files changed, 22 insertions, 4 deletions
diff --git a/utils/hwstub/lib/hwstub_usb.cpp b/utils/hwstub/lib/hwstub_usb.cpp
index e8b8e7bc3d..e6679ff780 100644
--- a/utils/hwstub/lib/hwstub_usb.cpp
+++ b/utils/hwstub/lib/hwstub_usb.cpp
@@ -41,20 +41,28 @@ context::context(libusb_context *ctx, bool cleanup_ctx)
41{ 41{
42} 42}
43 43
44context::context(libusb_context *ctx, bool cleanup_ctx, std::string *error, device_filter_t f)
45 :m_usb_ctx(ctx), m_cleanup_ctx(cleanup_ctx)
46{
47 (void)error;
48 // NOTE: can't use initializer list since this member is from parent class
49 // and parent's class constructor is NOT called when initializer list is built
50 device_filter = f;
51}
52
44context::~context() 53context::~context()
45{ 54{
46 if(m_cleanup_ctx) 55 if(m_cleanup_ctx)
47 libusb_exit(m_usb_ctx); 56 libusb_exit(m_usb_ctx);
48} 57}
49 58
50std::shared_ptr<context> context::create(libusb_context *ctx, bool cleanup_ctx, 59std::shared_ptr<context> context::create(libusb_context *ctx, bool cleanup_ctx, std::string *error, device_filter_t f)
51 std::string *error)
52{ 60{
53 (void) error; 61 (void) error;
54 if(ctx == nullptr) 62 if(ctx == nullptr)
55 libusb_init(nullptr); 63 libusb_init(nullptr);
56 // NOTE: can't use make_shared() because of the protected ctor */ 64 // NOTE: can't use make_shared() because of the protected ctor */
57 return std::shared_ptr<context>(new context(ctx, cleanup_ctx)); 65 return std::shared_ptr<context>(new context(ctx, cleanup_ctx, nullptr, f));
58} 66}
59 67
60libusb_context *context::native_context() 68libusb_context *context::native_context()
@@ -81,7 +89,11 @@ error context::fetch_device_list(std::vector<ctx_dev_t>& list, void*& ptr)
81 ptr = (void *)usb_list; 89 ptr = (void *)usb_list;
82 list.clear(); 90 list.clear();
83 for(int i = 0; i < ret; i++) 91 for(int i = 0; i < ret; i++)
84 if(device::is_hwstub_dev(usb_list[i])) 92 /* filter devices by hwstub interface and by other filtering criteria
93 * if provided
94 */
95 if(device::is_hwstub_dev(usb_list[i]) &&
96 context::device_filter(usb_list[i]))
85 list.push_back(to_ctx_dev(usb_list[i])); 97 list.push_back(to_ctx_dev(usb_list[i]));
86 return error::SUCCESS; 98 return error::SUCCESS;
87} 99}
@@ -231,6 +243,12 @@ uint16_t device::get_pid()
231 return dev_desc.idProduct; 243 return dev_desc.idProduct;
232} 244}
233 245
246bool device::is_bus_addr_device(libusb_device *dev, uint8_t bus, uint8_t addr)
247{
248 return ((libusb_get_bus_number(dev) == bus) &&
249 (libusb_get_device_address(dev) == addr));
250}
251
234/** 252/**
235 * USB handle 253 * USB handle
236 */ 254 */