FlashROM: программирование SPI Flash

FlashROM - консольная утилита для идентификации, чтения, записи, проверки и стирания микросхем Flash памяти.

Основное назначение - это перепрошивка BIOS, etc, а потому в списке устройств программирования много весьма специфичных. Но так же поддерживаются распространённые программаторы/адаптеры:

  • ft2232_spi,
  • serprog,
  • buspirate_spi,
  • rayer_spi,
  • pony_spi

Адаптеры rayer и pony подключается на LPT порт, так что в современных реалиях их использование затруднительно.

SerProg

serprog это не конкретный адаптер, а протокол взаимодействия с адаптером по UART интерфейсу (или через эмуляцию UART на USB).

Для этого протокола существуют разные реализации адаптеров, требующие минимум обвязки для микроконтроллера. Я быстро создал прототип SerProg STM32VCP использовав готовую devboard на stm32f103rbt6 с разведённым USB:

Программатор из подручных материалов

SPI Flash подключается непосредственно к процессору:

  • PA4/SPI1_NSS (20) - #CS
  • PA5/SPI1_SCK (21) - SCLK
  • PA6/SPI1_MISO (22) - SO
  • PA7/SPI1_MOSI (23) - SI

При желании можно подключить светодиод индикации режима на ногу PA0 (14).

После этого, можно подключить свежезапиленый программатор и поработать с памятью.

flashrom -p serprog:dev=/dev/ttyACM0:4000000 -r backup-firmware.bin flashrom -p serprog:dev=/dev/ttyACM0:4000000 -w firmware.bin

В некоторых случаях flashrom не может однозначно определить с каким чипом он имеет дело, в этом случае он предложит варианты, и необходимо указать тип чипа явно:

/usr/sbin/flashrom -p serprog:dev=/dev/ttyACM0:4000000
-c MX25L6445E -w fw.bin

CH341A USB конвертер

CH341A USB programmer

“Народный программатор” за свою низкую цену построен на базе USB конвертера CH341A и позволяет работать с протоколами UART, EPP, I2C и SPI. Вариантов программатора множество, но отличаются они по большому счёту только внешним видом и качеством исполнения.

Поддержка программатора добавлена во “flashrom” относительно недавно, если мне не изменяет память версии этак с “0.9.4” Чтение не вызывает затруднений и происходит достаточно быстро:

$ time flashrom -p ch341a_spi -r tmp_firmware_4mb.bin
flashrom v0.9.9-r1954 on Linux 4.4.0-1-amd64 (x86_64)
flashrom is free software, get the source code at https://flashrom.org

Calibrating delay loop... OK.
Found PMC flash chip "Pm25LQ032C" (4096 kB, SPI) on ch341a_spi.
Reading flash... done.

real	1m6.870s
user	0m2.096s
sys	0m2.420s

Запись тоже не вызывает проблем.

$ time flashrom -p ch341a_spi -w tmp_firmware_16mb.bin 
flashrom v0.9.9-r1954 on Linux 4.4.0-1-amd64 (x86_64)
flashrom is free software, get the source code at https://flashrom.org

Calibrating delay loop... OK.
Found Winbond flash chip "W25Q128.V" (16384 kB, SPI) on ch341a_spi.
Reading old flash chip contents... done.
Erasing and writing flash chip... Erase/write done.
Verifying flash... VERIFIED.

real	19m17.848s
user	0m25.116s
sys	0m36.900s

Подробнее с программатором можно ознакомиться на отдельной странице ch341a.

BusPirate

Если есть под рукой BusPirate (как у меня), можно воспользоваться им, но это плохой вариант, потому как BusPirate очень-очень медленный. Так полный цикл записи (чтение старой прошивки, стирание памяти, запись новой, верификация) SPI Flash на 16Mb у меня заняло более 20 минут.

Пример чтения содержимого микросхемы памяти:

/usr/sbin/flashrom -p buspirate_spi:dev=/dev/ttyACM0,spispeed=1M
-r backup_firmware.bin

FT2232 based adapters

FT2232 должен быть хорошим вариантом, но у меня его нет. Поддерживаются различные JTAG адаптеры. http://flashrom.org/Supported_hardware#USB_Devices

 
comments powered by Disqus