環境で PICO_SDK_PATH を設定するか、 -DPICO_SDK_PATH=/path/to/pico-sdk
を使用して cmake に渡す必要があります。署名やハッシュなどの機能を使用するには、SDK の mbedtls サブモジュールがチェックアウトされていることを確認する必要があります。これは、SDK ディレクトリからこれを実行することで実行できます。
git submodule update --init lib/mbedtls
libusb-1.0
もインストールする必要があります。
お気に入りのパッケージ ツールを使用して依存関係をインストールします。たとえば、Ubuntu では次のようになります。
sudo apt install build-essential pkg-config libusb-1.0-0-dev cmake
次に、通常の CMake プロジェクトと同様に単純にビルドします。
mkdir build
cd build
cmake ..
make
Linux では、sudo を使用せずに picotool を実行するために udev ルールを追加できます。
sudo cp udev/99-picotool.rules /etc/udev/rules.d/
ここから libUSB をダウンロード https://libusb.info/
LIBUSB_ROOT 環境変数をインストール ディレクトリに設定します。
mkdir build
cd build
cmake -G "NMake Makefiles" ..
nmake
ここから libUSB をダウンロード https://libusb.info/
LIBUSB_ROOT 環境変数をインストール ディレクトリに設定します。
mkdir build
cd build
cmake ..
make
libusb を個別にダウンロードしたり、 LIBUSB_ROOT
を設定したりする必要はありません。
pacman -S $MINGW_PACKAGE_PREFIX-{toolchain,cmake,libusb}
mkdir build
cd build
cmake .. -DCMAKE_INSTALL_PREFIX=$MINGW_PREFIX
cmake --build .
Raspberry Pi Pico SDK (pico-sdk) バージョン 2.0.0 以降では、 picotool
使用して、以前は SDK のelf2uf2
ツールによって処理されていた ELF から UF2 への変換を実行します。 SDK は、バイナリのハッシュと署名にもpicotool
使用します。
SDK はプロジェクトごとに picotool をダウンロードできますが、複数のプロジェクトがある場合、またはビルド構成がある場合は、 picotool
の単一コピーをローカルにインストールすることをお勧めします。これは、 make install
またはcmake --install .
; SDK はデフォルトでこのインストールされたバージョンを使用します。
あるいは、次の方法でカスタム パスにインストールすることもできます。
cmake -DCMAKE_INSTALL_PREFIX=$MY_INSTALL_DIR -DPICOTOOL_FLAT_INSTALL=1 ..
SDK がこのカスタム パスでpicotool
見つけるには、 picotool_DIR
環境変数を設定するか、 -Dpicotool_DIR=$MY_INSTALL_DIR/picotool
cmake
コマンドに渡すか、または追加することによって、プロジェクト内でpicotool_DIR
変数を設定する必要があります。 set(picotool_DIR $MY_INSTALL_DIR/picotool)
CMakeLists.txt ファイルに設定します。
picotool
は、RP2040/RP2350 バイナリを操作し、BOOTSEL モードの場合に RP2040/RP2350 デバイスと対話するためのツールです。 ( picotool
のバージョン 1.1 では、 BOOTSEL モードではなく、 picotool
の-f
引数を使用して Raspberry Pi Pico SDK の USB stdio サポートを使用しているデバイスと対話することも可能です)。
追加のドキュメントについては、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
ファイルに作用しないコマンドを使用するには、BOOTSEL モードのデバイスが接続されている必要があることに注意してください。
SDK でのバイナリ情報のサポートにより、 picotool
見つけられるコンパクトな情報を簡単に保存できます (下記の「バイナリ情報」セクションを参照)。 info コマンドは、この情報を読み取るためのコマンドです。
情報は、BOOTSEL モードで 1 つ以上の接続されたデバイスから読み取ることも、ファイルから読み取ることもできます。このファイルは、ELF、UF2、または 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
-f 引数は、Windows プラットフォームと macOS / Unix プラットフォームで若干異なることに注意してください。
例えば
$ picotool info プログラム情報名: hello_world 機能: stdout から 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 プログラム情報名: hello_world 機能: stdout から UART へ
固定ピン情報 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 を使用してデバイスのバイナリ情報を構成できます。具体的には、 bi_ptr_int32
および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
ファイルからデバイスにデータを書き込むことができます (フラッシュまたは 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
例えば
$ picotool load blink.uf2
Loading into Flash: [==============================] 100%
save
使用すると、RAM の範囲、フラッシュ内のプログラム、またはデバイスからのフラッシュの明示的な範囲を BIN ファイルまたは 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
たとえば、まずデバイス上にあるものを確認します...
$ picotool info
Program Information
name: lcd_1602_i2c
web site: https://github.com/raspberrypi/pico-examples/tree/HEAD/i2c/lcd_1602_i2c
...ファイルに保存しています...
$ picotool save spoon.uf2
Saving file: [==============================] 100%
Wrote 51200 bytes to spoon.uf2
...そしてファイルを見てみると、
$ 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
、RP2350 で実行するバイナリに署名および/またはハッシュすることができます。
デフォルトでは、バイナリに署名するだけですが、これは--hash
および--no-sign
引数を使用して構成できます。
署名キーはsecp256k1曲線用の PEM 形式である必要があります。次のコマンドを使用して .PEM ファイルを作成できます。
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
使用すると、RP2350 で使用するバイナリを暗号化して署名できます。デフォルトでは、暗号化されたバイナリに署名しますが、 picotool sign
と同様に設定できます。
暗号化されたバイナリは次の構造になります。
AES キーは、暗号化に使用される 256 ビット AES キーの .bin ファイルとして提供する必要があります。
$ 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
partition
コマンドを使用すると、RP2350 デバイス上のパーティション テーブルを操作したり、パーティション テーブルを作成したりできます。
$ 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
このコマンドを使用すると、パーティション テーブルを作成し、ELF ファイル (ブートローダーなど) のブロック ループにさらに埋め込むことができます。デフォルトでは、すべてのパーティション テーブルはハッシュされており、署名することもできます。
$ 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)
uf2
コマンドを使用すると UF2 を作成でき、UF2 のダウンロードが失敗した場合に情報が提供されます。
このコマンドは、以前 Raspberry Pi Pico SDK にあった elf2uf2 機能を置き換えます。ファミリ ID の自動検出が試行されますが、失敗した場合は--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)
このコマンドは、UF2 ダウンロードが失敗した理由に関するデバイス上の情報を読み取ります。最新のダウンロードが失敗した場合にのみ情報が提供されます。
$ 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
otp
コマンドは、RP2350 OTP メモリと対話するためのものです。 RP2040 には OTP がないため、RP2040 デバイスでは使用できません。
OTP メモリは 1 回限りプログラム可能であることに注意してください。これは、ビットが 0 から 1 に変更されると、元に戻すことはできないことを意味します。したがって、これらのコマンドを使用する場合は、RP2350 デバイスがブリックする危険があるため、注意が必要です。たとえば、SECURE_BOOT_ENABLE を設定してもブート キーを設定せず、PICOBOOT インターフェイスを無効にすると、デバイスは使用できなくなります。
list
、 set
、 get
、およびload
コマンドの場合、JSON ファイルで独自の OTP レイアウトを定義し、それを-i
引数で渡すことができます。これらの行は、解析時にデフォルトの行に追加されます。
$ 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)
これらのコマンドは、OTP の特定の行を設定/取得します。デフォルトでは、すべての冗長行の書き込み/読み取りが行われますが、これは-c
引数でオーバーライドできます。
このコマンドを使用すると、一連の OTP 行をデバイスにロードできます。ソースはバイナリ ファイル、またはpicotool sign
によって出力されるような JSON ファイルにすることができます。たとえば、バイナリに署名し、それを使用してセキュア ブートをテストする場合は、次の一連のコマンドを実行できます。
$ 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
このコマンドにより、OTP ホワイトラベルが可能になり、デバイスが BOOTSEL モードで使用する USB 構成が設定されます。これは、JSON ファイルから構成できます。その例は、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
...
このコマンドは、OTP 権限を設定するためにデバイス上でバイナリを実行します。これは、RP2350 の errata XXX を修正するために必要なデフォルトの権限設定のため、 picotool
からこれらの権限に直接アクセスできないためです。バイナリを実行するため、セキュア ブートが有効になっている場合はバイナリに署名する必要があります。バイナリは、UART 上で実行していることを出力します。これは、UART 構成引数を使用して構成できます。 OTP 権限は json ファイルで定義できます。その例は、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.
バイナリ情報はマシンで検索可能であり、通常はマシンで消耗します。一般的にと言ったのは、誰もがあらゆる情報を含めることができ、それを私たちの情報から区別できるからですが、データを自己記述にするかどうかは彼ら次第だからです。
時間の経過とともにバイナリ情報は確実に追加されますが、リリース時からほとんどのバイナリに含まれる最小限のコア セットを入手したいと考えていることに注意してください。
Pico を手に取ったものの、何が入っているのかわからないときに、この情報は非常に便利です。
基本情報には次のものが含まれます
バイナリ情報は自己記述/拡張可能であるため、プログラムには picotool が認識していない情報が含まれる可能性があります (例: MicroPython には組み込みライブラリのリストが含まれます)。
これは、「hello_world.elf」という実行可能ファイルがあるものの、どのボード用に構築されたかを忘れてしまった場合に確かに便利です。
静的 (固定) ピン割り当ては、非常にコンパクトな形式でバイナリに記録できます。
$ 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
これは、バイナリを再コンパイルせずにバイナリ内のパラメータを変更できるようにしたい場合に非常に便利です。
$ picotool config -s name Jane
name = "Billy"
setting name -> "Jane"
バイナリ情報はマクロ (悪質なワープマクロ) によってプログラム内で宣言されます。ピンの例:
$ 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
... setup_default_uart
関数には次の 1 行があります。
bi_decl_if_func_used ( bi_2pins_with_func ( PICO_DEFAULT_UART_RX_PIN , PICO_DEFAULT_UART_TX_PIN , GPIO_FUNC_UART ));
2 つのピン番号と機能 UART が保存され、picotool によって実際の機能名 (UART1 TX など) にデコードされます。 bi_decl_if_func_used
は、バイナリ情報が含まれる関数が呼び出された場合にのみ含まれるようにします。
同様に、ビデオ コードには次のような数行が含まれています。
bi_decl_if_func_used ( bi_pin_mask_with_name ( 0x1f << ( PICO_SCANVIDEO_COLOR_PIN_BASE + PICO_SCANVIDEO_DPI_PIXEL_RSHIFT ), "Red 0-4" ));
設定例では、次の行を入れます。
bi_decl ( bi_ptr_string ( 0x1111 , 0x3333 , name , "Billy" , 128 ));
コードに追加すると、後で出力するための name 変数が作成されます。パラメータは、タグ、ID、変数名、デフォルト値、および最大文字列長です。
printf ( "Name is %sn" , name );
無駄なスペースをできるだけ少なくするように設計されていますが、プリプロセッサ変数PICO_NO_BINARY_INFO=1
を使用してすべてをオフにすることができます。さらに、バイナリ情報を挿入する SDK コードは、独自のプリプロセッサ変数によって個別に除外できます。
必要です
#include "pico/binary_info.h"
基本的には、バイナリ情報を無条件に含めるにはbi_decl(bi_blah(...))
を使用するか、バイナリ情報を囲む関数がバイナリに含まれていない場合に削除される可能性があるバイナリ情報にはbi_decl_if_func_used(bi_blah(...))
使用します。リンカー ( --gc-sections
考えてください)
ヘッダーには bi_ マクロがたくさんあります
#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 ) ...
基礎となるマクロを利用します。
#define bi_program_url ( url ) bi_string(BINARY_INFO_TAG_RASPBERRY_PI, BINARY_INFO_ID_RP_PROGRAM_URL, url)
注: これらをbi_decl
などで囲むのを忘れがちなので、囲った場合に役立つエラー メッセージを表示してビルドが失敗するように (多くの子猫を犠牲にして) 努力が払われました。
たとえば、コンパイルしようとすると、
bi_1pin_with_name ( 0 , "Toaster activator" );
与える
/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
使用できます
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" )
これらはすべてコマンド ライン引数としてコンパイルに渡されることに注意してください。そのため、引用符や改行などを使用する予定がある場合は、コード内で bi_decl を介して定義するとうまくいく可能性があります。
MicroPython と CircuitPython、最終的には SDK などがフラッシュ内の 1 つ以上のストレージ デバイスをサポートする可能性があります。これらを定義するためのマクロはすでにありますが、picotool はまだ何も実行しません...しかし、将来的にはバックアップ/復元/ファイル コピー、さらにはヒューズ マウントも興味深いかもしれません。
今すぐタグ付けすることをお勧めします...
これが今私の頭の中にあるものです(当時)
#define bi_block_device ( _tag , _name , _offset , _size , _extra , _flags )
データが入る
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 ;
そして
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/F
を指定してコマンドを実行するには、互換性のあるコードがデバイス上で実行されている必要があります。 pico-sdk を使用してコンパイルされたバイナリの互換性のあるコードの定義は、次のコードです。
-f/F
による再起動は機能しません。代わりに、コードの実行が終了したら再起動し、picotool にアクセスできるようにコンパイル定義PICO_ENTER_USB_BOOT_ON_EXIT
を設定できます (たとえば、 target_compile_definitions( PRIVATE PICO_ENTER_USB_BOOT_ON_EXIT=1)
stdio_init_all()
を呼び出し、CMakeLists.txt ファイルにpico_enable_stdio_usb( 1)
がある場合、この要件を満たします (hello_usb の例を参照)。長い操作の途中で Ctrl+C を押すと、libusb が少し混乱するようです。これは、USB MSD 書き込みのロックアウトを解除できないことを意味します (ユーザーがロックアウトできないようにロックアウトをオフにしました)自分の足でつま先を踏みます)。 picotool info
再度実行するだけで、次回は適切にロックが解除されます (またはデバイスを再起動できます)。