You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
180 lines
5.4 KiB
180 lines
5.4 KiB
# SPDX-FileCopyrightText: 2021 Foundation Devices, Inc. <hello@foundationdevices.com>
|
|
#
|
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
# Install dependencies.
|
|
deps:
|
|
@echo "Not sure we will need this if all deps are setup via Dockerfile"
|
|
|
|
# Initialize development environment
|
|
init: deps
|
|
git config core.hooksPath .githooks
|
|
|
|
# Lint only the python code of the project
|
|
lint-py:
|
|
pycodestyle --exclude trezor-firmware --statistics .
|
|
|
|
# Lint only the C code of the project
|
|
lint-c:
|
|
@echo "TBD"
|
|
|
|
# Lint only the code of the project
|
|
lint-code: lint-py lint-c
|
|
|
|
# Lint the licensing
|
|
lint-license:
|
|
reuse lint
|
|
|
|
# Lint all of the project
|
|
lint: lint-code lint-license
|
|
|
|
#
|
|
# Firmware Commands
|
|
#
|
|
|
|
build:
|
|
make BOARD=Passport
|
|
|
|
# Sign current firmware build with the user.pem key and set specified version
|
|
sign version="1.0.0": build
|
|
@echo "\nAdding user signature...\n"
|
|
@cosign -f build-Passport/firmware.bin -k ~/bin/keys/user.pem -v {{version}} > /dev/null
|
|
|
|
@cosign -f build-Passport/firmware-key-user.bin -x
|
|
@echo "\nSigning Complete!"
|
|
|
|
# Build, sign and flash the firmware with the specified version
|
|
flash version="1.0.0": (sign version)
|
|
just run-ocd-command "flash write_image erase build-Passport/firmware-key-user.bin 0x8020000"
|
|
just reset
|
|
|
|
# Install a recent Foundation-signed build
|
|
flash-foundation version="1.0.0":
|
|
just run-ocd-command "flash write_image erase ../../releases/passport-fw-{{version}}.bin 0x8020000"
|
|
just reset
|
|
|
|
# Clean the firmware build
|
|
clean:
|
|
make BOARD=Passport clean
|
|
|
|
#
|
|
# Misc. Commands
|
|
#
|
|
|
|
# Launch OCD, run a command and then exit
|
|
run-ocd-command command:
|
|
sudo /usr/local/bin/openocd -f stlink.cfg -c "adapter speed 1000; transport select hla_swd" -f stm32h7x.cfg -c "init; reset halt; {{command}}" -c "exit"
|
|
|
|
run-ocd-command-no-halt command:
|
|
sudo /usr/local/bin/openocd -f stlink.cfg -c "adapter speed 1000; transport select hla_swd" -f stm32h7x.cfg -c "init; {{command}}" -c "exit"
|
|
|
|
# Build all Python graphics
|
|
graphics-py:
|
|
just -f boards/Passport/graphics/py/Justfile build
|
|
|
|
# Build all C graphics (firmware & bootloader)
|
|
graphics-c:
|
|
just -f boards/Passport/graphics/c/Justfile build
|
|
|
|
graphics: graphics-py graphics-c
|
|
|
|
# Reset the Passport
|
|
reset:
|
|
just run-ocd-command "reset"
|
|
|
|
# Get the username for use below
|
|
user := `whoami`
|
|
|
|
# Read the "ROM Secrets" from Passport and save them to a file
|
|
save-secrets filename="boards/Passport/bootloader/secrets":
|
|
just run-ocd-command "dump_image {{filename}} 0x0801FF00 256"
|
|
# Running OCD as sudo makes the output file be owned by root, so switch it back to the user
|
|
sudo chown {{user}}:{{user}} {{filename}}
|
|
|
|
secrets:
|
|
#!/usr/bin/env bash
|
|
# The last bit below redirects stderr to stdout, which the backticks capture into the variable `secrets`
|
|
secrets=`just run-ocd-command "mdb 0x0801FF00 256" 2>&1`
|
|
secrets=`echo "$secrets" | tail -n 8`
|
|
echo -e "Passport ROM Secrets:\n$secrets"
|
|
|
|
# Calculate all hashes and format it all for GitHub release notes
|
|
hash filepath:
|
|
#!/usr/bin/env bash
|
|
filename=`basename {{filepath}}`
|
|
|
|
# SHA256
|
|
sha=`shasum -b -a 256 {{filepath}} | sed -rn 's/^(.*) .*$/\1/p'`
|
|
echo -e "\n\`SHA256: $sha\`"
|
|
echo -e "\`(shasum -b -a 256 $filename)\`\n"
|
|
|
|
# MD5
|
|
md5=`mdsum {{filepath}} | sed -rn 's/^(.*) .*$/\1/p'`
|
|
echo "\`MD5: $md5\`"
|
|
echo -e "\`(md5 $filename or mdsum $filename)\`\n"
|
|
|
|
# Build Hash
|
|
build_hash=`cosign -f {{filepath}} -x | sed -rn 's/^FW Build Hash: (.*)$/\1/p'`
|
|
echo -e "\`Build Hash: $build_hash\`"
|
|
echo -e "\`(Developers Only)\`\n"
|
|
|
|
# Run all tests
|
|
test:
|
|
@echo "TBD"
|
|
|
|
# Format the project's .py files under boards/Passport/modules
|
|
fmt-py:
|
|
#!/usr/bin/env bash
|
|
pushd boards/Passport/modules
|
|
files_to_fmt=`find . -path ./trezor-firmware -prune -false -o -name '*.py'`
|
|
autopep8 --max-line-length=120 --in-place $files_to_fmt
|
|
popd
|
|
|
|
# Format the project's .c and .h files under boards/Passport/
|
|
fmt-c:
|
|
#!/usr/bin/env bash
|
|
pushd boards/Passport
|
|
files_to_fmt=`find . -path ./trezor-firmware -prune -false -o -name '*.[c|h]'`
|
|
clang-format-5.0 -i --style=file $files_to_fmt
|
|
popd
|
|
|
|
# Format the project's source code under boards/Passport
|
|
fmt: fmt-py fmt-c
|
|
|
|
# Convert a raw pixel map to a PNG
|
|
convert-screenshot from_file to_file:
|
|
#!/usr/bin/python3
|
|
from PIL import Image, ImageOps
|
|
raw_bits = open('{{from_file}}', 'rb').read()
|
|
WIDTH = 230
|
|
HEIGHT = 303
|
|
SCAN_WIDTH = 240
|
|
|
|
# Convert
|
|
img = Image.frombuffer('1', (SCAN_WIDTH, HEIGHT), raw_bits)
|
|
|
|
# Crop to actual width (framebuffer is 240 vs 230 for actual display)
|
|
img = img.crop((0, 0, WIDTH, HEIGHT))
|
|
|
|
# Invert since raw image is actually white on black - have to convert to grayscale first since invert() doesn't work
|
|
# for 1-bit per pixel black/white images.
|
|
img = ImageOps.grayscale(img)
|
|
img = ImageOps.invert(img)
|
|
|
|
# Apply a color shift to make it look nicer
|
|
img = ImageOps.colorize(img, (0,0,0,0), '#E0E0E0')
|
|
|
|
img.save('{{to_file}}')
|
|
|
|
# Capture a screenshot from Passport via OCD
|
|
screenshot filename:
|
|
#!/usr/bin/env bash
|
|
ADDR_FILE=screenshot-addr.tmp
|
|
TMP_FILE=screenshot.tmp
|
|
just run-ocd-command-no-halt "dump_image $ADDR_FILE 0x38006920 4"
|
|
N=`head -c 4 $ADDR_FILE | od -An --endian=little -t u4`
|
|
FRAMEBUFFER_ADDR=`printf '%x\n' $N`
|
|
echo FRAMEBUFFER_ADDR=$FRAMEBUFFER_ADDR
|
|
just run-ocd-command-no-halt "dump_image screenshot.tmp 0x$FRAMEBUFFER_ADDR 9090"
|
|
just convert-screenshot $TMP_FILE {{filename}}
|
|
rm -f $TMP_FILE $ADDR_FILE
|
|
|