From 88e736c9e91d02178a11a15ff572cab99c910ad1 Mon Sep 17 00:00:00 2001 From: Daniel Thompson Date: Tue, 14 Jan 2020 21:32:59 +0000 Subject: [PATCH] Initial revision This is a just a rather hacky combined build environment. --- .gitignore | 2 + .gitmodules | 12 ++++ Makefile | 38 ++++++++++ bootloader | 1 + micropython | 1 + tools/hexmerge.py | 178 ++++++++++++++++++++++++++++++++++++++++++++++ tools/intelhex | 1 + tools/nrfutil | 1 + 8 files changed, 234 insertions(+) create mode 100644 .gitignore create mode 100644 .gitmodules create mode 100644 Makefile create mode 160000 bootloader create mode 160000 micropython create mode 100644 tools/hexmerge.py create mode 160000 tools/intelhex create mode 160000 tools/nrfutil diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..26bd8d0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +bootloader.hex +micropython.zip diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..4471178 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,12 @@ +[submodule "bootloader"] + path = bootloader + url = https://github.com/daniel-thompson/wasp-bootloader +[submodule "micropython"] + path = micropython + url = https://github.com/daniel-thompson/micropython +[submodule "tools/intelhex"] + path = tools/intelhex + url = https://github.com/python-intelhex/intelhex +[submodule "tools/nrfutil"] + path = tools/nrfutil + url = https://github.com/adafruit/Adafruit_nRF52_nrfutil.git diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..8d57c1e --- /dev/null +++ b/Makefile @@ -0,0 +1,38 @@ +export PYTHONPATH := $(PWD)/tools/nrfutil:$(PWD)/tools/intelhex:$(PYTHONPATH) + +JOBS = -j $(shell nproc) + +all : bootloader micropython + +clean : + rm -rf \ + bootloader/_build-nitrogen_nrf52832 \ + micropython/mpy-cross/build \ + micropython/ports/nrf/build-dsd6-s132 + +submodules : + git submodule update --init --recursive + +bootloader: + make -C bootloader/ BOARD=nitrogen_nrf52832 $(JOBS) all genhex + python3 tools/hexmerge.py \ + bootloader/lib/softdevice/s132_nrf52_6.1.1/s132_nrf52_6.1.1_softdevice.hex \ + bootloader/_build-nitrogen_nrf52832/nitrogen_nrf52832_bootloader-*-nosd.hex \ + -o bootloader.hex + +micropython: + make -C micropython/mpy-cross $(JOBS) + make -C micropython/ports/nrf BOARD=dsd6 SD=s132 $(JOBS) + python3 -m nordicsemi dfu genpkg \ + --dev-type 0x0052 \ + --application micropython/ports/nrf/build-dsd6-s132/firmware.hex \ + micropython.zip + +dfu: + python3 -m nordicsemi dfu serial --package micropython.zip --port /dev/ttyACM0 + +flash: + cp bootloader.hex /run/media/$(USER)/MBED + +.PHONY: bootloader micropython + diff --git a/bootloader b/bootloader new file mode 160000 index 0000000..948de6e --- /dev/null +++ b/bootloader @@ -0,0 +1 @@ +Subproject commit 948de6e59df49b59f7fc178742308bec67441991 diff --git a/micropython b/micropython new file mode 160000 index 0000000..f579f2e --- /dev/null +++ b/micropython @@ -0,0 +1 @@ +Subproject commit f579f2e143527b0b1e8bf52dca010f2afc8f1288 diff --git a/tools/hexmerge.py b/tools/hexmerge.py new file mode 100644 index 0000000..fc6877e --- /dev/null +++ b/tools/hexmerge.py @@ -0,0 +1,178 @@ +#!/usr/bin/python + +# Copyright (c) 2008-2018 Alexander Belchenko +# All rights reserved. +# +# Redistribution and use in source and binary forms, +# with or without modification, are permitted provided +# that the following conditions are met: +# +# * Redistributions of source code must retain +# the above copyright notice, this list of conditions +# and the following disclaimer. +# * Redistributions in binary form must reproduce +# the above copyright notice, this list of conditions +# and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# * Neither the name of the author nor the names +# of its contributors may be used to endorse +# or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +# BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY +# AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +# IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, +# OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +# OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED +# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +# EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +"""Merge content of several hex files into one file.""" + +VERSION = '2.2' + +USAGE = '''hexmerge: merge content of hex files. +Usage: + python hexmerge.py [options] FILES... + +Options: + -h, --help this help message. + -v, --version version info. + -o, --output=FILENAME output file name (emit output to stdout + if option is not specified) + -r, --range=START:END specify address range for output + (ascii hex value). Both values are inclusive. + Range can be in form 'START:' or ':END'. + --no-start-addr Don't write start addr to output file. + --overlap=METHOD What to do when data in files overlapped. + Supported variants: + * error -- stop and show error message (default) + * ignore -- keep data from first file that + contains data at overlapped address + * replace -- use data from last file that + contains data at overlapped address + +Arguments: + FILES list of hex files for merging + (use '-' to read content from stdin) + +You can specify address range for each file in the form: + + filename:START:END + +See description of range option above. + +You can omit START or END, so supported variants are: + + filename:START: read filename and use data starting from START addr + filename::END read filename and use data till END addr + +Use entire file content: + + filename +or + filename:: +''' + +import sys + + +def main(args=None): + import getopt + + output = None + start = None + end = None + write_start_addr = True + overlap = 'error' + + if args is None: + args = sys.argv[1:] + try: + opts, args = getopt.gnu_getopt(args, 'hvo:r:', + ['help', 'version', + 'output=', 'range=', + 'no-start-addr', 'overlap=', + ]) + + for o,a in opts: + if o in ('-h', '--help'): + print(USAGE) + return 0 + elif o in ('-v', '--version'): + print(VERSION) + return 0 + elif o in ('-o', '--output'): + output = a + elif o in ("-r", "--range"): + try: + l = a.split(":") + if l[0] != '': + start = int(l[0], 16) + if l[1] != '': + end = int(l[1], 16) + except (ValueError, IndexError): + raise getopt.GetoptError('Bad range value(s)') + elif o == '--no-start-addr': + write_start_addr = False + elif o == '--overlap': + if a in ('error', 'ignore', 'replace'): + overlap = a + else: + raise getopt.GetoptError('Bad overlap value') + + if len(args) == 0: + raise getopt.GetoptError('You should specify file list') + + except getopt.GetoptError: + e = sys.exc_info()[1] # current exception + sys.stderr.write(str(e)+"\n") + sys.stderr.write(USAGE+"\n") + return 1 + + import intelhex + # TODO: move actual merge code into intelhex package as helper function + # and write couple of tests for it. + res = intelhex.IntelHex() + + def end_addr_inclusive(addr): + if addr is not None: + return addr + 1 + return addr + + for f in args: + try: + fname, fstart, fend = intelhex._get_file_and_addr_range(f) + except intelhex._BadFileNotation: + sys.stderr.write('Bad argument: "%s"\n' % f) + sys.stderr.write(USAGE+"\n") + return 1 + if fname == '-': + fname = sys.stdin + ih = intelhex.IntelHex(fname) + if (fstart, fend) != (None, None): + ih = ih[fstart:end_addr_inclusive(fend)] + try: + res.merge(ih, overlap) + except intelhex.AddressOverlapError: + e = sys.exc_info()[1] # current exception + sys.stderr.write('Merging: '+fname+"\n") + sys.stderr.write(str(e)+"\n") + return 1 + + if (start, end) != (None, None): + res = res[start:end_addr_inclusive(end)] + if output is None: + output = sys.stdout + res.write_hex_file(output, write_start_addr) + return 0 + + +if __name__ == '__main__': + sys.exit(main()) diff --git a/tools/intelhex b/tools/intelhex new file mode 160000 index 0000000..5c15003 --- /dev/null +++ b/tools/intelhex @@ -0,0 +1 @@ +Subproject commit 5c15003d08bf53512d5eaa54c7d2825a8b5c37cc diff --git a/tools/nrfutil b/tools/nrfutil new file mode 160000 index 0000000..7a327fd --- /dev/null +++ b/tools/nrfutil @@ -0,0 +1 @@ +Subproject commit 7a327fdeac63343d8aa4c778b015d735cdba50bc