Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 16 additions & 2 deletions dfuse/DfuDevice.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import usb.util
import time
import errno

DFU_REQUEST_SEND = 0x21
DFU_REQUEST_RECEIVE = 0xa1
Expand Down Expand Up @@ -48,8 +49,21 @@ def upload(self, blockNum, size):
return self.control_msg(DFU_REQUEST_RECEIVE, DFU_UPLOAD, blockNum, size)

def get_status(self):
status = self.control_msg(DFU_REQUEST_RECEIVE, DFU_GETSTATUS, 0, 6)
return (status[0], status[4], status[1] + (status[2] << 8) + (status[3] << 16), status[5])
# An arbitrary number of retries.
for i in range(5):
try:
status = self.control_msg(DFU_REQUEST_RECEIVE, DFU_GETSTATUS, 0, 6)
return (status[0], status[4], status[1] + (status[2] << 8) + (status[3] << 16), status[5])
except usb.core.USBError as ex:
if ex.errno == errno.EPIPE:
# Stalled; wait for it to clear.
time.sleep(.01 * i)
else:
raise
else:
# One last time to either succeed or raise the exception
status = self.control_msg(DFU_REQUEST_RECEIVE, DFU_GETSTATUS, 0, 6)
return (status[0], status[4], status[1] + (status[2] << 8) + (status[3] << 16), status[5])

def clear_status(self):
self.control_msg(DFU_REQUEST_SEND, DFU_CLRSTATUS, 0, None)
Expand Down