def clear_storage(self): if self.args.programmer == "none": return 0 info("Erasing the persistent storage") board_props = SUPPORTED_BOARDS[self.args.board] # 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("Couldn't erase the persistent storage: {}".format( str(e))) return 0 if self.args.programmer == "pyocd": self.checked_command([ "pyocd", "erase", "--target={}".format(board_props.pyocd_target), "--sector", "{}+{}".format(board_props.storage_address, board_props.storage_size) ]) return 0 fatal("Programmer {} is not supported.".format(self.args.programmer))
def verify_flashed_app(self, expected_app): args = copy.copy(self.tockloader_default_args) tock = loader.TockLoader(args) app_found = False with tock._start_communication_with_board(): apps = [app.name for app in tock._extract_all_app_headers()] app_found = expected_app in apps return app_found
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) app_found = False with tock._start_communication_with_board(): apps = [app.name for app in tock._extract_all_app_headers()] app_found = expected_app in apps return app_found
def install_padding(self): padding = self.get_padding() board_props = SUPPORTED_BOARDS[self.args.board] info("Flashing padding application") args = copy.copy(self.tockloader_default_args) setattr(args, "address", board_props.padding_address) tock = loader.TockLoader(args) tock.open() try: tock.flash_binary(padding, args.address) except TockLoaderException as e: fatal("Couldn't install padding: {}".format(str(e)))
def clear_apps(self): args = copy.copy(self.tockloader_default_args) setattr(args, "app_address", 0x40000) info("Erasing all installed applications") tock = loader.TockLoader(args) tock.open(args) try: tock.erase_apps(False) except TockLoaderException as e: # Erasing apps is not critical info(("A non-critical error occured while erasing " "apps: {}".format(str(e))))
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) info("Erasing all installed applications") tock = loader.TockLoader(args) tock.open(args) try: tock.erase_apps(False) except TockLoaderException as e: # Erasing apps is not critical info(("A non-critical error occurred while erasing " "apps: {}".format(str(e))))
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) info("Erasing all installed applications") tock = loader.TockLoader(args) tock.open() try: tock.erase_apps() except TockLoaderException as e: # Erasing apps is not critical info(("A non-critical error occurred while erasing " "apps: {}".format(str(e))))
def install_tock_os(self): board_props = SUPPORTED_BOARDS[self.args.board] kernel_file = os.path.join("third_party", "tock", "target", board_props.arch, "release", "{}.bin".format(self.args.board)) info("Flashing file {}.".format(kernel_file)) with open(kernel_file, "rb") as f: kernel = f.read() args = copy.copy(self.tockloader_default_args) setattr(args, "address", board_props.app_address) tock = loader.TockLoader(args) tock.open() try: tock.flash_binary(kernel, board_props.kernel_address) except TockLoaderException as e: fatal("Couldn't install Tock OS: {}".format(str(e)))
def install_padding(self): fake_header = tbfh.TBFHeader("") fake_header.version = 2 fake_header.fields["header_size"] = 0x10 fake_header.fields["total_size"] = 0x10000 fake_header.fields["flags"] = 0 padding = fake_header.get_binary() info("Flashing padding application") args = copy.copy(self.tockloader_default_args) setattr(args, "address", 0x30000) tock = loader.TockLoader(args) tock.open(args) try: tock.flash_binary(padding, args.address) except TockLoaderException as e: fatal("Couldn't install padding: {}".format(str(e)))
def install_tab_file(self, tab_filename): assert self.args.application info("Installing Tock application {}".format(self.args.application)) board_props = SUPPORTED_BOARDS[self.args.board] args = copy.copy(self.tockloader_default_args) setattr(args, "app_address", board_props.app_address) setattr(args, "erase", self.args.clear_apps) setattr(args, "make", False) setattr(args, "no_replace", False) tock = loader.TockLoader(args) tock.open() tabs = [tab.TAB(tab_filename)] try: tock.install(tabs, replace="yes", erase=args.erase) except TockLoaderException as e: fatal("Couldn't install Tock application {}: {}".format( self.args.application, str(e)))
def install_elf_file(self, elf_path): assert self.args.application package_parameter = "-n" elf2tab_ver = self.checked_command_output(["elf2tab", "--version" ]).split(' ', maxsplit=1)[1] # Starting from v0.5.0-dev the parameter changed. # Current pyblished crate is 0.4.0 but we don't want developers # running the HEAD from github to be stuck if "0.5.0-dev" in elf2tab_ver: package_parameter = "--package-name" os.makedirs(self.tab_folder, exist_ok=True) tab_filename = os.path.join(self.tab_folder, "{}.tab".format(self.args.application)) shutil.copyfile(elf_path, self.target_elf_filename) self.checked_command_output([ "elf2tab", package_parameter, self.args.application, "-o", tab_filename, self.target_elf_filename, "--stack={}".format(STACK_SIZE), "--app-heap={}".format(APP_HEAP_SIZE), "--kernel-heap=1024", "--protected-region-size=64" ]) self.install_padding() if not self.args.dfu: info("Installing Tock application {}".format( self.args.application)) args = copy.copy(self.tockloader_default_args) setattr(args, "app_address", 0x40000) setattr(args, "erase", self.args.clear_apps) setattr(args, "make", False) setattr(args, "no_replace", False) tock = tockloader.TockLoader(args) tock.open(args) tabs = [tab.TAB(tab_filename)] try: tock.install(tabs, replace="yes", erase=args.erase) except TockLoaderException as e: fatal("Couldn't install Tock application {}: {}".format( self.args.application, str(e))) else: self.padding_to_hex() self.app_to_hex()
def install_padding(self): fake_header = tbfh.TBFHeader("") fake_header.version = 2 fake_header.fields["header_size"] = 0x10 fake_header.fields["total_size"] = 0x10000 fake_header.fields["flags"] = 0 padding = fake_header.get_binary() if self.args.dfu: info("Save padding") padding_filename = os.path.join(self.tab_folder, "padding.bin") with open(padding_filename, "wb") as f: f.write(padding) else: info("Flashing padding application") args = copy.copy(self.tockloader_default_args) setattr(args, "address", 0x30000) tock = tockloader.TockLoader(args) tock.open(args) try: tock.flash_binary(padding, args.address) except TockLoaderException as e: fatal("Couldn't install padding: {}".format(str(e)))