Closed xobs closed 4 years ago
In looking closer, it looks like dfu.py
uses generates nonstandard DFU versions. The bcdDFU field is 01.1a
, whereas the standard defines the bcdDFU field should be 01.00
, at least according to the most recent spec I can find: https://www.usb.org/sites/default/files/DFU_1.1.pdf
Additionally, there is a lot of extra stuff that gets added.
With this patch I can get dfu.py
to generate the same file as dfu-suffix
:
diff --git a/tools/dfu.py b/tools/dfu.py
index 54b6024..b74b7d7 100755
--- a/tools/dfu.py
+++ b/tools/dfu.py
@@ -60,12 +60,13 @@ def build(file,targets,device=DEFAULT_DEVICE):
for t,target in enumerate(targets):
tdata = b''
for image in target:
- tdata += struct.pack('<2I',image['address'],len(image['data']))+image['data']
- tdata = struct.pack('<6sBI255s2I',b'Target',0,1, b'ST...',len(tdata),len(target)) + tdata
+ tdata += image['data']
+# tdata += struct.pack('<2I',image['address'],len(image['data']))+image['data']
+# tdata = struct.pack('<6sBI255s2I',b'Target',0,1, b'ST...',len(tdata),len(target)) + tdata
data += tdata
- data = struct.pack('<5sBIB',b'DfuSe',1,len(data)+11,len(targets)) + data
+# data = struct.pack('<5sBIB',b'DfuSe',1,len(data)+11,len(targets)) + data
v,d=map(lambda x: int(x,0) & 0xFFFF, device.split(':',1))
- data += struct.pack('<4H3sB',0,d,v,0x011a,b'UFD',16)
+ data += struct.pack('<4H3sB',0xffff,d,v,0x0100,b'UFD',16)
crc = compute_crc(data)
data += struct.pack('<I',crc)
open(file,'wb').write(data)
I added dfu-suffix.py
in c91d364a58118100871acd5a195b73c3bbbe5141 that addresses this.
@xobs updated dfu.py
In trying to add support for Fomu, I found a script called
dfu.py
that seems to indicate that it can be used to create standard USB DFU images. However, the output does not appear to be valid.For comparison with the standard dfu tools:
You can see that it's adding 292 bytes to the start of the image, whereas the DFU standard says that DFU images should only have a 16-byte header appended as a suffix. This results in a nonstandard DFU image that can't be loaded with e.g.
dfu-util
.