blob: 525a931c35fb809f5bd487ef66652fdc31efda93 [file] [log] [blame]
#!/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))