Исправление ошибки 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 шт):
Для этого устройства нужно добавить код:
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 за объяснение.