Как стать автором
Поиск
Написать публикацию
Обновить

Патчим OpenOCD для поддержки чипа NOR Flash

Время на прочтение2 мин
Количество просмотров1.5K
Отлаживать отладчик, пока отлаживаешь отладчик
Отлаживать отладчик, пока отлаживаешь отладчик

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 из исходников, взятых из основного репозитория

Теги:
Хабы:
Всего голосов 12: ↑11 и ↓1+14
Комментарии1

Публикации

Ближайшие события