| #!/usr/bin/env python3 |
| # Copyright (c) 2021 Project CHIP Authors |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| """Flash an CYW30739 device. |
| |
| This is layered so that a caller can perform individual operations |
| through an `Flasher` instance, or operations according to a command line. |
| For `Flasher`, see the class documentation. |
| """ |
| |
| import os |
| import sys |
| |
| import firmware_utils |
| |
| # Additional options that can be use to configure an `Flasher` |
| # object (as dictionary keys) and/or passed as command line options. |
| CYW30739_OPTIONS = { |
| # Configuration options define properties used in flashing operations. |
| "configuration": { |
| "direct": { |
| "help": "Set 1 to enable direct load", |
| "default": 0, |
| "argparse": {"action": "store"}, |
| }, |
| "sdk_scripts_dir": { |
| "help": "The SDK scripts directory", |
| "default": None, |
| "argparse": {"action": "store"}, |
| }, |
| "sdk_tools_dir": { |
| "help": "The SDK tools directory", |
| "default": None, |
| "argparse": {"action": "store"}, |
| }, |
| "program": { |
| "help": "The script to program the flash.", |
| "command": [ |
| "bash", |
| "--norc", |
| "--noprofile", |
| "{sdk_scripts_dir}/bt_program.bash", |
| "--tools={sdk_tools_dir}", |
| "--scripts={sdk_scripts_dir}", |
| "--elf={application}", |
| "--direct={direct}", |
| (), |
| ], |
| }, |
| "port": { |
| "help": "The serial port of device to flash", |
| "default": None, |
| "argparse": {}, |
| }, |
| }, |
| } |
| |
| |
| class Flasher(firmware_utils.Flasher): |
| """Manage CYW30739 flashing.""" |
| |
| def __init__(self, **options): |
| super().__init__(platform="CYW30739", module=__name__, **options) |
| self.define_options(CYW30739_OPTIONS) |
| |
| def erase(self): |
| """Not supported""" |
| self.log(0, "Do not support erasing device.") |
| self.err = 1 |
| return self |
| |
| def verify(self): |
| """Not supported""" |
| self.log(0, "Do not support verifying image.") |
| self.err = 1 |
| return self |
| |
| def flash(self): |
| """Flash image.""" |
| |
| arguments = [ |
| "--hex={}/{}_download.hex".format( |
| self.option.application.parent, self.option.application.stem |
| ), |
| ] |
| if self.option.port: |
| arguments.append("--uart={port}") |
| if self.option.verbose > 0: |
| arguments.append("--verbose") |
| |
| return self.run_tool("program", arguments, name="Flash") |
| |
| def reset(self): |
| """Not supported""" |
| self.log(0, "Do not support resetting device.") |
| self.err = 1 |
| return self |
| |
| def actions(self): |
| """Perform actions on the device according to self.option.""" |
| self.log(3, "Options:", self.option) |
| |
| if self.option.erase: |
| if self.erase().err: |
| return self |
| |
| if self.option.verify_application: |
| if self.verify().err: |
| return self |
| |
| if self.option.reset: |
| if self.reset().err: |
| return self |
| |
| if self.option.application: |
| if self.flash().err: |
| return self |
| |
| return self |
| |
| |
| if __name__ == "__main__": |
| sys.exit(Flasher().flash_command(sys.argv)) |