| #!/usr/bin/env python3 |
| # Copyright (c) 2020-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 a QPG device on a DK board. |
| |
| Currently only support CMSIS mBed Drag and Drop for public use. |
| |
| usage: qpg_firmware_utils.py [-h] [--application FILE] [--drive DRIVE] |
| |
| optional arguments: |
| -h, --help show this help message and exit |
| |
| configuration: |
| --verbose Report more verbosely |
| --drive Connected mBed USB mount to copy to |
| |
| operations: |
| --application FILE Flash an image through drag and drop |
| """ |
| |
| import sys |
| import os |
| import shutil |
| |
| import firmware_utils |
| |
| # Additional options that can be use to configure an `Flasher` |
| # object (as dictionary keys) and/or passed as command line options. |
| QPG_OPTIONS = { |
| # Configuration options define properties used in flashing operations. |
| 'configuration': { |
| # Tool configuration options. |
| 'drive': { |
| 'help': 'Location of the mBed mount', |
| 'default': '/mnt/e', |
| 'alias': ['-d'], |
| 'argparse': { |
| 'metavar': 'FILE' |
| }, |
| }, |
| }, |
| } |
| |
| |
| class Flasher(firmware_utils.Flasher): |
| """Manage flashing.""" |
| |
| def __init__(self, **options): |
| super().__init__(platform='QPG', module=__name__, **options) |
| self.define_options(QPG_OPTIONS) |
| |
| def erase(self): |
| """Not supported""" |
| self.log(0, "Erase not supported") |
| return self |
| |
| def verify(self, image): |
| """Not supported""" |
| self.log(0, "Verify not supported") |
| return self |
| |
| def flash(self, image): |
| """Flash image.""" |
| self.log(1, "Copying to {} drive {}".format( |
| image, self.option.drive or "None")) |
| if not self.option.drive: |
| self.log(0, "--drive or -d required for copy action") |
| self.err = 1 |
| return self |
| |
| # Check for drive mount |
| if not os.path.exists(self.option.drive): |
| self.log(0, "Drive '{}' does not exist. Is the USB device mounted correctly ?".format( |
| self.option.drive)) |
| self.err = 2 |
| return self |
| |
| # Check for valid mBed device |
| mbed_marker = os.path.join(self.option.drive, 'MBED.HTM') |
| if not os.path.exists(mbed_marker): |
| self.log(0, "Drive '{}' not a path to an MBED device".format( |
| self.option.drive)) |
| self.err = 3 |
| return self |
| |
| shutil.copyfile(image, os.path.join( |
| self.option.drive, os.path.basename(image))) |
| return self |
| |
| def reset(self): |
| """Not supported""" |
| self.log(0, "Reset is triggered automatically after completion of mBed copy.") |
| 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.application: |
| application = self.option.application |
| if self.flash(application).err: |
| return self |
| if self.option.verify_application: |
| if self.verify(application).err: |
| return self |
| if self.option.reset is None: |
| self.option.reset = True |
| |
| if self.option.reset: |
| if self.reset().err: |
| return self |
| |
| return self |
| |
| |
| if __name__ == '__main__': |
| sys.exit(Flasher().flash_command(sys.argv)) |