Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Convert logos directly into DFU format #1190

Merged
merged 7 commits into from
Jan 24, 2022
Merged
Show file tree
Hide file tree
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
Binary file added Bootup Logo/Logos/IronOS.dfu
Binary file not shown.
Binary file not shown.
Binary file not shown.
47 changes: 41 additions & 6 deletions Bootup Logo/python_logo_converter/img2ts100.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
#!/usr/bin/env python
# coding=utf-8
from __future__ import division
import os
import sys
import os, sys, struct, zlib


try:
Expand All @@ -13,7 +12,7 @@
"management tool."
.format(error, sys.argv[0]))

VERSION_STRING = '0.02'
VERSION_STRING = '0.03'

LCD_WIDTH = 96
LCD_HEIGHT = 16
Expand All @@ -26,12 +25,23 @@
INTELHEX_BYTES_PER_LINE = 16
INTELHEX_MINIMUM_SIZE = 4096

DFU_PINECIL_ALT = 0
DFU_PINECIL_VENDOR = 0x28e9
DFU_PINECIL_PRODUCT = 0x0189
DFU_LOGO_ADDRESS = 0x0801F800
DFU_TARGET_NAME = b"Pinecil"
DFU_PREFIX_SIZE = 11
DFU_SUFFIX_SIZE = 16

def split16(word):
"""return high and low byte of 16-bit word value as tuple"""
return (word >> 8) & 0xff, word & 0xff


def compute_crc(data):
return 0xFFFFFFFF & -zlib.crc32(data) - 1


def intel_hex_line(record_type, offset, data):
"""generate a line of data in Intel hex format"""
# length, address offset, record type
Expand Down Expand Up @@ -82,6 +92,32 @@ def write(generator):
write(intel_hex_line(INTELHEX_END_OF_FILE_RECORD, 0, ()))


def build_dfu(file, bytes_):
data = b""
for byte in bytes_:
data += byte.to_bytes(1, byteorder="big")

data = (
struct.pack("<2I", DFU_LOGO_ADDRESS, len(data)) + data
)
data = (
struct.pack(
"<6sBI255s2I", b"Target", DFU_PINECIL_ALT, 1, DFU_TARGET_NAME, len(data), 1
)
+ data
)
data = (
struct.pack(
"<5sBIB", b"DfuSe", 1, DFU_PREFIX_SIZE + len(data) + DFU_SUFFIX_SIZE, 1
)
+ data
)
data += struct.pack("<4H3sB", 0, DFU_PINECIL_PRODUCT, DFU_PINECIL_VENDOR, 0x011A, b"UFD", DFU_SUFFIX_SIZE)
crc = compute_crc(data)
data += struct.pack("<I", crc)
file.write(data)


def img2hex(input_filename,
output_file,
preview_filename=None,
Expand Down Expand Up @@ -160,8 +196,7 @@ def img2hex(input_filename,
data[4 + ndx + (1 if ndx % 2 == 0 else -1)] = byte

if binary:
for byte in data:
output_file.write(byte.to_bytes(1, byteorder="big"))
build_dfu(output_file, data)
else:
intel_hex(output_file, data, 0x0800F800)

Expand Down Expand Up @@ -234,7 +269,7 @@ def zero_to_255(text):
sys.exit(1)

try:
if args.output_filename[-4:] == ".bin":
if args.output_filename[-4:] == ".dfu":
with open(args.output_filename, 'wb') as output:
img2hex(args.input_filename,
output,
Expand Down
8 changes: 4 additions & 4 deletions Documentation/Logo.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,10 @@ You perform this the same way as if you were flashing a new firmware, and all of

### Pinecil

For the Pinecil, we require to flash the logo using dfu-util instead, which will only take `.bin` files rather than `.hex`.
For the Pinecil, we require to flash the logo using dfu-util instead.
To flash the logo, use the following steps:

- `python3 img2ts100.py input.png logo.bin`
- `dfu-util -d 28e9:0189 -a 0 -D logo.bin -s 0x0801F800`
- `python3 img2ts100.py input.png logo.dfu`
- `dfu-util -D logo.dfu`

The converter will create a binary file if the .bin extension is used. Use dfu-util to flash it in the right location.
The converter will create a DFU instead of a HEX file if the .dfu extension is used.