From 564a68f70731aa4e25408eb7bcd3a89ee84629fa Mon Sep 17 00:00:00 2001 From: Pierre-Olivier Vauboin Date: Thu, 12 Sep 2024 14:02:14 +0200 Subject: [PATCH] cores/usb/generic_device: add vendor specific request handlers --- lambdalib/cores/usb/generic_device.py | 10 +++++++++- lambdalib/software/usb/device.py | 6 ++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/lambdalib/cores/usb/generic_device.py b/lambdalib/cores/usb/generic_device.py index 68fb966..bee8432 100644 --- a/lambdalib/cores/usb/generic_device.py +++ b/lambdalib/cores/usb/generic_device.py @@ -52,6 +52,7 @@ def __init__(self, pins, self.ep_pairs = ep_pairs self.ep_sizes = ep_sizes + self.control_ep_handlers = [] self.kwargs = kwargs @@ -104,6 +105,9 @@ def create_descriptors(self): return descriptors + def add_control_ep_handler(self, handler): + self.control_ep_handlers.append(handler) + def elaborate(self, platform): m = Module() @@ -111,7 +115,11 @@ def elaborate(self, platform): # Add our standard control endpoint to the device. descriptors = self.create_descriptors() - usb.add_standard_control_endpoint(descriptors) + control_ep = usb.add_standard_control_endpoint(descriptors) + + # Add optional custom requests handlers (vendor) + for handler in self.control_ep_handlers: + control_ep.add_request_handler(handler) for k, (i, o) in enumerate(self.ep_sizes): # Add a stream OUT endpoint to our device. diff --git a/lambdalib/software/usb/device.py b/lambdalib/software/usb/device.py index 103169a..913afb5 100644 --- a/lambdalib/software/usb/device.py +++ b/lambdalib/software/usb/device.py @@ -90,6 +90,12 @@ def __init__(self, bulksize, pid=0x1234, vid=0xffff, idx=0, interface=0): raise usb1.USBError("Device not present, check udev rules") self.handle.claimInterface(self.interface) + def control_write(self, *args): + self.handle.controlWrite(*args) + + def control_read(self, *args): + return self.handle.controlRead(*args) + def get_endpoint(self, num, asynchronous=True): return USBEndpoint(self.handle, self.bulksize, num, asynchronous=asynchronous, context=self.context)