Skip to content

Commit b9e1d7d

Browse files
committed
usb1: Expose and give control of transfer flags
1 parent a9034c1 commit b9e1d7d

File tree

3 files changed

+66
-2
lines changed

3 files changed

+66
-2
lines changed

README.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -574,6 +574,7 @@ Expose more modern libusb1 API:
574574
- libusb_set_log_cb
575575
- libusb_setlocale + libusb_strerror
576576
- libusb_wrap_sys_device
577+
- transfer flags LIBUSB_TRANSFER_SHORT_NOT_OK and LIBUSB_TRANSFER_ADD_ZERO_PACKET
577578

578579
As a result, python-libusb1 should now be usable on Android.
579580

usb1/__init__.py

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,8 @@ def __init__(
221221
after_completion,
222222
registerFinalizer,
223223
unregisterFinalizer,
224+
short_is_error,
225+
add_zero_packet,
224226
):
225227
"""
226228
You should not instanciate this class directly.
@@ -241,6 +243,8 @@ def __init__(
241243
raise USBErrorNoMem
242244
# pylint: enable=undefined-variable
243245
self.__transfer = transfer
246+
self.setShortIsError(short_is_error)
247+
self.setAddZeroPacket(add_zero_packet)
244248
finalizer_handle = id(self)
245249
self.__close = weakref.finalize(
246250
self,
@@ -720,6 +724,44 @@ def setBuffer(self, buffer_or_len):
720724
transfer.buffer = cast(buff, c_void_p)
721725
transfer.length = sizeof(buff)
722726

727+
def isShortAnError(self):
728+
"""
729+
Returns whether the LIBUSB_TRANSFER_SHORT_NOT_OK flag is set on this
730+
transfer.
731+
"""
732+
return bool(self.__transfer.contents.flags & libusb1.LIBUSB_TRANSFER_SHORT_NOT_OK)
733+
734+
def setShortIsError(self, state):
735+
"""
736+
state (bool)
737+
When true, LIBUSB_TRANSFER_SHORT_NOT_OK flag is set on this
738+
transfer.
739+
Otherwise, it is cleared.
740+
"""
741+
if state:
742+
self.__transfer.contents.flags |= libusb1.LIBUSB_TRANSFER_SHORT_NOT_OK
743+
else:
744+
self.__transfer.contents.flags &= ~libusb1.LIBUSB_TRANSFER_SHORT_NOT_OK
745+
746+
def isZeroPacketAdded(self):
747+
"""
748+
Returns whether the LIBUSB_TRANSFER_ADD_ZERO_PACKET flag is set on this
749+
transfer.
750+
"""
751+
return bool(self.__transfer.contents.flags & libusb1.LIBUSB_TRANSFER_ADD_ZERO_PACKET)
752+
753+
def setAddZeroPacket(self, state):
754+
"""
755+
state (bool)
756+
When true, LIBUSB_TRANSFER_ADD_ZERO_PACKET flag is set on this
757+
transfer.
758+
Otherwise, it is cleared.
759+
"""
760+
if state:
761+
self.__transfer.contents.flags |= libusb1.LIBUSB_TRANSFER_ADD_ZERO_PACKET
762+
else:
763+
self.__transfer.contents.flags &= ~libusb1.LIBUSB_TRANSFER_ADD_ZERO_PACKET
764+
723765
def isSubmitted(self):
724766
"""
725767
Tells if this transfer is submitted and still pending.
@@ -1508,11 +1550,14 @@ def interruptRead(self, endpoint, length, timeout=0):
15081550
raise
15091551
return data_buffer[:transferred]
15101552

1511-
def getTransfer(self, iso_packets=0):
1553+
def getTransfer(self, iso_packets=0, short_is_error=False, add_zero_packet=False):
15121554
"""
15131555
Get an USBTransfer instance for asynchronous use.
15141556
iso_packets: the number of isochronous transfer descriptors to
15151557
allocate.
1558+
short_is_error: When true, short frames are reported as errors.
1559+
add_zero_packet: When true, transfers of a multiple of the endpoint
1560+
size are followed by a zero-length packet.
15161561
"""
15171562
return USBTransfer(
15181563
context=self.__context,
@@ -1522,6 +1567,8 @@ def getTransfer(self, iso_packets=0):
15221567
after_completion=self.__inflight_remove,
15231568
registerFinalizer=self.__registerFinalizer,
15241569
unregisterFinalizer=self.__unregisterFinalizer,
1570+
short_is_error=short_is_error,
1571+
add_zero_packet=add_zero_packet,
15251572
)
15261573

15271574
class USBConfiguration:

usb1/testUSB1.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ def _fakeAllocTransfer(self, isochronous_count):
8585
return pointer(transfer)
8686

8787
@staticmethod
88-
def getTransfer(iso_packets=0):
88+
def getTransfer(iso_packets=0, short_is_error=False, add_zero_packet=False):
8989
# Dummy handle
9090
return usb1.USBTransfer(
9191
context=None,
@@ -95,6 +95,8 @@ def getTransfer(iso_packets=0):
9595
after_completion=lambda x: None,
9696
registerFinalizer=lambda handle, finalizer: None,
9797
unregisterFinalizer=lambda handle: None,
98+
short_is_error=short_is_error,
99+
add_zero_packet=add_zero_packet,
98100
)
99101

100102
@staticmethod
@@ -145,6 +147,20 @@ def callback(transfer):
145147
request_type, request, value, index, buff, callback=callback)
146148
# No callback
147149
transfer.setControl(request_type, request, value, index, buff)
150+
self.assertFalse(transfer.isShortAnError())
151+
self.assertFalse(transfer.isZeroPacketAdded())
152+
transfer.setShortIsError(True)
153+
self.assertTrue(transfer.isShortAnError())
154+
self.assertFalse(transfer.isZeroPacketAdded())
155+
transfer.setAddZeroPacket(True)
156+
self.assertTrue(transfer.isShortAnError())
157+
self.assertTrue(transfer.isZeroPacketAdded())
158+
transfer.setShortIsError(False)
159+
self.assertFalse(transfer.isShortAnError())
160+
self.assertTrue(transfer.isZeroPacketAdded())
161+
transfer.setAddZeroPacket(False)
162+
self.assertFalse(transfer.isShortAnError())
163+
self.assertFalse(transfer.isZeroPacketAdded())
148164

149165
def _testTransferSetter(self, transfer, setter_id):
150166
endpoint = 0x81

0 commit comments

Comments
 (0)