Sie müssen PICO_SDK_PATH in der Umgebung festlegen oder es mit -DPICO_SDK_PATH=/path/to/pico-sdk
an cmake übergeben. Um Funktionen wie Signieren oder Hashing nutzen zu können, müssen Sie sicherstellen, dass das mbedtls-Submodul im SDK ausgecheckt ist. Dies können Sie erreichen, indem Sie es in Ihrem SDK-Verzeichnis ausführen.
git submodule update --init lib/mbedtls
Sie müssen außerdem libusb-1.0
installieren.
Verwenden Sie Ihr bevorzugtes Pakettool, um Abhängigkeiten zu installieren. Zum Beispiel unter Ubuntu:
sudo apt install build-essential pkg-config libusb-1.0-0-dev cmake
Dann einfach wie ein normales CMake-Projekt erstellen:
mkdir build
cd build
cmake ..
make
Unter Linux können Sie udev-Regeln hinzufügen, um picotool ohne sudo auszuführen:
sudo cp udev/99-picotool.rules /etc/udev/rules.d/
Laden Sie libUSB hier herunter: https://libusb.info/
Setzen Sie die Umgebungsvariable LIBUSB_ROOT auf das Installationsverzeichnis.
mkdir build
cd build
cmake -G "NMake Makefiles" ..
nmake
Laden Sie libUSB hier herunter: https://libusb.info/
Setzen Sie die Umgebungsvariable LIBUSB_ROOT auf das Installationsverzeichnis.
mkdir build
cd build
cmake ..
make
Sie müssen libusb nicht separat herunterladen oder LIBUSB_ROOT
festlegen.
pacman -S $MINGW_PACKAGE_PREFIX-{toolchain,cmake,libusb}
mkdir build
cd build
cmake .. -DCMAKE_INSTALL_PREFIX=$MINGW_PREFIX
cmake --build .
Das Raspberry Pi Pico SDK (pico-sdk) Version 2.0.0 und höher verwendet picotool
um die ELF-zu-UF2-Konvertierung durchzuführen, die zuvor vom elf2uf2
Tool im SDK durchgeführt wurde. Das SDK verwendet auch picotool
zum Hashen und Signieren von Binärdateien.
Während das SDK Picotool einzeln pro Projekt herunterladen kann, ist es bei mehreren Projekten oder Build-Konfigurationen vorzuziehen, eine einzelne Kopie von picotool
lokal zu installieren. Dies geht am einfachsten mit make install
oder cmake --install .
; Das SDK verwendet standardmäßig diese installierte Version.
Alternativ können Sie die Installation auch in einem benutzerdefinierten Pfad durchführen:
cmake -DCMAKE_INSTALL_PREFIX=$MY_INSTALL_DIR -DPICOTOOL_FLAT_INSTALL=1 ..
Damit das SDK picotool
in diesem benutzerdefinierten Pfad findet, müssen Sie die Variable picotool_DIR
in Ihrem Projekt festlegen, indem Sie entweder die Umgebungsvariable picotool_DIR
festlegen, -Dpicotool_DIR=$MY_INSTALL_DIR/picotool
an Ihren cmake
-Befehl übergeben oder hinzufügen set(picotool_DIR $MY_INSTALL_DIR/picotool)
auf Ihre CMakeLists.txt-Datei.
picotool
ist ein Tool zum Arbeiten mit RP2040/RP2350-Binärdateien und zur Interaktion mit RP2040/RP2350-Geräten, wenn diese sich im BOOTSEL-Modus befinden. (Ab Version 1.1 von picotool
ist es auch möglich, mit Geräten zu interagieren, die sich nicht im BOOTSEL-Modus befinden, aber USB-Stdio-Unterstützung vom Raspberry Pi Pico SDK verwenden, indem Sie das Argument -f
von picotool
verwenden.)
Hinweis: Weitere Dokumentation finden Sie unter 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
Beachten Sie, dass Befehle, die sich nicht auf Dateien auswirken, die Verbindung eines Geräts im BOOTSEL-Modus erfordern.
Die Unterstützung für Binärinformationen im SDK ermöglicht das einfache Speichern kompakter Informationen, die picotool
finden kann (siehe Abschnitt „Binärinformationen“ unten). Der Befehl info dient zum Auslesen dieser Informationen.
Die Informationen können entweder von einem oder mehreren angeschlossenen Geräten im BOOTSEL-Modus oder aus einer Datei gelesen werden. Diese Datei kann eine ELF-, eine UF2- oder eine BIN-Datei sein.
$ 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
Beachten Sie, dass die -f-Argumente für Windows- und macOS-/Unix-Plattformen leicht variieren.
z.B
$ picotool info Programminformationsname: hello_world Funktionen: stdout zu 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 Programminformationsname: hello_world Funktionen: stdout zu UART
Feste Pin-Informationen 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
Mit Config können Sie die Binärinformationen auf einem Gerät konfigurieren, sofern diese konfigurierbar sind. Insbesondere können Sie bi_ptr_int32
und bi_ptr_string
konfigurieren.
$ 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
können Sie Daten aus einer Datei auf das Gerät schreiben (entweder in den Flash oder in den 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
z.B
$ picotool load blink.uf2
Loading into Flash: [==============================] 100%
save
können Sie einen RAM-Bereich, das Programm im Flash oder einen expliziten Flash-Bereich vom Gerät in einer BIN-Datei oder einer UF2-Datei speichern.
$ 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
z. B. zuerst schauen, was auf dem Gerät ist...
$ picotool info
Program Information
name: lcd_1602_i2c
web site: https://github.com/raspberrypi/pico-examples/tree/HEAD/i2c/lcd_1602_i2c
... in einer Datei speichern ...
$ picotool save spoon.uf2
Saving file: [==============================] 100%
Wrote 51200 bytes to spoon.uf2
... und schaue mir die Datei an:
$ 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
können Sie eine Binärdatei signieren und/oder hashen, um sie auf RP2350 auszuführen.
Standardmäßig wird nur die Binärdatei signiert, dies kann jedoch mit den Argumenten --hash
und --no-sign
konfiguriert werden.
Ihr Signaturschlüssel muss für die Kurve secp256k1 im PEM-Format vorliegen. Sie können eine .PEM-Datei erstellen mit:
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
können Sie eine Binärdatei zur Verwendung auf dem RP2350 verschlüsseln und signieren. Standardmäßig wird die verschlüsselte Binärdatei signiert, dies kann jedoch ähnlich wie bei picotool sign
konfiguriert werden.
Die verschlüsselte Binärdatei hat die folgende Struktur:
Der AES-Schlüssel muss als .bin-Datei des 256-Bit-AES-Schlüssels bereitgestellt werden, der für die Verschlüsselung verwendet werden soll.
$ 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
Mit den partition
können Sie mit den Partitionstabellen auf RP2350-Geräten interagieren und diese auch erstellen.
$ 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
Mit diesem Befehl können Sie Partitionstabellen erstellen und diese zusätzlich in die Blockschleife von ELF-Dateien einbetten (z. B. für Bootloader). Standardmäßig werden alle Partitionstabellen gehasht und Sie können sie auch signieren.
$ 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)
Die uf2
-Befehle ermöglichen die Erstellung von UF2s und Cam stellt Informationen bereit, wenn ein UF2-Download fehlgeschlagen ist.
Dieser Befehl ersetzt die elf2uf2-Funktionalität, die zuvor im Raspberry Pi Pico SDK enthalten war. Es wird versucht, die Familien-ID automatisch zu erkennen. Wenn dies jedoch fehlschlägt, können Sie eine manuell mit dem Argument --family
angeben.
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)
Dieser Befehl liest die Informationen auf einem Gerät darüber, warum ein UF2-Download fehlgeschlagen ist. Es werden nur Informationen angezeigt, wenn der letzte Download fehlgeschlagen ist.
$ 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
Die otp
-Befehle dienen der Interaktion mit dem RP2350-OTP-Speicher. Sie sind auf RP2040-Geräten nicht verfügbar, da RP2040 kein OTP hat.
Beachten Sie, dass der OTP-Speicher einmalig programmierbar ist, was bedeutet, dass ein einmal geändertes Bit von 0 auf 1 nicht mehr zurück geändert werden kann. Daher ist bei der Verwendung dieser Befehle Vorsicht geboten, da die Gefahr besteht, dass Ihr RP2350-Gerät beschädigt wird. Wenn Sie beispielsweise SECURE_BOOT_ENABLE festlegen, aber keinen Startschlüssel festlegen und die PICOBOOT-Schnittstelle deaktivieren, ist Ihr Gerät unbrauchbar.
Für die Befehle list
, set
, get
und „ load
können Sie Ihr eigenes OTP-Layout in einer JSON-Datei definieren und dieses mit dem Argument -i
übergeben. Diese Zeilen werden beim Parsen zu den Standardzeilen hinzugefügt.
$ 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)
Mit diesen Befehlen werden bestimmte OTP-Zeilen festgelegt/abgerufen. Standardmäßig schreiben/lesen sie alle redundanten Zeilen, dies kann jedoch mit dem Argument -c
überschrieben werden
Dieser Befehl ermöglicht das Laden einer Reihe von OTP-Zeilen auf das Gerät. Die Quelle kann eine Binärdatei oder eine JSON-Datei sein, wie sie beispielsweise von picotool sign
ausgegeben wird. Wenn Sie beispielsweise eine Binärdatei signieren und dann den sicheren Start damit testen möchten, können Sie den folgenden Befehlssatz ausführen:
$ 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
Dieser Befehl ermöglicht OTP-White-Labeling, das die vom Gerät verwendete USB-Konfiguration im BOOTSEL-Modus festlegt. Dies kann über eine JSON-Datei konfiguriert werden, ein Beispiel dafür finden Sie in „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
...
Dieser Befehl führt eine Binärdatei auf Ihrem Gerät aus, um die OTP-Berechtigungen festzulegen, da diese aufgrund der Standardberechtigungseinstellungen, die zum Beheben von Errata XXX auf RP2350 erforderlich sind, von picotool
aus nicht direkt zugänglich sind. Da eine Binärdatei ausgeführt wird, muss die Binärdatei signiert werden, wenn der sichere Start aktiviert ist. Die Binärdatei gibt über UART aus, was sie tut. Dies kann mithilfe der UART-Konfigurationsargumente konfiguriert werden. Sie können Ihre OTP-Berechtigungen in einer JSON-Datei definieren, ein Beispiel dafür finden Sie in „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.
Binäre Informationen sind maschinell lokalisierbar und im Allgemeinen maschinell verbrauchbar. Ich sage allgemein, weil jeder beliebige Informationen einbeziehen kann und wir sie von unseren unterscheiden können, aber es liegt an ihnen, ob sie ihre Daten selbstbeschreibend gestalten.
Beachten Sie, dass wir im Laufe der Zeit sicherlich weitere Binärinformationen hinzufügen werden, aber ich möchte, dass in den meisten Binärdateien ab dem Start ein Mindestkernsatz enthalten ist!!
Diese Informationen sind wirklich praktisch, wenn Sie einen Pico in die Hand nehmen und nicht wissen, was sich darauf befindet!
Grundlegende Informationen umfassen
Die Binärinformationen sind selbstbeschreibend/erweiterbar, sodass Programme Informationen enthalten können, die Picotool nicht kennt (z. B. enthält MicroPython eine Liste integrierter Bibliotheken).
Dies ist sicherlich praktisch, wenn Sie eine ausführbare Datei namens „hello_world.elf“ haben, aber vergessen haben, für welches Board sie erstellt wurde ...
Statische (feste) Pinbelegungen können in sehr kompakter Form binär erfasst werden:
$ 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
Dies ist sehr praktisch, wenn Sie Parameter in einer Binärdatei ändern möchten, ohne sie neu kompilieren zu müssen.
$ picotool config -s name Jane
name = "Billy"
setting name -> "Jane"
Binäre Informationen werden im Programm durch Makros (bösartig verzerrte Makros) deklariert; für das Pins-Beispiel:
$ 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
... es gibt eine Zeile in der Funktion 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 ));
Die beiden Pin-Nummern und der Funktions-UART werden gespeichert und dann von picotool in ihre tatsächlichen Funktionsnamen (UART1 TX usw.) dekodiert. Der bi_decl_if_func_used
stellt sicher, dass die Binärinformationen nur dann einbezogen werden, wenn die enthaltende Funktion aufgerufen wird.
Ebenso enthält der Videocode einige Zeilen wie diese:
bi_decl_if_func_used ( bi_pin_mask_with_name ( 0x1f << ( PICO_SCANVIDEO_COLOR_PIN_BASE + PICO_SCANVIDEO_DPI_PIXEL_RSHIFT ), "Red 0-4" ));
Für das Konfigurationsbeispiel geben Sie die Zeile ein
bi_decl ( bi_ptr_string ( 0x1111 , 0x3333 , name , "Billy" , 128 ));
in Ihren Code ein, der dann die Namensvariable erstellt, die Sie anschließend ausdrucken können. Die Parameter sind das Tag, die ID, der Variablenname, der Standardwert und die maximale Stringlänge.
printf ( "Name is %sn" , name );
Die Dinge sind darauf ausgelegt, so wenig Platz wie möglich zu verschwenden, aber Sie können alles mit der Präprozessorvariablen PICO_NO_BINARY_INFO=1
deaktivieren. Darüber hinaus kann jeder SDK-Code, der Binärinformationen einfügt, durch seine eigene Präprozessorvariable separat ausgeschlossen werden.
Du brauchst
#include "pico/binary_info.h"
Grundsätzlich verwenden Sie entweder bi_decl(bi_blah(...))
für die bedingungslose Einbindung der binären Informationen blah oder bi_decl_if_func_used(bi_blah(...))
für binäre Informationen, die möglicherweise entfernt werden, wenn die einschließende Funktion nicht in die Binärdatei einbezogen wird der Linker (denken Sie --gc-sections
)
Es gibt eine Reihe von bi_-Makros in den Kopfzeilen
#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 ) ...
die zugrunde liegende Makros nutzen, z
#define bi_program_url ( url ) bi_string(BINARY_INFO_TAG_RASPBERRY_PI, BINARY_INFO_ID_RP_PROGRAM_URL, url)
HINWEIS: Es kann leicht passieren, dass man vergisst, diese in bi_decl
usw. einzuschließen. Deshalb wurde versucht (auf Kosten vieler Kittens), den Build mit einer einigermaßen hilfreichen Fehlermeldung fehlschlagen zu lassen, wenn Sie dies tun.
Versuchen Sie zum Beispiel zu kompilieren
bi_1pin_with_name ( 0 , "Toaster activator" );
gibt
/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
Sie können verwenden
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" )
Beachten Sie, dass alle diese als Befehlszeilenargumente an die Kompilierung übergeben werden. Wenn Sie also Anführungszeichen, Zeilenumbrüche usw. verwenden möchten, ist die Definition über bi_decl im Code möglicherweise besser.
MicroPython und CircuitPython, schließlich das SDK und andere unterstützen möglicherweise ein oder mehrere Speichergeräte in Flash. Wir haben bereits Makros, um diese zu definieren, obwohl Picotool noch nichts damit macht ... aber Backup/Wiederherstellung/Dateikopie und sogar das Mounten von Sicherungen in der Zukunft könnten interessant sein.
Ich schlage vor, dass wir diese jetzt markieren ...
Das ist es, was mir (damals) gerade so durch den Kopf geht.
#define bi_block_device ( _tag , _name , _offset , _size , _extra , _flags )
mit den Daten, die hineingehen
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 ;
Und
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
};
Für die Ausführung von Befehlen mit -f/F
muss kompatibler Code auf dem Gerät ausgeführt werden. Die Definition von kompatiblem Code für die Zwecke von Binärdateien, die mit dem Pico-SDK kompiliert wurden, ist Code, der
-f/F
nicht. Stattdessen können Sie die Kompilierungsdefinition PICO_ENTER_USB_BOOT_ON_EXIT
so einstellen, dass sie neu startet und für picotool zugänglich ist, sobald die Ausführung Ihres Codes abgeschlossen ist, beispielsweise mit target_compile_definitions( PRIVATE PICO_ENTER_USB_BOOT_ON_EXIT=1)
stdio_init_all()
aufruft und Sie pico_enable_stdio_usb( 1)
in Ihrer CMakeLists.txt-Datei haben, dann erfüllen Sie diese Anforderung (siehe das hello_usb-Beispiel). Wenn Sie mitten in einem langen Vorgang Strg+C drücken, scheint libusb etwas verwirrt zu sein, was bedeutet, dass wir unsere Sperre für USB-MSD-Schreibvorgänge nicht aufheben können (wir haben sie deaktiviert, damit der Benutzer dies nicht tut). auf eigene Faust treten). Durch einfaches erneutes Ausführen picotool info
wird es beim nächsten Mal ordnungsgemäß entsperrt (oder Sie können das Gerät neu starten).