
Disclaimer: "чукча не писатель, чукча читатель"
UseCase 0: надоело переподключать плату с RP2040 и захотелось загружать прошивку из IDE по кнопке "Run"
UseCase 1: хочется пошаговой отладки, а не принтами.
Установил на одну из плат DebugProbe и попробовал подключиться.
Оказалось не все так просто - OpenOCD плевался на неизвестное устройство:
Error: Unknown flash device (ID 0x00184068)
Загуглим ошибку.
Натыкаемся на предложение пропатчить список известных flash
Ладно...
Скачиваем исходники OpenOCD:
git clone https://git.code.sf.net/p/openocd/code openocd
Смотрим в src/flash/nor/spi.c
Разработчики заботливо оставили комментарий с инструкциями по расширению списка:
/* Shared table of known SPI flash devices for SPI-based flash drivers. Taken
from device datasheets and Linux SPI flash drivers. */
const struct flash_device flash_devices[] = {
/* Note: device_id is usually 3 bytes long, however the unused highest byte counts
* continuation codes for manufacturer id as per JEP106xx.
*
* All sizes (page, sector/block and flash) are in bytes.
*
* Guide to select a proper erase command (if both sector and block erase cmds are available):
* Use 4kbit sector erase cmd and set erase size to the size of sector for small devices
* (4Mbit and less, size <= 0x80000) to prevent too raw erase granularity.
* Use 64kbit block erase cmd and set erase size to the size of block for bigger devices
* (8Mbit and more, size >= 0x100000) to keep erase speed reasonable.
* If the device implements also 32kbit block erase, use it for 8Mbit, size == 0x100000.
*/
То есть для патча потребуются номера команд чтения/записи и размеры блоков.
Судя по всему номера основных команд у этого класса устройств совпадают у большинства производителей.
В моём случае потребовалось добавить строки
FLASH_ID("zbit zb25vq32" , 0x03, 0x0b, 0x02, 0xd8, 0xc7, 0x0016405e, 0x100, 0x10000, 0x0400000),
FLASH_ID("boya by25q128es", 0x03, 0x0b, 0x02, 0xd8, 0xc7, 0x00184068, 0x100, 0x10000, 0x1000000),
С комментариями к константам:
FLASH_ID(
"by25q128es", // название чипа
0x03, // "Read Data" - команда чтения
0x0b, // "Quick Read" - ускоренное чтение
0x02, // "Page Program" - записать "страницу"
0xd8, // "64K Block Erase" - стереть блок
0xc7, // "Chip Erase" - стереть всё
0x00184068, // ID производителя / устройства
0x100, // 256 байт, размер "страницы" для записи
0x10000, // 64KiB, размер стираемого блока(в байтах)
0x1000000 // 16MiB, общий объём памяти(в байтах)
),
Для RP2040 есть способ с правкой конфига target/rp2040.cfg
# allow skip flash auto_probe
if { [info exists FLASH_SIZE] } {
set _FLASH_SIZE $FLASH_SIZE
} else {
set _FLASH_SIZE 0
}
# flash bank $_FLASHNAME rp2040_flash 0x10000000 0 0 0 $_FLASH_TARGET
flash bank $_FLASHNAME rp2040_flash 0x10000000 $_FLASH_SIZE 0 0 $_FLASH_TARGET
if { $_BOTH_CORES } {
# Alias to ensure gdb connecting to core 1 gets the correct memory map
# flash bank $_CHIPNAME.alias virtual 0x10000000 0 0 0 $_TARGETNAME_1 $_FLASHNAME
flash bank $_CHIPNAME.alias virtual 0x10000000 $_FLASH_SIZE 0 0 $_TARGETNAME_1 $_FLASHNAME
# Select core 0
targets $_TARGETNAME_0
}
Но всё равно нужно собирать OpenOCD из исходников, взятых из основного репозитория