تحتاج إلى تعيين PICO_SDK_PATH في البيئة، أو تمريره إلى cmake باستخدام -DPICO_SDK_PATH=/path/to/pico-sdk
. لاستخدام ميزات مثل التوقيع أو التجزئة، ستحتاج إلى التأكد من سحب وحدة mbedtls الفرعية في SDK - ويمكن القيام بذلك عن طريق تشغيل هذا من دليل 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، يمكنك إضافة قواعد udev لتشغيل picotool بدون sudo:
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 .
يستخدم الإصدار 2.0.0 من Raspberry Pi Pico SDK (pico-sdk) والإصدارات الأحدث picotool
لإجراء التحويل من ELF إلى UF2 الذي تمت معالجته مسبقًا بواسطة أداة elf2uf2
في SDK. يستخدم 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
في مشروعك، إما عن طريق تعيين متغير البيئة picotool_DIR
، أو عن طريق تمرير -Dpicotool_DIR=$MY_INSTALL_DIR/picotool
إلى أمر cmake
الخاص بك، أو عن طريق إضافة set(picotool_DIR $MY_INSTALL_DIR/picotool)
على ملفك ملف CMakeLists.txt.
picotool
هي أداة للعمل مع الثنائيات RP2040/RP2350، والتفاعل مع أجهزة RP2040/RP2350 عندما تكون في وضع BOOTSEL. (اعتبارًا من الإصدار 1.1 من picotool
من الممكن أيضًا التفاعل مع الأجهزة غير الموجودة في وضع BOOTSEL، ولكنها تستخدم دعم USB stdio من Raspberry Pi Pico SDK باستخدام الوسيطة -f
الخاصة بـ picotool
).
ملاحظة للحصول على وثائق إضافية، راجع 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
العثور عليها (انظر قسم المعلومات الثنائية أدناه). أمر المعلومات مخصص لقراءة هذه المعلومات.
يمكن قراءة المعلومات إما من جهاز واحد أو أكثر متصلين في وضع 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 $ اسم معلومات البرنامج: ميزات 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 $ -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
يتيح لك التكوين تكوين المعلومات الثنائية على الجهاز، إذا كان قابلاً للتكوين. على وجه التحديد، يمكنك تكوين 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
يسمح لك بكتابة البيانات من ملف على الجهاز (إما الكتابة على الفلاش، أو على ذاكرة الوصول العشوائي)
$ 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 كملف .bin لمفتاح AES 256 بت لاستخدامه في التشفير.
$ 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
بإنشاء UF2s، وتوفر الكاميرا معلومات عند فشل تنزيل UF2.
يحل هذا الأمر محل وظيفة elf2uf2 التي كانت موجودة سابقًا في Raspberry Pi Pico SDK. سيحاول اكتشاف معرف العائلة تلقائيًا، ولكن إذا فشل ذلك، يمكنك تحديد واحد يدويًا باستخدام الوسيطة --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، حيث أن RP2040 لا يحتوي على كلمة مرور لمرة واحدة (OTP).
لاحظ أن ذاكرة OTP قابلة للبرمجة لمرة واحدة، مما يعني أنه بمجرد تغيير البت من 0 إلى 1، لا يمكن تغييره مرة أخرى. ولذلك، ينبغي توخي الحذر عند استخدام هذه الأوامر، لأنها تخاطر بتعطيل جهاز RP2350 الخاص بك. على سبيل المثال، إذا قمت بتعيين SECURE_BOOT_ENABLE ولكن لم تقم بتعيين مفتاح تمهيد، وقمت بتعطيل واجهة PICOBOOT، فسيكون جهازك غير قابل للاستخدام.
بالنسبة لأوامر list
set
get
load
، يمكنك تحديد تخطيط OTP الخاص بك في ملف JSON وتمرير ذلك باستخدام الوسيطة -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 على الجهاز. يمكن أن يكون المصدر ملفًا ثنائيًا، أو ملف JSON مثل الناتج بواسطة picotool sign
. على سبيل المثال، إذا كنت ترغب في التوقيع على ملف ثنائي ثم اختبار التمهيد الآمن به، فيمكنك تشغيل مجموعة الأوامر التالية:
$ 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، والتي تحدد تكوين USB الذي يستخدمه الجهاز في وضع BOOTSEL. يمكن تكوين ذلك من ملف 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، حيث لا يمكن الوصول إليها مباشرة من picotool
بسبب إعدادات الأذونات الافتراضية المطلوبة لإصلاح الأخطاء XXX على RP2350. نظرًا لأنه يقوم بتشغيل ملف ثنائي، فيجب توقيعه في حالة تمكين التمهيد الآمن. سيقوم الملف الثنائي بطباعة ما يفعله عبر 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
:
bi_decl_if_func_used ( bi_2pins_with_func ( PICO_DEFAULT_UART_RX_PIN , PICO_DEFAULT_UART_TX_PIN , GPIO_FUNC_UART ));
يتم تخزين رقمين الدبوس والوظيفة UART، ثم يتم فك تشفيرهما إلى أسماء الوظائف الفعلية الخاصة بهما (UART1 TX وما إلى ذلك) بواسطة picotool. يتأكد 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 ));
في التعليمات البرمجية الخاصة بك، والتي ستقوم بعد ذلك بإنشاء متغير الاسم لتتمكن من طباعته لاحقًا. المعلمات هي العلامة والمعرف واسم المتغير والقيمة الافتراضية والحد الأقصى لطول السلسلة.
printf ( "Name is %sn" , name );
تم تصميم الأشياء لإضاعة أقل مساحة ممكنة، ولكن يمكنك إيقاف تشغيل كل شيء باستخدام متغير المعالج المسبق PICO_NO_BINARY_INFO=1
. بالإضافة إلى ذلك، يمكن استبعاد أي كود SDK يقوم بإدراج معلومات ثنائية بشكل منفصل بواسطة متغير المعالج المسبق الخاص به.
تحتاج
#include "pico/binary_info.h"
بشكل أساسي، يمكنك إما استخدام bi_decl(bi_blah(...))
للتضمين غير المشروط للمعلومات الثنائية 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()
وكان لديك pico_enable_stdio_usb( 1)
في ملف CMakeLists.txt، فإنك تستوفي هذا المطلب (راجع مثال hello_usb) إذا قمت بالضغط على ctrl+c في منتصف عملية طويلة، فيبدو أن libusb مرتبك بعض الشيء، مما يعني أننا غير قادرين على إلغاء قفل عمليات كتابة USB MSD (لقد قمنا بإيقاف تشغيلها حتى لا يقوم المستخدم بذلك) خطوة على أصابع قدميه). سيؤدي تشغيل picotool info
مرة أخرى إلى فتحه بشكل صحيح في المرة القادمة (أو يمكنك إعادة تشغيل الجهاز).