Vous devez définir PICO_SDK_PATH dans l'environnement ou le transmettre à cmake avec -DPICO_SDK_PATH=/path/to/pico-sdk
. Pour utiliser des fonctionnalités telles que la signature ou le hachage, vous devrez vous assurer que le sous-module mbedtls du SDK est extrait - cela peut être fait en l'exécutant à partir de votre répertoire SDK.
git submodule update --init lib/mbedtls
Vous devez également installer libusb-1.0
.
Utilisez votre outil de package préféré pour installer les dépendances. Par exemple, sur Ubuntu :
sudo apt install build-essential pkg-config libusb-1.0-0-dev cmake
Ensuite, construisez simplement comme un projet CMake normal :
mkdir build
cd build
cmake ..
make
Sous Linux, vous pouvez ajouter des règles udev afin d'exécuter picotool sans sudo :
sudo cp udev/99-picotool.rules /etc/udev/rules.d/
Téléchargez libUSB à partir d'ici https://libusb.info/
définissez la variable d'environnement LIBUSB_ROOT sur le répertoire d'installation.
mkdir build
cd build
cmake -G "NMake Makefiles" ..
nmake
Téléchargez libUSB à partir d'ici https://libusb.info/
définissez la variable d'environnement LIBUSB_ROOT sur le répertoire d'installation.
mkdir build
cd build
cmake ..
make
Pas besoin de télécharger libusb séparément ou de définir LIBUSB_ROOT
.
pacman -S $MINGW_PACKAGE_PREFIX-{toolchain,cmake,libusb}
mkdir build
cd build
cmake .. -DCMAKE_INSTALL_PREFIX=$MINGW_PREFIX
cmake --build .
Le SDK Raspberry Pi Pico (pico-sdk) version 2.0.0 et supérieure utilise picotool
pour effectuer la conversion ELF en UF2 précédemment gérée par l'outil elf2uf2
dans le SDK. Le SDK utilise également picotool
pour hacher et signer les binaires.
Bien que le SDK puisse télécharger picotool seul par projet, si vous avez plusieurs projets ou configurations de build, il est préférable d'installer une seule copie de picotool
localement. Cela peut être fait plus simplement avec make install
ou cmake --install .
; le SDK utilisera cette version installée par défaut.
Alternativement, vous pouvez installer sur un chemin personnalisé via :
cmake -DCMAKE_INSTALL_PREFIX=$MY_INSTALL_DIR -DPICOTOOL_FLAT_INSTALL=1 ..
Pour que le SDK trouve picotool
dans ce chemin personnalisé, vous devrez définir la variable picotool_DIR
dans votre projet, soit en définissant la variable d'environnement picotool_DIR
, en passant -Dpicotool_DIR=$MY_INSTALL_DIR/picotool
à votre commande cmake
, ou en ajoutant set(picotool_DIR $MY_INSTALL_DIR/picotool)
à votre fichier CMakeLists.txt.
picotool
est un outil permettant de travailler avec les binaires RP2040/RP2350 et d'interagir avec les appareils RP2040/RP2350 lorsqu'ils sont en mode BOOTSEL. (À partir de la version 1.1 de picotool
il est également possible d'interagir avec des appareils qui ne sont pas en mode BOOTSEL, mais qui utilisent le support USB stdio du SDK Raspberry Pi Pico en utilisant l'argument -f
de picotool
).
Remarque pour une documentation supplémentaire, voir https://rptl.io/pico-get-started
$ picotool help
PICOTOOL:
Tool for interacting with RP2040/RP2350 device(s) in BOOTSEL mode, or with an RP2040/RP2350 binary
SYNOPSIS:
picotool info [-b] [-p] [-d] [--debug] [-l] [-a] [device-selection]
picotool info [-b] [-p] [-d] [--debug] [-l] [-a] [-t ]
picotool config [-s ] [-g ] [device-selection]
picotool config [-s ] [-g ] [-t ]
picotool load [-p] [-n] [-N] [-u] [-v] [-x] [-t ] [-o ] [device-selection]
picotool encrypt [--quiet] [--verbose] [--hash] [--sign] [-t ] [-o ] [-t ] [-t ] [] [-t ]
picotool seal [--quiet] [--verbose] [--hash] [--sign] [--clear] [-t ] [-o ] [-t ] [] [-t ] [] [-t ] [--major ] [--minor ] [--rollback [..]]
picotool link [--quiet] [--verbose] [-t ] [-t ] [-t ] [] [-t ] [-p]
picotool save [-p] [device-selection]
picotool save -a [device-selection]
picotool save -r [device-selection]
picotool verify [device-selection]
picotool reboot [-a] [-u] [-g ] [-c ] [device-selection]
picotool otp list|get|set|load|dump|permissions|white-label
picotool partition info|create
picotool uf2 info|convert
picotool version [-s] []
picotool coprodis [--quiet] [--verbose] [-t ] [-t ]
picotool help []
COMMANDS:
info Display information from the target device(s) or file.
Without any arguments, this will display basic information for all connected RP2040 devices in BOOTSEL mode
config Display or change program configuration settings from the target device(s) or file.
load Load the program / memory range stored in a file onto the device.
encrypt Encrypt the program.
seal Add final metadata to a binary, optionally including a hash and/or signature.
link Link multiple binaries into one block loop.
save Save the program / memory stored in flash on the device to a file.
verify Check that the device contents match those in the file.
reboot Reboot the device
otp Commands related to the RP2350 OTP (One-Time-Programmable) Memory
partition Commands related to RP2350 Partition Tables
uf2 Commands related to UF2 creation and status
version Display picotool version
coprodis Post-process coprocessor instructions in dissassembly files.
help Show general help or help for a specific command
Use "picotool help " for more info
Notez que les commandes qui n'agissent pas sur les fichiers nécessitent la connexion d'un périphérique en mode BOOTSEL.
Il s'agit d'une prise en charge des informations binaires dans le SDK qui permet de stocker facilement des informations compactes que picotool
peut trouver (voir la section Informations binaires ci-dessous). La commande info permet de lire ces informations.
Les informations peuvent être soit lues depuis un ou plusieurs appareils connectés en mode BOOTSEL, soit depuis un fichier. Ce fichier peut être un fichier ELF, un UF2 ou un fichier BIN.
$ picotool help info
INFO:
Display information from the target device(s) or file.
Without any arguments, this will display basic information for all connected RP2040 devices in BOOTSEL mode
SYNOPSIS:
picotool info [-b] [-p] [-d] [--debug] [-l] [-a] [device-selection]
picotool info [-b] [-p] [-d] [--debug] [-l] [-a] [-t ]
OPTIONS:
Information to display
-b, --basic
Include basic information. This is the default
-p, --pins
Include pin information
-d, --device
Include device information
--debug
Include device debug information
-l, --build
Include build attributes
-a, --all
Include all information
TARGET SELECTION:
To target one or more connected RP2040 device(s) in BOOTSEL mode (the default)
--bus
Filter devices by USB bus number
--address
Filter devices by USB device address
--vid
Filter by vendor id
--pid
Filter by product id
--ser
Filter by serial number
-f, --force
Force a device not in BOOTSEL mode but running compatible code to reset so the command can be executed. After executing the
command (unless the command itself is a 'reboot') the device will be rebooted back to application mode
-F, --force-no-reboot
Force a device not in BOOTSEL mode but running compatible code to reset so the command can be executed. After executing the
command (unless the command itself is a 'reboot') the device will be left connected and accessible to picotool, but without the
RPI-RP2 drive mounted
To target a file
The file name
-t
Specify file type (uf2 | elf | bin) explicitly, ignoring file extension
Notez que les arguments -f varient légèrement pour les plates-formes Windows et macOS/Unix.
par exemple
$ picotool info Nom des informations sur le programme : hello_world fonctionnalités : sortie standard vers UART
$ picotool info -a
Program Information
name: hello_world
features: stdout to UART
binary start: 0x10000000
binary end: 0x1000606c
Fixed Pin Information
20: UART1 TX
21: UART1 RX
Build Information
build date: Dec 31 2020
build attributes: Debug build
Device Information
flash size: 2048K
ROM version: 2
$ picotool info -bp Nom des informations sur le programme : hello_world fonctionnalités : sortie standard vers UART
Informations sur les broches fixes 20 : UART1 TX 21 : UART1 RX
$ picotool info -a lcd_1602_i2c.uf2
File lcd_1602_i2c.uf2:
Program Information
name: lcd_1602_i2c
web site: https://github.com/raspberrypi/pico-examples/tree/HEAD/i2c/lcd_1602_i2c
binary start: 0x10000000
binary end: 0x10003c1c
Fixed Pin Information
4: I2C0 SDA
5: I2C0 SCL
Build Information
build date: Dec 31 2020
Config vous permet de configurer les informations binaires sur un appareil, si elles sont configurables. Plus précisément, vous pouvez configurer bi_ptr_int32
et bi_ptr_string
.
$ picotool help config
CONFIG:
Display or change program configuration settings from the target device(s) or file.
SYNOPSIS:
picotool config [-s ] [-g ] [device-selection]
picotool config [-s ] [-g ] [-t ]
OPTIONS:
Variable name
New value
-g
Filter by feature group
TARGET SELECTION:
To target one or more connected RP2040 device(s) in BOOTSEL mode (the default)
--bus
Filter devices by USB bus number
--address
Filter devices by USB device address
--vid
Filter by vendor id
--pid
Filter by product id
--ser
Filter by serial number
-f, --force
Force a device not in BOOTSEL mode but running compatible code to reset so the command can be executed. After executing the
command (unless the command itself is a 'reboot') the device will be rebooted back to application mode
-F, --force-no-reboot
Force a device not in BOOTSEL mode but running compatible code to reset so the command can be executed. After executing the
command (unless the command itself is a 'reboot') the device will be left connected and accessible to picotool, but without the
RPI-RP2 drive mounted
To target a file
The file name
-t
Specify file type (uf2 | elf | bin) explicitly, ignoring file extension
$ picotool config
n = 5
name = "Billy"
nonconst_pins:
default_pin = 3
default_name = "My First Pin"
$ picotool config -g nonconst_pins
nonconst_pins:
default_pin = 3
default_name = "My First Pin"
$ picotool config -s name Jane
name = "Billy"
setting name -> "Jane"
$ picotool config
n = 5
name = "Jane"
nonconst_pins:
default_pin = 3
default_name = "My First Pin"
load
vous permet d'écrire des données à partir d'un fichier sur l'appareil (soit en écrivant sur flash, soit en RAM)
$ picotool help load
LOAD:
Load the program / memory range stored in a file onto the device.
SYNOPSIS:
picotool load [--ignore-partitions] [--family ] [-p ] [-n] [-N] [-u] [-v] [-x] [-t ] [-o
] [device-selection]
OPTIONS:
Post load actions
--ignore-partitions
When writing flash data, ignore the partition table and write to absolute space
--family
Specify the family ID of the file to load
family id to use for load
-p, --partition
Specify the partition to load into
partition to load into
-n, --no-overwrite
When writing flash data, do not overwrite an existing program in flash. If picotool cannot determine the size/presence of the
program in flash, the command fails
-N, --no-overwrite-unsafe
When writing flash data, do not overwrite an existing program in flash. If picotool cannot determine the size/presence of the
program in flash, the load continues anyway
-u, --update
Skip writing flash sectors that already contain identical data
-v, --verify
Verify the data was written correctly
-x, --execute
Attempt to execute the downloaded file as a program after the load
File to load from
The file name
-t
Specify file type (uf2 | elf | bin) explicitly, ignoring file extension
BIN file options
-o, --offset
Specify the load address for a BIN file
Load offset (memory address; default 0x10000000)
Target device selection
--bus
Filter devices by USB bus number
--address
Filter devices by USB device address
--vid
Filter by vendor id
--pid
Filter by product id
--ser
Filter by serial number
-f, --force
Force a device not in BOOTSEL mode but running compatible code to reset so the command can be executed. After executing the
command (unless the command itself is a 'reboot') the device will be rebooted back to application mode
-F, --force-no-reboot
Force a device not in BOOTSEL mode but running compatible code to reset so the command can be executed. After executing the
command (unless the command itself is a 'reboot') the device will be left connected and accessible to picotool, but without the
RPI-RP2 drive mounted
par exemple
$ picotool load blink.uf2
Loading into Flash: [==============================] 100%
save
vous permet de sauvegarder une plage de RAM, le programme en flash, ou une plage explicite de flash de l'appareil dans un fichier BIN ou un fichier UF2.
$ picotool help save
SAVE:
Save the program / memory stored in flash on the device to a file.
SYNOPSIS:
picotool save [-p] [device-selection]
picotool save -a [device-selection]
picotool save -r [device-selection]
OPTIONS:
Selection of data to save
-p, --program
Save the installed program only. This is the default
-a, --all
Save all of flash memory
-r, --range
Save a range of memory. Note that UF2s always store complete 256 byte-aligned blocks of 256 bytes, and the range is expanded
accordingly
The lower address bound in hex
The upper address bound in hex
Source device selection
--bus
Filter devices by USB bus number
--address
Filter devices by USB device address
--vid
Filter by vendor id
--pid
Filter by product id
--ser
Filter by serial number
-f, --force
Force a device not in BOOTSEL mode but running compatible code to reset so the command can be executed. After executing the
command (unless the command itself is a 'reboot') the device will be rebooted back to application mode
-F, --force-no-reboot
Force a device not in BOOTSEL mode but running compatible code to reset so the command can be executed. After executing the
command (unless the command itself is a 'reboot') the device will be left connected and accessible to picotool, but without the
RPI-RP2 drive mounted
File to save to
The file name
-t
Specify file type (uf2 | elf | bin) explicitly, ignoring file extension
par exemple, regardez d'abord ce qu'il y a sur l'appareil...
$ picotool info
Program Information
name: lcd_1602_i2c
web site: https://github.com/raspberrypi/pico-examples/tree/HEAD/i2c/lcd_1602_i2c
... en l'enregistrant dans un fichier ...
$ picotool save spoon.uf2
Saving file: [==============================] 100%
Wrote 51200 bytes to spoon.uf2
... et en regardant le fichier :
$ picotool info spoon.uf2
File spoon.uf2:
Program Information
name: lcd_1602_i2c
web site: https://github.com/raspberrypi/pico-examples/tree/HEAD/i2c/lcd_1602_i2c
seal
vous permet de signer et/ou de hacher un binaire à exécuter sur RP2350.
Par défaut, il signera simplement le binaire, mais cela peut être configuré avec les arguments --hash
et --no-sign
.
Votre clé de signature doit concerner la courbe secp256k1 , au format PEM. Vous pouvez créer un fichier .PEM avec :
openssl ecparam -name secp256k1 -genkey -out private.pem
$ picotool help seal
SEAL:
Add final metadata to a binary, optionally including a hash and/or signature.
SYNOPSIS:
picotool seal [--quiet] [--verbose] [--hash] [--sign] [--clear] [-t ] [-o ] [-t ] [] [-t
] [] [-t ] [--major ] [--minor ] [--rollback [..]]
OPTIONS:
--quiet
Don't print any output
--verbose
Print verbose output
--major
Add Major Version
--minor
Add Minor Version
--rollback [..]
Add Rollback Version
Configuration
--hash
Hash the file
--sign
Sign the file
--clear
Clear all of SRAM on load
File to load from
The file name
-t
Specify file type (uf2 | elf | bin) explicitly, ignoring file extension
BIN file options
-o, --offset
Specify the load address for a BIN file
Load offset (memory address; default 0x10000000)
File to save to
The file name
-t
Specify file type (uf2 | elf | bin) explicitly, ignoring file extension
Key file
The file name
-t
Specify file type (pem) explicitly, ignoring file extension
File to save OTP to (will edit existing file if it exists)
The file name
-t
Specify file type (json) explicitly, ignoring file extension
encrypt
vous permet de chiffrer et de signer un binaire à utiliser sur le RP2350. Par défaut, il signera le binaire crypté, mais cela peut être configuré de la même manière que picotool sign
.
Le binaire crypté aura la structure suivante :
La clé AES doit être fournie sous forme de fichier .bin de la clé AES de 256 bits à utiliser pour le cryptage.
$ picotool help encrypt
ENCRYPT:
Encrypt the program.
SYNOPSIS:
picotool encrypt [--quiet] [--verbose] [--hash] [--sign] [-t ] [-o ] [-t ] [-t ]
[] [-t ]
OPTIONS:
--quiet
Don't print any output
--verbose
Print verbose output
Signing Configuration
--hash
Hash the encrypted file
--sign
Sign the encrypted file
File to load from
The file name
-t
Specify file type (uf2 | elf | bin) explicitly, ignoring file extension
BIN file options
-o, --offset
Specify the load address for a BIN file
Load offset (memory address; default 0x10000000)
File to save to
The file name
-t
Specify file type (uf2 | elf | bin) explicitly, ignoring file extension
AES Key
The file name
-t
Specify file type (bin) explicitly, ignoring file extension
Signing Key file
The file name
-t
Specify file type (pem) explicitly, ignoring file extension
Les commandes partition
vous permettent d'interagir avec les tables de partition sur les appareils RP2350, et également de les créer.
$ picotool help partition info
PARTITION INFO:
Print the device's partition table.
SYNOPSIS:
picotool partition info -m [device-selection]
OPTIONS:
-m [device-selection]
$ picotool partition info
un-partitioned_space : S(rw) NSBOOT(rw) NS(rw), uf2 { absolute }
partitions:
0(A) 00002000->00201000 S(rw) NSBOOT(rw) NS(rw), id=0000000000000000, "A", uf2 { rp2350-arm-s, rp2350-riscv }, arm_boot 1, riscv_boot 1
1(B w/ 0) 00201000->00400000 S(rw) NSBOOT(rw) NS(rw), id=0000000000000001, "B", uf2 { rp2350-arm-s, rp2350-riscv }, arm_boot 1, riscv_boot 1
$ picotool partition info -m rp2350-arm-s
un-partitioned_space : S(rw) NSBOOT(rw) NS(rw), uf2 { absolute }
partitions:
0(A) 00002000->00201000 S(rw) NSBOOT(rw) NS(rw), id=0000000000000000, "A", uf2 { rp2350-arm-s, rp2350-riscv }, arm_boot 1, riscv_boot 1
1(B w/ 0) 00201000->00400000 S(rw) NSBOOT(rw) NS(rw), id=0000000000000001, "B", uf2 { rp2350-arm-s, rp2350-riscv }, arm_boot 1, riscv_boot 1
Family id 'rp2350-arm-s' can be downloaded in partition 0:
00002000->00201000
Cette commande vous permet de créer des tables de partition et de les intégrer en outre dans la boucle de bloc s'il s'agit de fichiers ELF (par exemple, pour les chargeurs de démarrage). Par défaut, toutes les tables de partition sont hachées et vous pouvez également les signer.
$ picotool help partition create
PARTITION CREATE:
Create a partition table from json
SYNOPSIS:
picotool partition create [--quiet] [--verbose] [-t ] [-t ] [[-o ] [--family ]]
[] [-t ] [[--sign ] [-t ] [--no-hash] [--singleton]] [[--abs-block] []]
OPTIONS:
--quiet
Don't print any output
--verbose
Print verbose output
partition table JSON
The file name
-t
Specify file type (json) explicitly, ignoring file extension
output file
The file name
-t
Specify file type (uf2 | elf | bin) explicitly, ignoring file extension
UF2 output options
-o, --offset
Specify the load address for UF2 file output
Load offset (memory address; default 0x10000000)
--family
Specify the family if for UF2 file output
family id for UF2 (default absolute)
embed partition table into bootloader ELF
The file name
-t
Specify file type (elf) explicitly, ignoring file extension
Partition Table Options
--sign
The file name
-t
Specify file type (pem) explicitly, ignoring file extension
--no-hash
Don't hash the partition table
--singleton
Singleton partition table
Errata RP2350-E9 Fix
--abs-block
Enforce support for an absolute block
absolute block location (default to 0x10ffff00)
Les commandes uf2
permettent la création d'UF2 et cam fournissent des informations en cas d'échec d'un téléchargement d'UF2.
Cette commande remplace la fonctionnalité elf2uf2 qui figurait auparavant dans le SDK Raspberry Pi Pico. Il tentera de détecter automatiquement l'ID de la famille, mais si cela échoue, vous pouvez en spécifier un manuellement avec l'argument --family
.
picotool help uf2 convert
UF2 CONVERT:
Convert ELF/BIN to UF2.
SYNOPSIS:
picotool uf2 convert [--quiet] [--verbose] [-t ] [-t ] [-o ] [--family ]
[[--abs-block] []]
OPTIONS:
--quiet
Don't print any output
--verbose
Print verbose output
File to load from
The file name
-t
Specify file type (uf2 | elf | bin) explicitly, ignoring file extension
File to save UF2 to
The file name
-t
Specify file type (uf2) explicitly, ignoring file extension
Packaging Options
-o, --offset
Specify the load address
Load offset (memory address; default 0x10000000 for BIN file)
UF2 Family options
family id for UF2
Errata RP2350-E9 Fix
--abs-block
Add an absolute block
absolute block location (default to 0x10ffff00)
Cette commande lit les informations sur un appareil expliquant pourquoi un téléchargement d'UF2 a échoué. Il ne donnera des informations que si le téléchargement le plus récent a échoué.
$ picotool help uf2 info
UF2 INFO:
Print info about UF2 download.
SYNOPSIS:
picotool uf2 info [device-selection]
OPTIONS:
Target device selection
--bus
Filter devices by USB bus number
--address
Filter devices by USB device address
--vid
Filter by vendor id
--pid
Filter by product id
--ser
Filter by serial number
-f, --force
Force a device not in BOOTSEL mode but running compatible code to reset so the command can be executed. After executing the
command (unless the command itself is a 'reboot') the device will be rebooted back to application mode
-F, --force-no-reboot
Force a device not in BOOTSEL mode but running compatible code to reset so the command can be executed. After executing the
command (unless the command itself is a 'reboot') the device will be left connected and accessible to picotool, but without the
RPI-RP2 drive mounted
Les commandes otp
permettent d'interagir avec la mémoire OTP du RP2350. Ils ne sont pas disponibles sur les appareils RP2040, car le RP2040 n'a pas d'OTP.
Notez que la mémoire OTP est programmable une seule fois, ce qui signifie qu'une fois qu'un bit est passé de 0 à 1, il ne peut pas être rétabli. Par conséquent, il convient de faire preuve de prudence lors de l'utilisation de ces commandes, car elles risquent de détruire votre appareil RP2350. Par exemple, si vous définissez SECURE_BOOT_ENABLE mais ne définissez pas de clé de démarrage et désactivez l'interface PICOBOOT, votre appareil sera inutilisable.
Pour les commandes list
, set
, get
et load
, vous pouvez définir votre propre disposition OTP dans un fichier JSON et la transmettre avec l'argument -i
. Ces lignes seront ajoutées aux lignes par défaut lors de l'analyse.
$ picotool help otp
OTP:
Commands related to the RP2350 OTP (One-Time-Programmable) Memory
SYNOPSIS:
picotool otp list [-p] [-n] [-i ] [..]
picotool otp get [-c ] [-r] [-e] [-n] [-i ] [device-selection] [-z] [..]
picotool otp set [-c ] [-r] [-e] [-i ] [-z] [device-selection]
picotool otp load [-r] [-e] [-s ] [-i ] [-t ] [device-selection]
picotool otp dump [-r] [-e] [device-selection]
picotool otp permissions [-t ] [--led ] [--hash] [--sign] [] [-t ] [device-selection]
picotool otp white-label -s [-t ] [device-selection]
SUB COMMANDS:
list List matching known registers/fields
get Get the value of one or more OTP registers/fields (RP2350 only)
set Set the value of an OTP row/field (RP2350 only)
load Load the row range stored in a file into OTP and verify. Data is 2 bytes/row for ECC, 4 bytes/row for raw. (RP2350 only)
dump Dump entire OTP (RP2350 only)
permissions Set the OTP access permissions (RP2350 only)
white-label Set the white labelling values in OTP (RP2350 only)
Ces commandes définiront/obtiendront des lignes spécifiques d’OTP. Par défaut, ils écriront/lisront toutes les lignes redondantes, mais cela peut être remplacé avec l'argument -c
Cette commande permet de charger une plage de lignes OTP sur l'appareil. La source peut être un fichier binaire ou un fichier JSON tel que celui généré par picotool sign
. Par exemple, si vous souhaitez signer un binaire puis tester le démarrage sécurisé avec celui-ci, vous pouvez exécuter l'ensemble de commandes suivant :
$ picotool sign hello_world.elf hello_world.signed.elf private.pem otp.json
$ picotool load hello_world.signed.elf
$ picotool otp load otp.json
$ picotool reboot
Cette commande permet l'étiquetage blanc OTP, qui définit la configuration USB utilisée par l'appareil en mode BOOTSEL. Cela peut être configuré à partir d'un fichier JSON, dont un exemple se trouve dans sample-wl.json.
$ picotool help otp white-label
OTP WHITE-LABEL:
Set the white labelling values in OTP
SYNOPSIS:
picotool otp white-label -s [-t ] [device-selection]
OPTIONS:
File with white labelling values
The file name
-t
Specify file type (json) explicitly, ignoring file extension
Target device selection
--bus
Filter devices by USB bus number
--address
Filter devices by USB device address
--vid
Filter by vendor id
--pid
Filter by product id
--ser
Filter by serial number
-f, --force
Force a device not in BOOTSEL mode but running compatible code to reset so the command can be executed. After executing the
command (unless the command itself is a 'reboot') the device will be rebooted back to application mode
-F, --force-no-reboot
Force a device not in BOOTSEL mode but running compatible code to reset so the command can be executed. After executing the
command (unless the command itself is a 'reboot') the device will be left connected and accessible to picotool, but without the
RPI-RP2 drive mounted
$ picotool otp white-label -s 0x100 ../sample-wl.json
Setting attributes 20e0
0x2e8b, 0x000e, 0x0215, 0x0c09, 0x1090, 0x200c, 0x2615, 0x20e0, 0x310b, 0x3706, 0x3a04, 0x3c04, 0x3e21, 0x4f15, 0x5a0a, 0x5f0a, 0x007a, 0x00df, 0x6c34, 0xd83c, 0xdf4c, 0x0020, 0x0054, 0x0065, 0x0073, 0x0074, 0x0027, 0x0073,
0x0020, 0x0050, 0x0069, 0x0073, 0x6554, 0x7473, 0x5220, 0x3250, 0x3533, 0x3f30, 0x6f6e, 0x6e74, 0x6365, 0x7365, 0x6173, 0x6972, 0x796c, 0x6e61, 0x6d75, 0x6562, 0x0072, 0x6554, 0x7473, 0x6950, 0x4220, 0x6f6f, 0x0074, 0x6554,
0x7473, 0x6950, 0x794d, 0x6950, 0x3876, 0x3739, 0x7468, 0x7074, 0x3a73, 0x2f2f, 0x7777, 0x2e77, 0x6172, 0x7073, 0x6562, 0x7272, 0x7079, 0x2e69, 0x6f63, 0x2f6d, 0x656e, 0x7377, 0x002f, 0x6f53, 0x656d, 0x4e20, 0x7765, 0x2073,
0x6241, 0x756f, 0x2074, 0x7453, 0x6675, 0x0066, 0x794d, 0x5420, 0x7365, 0x2074, 0x6950, 0x5054, 0x2d49, 0x5052, 0x3332, 0x3035,
$ picotool reboot -u
$ lsusb -v -s 1:102
Bus 001 Device 102: ID 2e8b:000e zß水? Test's Pis Test RP2350?
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 2.10
bDeviceClass 0
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 64
idVendor 0x2e8b
idProduct 0x000e
bcdDevice 2.15
iManufacturer 1 zß水? Test's Pis
iProduct 2 Test RP2350?
iSerial 3 notnecessarilyanumber
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 0x0037
bNumInterfaces 2
bConfigurationValue 1
iConfiguration 0
bmAttributes 0xc0
Self Powered
MaxPower 64mA
...
Cette commande exécutera un binaire sur votre appareil afin de définir les autorisations OTP, car celles-ci ne sont pas directement accessibles depuis picotool
en raison des paramètres d'autorisations par défaut requis pour corriger l'errata XXX sur le RP2350. Comme il exécute un binaire, celui-ci doit être signé si le démarrage sécurisé est activé. Le binaire imprimera ce qu'il fait sur uart, qui peut être configuré à l'aide des arguments de configuration UART. Vous pouvez définir vos autorisations OTP dans un fichier json, dont un exemple se trouve dans sample-permissions.json.
$ picotool help otp permissions
OTP PERMISSIONS:
Set the OTP access permissions
SYNOPSIS:
picotool otp permissions [-t ] [--led ] [--hash] [--sign] [] [-t ] [device-selection]
OPTIONS:
File to load permissions from
The file name
-t
Specify file type (json) explicitly, ignoring file extension
--led
LED Pin to flash; default 25
Signing Configuration
--hash
Hash the executable
--sign
Sign the executable
Key file
The file name
-t
Specify file type (pem) explicitly, ignoring file extension
Target device selection
--bus
Filter devices by USB bus number
--address
Filter devices by USB device address
--vid
Filter by vendor id
--pid
Filter by product id
--ser
Filter by serial number
-f, --force
Force a device not in BOOTSEL mode but running compatible code to reset so the command can be executed. After executing the
command (unless the command itself is a 'reboot') the device will be rebooted back to application mode
-F, --force-no-reboot
Force a device not in BOOTSEL mode but running compatible code to reset so the command can be executed. After executing the
command (unless the command itself is a 'reboot') the device will be left connected and accessible to picotool, but without the
RPI-RP2 drive mounted
$ picotool otp permissions --sign private.pem --tx 46 ../sample-permissions.json
Picking file ./xip_ram_perms.elf
page10
page10 = 0
setting page10 -> 4063233
page11
page11 = 0
setting page11 -> 4128781
page12
page12 = 0
setting page12 -> 4128781
tx_pin = 0
setting tx_pin -> 46
Loading into XIP RAM: [==============================] 100%
>>> using flash update boot of 13ffc000
The device was rebooted to start the application.
Les informations binaires sont localisables par machine et généralement consommables par machine. Je dis de manière générale parce que n'importe qui peut inclure n'importe quelle information, et nous pouvons la distinguer des nôtres, mais c'est à lui de décider si ses données sont auto-descriptives.
Notez que nous ajouterons certainement plus d'informations binaires au fil du temps, mais j'aimerais obtenir un ensemble de base minimum inclus dans la plupart des binaires dès le lancement !!
Cette information est vraiment pratique lorsque vous récupérez un Pico et que vous ne savez pas ce qu'il y a dessus !
Les informations de base comprennent
Les informations binaires sont auto-descriptives/extensibles, les programmes peuvent donc inclure des informations dont picotool n'a pas connaissance (par exemple, MicroPython inclut une liste de bibliothèques intégrées)
C'est certainement pratique lorsque vous avez un exécutable appelé 'hello_world.elf' mais que vous avez oublié pour quelle carte il est conçu...
Les affectations de broches statiques (fixes) peuvent être enregistrées dans le binaire sous une forme très compacte :
$ picotool info --pins sprite_demo.elf
File sprite_demo.elf:
Fixed Pin Information
0-4: Red 0-4
6-10: Green 0-4
11-15: Blue 0-4
16: HSync
17: VSync
18: Display Enable
19: Pixel Clock
20: UART1 TX
21: UART1 RX
C'est très pratique si vous souhaitez pouvoir modifier les paramètres d'un binaire, sans avoir à le recompiler.
$ picotool config -s name Jane
name = "Billy"
setting name -> "Jane"
Les informations binaires sont déclarées dans le programme par des macros (viles macros déformées) ; pour l'exemple des épingles :
$ picotool info --pins sprite_demo.elf
File sprite_demo.elf:
Fixed Pin Information
0-4: Red 0-4
6-10: Green 0-4
11-15: Blue 0-4
16: HSync
17: VSync
18: Display Enable
19: Pixel Clock
20: UART1 TX
21: UART1 RX
... il y a une ligne dans la fonction setup_default_uart
:
bi_decl_if_func_used ( bi_2pins_with_func ( PICO_DEFAULT_UART_RX_PIN , PICO_DEFAULT_UART_TX_PIN , GPIO_FUNC_UART ));
Les deux numéros de broches et la fonction UART sont stockés, puis décodés en leurs noms de fonction réels (UART1 TX, etc.) par picotool. Le bi_decl_if_func_used
garantit que les informations binaires ne sont incluses que si la fonction conteneur est appelée.
De même, le code vidéo contient quelques lignes comme ceci :
bi_decl_if_func_used ( bi_pin_mask_with_name ( 0x1f << ( PICO_SCANVIDEO_COLOR_PIN_BASE + PICO_SCANVIDEO_DPI_PIXEL_RSHIFT ), "Red 0-4" ));
Pour l'exemple de configuration, vous mettez la ligne
bi_decl ( bi_ptr_string ( 0x1111 , 0x3333 , name , "Billy" , 128 ));
dans votre code, qui créera ensuite la variable name que vous pourrez ensuite imprimer. Les paramètres sont la balise, l'ID, le nom de la variable, la valeur par défaut et la longueur maximale de la chaîne.
printf ( "Name is %sn" , name );
Les choses sont conçues pour gaspiller le moins d'espace possible, mais vous pouvez tout désactiver avec la variable de préprocesseur PICO_NO_BINARY_INFO=1
. De plus, tout code SDK qui insère des informations binaires peut être exclu séparément par sa propre variable de préprocesseur.
Vous avez besoin
#include "pico/binary_info.h"
Fondamentalement, vous utilisez soit bi_decl(bi_blah(...))
pour l'inclusion inconditionnelle des informations binaires blah, soit bi_decl_if_func_used(bi_blah(...))
pour les informations binaires qui peuvent être supprimées si la fonction englobante n'est pas incluse dans le binaire par l'éditeur de liens (pensez --gc-sections
)
Il y a un tas de macros bi_ dans les en-têtes
#define bi_binary_end ( end ) ...
#define bi_program_name ( name ) ...
#define bi_program_description ( description ) ...
#define bi_program_version_string ( version_string ) ...
#define bi_program_build_date_string ( date_string ) ...
#define bi_program_url ( url ) ...
#define bi_program_feature ( feature ) ...
#define bi_program_build_attribute ( attr ) ...
#define bi_1pin_with_func ( p0 , func ) ...
#define bi_2pins_with_func ( p0 , p1 , func ) ...
#define bi_3pins_with_func ( p0 , p1 , p2 , func ) ...
#define bi_4pins_with_func ( p0 , p1 , p2 , p3 , func ) ...
#define bi_5pins_with_func ( p0 , p1 , p2 , p3 , p4 , func ) ...
#define bi_pin_range_with_func ( plo , phi , func ) ...
#define bi_pin_mask_with_name ( pmask , label ) ...
#define bi_pin_mask_with_names ( pmask , label ) ...
#define bi_1pin_with_name ( p0 , name ) ...
#define bi_2pins_with_names ( p0 , name0 , p1 , name1 ) ...
#define bi_3pins_with_names ( p0 , name0 , p1 , name1 , p2 , name2 ) ...
#define bi_4pins_with_names ( p0 , name0 , p1 , name1 , p2 , name2 , p3 , name3 ) ...
qui utilisent des macros sous-jacentes, par exemple
#define bi_program_url ( url ) bi_string(BINARY_INFO_TAG_RASPBERRY_PI, BINARY_INFO_ID_RP_PROGRAM_URL, url)
REMARQUE : Il est facile d'oublier de les inclure dans bi_decl
etc., c'est pourquoi un effort a été fait (au détriment de beaucoup de chatons) pour faire échouer la construction avec un message d'erreur quelque peu utile si vous le faites.
Par exemple, essayer de compiler
bi_1pin_with_name ( 0 , "Toaster activator" );
donne
/home/graham/dev/mu/pico_sdk/src/common/pico_binary_info/include/pico/binary_info/code.h:17:55: error: '_error_bi_is_missing_enclosing_decl_261' undeclared here (not in a function)
17 | #define __bi_enclosure_check_lineno_var_name __CONCAT(_error_bi_is_missing_enclosing_decl_,__LINE__)
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
... more macro call stack of doom
Vous pouvez utiliser
pico_set_program_name(foo "not foo" ) # as "foo" would be the default
pico_set_program_description(foo "this is a foo" )
pico_set_program_version(foo "0.00001a" )
pico_set_program_url(foo "www.plinth.com/foo" )
Notez que tous ces éléments sont transmis sous forme d'arguments de ligne de commande à la compilation, donc si vous prévoyez d'utiliser des guillemets, des nouvelles lignes, etc., vous aurez peut-être plus de chance de définir via bi_decl dans le code.
MicroPython et CircuitPython, éventuellement le SDK et d'autres peuvent prendre en charge un ou plusieurs périphériques de stockage en flash. Nous avons déjà des macros pour les définir bien que picotool ne fasse encore rien avec elles... mais la sauvegarde/restauration/copie de fichiers et même le montage de fusibles à l'avenir pourraient être intéressants.
Je suggère que nous les étiquetions maintenant...
C'est ce que j'ai en tête en ce moment (à l'époque)
#define bi_block_device ( _tag , _name , _offset , _size , _extra , _flags )
avec les données entrant dans
typedef struct __packed _binary_info_block_device {
struct _binary_info_core core ;
bi_ptr_of ( const char ) name ; // optional static name (independent of what is formatted)
uint32_t offset ;
uint32_t size ;
bi_ptr_of ( binary_info_t ) extra ; // additional info
uint16_t flags ;
} binary_info_block_device_t ;
et
enum {
BINARY_INFO_BLOCK_DEV_FLAG_READ = 1 << 0 , // if not readable, then it is basically hidden, but tools may choose to avoid overwriting it
BINARY_INFO_BLOCK_DEV_FLAG_WRITE = 1 << 1 ,
BINARY_INFO_BLOCK_DEV_FLAG_REFORMAT = 1 << 2 , // may be reformatted..
BINARY_INFO_BLOCK_DEV_FLAG_PT_UNKNOWN = 0 << 4 , // unknown free to look
BINARY_INFO_BLOCK_DEV_FLAG_PT_MBR = 1 << 4 , // expect MBR
BINARY_INFO_BLOCK_DEV_FLAG_PT_GPT = 2 << 4 , // expect GPT
BINARY_INFO_BLOCK_DEV_FLAG_PT_NONE = 3 << 4 , // no partition table
};
L’exécution de commandes avec -f/F
nécessite qu’un code compatible soit exécuté sur l’appareil. La définition du code compatible aux fins des binaires compilés à l'aide du pico-sdk est le code qui
-f/F
ne fonctionnera pas - à la place, vous pouvez définir la définition de compilation PICO_ENTER_USB_BOOT_ON_EXIT
pour redémarrer et être accessible à picotool une fois l'exécution de votre code terminée, par exemple avec target_compile_definitions( PRIVATE PICO_ENTER_USB_BOOT_ON_EXIT=1)
stdio_init_all()
et que vous avez pico_enable_stdio_usb( 1)
dans votre fichier CMakeLists.txt alors vous remplissez cette exigence (voir l'exemple hello_usb) Si vous ctrl+c au milieu d'une longue opération, alors libusb semble être un peu confus, ce qui signifie que nous ne pouvons pas déverrouiller notre verrouillage des écritures USB MSD (nous les avons désactivés pour que l'utilisateur ne le fasse pas). marcher sur leurs propres pieds). Il suffit d'exécuter à nouveau picotool info
pour le déverrouiller correctement la prochaine fois (ou vous pourrez redémarrer l'appareil).