Как можно устранить ошибку «unknown flash device», возникающую при запуске отладки с помощью OpenOCD?

Я пытаюсь осуществить загрузку и отладку прошивки через SWD-интерфейс на плате, основанной на микроконтроллере RP2040 (Raspberry Pi Pico). 

В частности, на одной из плат был установлен <a href="https://www.raspberrypi.com/documentation/microcontrollers/debug-probe.html" rel="nofollow">DebugProbe</a> ( <a href="https://github.com/raspberrypi/debugprobe" rel="nofollow">Firmware</a> ). 

OpenOCD подключается к DebugProbe и, соответственно, ко второй плате. Однако при попытке подключения GDB возникает ошибка "unknown flash device". 

Вот команды, которые я использую:

<pre><code class="bash"># консоль с OpenOCD
$ openocd -f interface/cmsis-dap.cfg -c "set USE_CORE SMP" -f target/rp2040.cfg -c "adapter speed 5000"</code></pre>

<pre><code class="bash"># консоль с GDB
$ gdb-multiarch cmake-build-debug/blink/blink.elf
GNU gdb (Ubuntu 15.0.50.20240403-0ubuntu1) 15.0.50.20240403-git
Copyright (C) 2024 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later &lt;http://gnu.org/licenses/gpl.html&gt;
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
&lt;https://www.gnu.org/software/gdb/bugs/&gt;.
Find the GDB manual and other documentation resources online at:
    &lt;http://www.gnu.org/software/gdb/documentation/&gt;.

For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from cmake-build-debug/blink/blink.elf...
(gdb) target extended-remote :3333
Remote debugging using :3333
Remote connection clos
  • 16 марта 2025 г. 16:24
Ответы на вопрос 2
Ошибка «unknown flash device» в OpenOCD обычно указывает на то, что конфигурация OpenOCD не может распознать целевое флэш-устройство, указанное в конфигурационном файле. В случае с RP2040 это может быть связано с тем, что OpenOCD не имеет информации о растровой технике (памяти) конкретного флэш-устройства, установленного на вашей плате.

Вот несколько шагов, которые помогут решить эту проблему:

1. **Проверьте конфигурацию OpenOCD**:
   Убедитесь, что вы правильно настроили конфигурацию OpenOCD. В частности, в файле `target/rp2040.cfg` должно быть прописано корректное описание флэш-памяти. Обычно в конфигурации RP2040 определяются модели памяти, такие как `flash_bank`. Убедитесь, что в файле присутствует правильный `flash_bank`, который соответствует используемому вами флэш-устройству.

2. **Обновите OpenOCD**:
   Если вы используете устаревшую версию OpenOCD, она может не поддерживать ваше устройство или конфигурации. Убедитесь, что у вас установлена последняя версия OpenOCD, особенно если она была улучшена для поддержки RP2040.

3. **Проверьте установленные последовательно библиотеки**:
   Возможно, в вашей версии OpenOCD отсутствует поддержка некоторых флэш-устройств. Может потребоваться обновить дополнительные модули или использовать сторонние ветки OpenOCD. Проверка документации может помочь понять, какие флэш-устройства поддерживаются.

4. **Проверьте документирование производителя**:
   Возможно, вы используете не ту конфигурацию для конкретной модели вашей платы. Обратитесь к документации Raspberry Pi для получения конкретных инструкций, если ваша плата имеет несколько различных вариантов флэш-памяти.

5. **Проверьте программное обеспечение отладки**:
   Убедитесь, что вы используете правильные команды для запуска отладки и записи в память флэш. В некоторых случаях может понадобиться прописать дополнительные команды в GDB для инициализации флэш-памяти.

6. **Проверьте подключение**:
   Убедитесь, что ваше подключение к плате правильно и что DebugProbe корректно функционирует. Проблемы с аппаратным обеспечением могут привести к ошибкам обмена данными.

Для получения более подробной информации об использовании OpenOCD с RP2040, рекомендуется обратиться к официальной документации OpenOCD и документации Raspberry Pi, так как они могут содержать обновления или исправления для известных проблемник с конкретными конфигурациями.
Для патча потребуются номера команд чтения/записи и размеры блоков. 
Номера основных команд у этого класса устройств совпадают у большинства производителей.

Для первого нужно добавить:
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, общий объём памяти(в байтах)
),


Для второго отличие только в объеме (4MiB):
FLASH_ID("zbit zb25vq32"  ,       0x03, 0x0b, 0x02, 0xd8, 0xc7, 0x0016405e, 0x100, 0x10000, 0x0400000),
Похожие вопросы