Skip to content
This repository was archived by the owner on Jan 27, 2025. It is now read-only.

Commit 3451bde

Browse files
committed
tests: Tolerate USB HID interface
set_configuration() will fail if there's a HID driver attached. Could probably dropped it entirely, but now it will work even if no kernel driver has been bound. The GUD interface isn't necessarily the first one, so accommodate for that. Drop the reset(), shouldn't be necessary.
1 parent 41508c2 commit 3451bde

File tree

1 file changed

+26
-24
lines changed

1 file changed

+26
-24
lines changed

tests/gud/__init__.py

Lines changed: 26 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -195,41 +195,45 @@ def __init__(self, dev):
195195
self._formats = None
196196
self._properties = None
197197
self._connectors = None
198+
self._interface = None
199+
self.ep = None
198200
self.state = None
199201

200-
def config(self):
201-
self.dev.set_configuration()
202-
self.interface = None
202+
@property
203+
def interface(self):
204+
if self._interface is not None:
205+
return self._interface
206+
207+
try:
208+
self.dev.set_configuration()
209+
except usb.core.USBError as e:
210+
if e.errno != errno.EBUSY:
211+
raise e from None
212+
# Pick the first Vendor Class Interface
203213
for itf in self.dev.get_active_configuration():
204214
if itf.bInterfaceClass == 0xff:
205-
self.interface = itf
206-
assert self.interface is not None
215+
self._interface = itf
216+
break
217+
assert self._interface is not None
207218
self.ep = usb.util.find_descriptor(
208-
self.interface,
219+
self._interface,
209220
# match the first OUT endpoint
210221
custom_match = lambda e: usb.util.endpoint_direction(e.bEndpointAddress) == usb.util.ENDPOINT_OUT)
211222
assert self.ep is not None
212223

213-
def _get_ifnum(self, ifnum):
214-
if ifnum is None:
215-
if self.interface:
216-
return self.interface.bInterfaceNumber
217-
else:
218-
return 0
219-
else:
220-
return ifnum
224+
return self._interface
221225

222226
def reset(self):
223227
self.dev.reset()
224228

225-
def is_kernel_driver_active(self, ifnum=None):
226-
return self.dev.is_kernel_driver_active(self._get_ifnum(ifnum))
229+
def is_kernel_driver_active(self):
230+
return self.dev.is_kernel_driver_active(self.interface.bInterfaceNumber)
227231

228-
def detach_kernel_driver(self, ifnum=None):
229-
self.dev.detach_kernel_driver(self._get_ifnum(ifnum))
232+
def detach_kernel_driver(self):
233+
self.dev.detach_kernel_driver(self.interface.bInterfaceNumber)
230234

231-
def attach_kernel_driver(self, ifnum=None):
232-
self.dev.attach_kernel_driver(self._get_ifnum(ifnum))
235+
def attach_kernel_driver(self):
236+
self.dev.attach_kernel_driver(self.interface.bInterfaceNumber)
233237

234238
@property
235239
def descriptor(self):
@@ -506,10 +510,8 @@ def find_first_setup():
506510
dev = find()
507511
if not dev:
508512
return None
509-
if dev.is_kernel_driver_active(0):
510-
dev.detach_kernel_driver(0)
511-
dev.reset()
512-
dev.config()
513+
if dev.is_kernel_driver_active():
514+
dev.detach_kernel_driver()
513515
for connector in dev.connectors:
514516
connector.update()
515517
return dev

0 commit comments

Comments
 (0)