From 9b780ef7d7732c47264d69a1a904d0f208f45a95 Mon Sep 17 00:00:00 2001 From: kaczmarczyck <43844792+kaczmarczyck@users.noreply.github.com> Date: Wed, 6 Oct 2021 18:33:40 +0200 Subject: [PATCH] New boards with layouts for dual partition setups (#387) * upgradable boards * updates the install manual for proper SSL config * storage locations from build script * deploy script improvements * UTC time --- boards/nordic/nrf52840dk_opensk/build.rs | 25 ++ boards/nordic/nrf52840dk_opensk/src/main.rs | 15 +- boards/nordic/nrf52840dk_opensk_a/Cargo.toml | 18 ++ boards/nordic/nrf52840dk_opensk_a/Makefile | 31 +++ boards/nordic/nrf52840dk_opensk_a/README.md | 11 + boards/nordic/nrf52840dk_opensk_a/build.rs | 45 ++++ boards/nordic/nrf52840dk_opensk_a/layout.ld | 13 ++ boards/nordic/nrf52840dk_opensk_b/Cargo.toml | 18 ++ boards/nordic/nrf52840dk_opensk_b/Makefile | 31 +++ boards/nordic/nrf52840dk_opensk_b/README.md | 11 + boards/nordic/nrf52840dk_opensk_b/build.rs | 45 ++++ boards/nordic/nrf52840dk_opensk_b/layout.ld | 13 ++ build.rs | 2 + deploy.py | 232 +++++++++++-------- docs/install.md | 4 +- nrf52840_layout_a.ld | 21 ++ nrf52840_layout_b.ld | 21 ++ patches/tock/03-additional-boards.patch | 4 +- 18 files changed, 441 insertions(+), 119 deletions(-) create mode 100644 boards/nordic/nrf52840dk_opensk_a/Cargo.toml create mode 100644 boards/nordic/nrf52840dk_opensk_a/Makefile create mode 100644 boards/nordic/nrf52840dk_opensk_a/README.md create mode 100644 boards/nordic/nrf52840dk_opensk_a/build.rs create mode 100644 boards/nordic/nrf52840dk_opensk_a/layout.ld create mode 100644 boards/nordic/nrf52840dk_opensk_b/Cargo.toml create mode 100644 boards/nordic/nrf52840dk_opensk_b/Makefile create mode 100644 boards/nordic/nrf52840dk_opensk_b/README.md create mode 100644 boards/nordic/nrf52840dk_opensk_b/build.rs create mode 100644 boards/nordic/nrf52840dk_opensk_b/layout.ld create mode 100644 nrf52840_layout_a.ld create mode 100644 nrf52840_layout_b.ld diff --git a/boards/nordic/nrf52840dk_opensk/build.rs b/boards/nordic/nrf52840dk_opensk/build.rs index 1fdd492..e872190 100644 --- a/boards/nordic/nrf52840dk_opensk/build.rs +++ b/boards/nordic/nrf52840dk_opensk/build.rs @@ -1,4 +1,29 @@ +use std::env; +use std::fs; +use std::path::Path; + fn main() { println!("cargo:rerun-if-changed=layout.ld"); println!("cargo:rerun-if-changed=../../kernel_layout.ld"); + + let out_dir = env::var_os("OUT_DIR").unwrap(); + let dest_path = Path::new(&out_dir).join("locations.rs"); + fs::write( + &dest_path, + " +static mut STORAGE_LOCATIONS: [kernel::StorageLocation; 2] = [ + // We implement NUM_PAGES = 20 as 16 + 4 to satisfy the MPU. + kernel::StorageLocation { + address: 0xC0000, + size: 0x10000, // 16 pages + storage_type: kernel::StorageType::STORE, + }, + kernel::StorageLocation { + address: 0xD0000, + size: 0x4000, // 4 pages + storage_type: kernel::StorageType::STORE, + }, +]; +" + ).unwrap(); } diff --git a/boards/nordic/nrf52840dk_opensk/src/main.rs b/boards/nordic/nrf52840dk_opensk/src/main.rs index 83fd0bb..7132beb 100644 --- a/boards/nordic/nrf52840dk_opensk/src/main.rs +++ b/boards/nordic/nrf52840dk_opensk/src/main.rs @@ -67,6 +67,7 @@ #![feature(const_in_array_repeat_expressions)] #![deny(missing_docs)] +use core::env; use kernel::common::dynamic_deferred_call::{DynamicDeferredCall, DynamicDeferredCallClientState}; use kernel::component::Component; use kernel::hil::led::LedLow; @@ -128,19 +129,7 @@ const NUM_PROCS: usize = 8; static mut PROCESSES: [Option<&'static dyn kernel::procs::ProcessType>; NUM_PROCS] = [None; NUM_PROCS]; -static mut STORAGE_LOCATIONS: [kernel::StorageLocation; 2] = [ - // We implement NUM_PAGES = 20 as 16 + 4 to satisfy the MPU. - kernel::StorageLocation { - address: 0xC0000, - size: 0x10000, // 16 pages - storage_type: kernel::StorageType::STORE, - }, - kernel::StorageLocation { - address: 0xD0000, - size: 0x4000, // 4 pages - storage_type: kernel::StorageType::STORE, - }, -]; +include!(concat!(env!("OUT_DIR"), "/locations.rs")); static mut CHIP: Option<&'static nrf52840::chip::NRF52> = None; diff --git a/boards/nordic/nrf52840dk_opensk_a/Cargo.toml b/boards/nordic/nrf52840dk_opensk_a/Cargo.toml new file mode 100644 index 0000000..471f67f --- /dev/null +++ b/boards/nordic/nrf52840dk_opensk_a/Cargo.toml @@ -0,0 +1,18 @@ +[package] +name = "nrf52840dk_opensk_a" +version = "0.1.0" +authors = ["Tock Project Developers "] +build = "build.rs" +edition = "2018" + +[[bin]] +path = "../nrf52840dk_opensk/src/main.rs" +name = "nrf52840dk_opensk_a" + +[dependencies] +components = { path = "../../components" } +cortexm4 = { path = "../../../arch/cortex-m4" } +capsules = { path = "../../../capsules" } +kernel = { path = "../../../kernel" } +nrf52840 = { path = "../../../chips/nrf52840" } +nrf52_components = { path = "../nrf52_components" } diff --git a/boards/nordic/nrf52840dk_opensk_a/Makefile b/boards/nordic/nrf52840dk_opensk_a/Makefile new file mode 100644 index 0000000..43d30f2 --- /dev/null +++ b/boards/nordic/nrf52840dk_opensk_a/Makefile @@ -0,0 +1,31 @@ +# Makefile for building the tock kernel for the nRF development kit + +TARGET=thumbv7em-none-eabi +PLATFORM=nrf52840dk_opensk_a + +include ../../Makefile.common + +TOCKLOADER=tockloader + +# Where in the SAM4L flash to load the kernel with `tockloader` +KERNEL_ADDRESS=0x20000 + +# Upload programs over uart with tockloader +ifdef PORT + TOCKLOADER_GENERAL_FLAGS += --port $(PORT) +endif + +# Upload the kernel over JTAG +.PHONY: flash +flash: $(TOCK_ROOT_DIRECTORY)target/$(TARGET)/release/$(PLATFORM).bin + $(TOCKLOADER) $(TOCKLOADER_GENERAL_FLAGS) flash --address $(KERNEL_ADDRESS) --board nrf52dk --jlink $< + +# Upload the kernel over JTAG using OpenOCD +.PHONY: flash-openocd +flash-openocd: $(TOCK_ROOT_DIRECTORY)target/$(TARGET)/release/$(PLATFORM).bin + $(TOCKLOADER) $(TOCKLOADER_GENERAL_FLAGS) flash --address $(KERNEL_ADDRESS) --board nrf52dk --openocd $< + +# Upload the kernel over serial/bootloader +.PHONY: program +program: $(TOCK_ROOT_DIRECTORY)target/$(TARGET)/release/$(PLATFORM).hex + $(error Cannot program nRF52840DK over USB. Use \`make flash\` and JTAG) diff --git a/boards/nordic/nrf52840dk_opensk_a/README.md b/boards/nordic/nrf52840dk_opensk_a/README.md new file mode 100644 index 0000000..af56330 --- /dev/null +++ b/boards/nordic/nrf52840dk_opensk_a/README.md @@ -0,0 +1,11 @@ +Platform-Specific Instructions: nRF52840-DK, partition A +=================================== + +This is an upgrade partition for the adapted nrf52840dk in `../nrf52840dk_opensk`. + +Compared to our regular board definition for the nrf52840dk, changes are: +- a `layout.ld` with 128 kB for kernel and app +- the matching kernel address in the `Makefile` +- different `StorageLocation`s in `build.rs` + +For everything else, please check the README in `../nrf52840dk_opensk`. diff --git a/boards/nordic/nrf52840dk_opensk_a/build.rs b/boards/nordic/nrf52840dk_opensk_a/build.rs new file mode 100644 index 0000000..25935d6 --- /dev/null +++ b/boards/nordic/nrf52840dk_opensk_a/build.rs @@ -0,0 +1,45 @@ +use std::env; +use std::fs; +use std::path::Path; + +fn main() { + println!("cargo:rerun-if-changed=layout.ld"); + println!("cargo:rerun-if-changed=../../kernel_layout.ld"); + + let out_dir = env::var_os("OUT_DIR").unwrap(); + let dest_path = Path::new(&out_dir).join("locations.rs"); + fs::write( + &dest_path, + " +static mut STORAGE_LOCATIONS: [kernel::StorageLocation; 5] = [ + // We implement NUM_PAGES = 20 as 16 + 4 to satisfy the MPU. + kernel::StorageLocation { + address: 0xC0000, + size: 0x10000, // 16 pages + storage_type: kernel::StorageType::STORE, + }, + kernel::StorageLocation { + address: 0xD0000, + size: 0x4000, // 4 pages + storage_type: kernel::StorageType::STORE, + }, + // Partitions can also be split to maximize MPU happiness. + kernel::StorageLocation { + address: 0x60000, + size: 0x20000, + storage_type: kernel::StorageType::PARTITION, + }, + kernel::StorageLocation { + address: 0x80000, + size: 0x20000, + storage_type: kernel::StorageType::PARTITION, + }, + kernel::StorageLocation { + address: 0x5000, + size: 0x1000, + storage_type: kernel::StorageType::METADATA, + }, +]; +" + ).unwrap(); +} diff --git a/boards/nordic/nrf52840dk_opensk_a/layout.ld b/boards/nordic/nrf52840dk_opensk_a/layout.ld new file mode 100644 index 0000000..41b5f78 --- /dev/null +++ b/boards/nordic/nrf52840dk_opensk_a/layout.ld @@ -0,0 +1,13 @@ +/* Memory Space Definitions, 1M flash, 256K ram */ +MEMORY +{ + rom (rx) : ORIGIN = 0x00020000, LENGTH = 128K + prog (rx) : ORIGIN = 0x00040000, LENGTH = 128K + ram (rwx) : ORIGIN = 0x20000000, LENGTH = 256K +} + +MPU_MIN_ALIGN = 8K; +PAGE_SIZE = 4K; + +INCLUDE ../../kernel_layout.ld + diff --git a/boards/nordic/nrf52840dk_opensk_b/Cargo.toml b/boards/nordic/nrf52840dk_opensk_b/Cargo.toml new file mode 100644 index 0000000..60cad96 --- /dev/null +++ b/boards/nordic/nrf52840dk_opensk_b/Cargo.toml @@ -0,0 +1,18 @@ +[package] +name = "nrf52840dk_opensk_b" +version = "0.1.0" +authors = ["Tock Project Developers "] +build = "build.rs" +edition = "2018" + +[[bin]] +path = "../nrf52840dk_opensk/src/main.rs" +name = "nrf52840dk_opensk_b" + +[dependencies] +components = { path = "../../components" } +cortexm4 = { path = "../../../arch/cortex-m4" } +capsules = { path = "../../../capsules" } +kernel = { path = "../../../kernel" } +nrf52840 = { path = "../../../chips/nrf52840" } +nrf52_components = { path = "../nrf52_components" } diff --git a/boards/nordic/nrf52840dk_opensk_b/Makefile b/boards/nordic/nrf52840dk_opensk_b/Makefile new file mode 100644 index 0000000..1bd3077 --- /dev/null +++ b/boards/nordic/nrf52840dk_opensk_b/Makefile @@ -0,0 +1,31 @@ +# Makefile for building the tock kernel for the nRF development kit + +TARGET=thumbv7em-none-eabi +PLATFORM=nrf52840dk_opensk_b + +include ../../Makefile.common + +TOCKLOADER=tockloader + +# Where in the SAM4L flash to load the kernel with `tockloader` +KERNEL_ADDRESS=0x60000 + +# Upload programs over uart with tockloader +ifdef PORT + TOCKLOADER_GENERAL_FLAGS += --port $(PORT) +endif + +# Upload the kernel over JTAG +.PHONY: flash +flash: $(TOCK_ROOT_DIRECTORY)target/$(TARGET)/release/$(PLATFORM).bin + $(TOCKLOADER) $(TOCKLOADER_GENERAL_FLAGS) flash --address $(KERNEL_ADDRESS) --board nrf52dk --jlink $< + +# Upload the kernel over JTAG using OpenOCD +.PHONY: flash-openocd +flash-openocd: $(TOCK_ROOT_DIRECTORY)target/$(TARGET)/release/$(PLATFORM).bin + $(TOCKLOADER) $(TOCKLOADER_GENERAL_FLAGS) flash --address $(KERNEL_ADDRESS) --board nrf52dk --openocd $< + +# Upload the kernel over serial/bootloader +.PHONY: program +program: $(TOCK_ROOT_DIRECTORY)target/$(TARGET)/release/$(PLATFORM).hex + $(error Cannot program nRF52840DK over USB. Use \`make flash\` and JTAG) diff --git a/boards/nordic/nrf52840dk_opensk_b/README.md b/boards/nordic/nrf52840dk_opensk_b/README.md new file mode 100644 index 0000000..8e32153 --- /dev/null +++ b/boards/nordic/nrf52840dk_opensk_b/README.md @@ -0,0 +1,11 @@ +Platform-Specific Instructions: nRF52840-DK, partition B +=================================== + +This is an upgrade partition for the adapted nrf52840dk in `../nrf52840dk_opensk`. + +Compared to our regular board definition for the nrf52840dk, changes are: +- a `layout.ld` with 128 kB for kernel and app +- the matching kernel address in the `Makefile` +- different `StorageLocation`s in `build.rs` + +For everything else, please check the README in `../nrf52840dk_opensk`. diff --git a/boards/nordic/nrf52840dk_opensk_b/build.rs b/boards/nordic/nrf52840dk_opensk_b/build.rs new file mode 100644 index 0000000..ee44cb1 --- /dev/null +++ b/boards/nordic/nrf52840dk_opensk_b/build.rs @@ -0,0 +1,45 @@ +use std::env; +use std::fs; +use std::path::Path; + +fn main() { + println!("cargo:rerun-if-changed=layout.ld"); + println!("cargo:rerun-if-changed=../../kernel_layout.ld"); + + let out_dir = env::var_os("OUT_DIR").unwrap(); + let dest_path = Path::new(&out_dir).join("locations.rs"); + fs::write( + &dest_path, + " +static mut STORAGE_LOCATIONS: [kernel::StorageLocation; 5] = [ + // We implement NUM_PAGES = 20 as 16 + 4 to satisfy the MPU. + kernel::StorageLocation { + address: 0xC0000, + size: 0x10000, // 16 pages + storage_type: kernel::StorageType::STORE, + }, + kernel::StorageLocation { + address: 0xD0000, + size: 0x4000, // 4 pages + storage_type: kernel::StorageType::STORE, + }, + // Partitions can also be split to maximize MPU happiness. + kernel::StorageLocation { + address: 0x20000, + size: 0x20000, + storage_type: kernel::StorageType::PARTITION, + }, + kernel::StorageLocation { + address: 0x40000, + size: 0x20000, + storage_type: kernel::StorageType::PARTITION, + }, + kernel::StorageLocation { + address: 0x4000, + size: 0x1000, + storage_type: kernel::StorageType::METADATA, + }, +]; +" + ).unwrap(); +} diff --git a/boards/nordic/nrf52840dk_opensk_b/layout.ld b/boards/nordic/nrf52840dk_opensk_b/layout.ld new file mode 100644 index 0000000..f6ff74e --- /dev/null +++ b/boards/nordic/nrf52840dk_opensk_b/layout.ld @@ -0,0 +1,13 @@ +/* Memory Space Definitions, 1M flash, 256K ram */ +MEMORY +{ + rom (rx) : ORIGIN = 0x00060000, LENGTH = 128K + prog (rx) : ORIGIN = 0x00080000, LENGTH = 128K + ram (rwx) : ORIGIN = 0x20000000, LENGTH = 256K +} + +MPU_MIN_ALIGN = 8K; +PAGE_SIZE = 4K; + +INCLUDE ../../kernel_layout.ld + diff --git a/build.rs b/build.rs index 184cd3b..2640610 100644 --- a/build.rs +++ b/build.rs @@ -32,6 +32,8 @@ fn main() { println!("cargo:rerun-if-changed={}", UPGRADE_FILE); println!("cargo:rerun-if-changed=layout.ld"); println!("cargo:rerun-if-changed=nrf52840_layout.ld"); + println!("cargo:rerun-if-changed=nrf52840_layout_a.ld"); + println!("cargo:rerun-if-changed=nrf52840_layout_b.ld"); let out_dir = env::var_os("OUT_DIR").unwrap(); let aaguid_bin_path = Path::new(&out_dir).join("opensk_aaguid.bin"); diff --git a/deploy.py b/deploy.py index 28688de..6d99d1f 100755 --- a/deploy.py +++ b/deploy.py @@ -22,8 +22,11 @@ from __future__ import print_function import argparse import collections import copy +import datetime +import hashlib import os import shutil +import struct import subprocess import sys @@ -50,12 +53,19 @@ OpenSKBoard = collections.namedtuple( "page_size", # Flash address at which the kernel will be written "kernel_address", - # Set to None is padding is not required for the board. + # Set to None if padding is not required for the board. # This creates a fake Tock OS application that starts at the # address specified by this parameter (must match the `prog` value # specified on the board's `layout.ld` file) and will end at # `app_address`. "padding_address", + # If present, enforce that the firmware image equals this value, + # padding it with 0xFF bytes. + "firmware_size", + # Set to None if metadata is not required for the board. + # Writes the metadata that is checked by the custom bootloader for + # upgradable board. + "metadata_address", # Linker script to produce a working app for this board "app_ldscript", # Flash address at which the app should be written @@ -83,81 +93,63 @@ OpenSKBoard = collections.namedtuple( "nordic_dfu", ]) +nrf52840dk_opensk_board = OpenSKBoard( + path="third_party/tock/boards/nordic/nrf52840dk_opensk", + arch="thumbv7em-none-eabi", + page_size=4096, + kernel_address=0, + padding_address=0x30000, + firmware_size=None, + metadata_address=None, + app_ldscript="nrf52840_layout.ld", + app_address=0x40000, + storage_address=0xC0000, + storage_size=0x14000, + pyocd_target="nrf52840", + openocd_board="nordic_nrf52840_dongle.cfg", + openocd_options=[], + openocd_commands={}, + jlink_if="swd", + jlink_device="nrf52840_xxaa", + nordic_dfu=False, +) + SUPPORTED_BOARDS = { "nrf52840dk_opensk": - OpenSKBoard( - path="third_party/tock/boards/nordic/nrf52840dk_opensk", - arch="thumbv7em-none-eabi", - page_size=4096, - kernel_address=0, - padding_address=0x30000, - app_ldscript="nrf52840_layout.ld", + nrf52840dk_opensk_board, + "nrf52840dk_opensk_a": + nrf52840dk_opensk_board._replace( + path=nrf52840dk_opensk_board.path + "_a", + kernel_address=0x20000, + padding_address=None, + firmware_size=0x40000, + metadata_address=0x4000, + app_ldscript="nrf52840_layout_a.ld", app_address=0x40000, - storage_address=0xC0000, - storage_size=0x14000, - pyocd_target="nrf52840", - openocd_board="nordic_nrf52840_dongle.cfg", - openocd_options=[], - openocd_commands={}, - jlink_if="swd", - jlink_device="nrf52840_xxaa", - nordic_dfu=False, + ), + "nrf52840dk_opensk_b": + nrf52840dk_opensk_board._replace( + path=nrf52840dk_opensk_board.path + "_b", + kernel_address=0x60000, + padding_address=None, + firmware_size=0x40000, + metadata_address=0x5000, + app_ldscript="nrf52840_layout_b.ld", + app_address=0x80000, ), "nrf52840_dongle_opensk": - OpenSKBoard( - path="third_party/tock/boards/nordic/nrf52840_dongle_opensk", - arch="thumbv7em-none-eabi", - page_size=4096, - kernel_address=0, - padding_address=0x30000, - app_ldscript="nrf52840_layout.ld", - app_address=0x40000, - storage_address=0xC0000, - storage_size=0x14000, - pyocd_target="nrf52840", - openocd_board="nordic_nrf52840_dongle.cfg", - openocd_options=[], - openocd_commands={}, - jlink_if="swd", - jlink_device="nrf52840_xxaa", - nordic_dfu=False, - ), + nrf52840dk_opensk_board._replace( + path="third_party/tock/boards/nordic/nrf52840_dongle_opensk",), "nrf52840_dongle_dfu": - OpenSKBoard( + nrf52840dk_opensk_board._replace( path="third_party/tock/boards/nordic/nrf52840_dongle_dfu", - arch="thumbv7em-none-eabi", - page_size=4096, kernel_address=0x1000, - padding_address=0x30000, - app_ldscript="nrf52840_layout.ld", - app_address=0x40000, - storage_address=0xC0000, - storage_size=0x14000, - pyocd_target="nrf52840", - openocd_board="nordic_nrf52840_dongle.cfg", - openocd_options=[], - openocd_commands={}, - jlink_if="swd", - jlink_device="nrf52840_xxaa", nordic_dfu=True, ), "nrf52840_mdk_dfu": - OpenSKBoard( + nrf52840dk_opensk_board._replace( path="third_party/tock/boards/nordic/nrf52840_mdk_dfu", - arch="thumbv7em-none-eabi", - page_size=4096, kernel_address=0x1000, - padding_address=0x30000, - app_ldscript="nrf52840_layout.ld", - app_address=0x40000, - storage_address=0xC0000, - storage_size=0x14000, - pyocd_target="nrf52840", - openocd_board="nordic_nrf52840_dongle.cfg", - openocd_options=[], - openocd_commands={}, - jlink_if="swd", - jlink_device="nrf52840_xxaa", nordic_dfu=True, ), } @@ -205,6 +197,18 @@ def assert_python_library(module): f"Try to run: pip3 install {module}")) +def create_metadata(firmware_image, partition_address): + t = datetime.datetime.utcnow().timestamp() + timestamp = struct.pack(" length: + fatal(f"Binary size {len(binary)} exceeds flash partition {length}.") + padding = bytes([0xFF] * (length - len(binary))) + return binary + padding + + board_props = SUPPORTED_BOARDS[self.args.board] + if board_props.metadata_address is None: + return + + kernel = self.read_kernel() + app_tab_path = "target/tab/ctap2.tab" + if not os.path.exists(app_tab_path): + fatal(f"File not found: {app_tab_path}") + app_tab = tab.TAB(app_tab_path) + arch = board_props.arch + if arch not in app_tab.get_supported_architectures(): + fatal(f"Architecture not found: {arch}") + app = app_tab.extract_app(arch).get_binary(board_props.app_address) + + kernel_size = board_props.app_address - board_props.kernel_address + app_size = board_props.firmware_size - kernel_size + firmware_image = pad_to(kernel, kernel_size) + pad_to(app, app_size) + + metadata = create_metadata(firmware_image, board_props.kernel_address) + if self.args.verbose_build: + info(f"Metadata bytes: {metadata}") + + info("Flashing metadata application") + self.write_binary(metadata, board_props.metadata_address) def clear_apps(self): args = copy.copy(self.tockloader_default_args) - board_props = SUPPORTED_BOARDS[self.args.board] - setattr(args, "app_address", board_props.app_address) # Ensure we don't force erase all apps but only the apps starting # at `board.app_address`. This makes sure we don't erase the padding. setattr(args, "force", False) @@ -530,12 +565,7 @@ class OpenSKInstaller: # Use tockloader if possible if self.args.programmer in ("jlink", "openocd"): storage = bytes([0xFF] * board_props.storage_size) - tock = loader.TockLoader(self.tockloader_default_args) - tock.open() - try: - tock.flash_binary(storage, board_props.storage_address) - except TockLoaderException as e: - fatal(f"Couldn't erase the persistent storage: {str(e)}") + self.write_binary(storage, board_props.storage_address) return 0 if self.args.programmer == "pyocd": self.checked_command([ @@ -549,8 +579,7 @@ class OpenSKInstaller: def verify_flashed_app(self, expected_app): if self.args.programmer not in ("jlink", "openocd"): return False - args = copy.copy(self.tockloader_default_args) - tock = loader.TockLoader(args) + tock = loader.TockLoader(self.tockloader_default_args) tock.open() app_found = False with tock._start_communication_with_board(): @@ -568,13 +597,9 @@ class OpenSKInstaller: if self.args.tockos: # Process kernel - kernel_path = os.path.join("third_party", "tock", "target", - board_props.arch, "release", - f"{self.args.board}.bin") - with open(kernel_path, "rb") as kernel: - kern_hex = intelhex.IntelHex() - kern_hex.frombytes(kernel.read(), offset=board_props.kernel_address) - final_hex.merge(kern_hex, overlap="error") + kern_hex = intelhex.IntelHex() + kern_hex.frombytes(self.read_kernel(), offset=board_props.kernel_address) + final_hex.merge(kern_hex, overlap="error") if self.args.application: # Add padding @@ -669,6 +694,7 @@ class OpenSKInstaller: if self.args.application: self.install_padding() self.install_tab_file(f"target/tab/{self.args.application}.tab") + self.install_metadata() if self.verify_flashed_app(self.args.application): info("You're all set!") return 0 diff --git a/docs/install.md b/docs/install.md index a3b8dd1..ca888ba 100644 --- a/docs/install.md +++ b/docs/install.md @@ -52,8 +52,8 @@ following: * rustup (can be installed with [Rustup](https://rustup.rs/)) * python3 and pip (can be installed with the `python3-pip` package on Debian) -* the OpenSSL command line tool (can be installed with the `libssl-dev` - package on Debian) +* the OpenSSL command line tool (can be installed and configured with the + `libssl-dev` and `pkg-config` packages on Debian) The scripts provided in this project have been tested under Linux and OS X. We haven't tested them on Windows and other platforms. diff --git a/nrf52840_layout_a.ld b/nrf52840_layout_a.ld new file mode 100644 index 0000000..81c6ed2 --- /dev/null +++ b/nrf52840_layout_a.ld @@ -0,0 +1,21 @@ +/* Layout for the nRF52840-DK and nRF52840 dongle, used by the + * app in this repository. + */ + +MEMORY { + /* The application region is 64 bytes (0x40) and we reserve 0x40000 at the end + * of the flash for the persistent storage. + */ + FLASH (rx) : ORIGIN = 0x00040040, LENGTH = 0x0001FFC0 + SRAM (rwx) : ORIGIN = 0x20020000, LENGTH = 128K +} + +/* + * Any change to STACK_SIZE should be accompanied by a corresponding change to + * `elf2tab`'s `--stack` option + */ +STACK_SIZE = 16384; + +MPU_MIN_ALIGN = 8K; + +INCLUDE layout.ld diff --git a/nrf52840_layout_b.ld b/nrf52840_layout_b.ld new file mode 100644 index 0000000..5d76bc9 --- /dev/null +++ b/nrf52840_layout_b.ld @@ -0,0 +1,21 @@ +/* Layout for the nRF52840-DK and nRF52840 dongle, used by the + * app in this repository. + */ + +MEMORY { + /* The application region is 64 bytes (0x40) and we reserve 0x40000 at the end + * of the flash for the persistent storage. + */ + FLASH (rx) : ORIGIN = 0x00080040, LENGTH = 0x0001FFC0 + SRAM (rwx) : ORIGIN = 0x20020000, LENGTH = 128K +} + +/* + * Any change to STACK_SIZE should be accompanied by a corresponding change to + * `elf2tab`'s `--stack` option + */ +STACK_SIZE = 16384; + +MPU_MIN_ALIGN = 8K; + +INCLUDE layout.ld diff --git a/patches/tock/03-additional-boards.patch b/patches/tock/03-additional-boards.patch index d6f605a..754c64a 100644 --- a/patches/tock/03-additional-boards.patch +++ b/patches/tock/03-additional-boards.patch @@ -2,11 +2,13 @@ diff --git a/Cargo.toml b/Cargo.toml index 06acc26d2..e5db0740b 100644 --- a/Cargo.toml +++ b/Cargo.toml -@@ -20,7 +20,11 @@ members = [ +@@ -20,7 +20,13 @@ members = [ "boards/msp_exp432p401r", "boards/microbit_v2", "boards/nordic/nrf52840dk", + "boards/nordic/nrf52840dk_opensk", ++ "boards/nordic/nrf52840dk_opensk_a", ++ "boards/nordic/nrf52840dk_opensk_b", "boards/nordic/nrf52840_dongle", + "boards/nordic/nrf52840_dongle_opensk", + "boards/nordic/nrf52840_dongle_dfu",