Flashing configuration
Zephyr supports setting up configuration for flash runners (invoked from
west flash) which allows for customising how commands are used when
programming boards. This configuration is used for Sysbuild (System build) projects and allows for
configuring when commands are ran for groups of board targets. As an example: a multi-core SoC
might want to only allow the --erase
argument to be used once for all of the cores in the SoC
which would prevent multiple erase tasks running in a single west flash
invocation, which
could wrongly clear the memory which is used by the other images being programmed.
Priority
Flashing configuration is singular, it will only be read from a single location, this configuration can reside in the following files starting with the highest priority:
soc.yml
(in soc folder)
board.yml
(in board folder)
Configuration
Configuration is applied in the yml file by using a runners
map with a single run_once
child, this then contains a map of commands as they would be provided to the flash runner e.g.
--reset
followed by a list which specifies the settings for each of these commands (these
are grouped by flash runner, and by qualifiers/boards). Commands have associated runners that
they apply to using a runners
list value, this can contain all
if it applies to all
runners, otherwise must contain each runner that it applies to using the runner-specific name.
Groups of board targets can be specified using the groups
key which has a list of board
target sets. Board targets are regular expression matches, for soc.yml
files each set of
board targets must be in a qualifiers
key (only regular expression matches for board
qualifiers are allowed, board names must be omitted from these entries). For board.yml
files each set of board targets must be in a boards
key, these are lists containing the
matches which form a singular group. A final parameter run
can be set to first
which
means that the command will be ran once with the first image flashing process per set of board
targets, or to last
which will be ran once for the final image flash per set of board targets.
An example flashing configuration for a soc.yml
is shown below in which the --recover
command will only be used once for any board targets which used the nRF5340 SoC application or
network CPU cores, and will only reset the network or application core after all images for the
respective core have been flashed.
runners:
run_once:
'--recover':
- run: first
runners:
- nrfjprog
groups:
- qualifiers:
- nrf5340/cpunet
- nrf5340/cpuapp
- nrf5340/cpuapp/ns
'--reset':
- run: last
runners:
- nrfjprog
- jlink
groups:
- qualifiers:
- nrf5340/cpunet
- qualifiers:
- nrf5340/cpuapp
- nrf5340/cpuapp/ns
# Made up non-real world example to show how to specify different options for different
# flash runners
- run: first
runners:
- some_other_runner
groups:
- qualifiers:
- nrf5340/cpunet
- qualifiers:
- nrf5340/cpuapp
- nrf5340/cpuapp/ns
Usage
Commands that are supported by flash runners can be used as normal when flashing non-sysbuild applications, the run once configuration will not be used. When flashing a sysbuild project with multiple images, the flash runner run once configuration will be applied.
For example, building the SMP server sample for the nrf5340dk which will include MCUboot as a secondary image:
cmake -GNinja -Sshare/sysbuild/ -Bbuild -DBOARD=nrf5340dk/nrf5340/cpuapp -DAPP_DIR=samples/subsys/mgmt/mcumgr/smp_svr
cmake --build build
Once built with an nrf5340dk connected, the following command can be used to flash the board with both applications and will only perform a single device recovery operation when programming the first image:
west flash --recover
If the above was ran without the flashing configuration, the recovery process would be ran twice and the device would be unbootable.