Skip to content

Commit 5d1d1ee

Browse files
committed
dist: Create DFU files in addition to HEX
1 parent 955ccb9 commit 5d1d1ee

5 files changed

Lines changed: 76 additions & 4 deletions

File tree

.github/workflows/ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ jobs:
2121
sudo apt -y install git gcc-arm-none-eabi python3-pip srecord zip
2222
2323
- name: Dependency packages (pip)
24-
run: python3 -m pip install --user crcmod
24+
run: python3 -m pip install --user crcmod intelhex
2525

2626
- name: Build dist
2727
run: |

.github/workflows/release.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ jobs:
2323
sudo apt -y install git gcc-arm-none-eabi python3-pip srecord zip
2424
2525
- name: Dependency packages (pip)
26-
run: python3 -m pip install --user crcmod
26+
run: python3 -m pip install --user crcmod intelhex
2727

2828
- name: Build release
2929
run: |

Makefile

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,26 +33,31 @@ out: FORCE
3333
+mkdir -p out/$(mcu)/$(level)/$(target)
3434

3535
target: FORCE out
36-
$(MAKE) -C out/$(mcu)/$(level)/$(target) -f $(ROOT)/Rules.mk target.bin target.hex target.upd $(mcu)=y $(level)=y $(target)=y
36+
$(MAKE) -C out/$(mcu)/$(level)/$(target) -f $(ROOT)/Rules.mk target.bin target.hex target.dfu target.upd $(mcu)=y $(level)=y $(target)=y
3737

3838
dist: level := prod
3939
dist: t := $(ROOT)/out/$(PROJ)-$(VER)
4040
dist: FORCE all
4141
rm -rf out/$(PROJ)-*
4242
mkdir -p $(t)/hex/alt
43+
mkdir -p $(t)/dfu/alt
4344
cd out/stm32f1/$(level)/greaseweazle; \
4445
cp -a target.hex $(t)/hex/$(PROJ)-f1-$(VER).hex; \
46+
cp -a target.dfu $(t)/dfu/$(PROJ)-f1-$(VER).dfu; \
4547
cp -a ../bootloader/target.upd $(t)/$(PROJ)-$(VER).upd; \
4648
$(PYTHON) $(ROOT)/scripts/mk_update.py cat $(t)/$(PROJ)-$(VER).upd \
4749
target.upd
4850
cd out/stm32f1/debug/blinky; \
49-
cp -a target.hex $(t)/hex/alt/blinky-test-f1-$(VER).hex
51+
cp -a target.hex $(t)/hex/alt/blinky-test-f1-$(VER).hex; \
52+
cp -a target.dfu $(t)/dfu/alt/blinky-test-f1-$(VER).dfu
5053
cd out/stm32f7/$(level)/greaseweazle; \
5154
cp -a target.hex $(t)/hex/$(PROJ)-f7-$(VER).hex; \
55+
cp -a target.dfu $(t)/dfu/$(PROJ)-f7-$(VER).dfu; \
5256
$(PYTHON) $(ROOT)/scripts/mk_update.py cat $(t)/$(PROJ)-$(VER).upd \
5357
../bootloader/target.upd target.upd
5458
cd out/at32f4/$(level)/greaseweazle; \
5559
cp -a target.hex $(t)/hex/$(PROJ)-at32f4-$(VER).hex; \
60+
cp -a target.dfu $(t)/dfu/$(PROJ)-at32f4-$(VER).dfu; \
5661
$(PYTHON) $(ROOT)/scripts/mk_update.py cat $(t)/$(PROJ)-$(VER).upd \
5762
../bootloader/target.upd target.upd
5863
cp -a COPYING $(t)/

Rules.mk

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,15 @@ FLAGS += -Wno-unused-value -ffunction-sections
2020

2121
ifeq ($(mcu),stm32f1)
2222
FLAGS += -mcpu=cortex-m3 -DSTM32F1=1 -DMCU=1
23+
DFU_DEV = 0x0483:0xdf11
2324
stm32f1=y
2425
else ifeq ($(mcu),stm32f7)
2526
FLAGS += -mcpu=cortex-m7 -DSTM32F7=7 -DMCU=7
27+
DFU_DEV = 0x0483:0xdf11
2628
stm32f7=y
2729
else ifeq ($(mcu),at32f4)
2830
FLAGS += -mcpu=cortex-m4 -DAT32F4=4 -DMCU=4
31+
DFU_DEV = 0x2e3c:0xdf11
2932
at32f4=y
3033
endif
3134

@@ -101,6 +104,9 @@ endif
101104
$(OBJCOPY) -O binary $< $@
102105
chmod a-x $@
103106

107+
%.dfu: %.hex
108+
$(PYTHON) $(ROOT)/scripts/dfu-convert.py -i $< -D $(DFU_DEV) $@
109+
104110
%.upd: %.bin
105111
$(PYTHON) $(ROOT)/scripts/mk_update.py new $@ \
106112
$< $(mcu)-$(FW_MAJOR).$(FW_MINOR)-$(bootloader)

scripts/dfu-convert.py

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
# Written by Antonio Galea - 2010/11/18
2+
# Stripped down & modified by Keir Fraser for FlashFloppy project
3+
# Distributed under Gnu LGPL 3.0
4+
# see http://www.gnu.org/licenses/lgpl-3.0.txt
5+
6+
import sys,struct,zlib
7+
from optparse import OptionParser
8+
from intelhex import IntelHex
9+
10+
DEFAULT_DEVICE="0x0483:0xdf11"
11+
12+
def compute_crc(data):
13+
return 0xFFFFFFFF & -zlib.crc32(data) -1
14+
15+
def build(file,targets,device=DEFAULT_DEVICE):
16+
data = b''
17+
for t,target in enumerate(targets):
18+
tdata = b''
19+
for image in target:
20+
tdata += struct.pack('<2I',image['address'],len(image['data']))+image['data']
21+
tdata = struct.pack('<6sBI255s2I',b'Target',0,1,b'ST...',len(tdata),len(target)) + tdata
22+
data += tdata
23+
data = struct.pack('<5sBIB',b'DfuSe',1,len(data)+11,len(targets)) + data
24+
v,d=map(lambda x: int(x,0) & 0xFFFF, device.split(':',1))
25+
data += struct.pack('<4H3sB',0,d,v,0x011a,b'UFD',16)
26+
crc = compute_crc(data)
27+
data += struct.pack('<I',crc)
28+
open(file,'wb').write(data)
29+
30+
if __name__=="__main__":
31+
usage = """
32+
%prog {-i|--ihex} file.hex [-i file.hex ...] [{-D|--device}=vendor:device] outfile.dfu"""
33+
34+
parser = OptionParser(usage=usage)
35+
parser.add_option("-i", "--ihex", action="append", dest="hexfiles",
36+
help="build a DFU file from given HEXFILES", metavar="HEXFILES")
37+
parser.add_option("-D", "--device", action="store", dest="device",
38+
help="build for DEVICE, defaults to %s" % DEFAULT_DEVICE, metavar="DEVICE")
39+
(options, args) = parser.parse_args()
40+
41+
if options.hexfiles and len(args)==1:
42+
target = []
43+
44+
for h in options.hexfiles:
45+
ih = IntelHex(h)
46+
for (s,e) in ih.segments():
47+
target.append({ 'address': s, 'data': ih.tobinstr(s,e-1) })
48+
49+
outfile = args[0]
50+
device = DEFAULT_DEVICE
51+
if options.device:
52+
device=options.device
53+
try:
54+
v,d=map(lambda x: int(x,0) & 0xFFFF, device.split(':',1))
55+
except:
56+
print("Invalid device '%s'." % device)
57+
sys.exit(1)
58+
build(outfile,[target],device)
59+
else:
60+
parser.print_help()
61+
sys.exit(1)

0 commit comments

Comments
 (0)