Skip to content

Commit

Permalink
Implement UF2 device type id extension tag (qmk#21029)
Browse files Browse the repository at this point in the history
  • Loading branch information
zvecr authored and coquizen committed Jun 22, 2023
1 parent c499bea commit e81b5f6
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 1 deletion.
3 changes: 2 additions & 1 deletion builddefs/common_rules.mk
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,7 @@ endif
# To produce a UF2 file in your build, add to your keyboard's rules.mk:
# FIRMWARE_FORMAT = uf2
UF2CONV = $(TOP_DIR)/util/uf2conv.py
UF2CONV_ARGS ?=
UF2_FAMILY ?= 0x0

# Compiler flags to generate dependency files.
Expand Down Expand Up @@ -219,7 +220,7 @@ gccversion :
@$(BUILD_CMD)

%.uf2: %.elf
$(eval CMD=$(HEX) $< $(BUILD_DIR)/$(TARGET).tmp && $(UF2CONV) $(BUILD_DIR)/$(TARGET).tmp --output $@ --convert --family $(UF2_FAMILY) >/dev/null 2>&1)
$(eval CMD=$(HEX) $< $(BUILD_DIR)/$(TARGET).tmp && $(UF2CONV) $(UF2CONV_ARGS) $(BUILD_DIR)/$(TARGET).tmp --output $@ --convert --family $(UF2_FAMILY) >/dev/null 2>&1)
#@$(SILENT) || printf "$(MSG_EXECUTING) '$(CMD)':\n"
@$(SILENT) || printf "$(MSG_UF2) $@" | $(AWK_CMD)
@$(BUILD_CMD)
Expand Down
10 changes: 10 additions & 0 deletions util/uf2conv.py
Original file line number Diff line number Diff line change
Expand Up @@ -151,10 +151,15 @@ def encode(self, blockno, numblocks):
flags = 0x0
if familyid:
flags |= 0x2000
if devicetype:
flags |= 0x8000
hd = struct.pack("<IIIIIIII",
UF2_MAGIC_START0, UF2_MAGIC_START1,
flags, self.addr, 256, blockno, numblocks, familyid)
hd += self.bytes[0:256]
if devicetype:
hd += bytearray(b'\x08\x29\xa7\xc8')
hd += bytearray(devicetype.to_bytes(4, 'little'))
while len(hd) < 512 - 4:
hd += b"\x00"
hd += struct.pack("<I", UF2_MAGIC_END)
Expand Down Expand Up @@ -283,6 +288,8 @@ def error(msg):
parser.add_argument('-f', '--family', dest='family', type=str,
default="0x0",
help='specify familyID - number or name (default: 0x0)')
parser.add_argument('-t' , '--device-type', dest='devicetype', type=str,
help='specify deviceTypeID extension tag - number')
parser.add_argument('-o', '--output', metavar="FILE", dest='output', type=str,
help='write output to named file; defaults to "flash.uf2" or "flash.bin" where sensible')
parser.add_argument('-d', '--device', dest="device_path",
Expand Down Expand Up @@ -312,6 +319,9 @@ def error(msg):
except ValueError:
error("Family ID needs to be a number or one of: " + ", ".join(families.keys()))

global devicetype
devicetype = int(args.devicetype, 0) if args.devicetype else None

if args.list:
list_drives()
else:
Expand Down

0 comments on commit e81b5f6

Please sign in to comment.