blob: 2109f0347d144a09bf64f4114db10af560756ca7 [file] [log] [blame]
#!/usr/bin/env python3
# Copyright (c) 2023 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.
import sys
import firmware_utils
STM32_OPTIONS = {
'configuration': {
'stm32cubeprogrammer': {
'help': 'Path to the STM32CubeProgrammer executable',
'default': 'STM32_Programmer_CLI',
'argparse': {
'metavar': 'FILE'
},
'verify': ['{stm32cubeprogrammer}', '-v'],
'error':
"""\
Unable to execute STM32CubeProgrammer.
Please ensure that this tool is installed and
available. See the STM32 example README for
installation instructions.
""",
},
'device': {
'help': 'Device family or platform to target',
'default': 'STM32',
'alias': ['-d'],
'argparse': {
'metavar': 'DEVICE'
},
},
'port': {
'help': 'Serial port of the device to flash',
'default': None,
'alias': ['-p'],
'argparse': {
'metavar': 'PORT'
},
},
},
}
class Flasher(firmware_utils.Flasher):
"""Manage STM32 flashing."""
def __init__(self, **options):
super().__init__(platform='STM32', module=__name__, **options)
self.define_options(STM32_OPTIONS)
def erase(self):
"""Erase the device."""
return self.run_tool(
'stm32cubeprogrammer',
['--connect', 'port={port}', '-c', 'port=SWD', '--erase', 'all'],
name='Erase device')
def verify(self, image):
"""Verify image."""
return self.run_tool(
'stm32cubeprogrammer',
['--connect', 'port={port}', '-c', 'port=SWD', '--verify', image],
name='Verify',
pass_message='Verified',
fail_message='Not verified',
fail_level=2)
def flash(self, image):
"""Flash image."""
return self.run_tool(
'stm32cubeprogrammer',
['--connect', 'port={port}', '-c', 'port=SWD', '--write', image, '--format', 'bin', '--start-address',
'0x8000000'],
name='Flash')
def reset(self):
"""Reset the device."""
return self.run_tool(
'stm32cubeprogrammer',
['--connect', 'port={port}', '-c', 'port=SWD', '--rst'],
name='Reset')
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))