تحتاج إلى تعيين PICO_SDK_PATH في البيئة، أو تمريره إلى cmake باستخدام -DPICO_SDK_PATH=/path/to/pico-sdk
. لاستخدام ميزات مثل التوقيع أو التجزئة، ستحتاج إلى التأكد من سحب وحدة mbedtls الفرعية في SDK - ويمكن القيام بذلك عن طريق تشغيل هذا من دليل SDK الخاص بك.
تحديث الوحدة الفرعية لـ git --init lib/mbedtls
تحتاج أيضًا إلى تثبيت libusb-1.0
.
استخدم أداة الحزمة المفضلة لديك لتثبيت التبعيات. على سبيل المثال، على أوبونتو:
sudo apt install build-essential pkg-config libusb-1.0-0-dev cmake
ثم قم ببساطة بالبناء مثل مشروع CMake العادي:
mkdir buildcd buildcmake ..make
على Linux، يمكنك إضافة قواعد udev لتشغيل picotool بدون sudo:
sudo cp udev/99-picotool.rules /etc/udev/rules.d/
حمل libUSB من هنا https://libusb.info/
قم بتعيين متغير البيئة LIBUSB_ROOT على دليل التثبيت.
mkdir buildcd buildcmake -G "NMake Makefiles" ..nmake
حمل libUSB من هنا https://libusb.info/
قم بتعيين متغير البيئة LIBUSB_ROOT على دليل التثبيت.
mkdir buildcd buildcmake ..make
لا حاجة لتنزيل libusb بشكل منفصل أو تعيين LIBUSB_ROOT
.
pacman -S $MINGW_PACKAGE_PREFIX-{toolchain,cmake,libusb}mkdir buildcd buildcmake .. -DCMAKE_INSTALL_PREFIX=$MINGW_PREFIXcmake --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] <filename> [-t <type>] picotool config [-s <key> <value>] [-g <group>] [device-selection] picotool config [-s <key> <value>] [-g <group>] <filename> [-t <type>] picotool load [-p] [-n] [-N] [-u] [-v] [-x] <filename> [-t <type>] [-o <offset>] [device-selection] picotool encrypt [--quiet] [--verbose] [--hash] [--sign] <infile> [-t <type>] [-o <offset>] <outfile> [-t <type>] <aes_key> [-t <type>] [<signing_key>] [-t <type>] picotool seal [--quiet] [--verbose] [--hash] [--sign] [--clear] <infile> [-t <type>] [-o <offset>] <outfile> [-t <type>] [<key>] [-t <type>] [<otp>] [-t <type>] [--major <major>] [--minor <minor>] [--rollback <rollback> [<rows>..]] picotool link [--quiet] [--verbose] <outfile> [-t <type>] <infile1> [-t <type>] <infile2> [-t <type>] [<infile3>] [-t <type>] [-p] <pad> picotool save [-p] [device-selection] picotool save -a [device-selection] picotool save -r <from> <to> [device-selection] picotool verify [device-selection] picotool reboot [-a] [-u] [-g <partition>] [-c <cpu>] [device-selection] picotool otp list|get|set|load|dump|permissions|white-label picotool partition info|create picotool uf2 info|convert picotool version [-s] [<version>] picotool coprodis [--quiet] [--verbose] <infile> [-t <type>] <outfile> [-t <type>] picotool help [<cmd>] 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 <cmd>" 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] <filename> [-t <type>] 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 <bus> Filter devices by USB bus number --address <addr> Filter devices by USB device address --vid <vid> Filter by vendor id --pid <pid> Filter by product id --ser <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 <filename> The file name -t <type> 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 <key> <value>] [-g <group>] [device-selection]
picotool config [-s <key> <value>] [-g <group>] <filename> [-t <type>]
OPTIONS:
<key>
Variable name
<value>
New value
-g <group>
Filter by feature group
TARGET SELECTION:
To target one or more connected RP2040 device(s) in BOOTSEL mode (the default)
--bus <bus>
Filter devices by USB bus number
--address <addr>
Filter devices by USB device address
--vid <vid>
Filter by vendor id
--pid <pid>
Filter by product id
--ser <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
<filename>
The file name
-t <type>
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 <family_id>] [-p <partition>] [-n] [-N] [-u] [-v] [-x] <filename> [-t <type>] [-o
<offset>] [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>
family id to use for load
-p, --partition
Specify the partition to load into
<partition>
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
<filename>
The file name
-t <type>
Specify file type (uf2 | elf | bin) explicitly, ignoring file extension
BIN file options
-o, --offset
Specify the load address for a BIN file
<offset>
Load offset (memory address; default 0x10000000)
Target device selection
--bus <bus>
Filter devices by USB bus number
--address <addr>
Filter devices by USB device address
--vid <vid>
Filter by vendor id
--pid <pid>
Filter by product id
--ser <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 <from> <to> [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
<from>
The lower address bound in hex
<to>
The upper address bound in hex
Source device selection
--bus <bus>
Filter devices by USB bus number
--address <addr>
Filter devices by USB device address
--vid <vid>
Filter by vendor id
--pid <pid>
Filter by product id
--ser <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
<filename>
The file name
-t <type>
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] <infile> [-t <type>] [-o <offset>] <outfile> [-t <type>] [<key>] [-t
<type>] [<otp>] [-t <type>] [--major <major>] [--minor <minor>] [--rollback <rollback> [<rows>..]]
OPTIONS:
--quiet
Don't print any output
--verbose
Print verbose output
--major <major>
Add Major Version
--minor <minor>
Add Minor Version
--rollback <rollback> [<rows>..]
Add Rollback Version
Configuration
--hash
Hash the file
--sign
Sign the file
--clear
Clear all of SRAM on load
File to load from
<infile>
The file name
-t <type>
Specify file type (uf2 | elf | bin) explicitly, ignoring file extension
BIN file options
-o, --offset
Specify the load address for a BIN file
<offset>
Load offset (memory address; default 0x10000000)
File to save to
<outfile>
The file name
-t <type>
Specify file type (uf2 | elf | bin) explicitly, ignoring file extension
Key file
<key>
The file name
-t <type>
Specify file type (pem) explicitly, ignoring file extension
File to save OTP to (will edit existing file if it exists)
<otp>
The file name
-t <type>
Specify file type (json) explicitly, ignoring file extension
يتيح لك encrypt
تشفير وتوقيع ملف ثنائي للاستخدام على RP2350. افتراضيًا، سيقوم بالتوقيع على الملف الثنائي المشفر، ولكن يمكن تكوين ذلك بشكل مشابه picotool sign
.
سيكون للملف الثنائي المشفر البنية التالية:
كتلة البيانات الوصفية الأولى (5 كلمات)
الرابع (4 كلمات)
ثنائي مشفرة
الحشو للتأكد من أن الطول المشفر هو مضاعف 4 كلمات
كتلة البيانات التعريفية للتوقيع
يجب توفير مفتاح AES كملف .bin لمفتاح AES 256 بت لاستخدامه في التشفير.
$ picotool help encrypt
ENCRYPT:
Encrypt the program.
SYNOPSIS:
picotool encrypt [--quiet] [--verbose] [--hash] [--sign] <infile> [-t <type>] [-o <offset>] <outfile> [-t <type>] <aes_key> [-t <type>]
[<signing_key>] [-t <type>]
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
<infile>
The file name
-t <type>
Specify file type (uf2 | elf | bin) explicitly, ignoring file extension
BIN file options
-o, --offset
Specify the load address for a BIN file
<offset>
Load offset (memory address; default 0x10000000)
File to save to
<outfile>
The file name
-t <type>
Specify file type (uf2 | elf | bin) explicitly, ignoring file extension
AES Key
<aes_key>
The file name
-t <type>
Specify file type (bin) explicitly, ignoring file extension
Signing Key file
<signing_key>
The file name
-t <type>
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 <family_id> [device-selection]
OPTIONS:
-m <family_id> [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] <infile> [-t <type>] <outfile> [-t <type>] [[-o <offset>] [--family <family_id>]]
[<bootloader>] [-t <type>] [[--sign <keyfile>] [-t <type>] [--no-hash] [--singleton]] [[--abs-block] [<abs_block_loc>]]
OPTIONS:
--quiet
Don't print any output
--verbose
Print verbose output
partition table JSON
<infile>
The file name
-t <type>
Specify file type (json) explicitly, ignoring file extension
output file
<outfile>
The file name
-t <type>
Specify file type (uf2 | elf | bin) explicitly, ignoring file extension
UF2 output options
-o, --offset
Specify the load address for UF2 file output
<offset>
Load offset (memory address; default 0x10000000)
--family
Specify the family if for UF2 file output
<family_id>
family id for UF2 (default absolute)
embed partition table into bootloader ELF
<bootloader>
The file name
-t <type>
Specify file type (elf) explicitly, ignoring file extension
Partition Table Options
--sign <keyfile>
The file name
-t <type>
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
<abs_block_loc>
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] <infile> [-t <type>] <outfile> [-t <type>] [-o <offset>] [--family <family_id>]
[[--abs-block] [<abs_block_loc>]]
OPTIONS:
--quiet
Don't print any output
--verbose
Print verbose output
File to load from
<infile>
The file name
-t <type>
Specify file type (uf2 | elf | bin) explicitly, ignoring file extension
File to save UF2 to
<outfile>
The file name
-t <type>
Specify file type (uf2) explicitly, ignoring file extension
Packaging Options
-o, --offset
Specify the load address
<offset>
Load offset (memory address; default 0x10000000 for BIN file)
UF2 Family options
<family_id>
family id for UF2
Errata RP2350-E9 Fix
--abs-block
Add an absolute block
<abs_block_loc>
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 <bus>
Filter devices by USB bus number
--address <addr>
Filter devices by USB device address
--vid <vid>
Filter by vendor id
--pid <pid>
Filter by product id
--ser <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 <filename>] [<selector>..]
picotool otp get [-c <copies>] [-r] [-e] [-n] [-i <filename>] [device-selection] [-z] [<selector>..]
picotool otp set [-c <copies>] [-r] [-e] [-i <filename>] [-z] <selector> <value> [device-selection]
picotool otp load [-r] [-e] [-s <row>] [-i <filename>] <filename> [-t <type>] [device-selection]
picotool otp dump [-r] [-e] [device-selection]
picotool otp permissions <filename> [-t <type>] [--led <pin>] [--hash] [--sign] [<key>] [-t <type>] [device-selection]
picotool otp white-label -s <row> <filename> [-t <type>] [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.
<cod