환경에서 PICO_SDK_PATH를 설정하거나 -DPICO_SDK_PATH=/path/to/pico-sdk
사용하여 cmake에 전달해야 합니다. 서명이나 해싱과 같은 기능을 사용하려면 SDK의 mbedtls 하위 모듈이 체크아웃되어 있는지 확인해야 합니다. 이는 SDK 디렉터리에서 실행하여 수행할 수 있습니다.
git submodule update --init lib/mbedtls
libusb-1.0
도 설치해야 합니다.
선호하는 패키지 도구를 사용하여 종속성을 설치하세요. 예를 들어 우분투에서는 다음과 같습니다.
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/
여기 https://libusb.info/에서 libUSB를 다운로드하세요.
LIBUSB_ROOT 환경 변수를 설치 디렉터리로 설정합니다.
mkdir build
cd build
cmake -G "NMake Makefiles" ..
nmake
여기 https://libusb.info/에서 libUSB를 다운로드하세요.
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)
.
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 모드의 장치가 연결되어 있어야 합니다.
picotool
찾을 수 있는 압축 정보를 쉽게 저장할 수 있는 SDK의 바이너리 정보 지원입니다(아래 바이너리 정보 섹션 참조). info 명령은 이 정보를 읽기 위한 것입니다.
정보는 BOOTSEL 모드의 하나 이상의 연결된 장치 또는 파일에서 읽을 수 있습니다. 이 파일은 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 to 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 to 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
인수를 사용하여 구성할 수 있습니다.
서명 키는 PEM 형식의 secp256k1 곡선용이어야 합니다. 다음을 사용하여 .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 다운로드가 실패한 경우 cam은 정보를 제공합니다.
이 명령은 이전에 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 메모리는 일회성 프로그래밍이 가능합니다. 즉, 비트가 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
이 명령은 BOOTSEL 모드에서 장치가 사용하는 USB 구성을 설정하는 OTP 화이트 라벨링을 허용합니다. 이는 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의 에라타 XXX를 수정하는 데 필요한 기본 권한 설정으로 인해 picotool
에서 직접 액세스할 수 없기 때문입니다. 바이너리를 실행하기 때문에 보안 부팅이 활성화된 경우 바이너리에 서명해야 합니다. 바이너리는 UART 구성 인수를 사용하여 구성할 수 있는 uart를 통해 수행 중인 작업을 인쇄합니다. json 파일에서 OTP 권한을 정의할 수 있으며 그 예는 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
함수에는 한 줄이 있습니다:
bi_decl_if_func_used ( bi_2pins_with_func ( PICO_DEFAULT_UART_RX_PIN , PICO_DEFAULT_UART_TX_PIN , GPIO_FUNC_UART ));
두 개의 핀 번호와 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 및 기타 제품은 플래시에서 하나 이상의 저장 장치를 지원할 수 있습니다. 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
사용하여 재부팅하면 작동하지 않습니다. 대신 컴파일 정의 PICO_ENTER_USB_BOOT_ON_EXIT
설정하여 코드 실행이 완료된 후 picotool에 액세스할 수 있도록 설정할 수 있습니다(예: 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
다시 실행하면 다음 번에 제대로 잠금이 해제됩니다(또는 장치를 재부팅할 수 있습니다).