Skip to content

Baremetal apps for MCom-03 MIPS RISC0, ARM CPU

License

Notifications You must be signed in to change notification settings

elvees/mcom03-baremetal-tools

Repository files navigation

Baremetal-утилиты MCom-03

Репозиторий содержит baremetal-приложения для запуска на процессорах ARM CPU0 и MIPS32 RISC0.

Для сборки используются тулчейны ARM и RISC. Для RISC должен использоваться тулчейн производства ЭЛВИС (тулчейн реализует обходы аппаратных ошибок ядра).

Оба тулчейна входят в состав MCom-03 Linux SDK. Описание тулчейнов — Средства сборки

Подготовка среды:

wget https://dist.elvees.com/mcom03/buildroot/2023.03/rockpi/images/aarch64-buildroot-linux-gnu_sdk-buildroot.tar.gz
tar -xf aarch64-buildroot-linux-gnu_sdk-buildroot.tar.gz
source aarch64-buildroot-linux-gnu_sdk-buildroot/environment-setup
export MIPS32_CMAKE_TOOLCHAIN_FILE=$PWD/aarch64-buildroot-linux-gnu_sdk-buildroot/opt/toolchain-mipsel-elvees-elf32/share/cmake/toolchain.cmake
export ARM_CMAKE_TOOLCHAIN_FILE=$PWD/aarch64-buildroot-linux-gnu_sdk-buildroot/share/buildroot/toolchainfile.cmake

Note

Ссылка на релиз MCom-03 Buidroot приведена справочно. Последняя версия данного репозитория может требовать более свежих версий компиляторов.

Сборка проекта для MIPS32 (RISC0):

cmake -S . -B build-mips -DCMAKE_TOOLCHAIN_FILE=$MIPS32_CMAKE_TOOLCHAIN_FILE
make -j -C build-mips

Сборка проекта ARM64 (CPU0):

cmake -S . -B build-arm -DCMAKE_TOOLCHAIN_FILE=$ARM_CMAKE_TOOLCHAIN_FILE
make -j -C build-arm

Для проверки форматирования используется pre-commit (см. pre-commit.com):

pre-commit run --all-files

Приложение в бесконечном цикле выводит сообщение "Hello, world!" в UART0 и переключает состояние GPIO1_PORTD_0 (на плате MCom-03 BuB к этому GPIO подключен светодиод HL11).

Приложение собирается в двух (для MIPS) или трёх (для ARM64) вариантах:

  • XIP для запуска с QSPI-памяти;
  • RAM для запуска через JTAG или при загрузке через консоль UART;
  • U-Boot для запуска из U-Boot (доступно только для ARM64).
  1. Собрать приложение для MIPS32.
  2. Прошить файл hello-world-mips-xip0.bin на SPI-флеш.
  3. Подключить SPI-флеш в разъём QSPI0.
  4. Выставить переключатели BOOT в состояние "000".
  5. Подать питание на MCom-03.
  1. Собрать приложение для ARM64.
  2. Прошить файл hello-world-aarch64-xip1.bin на SPI-флеш.
  3. Подключить SPI-флеш в разъём QSPI1.
  4. Выставить переключатели BOOT в состояние "101".
  5. Подать питание на MCom-03.
  1. Собрать приложение для MIPS32.

  2. Выставить переключатели BOOT в состояние "000" или "011".

  3. Подать питание на MCom-03.

  4. Запустить MDB и выполнить команды:

    loadelf <путь_к_файлу>/hello-world-mips-ram.elf
    set risc.pc 0xa0000000
    run
    
  1. Собрать приложение для ARM64.

  2. Выставить переключатели BOOT в состояние "000" или "011".

  3. Подать питание на MCom-03.

  4. Запустить MDB и выполнить команды:

    set 0xbf000020 0x10
    loadbin <путь_к_файлу>/hello-world-aarch64-ram.bin 0xa0000000
    set 0xbf000000 0x10
    set 0xbf001008 0x115
    set 0xa1080000 0x2
    set 0xa1080004 0x2
    set 0xa1080008 0x2
    set 0xa1000040 0x10
    set 0xa100011C 0x0
    set 0xa1000000 0x10
    
  1. Собрать приложение для MIPS32.

  2. Выставить переключатели BOOT в состояние "011".

  3. Подать питание на MCom-03.

  4. Передать содержимое приложения в накристальное ОЗУ:

    cat hello-world-mips-ram.hex > /dev/ttyUSB0
    
  5. Открыть UART-консоль:

    minicom -D /dev/ttyUSB0
    
  6. В UART-консоли ввести команду:

    run
    
  1. Собрать приложение для ARM64.

  2. Запустить U-Boot. При появлении соощения Hit any key to stop autoboot нажать любую клавишу, что бы перейти в режим командной строки.

  3. Загрузить elf-файл в память любым способом. Например:

    • через UART0 по протоколу XMODEM:

      loadx $loadaddr
      
    • с SD-карты:

      load mmc 1:1 $loadaddr /spi-flasher-aarch64-uboot.elf
      
  4. Запустить исполнение elf-файла:

    setenv autostart 1
    bootelf $loadaddr
    

Note

В U-Boot доступно только 256 МиБ DDR-памяти в диапазоне от 0x8_9040_0000 до 0x8_A03F_FFFF поэтому загружать elf-файл необходимо в пределах этого диапазона. Следует учитывать, что в верхней части этого диапазона располагается код U-Boot, который нельзя перекрывать. Адрес начала U-Boot можно посмотреть в поле relocaddr, выполнив команду bdaddr. Для избежания повреждения кода U-Boot при загрузке файла рекомендуется использовать адрес из переменной loadaddr. При выполнении команды bootelf elf-файл будет распакован по адресу 0x8_9100_0000.

Приложение предназначено для загрузки в режиме UART0 (BOOT=3) и предоставляет функционал для работы с памятью SPI NOR, подключенной к QSPI0 или QSPI1. Приложение используется скриптом mcom03-flash-tools для прошивки SPI Flash.

Приложение spi-flasher предоставляет консоль через UART0 и может использоваться вручную без mcom03-flash-tools (кроме записи данных, которые передаются в бинарном виде). Для ручного запуска spi-flasher необходимо выполнить следующие действия:

  1. Собрать spi-flasher для архитектуры MIPS (нужен файл spi-flasher-mips-ram.hex).

  2. Выставить переключатели BOOT в состояние "011" и подать питание на MCom-03 (или нажать Reset, если питание уже было подано).

  3. Выполнить:

    cat spi-flasher-mips-ram.hex > /dev/ttyUSB0
    
  4. Открыть UART в любом текстовом терминале (например, minicom -D /dev/ttyUSB0).

  5. Выполнить команду run. После этого начинает исполняться spi-flasher.

Основные команды:

  • qspi <id> [v18] <id> - выбор QSPI0 или QSPI1; [v18] - выбор напряжения КП QSPI1. Для QSPI0 значение [v18] игнорируется. [v18] = 0 - режим 3.3В, [v18] = 1 - режим 1.8В (например, qspi 1 0).

  • read <offset> <size> [text|bin] - чтение содержимого SPI Flash. <offset> - смещение, начиная с которого читать данные, <size> - размер данных. Если третий аргумент не указан или указан как text, то данные выводятся в текстовом виде. Бинарный вид (bin) используется только для mcom03-flash-tools. Например, read 0 0x200.

  • write <offset> <page_size> - запись данных в SPI Flash, начиная со смещения <offset>. <page_size> - размер страницы (можно узнать из описания на микросхему SPI Flash). Для записи используется собственный протокол: Запись данных.

  • erase <offset> - очистка сектора, начинающегося со смещения <offset>. Размер сектора зависит от конкретной флеш-памяти (для S25FL128S сектор имеет размер 64 КиБ).

  • readcrc <offset> <size> - посчитать и вывести в консоль CRC16 для <size> байт данных, начиная со смещения <offset>.

  • custom <tx_data> <rx_size> - отправка на SPI Flash данных <tx_data> и вывод <rx_size> байт ответа. <tx_data> - это набор байт, записанных слитно в 16-ричном представлении. Перед <tx_data> можно не указывать 0x. Например, команда custom 0b00020000 64 или custom 0x0b00020000 64 отправит на SPI 5 байт [0b, 00, 02, 00, 00] (команда FAST_READ, адрес 0x200 и один dummy-байт) и прочитает 64 байта ответа. <rx_size> может быть любым неотрицательным целым числом.

  • bootrom - прыжок в код BootROM. Это действие выглядит как перезагрузка. Доступно только для сборки под процессор MIPS. Для тестирвоания команды можно использовать следующий код:

    # загрузить SPI Flasher в память и запустить
    cat spi-flasher-mips-ram.hex > /dev/ttyUSB0
    sleep 1
    echo "run" > /dev/ttyUSB0
    
    # проверить, что запускается именно SPI Flasher и он знает команду "bootrom"
    echo -e "help\r" > /dev/ttyUSB0 & grep "bootrom" /dev/ttyUSB0
    sleep 1
    
    # выполнить команду "bootrom" и проверить, что запущена именно консоль BootROM
    echo -e "bootrom\r" > /dev/ttyUSB0
    sleep 1
    echo -e "help\r" > /dev/ttyUSB0 & grep "devcommit" /dev/ttyUSB0
    
  • exit - выход в родительскую программу, из которой был вызван spi-flasher. Доступно только для сборки под U-Boot.

Команда write указывает смещение и размер страницы. Команда возвращает строку:

Ready for data
#

После чего ожидает блоки данных. Структура блока:

+--------------------------------------------------+
| len_lo | len_hi | crc_lo | crc_hi | payload .... |
+--------------------------------------------------+
  • len_lo и len_hi - младший и старший байты размера данных payload в байтах (размер блока не должен превышать размер страницы, указанный командой write);
  • crc_lo и crc_hi - младший и старший байты CRC16 от данных payload;
  • payload - данные для записи.

Если размер указан нулевой размер payload, то происходит возврат в консоль. После передачи последнего байта payload spi-flasher выдаёт один из ответов:

  • символ 'R' - означает, что блок записан и spi-flasher ожидаёт следующий блок;
  • символ 'C' - означает, что CRC16 от payload не соответствует укзанному (данные повредились при передаче через UART). В этом случае запись не производилась и можно либо повторить передачу этого блока, либо прервать запись и вернуться в консоль, указав нулевой размер данных;
  • строка 'En<сообщение>n' - означает, что произошла ошибка.

About

Baremetal apps for MCom-03 MIPS RISC0, ARM CPU

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 3

  •  
  •  
  •