Исправление ошибки Unknown flash device через добавление Flash ID в OpenOCD

При попытке отладки прошивки на RP2040(R-Pi Pico) OpenOCD выдает ошибку "Error: Unknown flash device (ID 0x00184068)"

На плате установлен чип памяти "BY25Q128ES - 128M BIT SPI NOR FLASH"

На форуме Raspbery Pi говорят о необходимости пропатчить файл src/flash/nor/spi.c

Datasheet на чип памяти я нашел, но не совсем понимаю, какие параметры нужно в нем искать, чтобы правильно заполнить строчку с FLASH_ID

Сам макрос cоздает объект типа flash_device и имеет сигнатуру:

/// @file: src/flash/nor/spi.h

/* data structure to maintain flash ids from different vendors */
struct flash_device {
    const char *name;
    uint8_t read_cmd;
    uint8_t qread_cmd;
    uint8_t pprog_cmd;
    uint8_t erase_cmd;
    uint8_t chip_erase_cmd;
    uint32_t device_id;
    uint32_t pagesize;
    uint32_t sectorsize;
    uint32_t size_in_bytes;
};

#define FLASH_ID(n, re, qr, pp, es, ces, id, psize, ssize, size) \
{                                   \
    .name = n,                      \
    .read_cmd = re,                 \
    .qread_cmd = qr,                \
    .pprog_cmd = pp,                \
    .erase_cmd = es,                \
    .chip_erase_cmd = ces,          \
    .device_id = id,                \
    .pagesize = psize,              \
    .sectorsize = ssize,            \
    .size_in_bytes = size,          \
}
/// @file: 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.
     */
    /*        name                  read qread  page  erase chip  device_id   page   erase   flash
     *                              _cmd _cmd   _prog _cmd* _erase            size   size*   size
     *                                          _cmd        _cmd
     */
    FLASH_ID("st m25pe10",          0x03, 0x00, 0x02, 0xd8, 0x00, 0x00118020, 0x100, 0x10000, 0x20000),
//....
    FLASH_ID("st m25p05",           0x03, 0x00, 0x02, 0xd8, 0xc7, 0x00102020, 0x80,  0x8000,  0x10000),
//...
    FLASH_ID("sp s25fl512s",        0x13, 0x00, 0x12, 0xdc, 0xc7, 0x00200201, 0x200, 0x40000, 0x4000000),

Что такое pagesize и sectorsize в этом контексте?

Как оно может называться в datasheet на чип flash?


Ответы (1 шт):

Автор решения: Maxim Timakov

Для этого устройства нужно добавить код:

    FLASH_ID("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, общий объём памяти(в байтах)
),

После пересборки OpenOCD GDB смог определить карту памяти и запрограммировать другую прошивку.

P.S.: спасибо @avp за объяснение.

→ Ссылка