Прошивка SPI EEPROM (mcom03-flash)

Утилита mcom03-flash предназначена для прошивки памятей, подключенных к контроллерам QSPI0, QSPI1 процессора. Поддерживаемые модули и памяти:

  • MCom-03 BuB r1.3.0, r1.5.0 (QSPI0, QSPI1);

  • NGFW-CB r1.0 с установленным ELV-MC03-SMARC r1.0, r1.1 (QSPI0);

  • ROCK Pi N10 с установленным ELV-MC03-SMARC r1.0, r1.1 (QSPI0);

  • ELV-SMARC-CB r1.0 с установленным ELV-MC03-SMARC r1.0, r1.1 (QSPI0);

  • ELV-SMARC-CB r2.9.1 с установленным ELV-MC03-SMARC r2.2 (QSPI0);

  • ELV-SMARC-CB r2.10 с установленным ELV-MC03-SMARC r1.0, r1.1 (QSPI0);

  • ELV-SMARC-CB r2.10.3 с установленным ELV-MC03-SMARC r1.0, r1.1, r2.6.1 (QSPI0);

  • ELV-SMARC-CB r3.1.0 с установленным ELV-MC03-SMARC r1.0, r1.1, r2.6.1 (QSPI0);

  • ELV-SMARC-CB r3.2.1 с установленным ELV-MC03-SMARC r1.0, r1.1, r2.7.1 (QSPI0);

  • ELV-SMARC-CB r3.3.0 с установленным ELV-MC03-SMARC r3.0.0 (QSPI0);

  • ELV-MC03-CB r1.1.0 с установленным ELV-MC03 r1.2, r2.2 (QSPI0);

  • MONO-BOARD r1.1.1 (QSPI0).

Прошивка выполняется по интерфейсу UART0: MCom-03 BootROM в режиме загрузки по UART принимает образ spi-flasher, spi-flasher запускается на RISC0, повышает частоты, принимает образы для прошивки по UART, прошивает соответствующую память QSPI.

Справочник:

$ mcom03-flash --help
usage: mcom03-flash [-h] [-p PORT] [-b BAUDRATE] [-v] [--hide-progress-bar]
                    [--flash-size FLASH_SIZE] [--flash-sector FLASH_SECTOR]
                    [--flash-page FLASH_PAGE] [-f FLASHER] [--version]
                    {flash,flash-tl,flash-tl-dir,flash-tl-image,read,erase,protect,unprotect} ...

Tool to flash/read/erase QSPI0, QSPI1 memory connected to MCom-03 SoC (1892ВА018).
Tool algorithm:

* upload baremetal binary flasher to CRAM memory via BootROM UART monitor
* upload image to CRAM memory (or part of it) and command flasher to flash it
* repeat previous step multiple time till whole image is flashed to SPI

Intel HEX file baremetal SPI flasher to be executed on RISC0 is embedded with the tool.
Size options (including --offset) can be in hexadecimal (0x) and decimal format. Decimals may be
followed by the multiplicative  suffixes (similar to dd utility): kB=1000, K=1024, MB=1000*1000,
M=1024*1024, binary prefixes can be used, too: KiB=K, MiB=M, and so on.

positional arguments:
  {flash,flash-tl,flash-tl-dir,flash-tl-image,read,erase,protect,unprotect}
    flash               Flash image to QSPI
    flash-tl            Flash tl images to QSPI
    flash-tl-dir        Flash tl images to QSPI relative to directory
    flash-tl-image      Flash tl images to QSPI from tar package
    read                Read data from QSPI
    erase               Erase data on QSPI
    protect             Protect QSPI from writing/erasing
    unprotect           Remove QSPI protection from writing/erasing

options:
  -h, --help            show this help message and exit
  -p PORT, --port PORT  serial port on host the device UART0 is connected to (default:
                        /dev/ttyUSB0)
  -b BAUDRATE, --baudrate BAUDRATE
                        specify UART baudrate (default: 115200)
  -v, --verbose         show UART traffic (default: False)
  --hide-progress-bar   do not show progress bar (progress bar is hidden in non-interactive shell)
                        (default: False)
  --flash-size FLASH_SIZE
                        redefine flash total size (default: None)
  --flash-sector FLASH_SECTOR
                        redefine flash erase sector size (default: None)
  --flash-page FLASH_PAGE
                        redefine flash page size (default: None)
  -f FLASHER, --flasher FLASHER
                        path to Intel HEX baremetal application to be executed on RISC0(use HEX
                        distributed with the tool if not specified) (default: None)
  --version             show program's version number and exit

Напряжение падов QSPI

Контроллер QSPI0 поддерживает только режим 1.8 В. Контроллер QSPI1 может настраивать пады на режим 1.8 В или 3.3 В.

Для конфигурации падов QSPI1 в режим 1.8 В используется параметр --voltage18. По умолчанию для QSPI1 утилита настраивает режим 3.3 В. Для QSPI0 данный параметр игнорируется и не влияет на работу падов.

Важно

При использовании м/сх памяти, подключенных к QSPI1, с напряжением I/O 3.3 В указание параметра --voltage18 может привести к повреждению падов MCom-03.

Важно

Параметр --voltage18 следует указывать для всех команд обращения к памяти (flash, read, erase).

Подготовка модуля

  1. Установить переключатели для загрузки процессора в режиме BootROM UART:

    • на модуле NGFW-CB (BOOT2,1,0): ON, OFF, OFF

    • на модуле MCom-03 BuB (BOOT2,1,0): OFF, ON, ON

    • на модуле conga-SEVAL (BOOT_SEL2,1,0): ON, OFF, OFF

    • на модуле ROCK Pi N10 снять джампер с пинов GPIO 25,26 (GND,ADC_IN1)

    • на модуле ELV-SMARC-CB r1.0 (BOOT SOURCE: 1, 2, 3): ON, OFF, OFF

    • на модуле ELV-SMARC-CB r2.9.1, r2.10.3, r3.1.0, r3.2.1 (BTSL2,1,0): ON, OFF, OFF

    • на модуле ELV-SMARC-CB r3.3.0 (BTSL2,1,0): ON, OFF, OFF

    • на модуле ELV-MC03-CB (BOOT2,1,0): OFF, ON, ON

    • на модуле MONO-BOARD r1.1.1 (BOOT_SEL3,2,1): ON, OFF, OFF

  2. Подключить кабель USB для UART-консоли модуля.

  3. Подать питание на модуль (если модуль уже включен, то нажать кнопку Reset).

    Для модуля NGFW-CB необходимо дополнительно нажать кнопку Power.

  4. Если на ПК открыто приложение, использующее UART (minicom), то приложение необходимо закрыть.

Прошивка QSPI

  1. Запустить:

    mcom03-flash --port /dev/ttyUSBx flash qspi0 <file-to-write>
    

    /dev/ttyUSBx — устройство терминала UART0 на ПК.

    Примечание

    Для указания начального смещения (аргумент --offset) и для любых указаний размеров можно использовать единицы измерения как в утилите dd: 1K = 1024, 1M = 1024K, 1KB = 1000, 1MB = 1000KB и т.д. Смещение может быть отрицательным. Тогда это интерпретируется как смещение с конца flash-памяти. В случае отрицательного смещения параметр должен передаваться с использованием знака «=», для избежания ошибки «expected one argument»:

    --offset=<negative value>
    

    Примечание

    Для ускорения процесса можно повысить скорость обмена данными по UART. Например:

    mcom03-flash --port /dev/ttyUSBx --baudrate 921600 flash qspi0 <file-to-write>
    

    Со стороны ПО поддерживаются все стандартные скорости от 300 бод до 4 Мбод. В том числе: 230400, 460800, 500000, 576000, 921600, 1000000, 1152000, 1500000, 2000000, 2500000, 3000000, 3500000, 4000000.

    Различные переходники USB-UART могут ограничивать максимальную скорость. Например, на модуле ELV-SMARC-CB r3.3.0 используется USB-UART с максимальной скоростью 921600 бод.

    В зависимости от качества Linux-драйвера переходника USB-UART устройство терминала /dev/ttyUSBx может открываться даже при указании неподдерживаемого переходником бодрейтом.

  2. После завершения прошивки будет выведена фраза Checking succeeded и указана длительность и скорость прошивки. Скорость прошивки ограничена скоростью UART. Например, при скорости UART 115200 бод скорость прошивки составляет ~9 КБ/с, а при скорости UART 921600 бод - ~40 КБ/с.

    Примечание

    Если при запуске на модуле NGFW-CB будет выдано исключение из-за несовпадения CRC, возможно, после включения питания не была нажата кнопка Power.

Важно

Для загрузки процессора в режиме XIP QSPI0 установить переключатели в положения:

  • на модуле NGFW-CB (BOOT2,1,0): ON, ON, ON

  • на модуле MCom-03 BuB (BOOT2,1,0): OFF, OFF, OFF

  • на модуле conga-SEVAL (BOOT_SEL2,1,0): ON, ON, ON

  • на модуле ROCK Pi N10 установить джампер на пины GPIO 25,26 (GND,ADC_IN1)

  • на модуле ELV-SMARC-CB r1.0 (BOOT SOURCE: 1, 2, 3): ON, ON, ON

  • на модуле ELV-SMARC-CB r2.9.1, r2.10.3, r3.1.0, r3.2.1 (BTSL2,1,0): ON, ON, ON

  • на модуле ELV-SMARC-CB r3.3.0 (BTSL2,1,0): ON, ON, ON

  • на модуле ELV-MC03-CB (BOOT2,1,0): OFF, OFF, OFF

  • на модуле MONO-BOARD r1.1.1 (BOOT_SEL3,2,1): ON, ON, ON

Справочник:

$ mcom03-flash flash --help
usage: mcom03-flash flash [-h] [--voltage18] [--offset OFFSET] {qspi0,qspi1} image

positional arguments:
  {qspi0,qspi1}    QSPI controller to use
  image            path binary image to flash to SPI

options:
  -h, --help       show this help message and exit
  --voltage18      Setup QSPI1 to 1.8V. Not used for QSPI0
  --offset OFFSET  Process data starting from OFFSET bytes (e.g. 0x100, 1024, 128K).Offset can be
                   negative. In the case it is treated as offset from the end

Чтение QSPI

Для чтения образа используется команда read утилиты mcom03-flash:

mcom03-flash --port /dev/ttyUSBx read qspi0 <output-file> [size-in-bytes]

Если размер не указан, то будет прочитано содержимое всей памяти. Пример использования:

mcom03-flash --port /dev/ttyUSB0 read qspi0 new-file.img 256K

Справочник:

$ mcom03-flash read --help
usage: mcom03-flash read [-h] [--voltage18] [--offset OFFSET] {qspi0,qspi1} fname [size]

positional arguments:
  {qspi0,qspi1}    QSPI controller to use
  fname            file name to save
  size             size to read/erase. Examples: 65536, 128K (131072 bytes), 4M (4194304 bytes),
                   128kB (128000 bytes), 4MB (4000000 bytes). If not defined then will be used all
                   rest of flash (after --offset)

options:
  -h, --help       show this help message and exit
  --voltage18      Setup QSPI1 to 1.8V. Not used for QSPI0
  --offset OFFSET  Process data starting from OFFSET bytes (e.g. 0x100, 1024, 128K).Offset can be
                   negative. In the case it is treated as offset from the end

Очистка QSPI

Для очистки памяти используется команда erase утилиты mcom03-flash:

mcom03-flash --port /dev/ttyUSBx erase qspi0 [size-in-bytes]

Если размер не указан, то будет очищена вся память. Пример использования:

mcom03-flash --port /dev/ttyUSBx erase qspi0 1M

Важно

Размер очищаемой памяти будет округлён вверх и будет кратен размеру блока стирания.

Справочник:

$ mcom03-flash erase --help
usage: mcom03-flash erase [-h] [--voltage18] [--offset OFFSET] {qspi0,qspi1} [size]

positional arguments:
  {qspi0,qspi1}    QSPI controller to use
  size             size to read/erase. Examples: 65536, 128K (131072 bytes), 4M (4194304 bytes),
                   128kB (128000 bytes), 4MB (4000000 bytes). If not defined then will be used all
                   rest of flash (after --offset)

options:
  -h, --help       show this help message and exit
  --voltage18      Setup QSPI1 to 1.8V. Not used for QSPI0
  --offset OFFSET  Process data starting from OFFSET bytes (e.g. 0x100, 1024, 128K).Offset can be
                   negative. In the case it is treated as offset from the end

Защита от записи/стирания

Команда protect включает программную защиту от записи и стирания памяти. Команда unprotect снимает защиту, если она установлена. В зависимости от типа защиты SPI-памяти защита может быть включена автоматически после сброса памяти или цикла питания. Подробнее см. описание класса для соответствующей памяти. Примеры команд:

mcom03-flash --port /dev/ttyUSBx protect qspi0
mcom03-flash --port /dev/ttyUSBx unprotect qspi0

Справочник:

$ mcom03-flash protect --help
usage: mcom03-flash protect [-h] [--voltage18] {qspi0,qspi1}

positional arguments:
  {qspi0,qspi1}  QSPI controller to use

options:
  -h, --help     show this help message and exit
  --voltage18    Setup QSPI1 to 1.8V. Not used for QSPI0
$ mcom03-flash unprotect --help
usage: mcom03-flash unprotect [-h] [--voltage18] {qspi0,qspi1}

positional arguments:
  {qspi0,qspi1}  QSPI controller to use

options:
  -h, --help     show this help message and exit
  --voltage18    Setup QSPI1 to 1.8V. Not used for QSPI0

Поддержка новых микросхем

  • Убедиться, что память поддерживается пакетом, см. mcom03_flash_tools.FLASH_LIST.

  • Реализовать дочерний класс для mcom03_flash_tools.Protector и добавить его в TYPE2CLS.

Алгоритм защиты должен подразумевать возможность программного сброса защиты.