StarFive VisionFive2

Одноплатный компьютер VisionFive2, построеный на высокопроизводительном SoC JH7110 с архитектурой RISC-V.

VisionFive 2 это первый в мире высокопроизводительный RISC-V одноплатный компьютер (SBC) со встроенным графическим процессором (GPU). В сравнении с предыдущей версией, VisionFive 2 был полностью модернизирован: увеличена рабочая частота процессора, расширены возможности обработки мультимедиа. Приемлемая цена и характеристики данной платы делают VisionFive 2 самым доступным одноплатным компьютером RISC-V для разработчиков.

Hardware Features

VisionFive 2 имеет четырехядерный 64-битный SoC c RV64GC instruction set architecture (ISA), работающий на частотах до 1.5 GHz, а также интегрированный графический ускоритель IMG BXE-4-32 MC1, поддерживающий OpenCL 3.0, OpenGL ES 3.2, и Vulkan 1.2. На плате может быть распаяно 2/4/8 GB LPDDR4 RAM. Имеются устройства ввода-вывода, такие как разъем M.2, разъем eMMC, четыре порта USB 3.0, 40-контактный разъем GPIO, два порта Gigabit Ethernet, слот для TF-карт.

VisionFive 2 имеет: аудио и видео декодеры, разъемы MIPI-CSI и MIPI-DSI для подключения мультимедийных периферийных устройств. Основные характеристики VisionFive 2 приведены в следующем списке:

VisionFive2
  • Processor: StarFive JH7110 with RISC-V quad-core CPU with 2 MB L2 cache and a monitor core, supporting RV64GC ISA, working up to 1.5 GHz
  • GPU: IMG BXE-4-32 MC1 with work frequency up to 600 MHz
  • Memory: 2 GB/4 GB/8 GB LPDDR4 SDRAM, up to 2,800 Mbps
  • Storage: Onboard TF card slot
  • Flash: 16MB SPI Nor Flash GD25Q128E (to store U-Boot and BootLoader)
  • Video Output: 1×2-lane MIPI DSI display port, supporting up to 1080p@30fps; 1×4-lane MIPI DSI display port, supporting up to 2K@30fps in both single display and dual display modes; 1×HDMI 2.0, supporting up to 4K@30fps or 2K@60fps (Note: Only one MIPI DSI port can be used for display at a time)
  • Camera: 1×2-lane MIPI CSI camera port, supporting up to 1080p@30fps
  • Encoder/Decoder: Video decoder supports up to 4K@60fps and multi-stream for H264/H265; Video encoder supports up to 1080p@30fps and multi-stream for H265; JEPG encoder/decoder
  • Audio: 4-pole stereo audio jack
  • Ethernet: 2×RJ45 Gigabit Ethernet ports
  • USB Host: 4×USB 3.0 ports (multiplexed with a PCIe 2.0 1x lane)
  • USB Device: 1×USB device port (by reusing the USB-C port)
  • M.2 Connector: M.2 M-Key
  • eMMC Socket: For eMMC module as OS and data storage
  • 2-Pin Fan Header
  • Power: USB-C port 5V DC via USB-C with PD, up to 30 W (minimum 3 A); GPIO Power In 5 V DC via GPIO heade (minimum 3 A); PoE (Power over Ethernet) Power function is enabled and requires separate PoE HAT
  • 40-Pin GPIO Header 1×40-pin GPIO header, supporting various interface options: 3.3V (on 2 pins); 5V (on 2 pins); Ground (on 8 pins); GPIO; CAN bus; DMIC; I2C; I2S; PWM; SPI; UART; and so on
  • Boot mode setting pins: 1-bit QSPI Nor Flash; SDIO3.0; eMMC; UART
  • Reset button: To reset VisionFive 2, press and hold the Reset button for more than 3 seconds to ensure the reset is successful
  • Dimensions: 100 × 74 mm
  • Recommended operating temperature: 0 - 50 ℃
  • Debug function: UART TX and UART RX are available through the 40-pin GPIO header

Документацию можно найти на официальном сайте компании StarFive.

Toolchain

Готовый toolchain для работы на 64-разрядных Linux машинах можно получить на нашем FTP-сервере в каталоге toolchains/x86_64. Выбирать здесь нужно последнюю версию архива с именем 'riscv64-RV64GC-linux-glibc-*.tar.xz'.

Кроме того, для работы с микроконтроллерами на архитектуре RISC-V, имеется toolchain riscv64-NONE-elf-newlib-*.tar.xz, его можно использовать, наример, для таких серий микроконтроллеров как GD32VF103.

Для самостоятельной сборки toolchain-а, необходимо получить срез репозитория toolchains, например,

$ svn co svn://radix.pro/radix/toolchains/trunk toolchains

и выполнить команду make в соответствующем каталоге:

$ cd toolchains/products/RISCV64-glibc/1.9.8
$ make -j8

Напомним здесь, что перед сборкой необходимо подготовить каталог для инсталляции toolchain-а так, как это описано в разделе, посвященном загрузке toolchain-ов с нашего FTP-сервера.

Boot Images

Для целевой архитектуры RISC-V мы можем использовать как U-Boot, так и GRUB в качестве EFI-загрузчика и, поэтому в каталоге очередного выпуска дистрибутива , дополнительно, будут располагаться образы SPI Nor Flash:

1.9.367
  │
  └── riscv64-glibc
      └── visionfive2
          ├── app
          ├── base
          ├── boot
          ├── dev
          ├── dict
          ├── fonts
          ├── libs
          ├── net
          ├── .dialogrc
          ├─ @.pkglist
          ├── visionfive2.efi32fs
          ├── visionfive2.ext4fs
          ├── visionfive2.pkglist
          ├── visionfive2.spi-flash.image
          ├── visionfive2.spi-flash.image.md5
          └─ *write-efiboot-image

Процедура создания загрузочных образов описана в разделе Boot Images и, для платы VisionFive 2, она не отличаться от записи на SD-карту образов файловых систем архитектуры X86_64.

Запись на физический носитель осуществляться с помощью скрипта write-efiboot-image, параметрами которого будут: образ FAT32 файловой системы, содержащей EFI-загрузчик GRUB и образ корневой файловой системы:

# ./write-efiboot-image -e visionfive2.efi32fs -r visionfive2.ext4fs /dev/sdg

Здесь, /dev/sdg необходимо заменить на действительное имя устройства подключенной SD-карты.

Образ visionfive2.spi-flash.image предназначен для прошивания микросхемы GD25Q128E. В нем имеются следующие разделы:

    Offset |    Length | Size  | Part Name | Description
 ----------+-----------+-------+-----------+-----------------
       0x0     0x40000    256k   spl         SPL
   0xf0000     0x10000     64k   uboot-env   U-Boot environment variables
  0x100000    0x300000   3072k   uboot       fw_payload.img (OpenSBI + U-Boot)
  0xf00000    0x100000   1024k   data        Reseved

На сайте компании StarFive представлена несколько другая таблица разделов. В ней ключевыми являются смещения до SPL, U-Boot environment и fw_payload.img, которые должны оставаться неизменными.

Действительные размеры разделов лучше согласовывать с записью:

#
# linux/arch/riscv/boot/dts/starfive/jh7110-visionfive-v2.dtsi:
#
&qspi {
    nor_flash: nor-flash@0 {
    compatible = "jedec,spi-nor";
    reg=<0>;
    cdns,read-delay = <5>;
    spi-max-frequency = <100000000>;
    cdns,tshsl-ns = <1>;
    cdns,tsd2d-ns = <1>;
    cdns,tchsh-ns = <1>;
    cdns,tslch-ns = <1>;
    status = "okay";

        partitions {
            compatible = "fixed-partitions";
            #address-cells = <1>;
            #size-cells = <1>;

            spl@0 {
                    reg = <0x0 0x40000>;
            };
            uboot-env@f0000 {
                    reg = <0xf0000 0x10000>;
            };
            uboot@100000 {
                    reg = <0x100000 0x300000>;
            };
            data@f00000 {
                    reg = <0xf00000 0x100000>;
            };
        };
    };
};

приведенной в конце файла jh7110-visionfive-v2.dtsi, в исходном коде ядра Linux. Тогда загрузчик можно будет обновлять с помощью mtd-utils, прямо на работающей системе.

Source Code

Для создания образа Radix.Linux мы используем репозитории исходных кодов ядра Linux, загрузчика U-Boot и OpenSBI, опубликованные компанией StarFive. Дополнительную информацию о программном обеспечении VisionFive 2 можно найти на страницах сайта https://doc-en.rvspace.org.

Поскольку на плате распаяна SPI Nor Flash GD25Q128E объемом 16MB и, кроме того, разработчики компании StarFive предупреждают о том, что загрузка с TF-карт в скором времени поддерживаться не будет, образ Radix.Linux имеет EFI-раздел с загрузчиком GRUB, а U-Boot прошивается непосредственно в память микросхемы GD25Q128E.

Разумеется существует возможность обновления загрузчика по UART c помощью recovery-образа публикуемого в репозитории Tools, однако мы будем прошивать загрузчик непосредственно программируя микросхему GD25Q128E.

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

U-Boot

Сборка загрузчика осуществляется в каталоге boot/u-boot/visionfive2. Процесс сборки описан в разделе Compiling U-boot and Kernel на сайте компании StarFive. Однако рассмотрев Make-файл тоже легко разобраться в последовательности и этапах приготовления образов u-boot-spl.bin и fw_payload.img.

Пользователи, не имеющие возможности программировать микросхему GD25Q128E, могут использовать загрузчик уже прошитый в SPI Nor Flash на производстве. Однако в этом случае им будет необходимо выполнить следующие команды, находясь в командной строке U-Boot:

VisionFive2 # setenv bootcmd 'run distro_bootcmd'
VisionFive2 # saveenv

Ну а мы приступим к описанию процесса записи образа visionfive2.spi-flash.image с помощью программатора ch341a и прищепки, которую обычно используют для восстановления BIOS на машинах с архитектурой X86.

CH341A Mini Programmer
Fig.1. CH341A Mini Programmer

Программатор должен быть доработан так, чтобы на шине данных он давал не 5V, а 3.3V. На следующем видео весьма подробно описан процесс доработки:

Video.1. Voltage modding the CH341A Mini Programmer

Прошивку мы будем осуществлять с помошью утилиты flashrom версии 1.3.0.

Если вы правильно подключили программатор, как показано на рис.2, то набрав следующую команду, вы увидите обнаруженное устройство "GD25LQ128C/GD25LQ128D".

bash-5.2# flashrom --programmer ch341a_spi -VV
flashrom v1.2 on Linux 6.1.20 (x86_64)
flashrom is free software, get the source code at https://flashrom.org

flashrom was built with libpci 3.7.0, GCC 11.2.0, little endian
Command line (3 args): flashrom --programmer ch341a_spi -VV
Using clock_gettime for delay loops (clk_id: 1, resolution: 1ns).
Initializing ch341a_spi programmer
Device revision is 3.0.4
The following protocols are supported: SPI.
Probing for AMIC A25L010, 128 kB: probe_spi_rdid_generic: id1 0xc8, id2 0x6018

 . . .

Found GigaDevice flash chip "GD25LQ128C/GD25LQ128D" (16384 kB, SPI).
This chip may contain one-time programmable memory. flashrom cannot read
and may never be able to write it, hence it may not be able to completely
clone the contents of this chip (see man page for details).
===
This flash part has status UNTESTED for operations: PROBE READ ERASE WRITE
The test status of this chip may have been updated in the latest development
version of flashrom. If you are running the latest development version,
please email a report to flashrom@flashrom.org if any of the above operations
work correctly for you with this flash chip. Please include the flashrom log
file for all operations you tested (see the man page for details), and mention
which mainboard or programmer you tested in the subject line.
Thanks for your help!
No operations were specified.

На сообщение о том, что операции: PROBE READ ERASE WRITE еще не протестированы, можно не обращать внимание, так как разработчики flashrom писали, что код функций для работы с "GD25Q128E" полностью совпадает с теми, что используются для "GD25LQ128C", просто они еще не успели привести сообщения в порядок.

Connection CH341A Mini Programmer to the GD25Q128E
Fig.2. Connect the CH341A Mini Programmer to the GD25Q128E

Прежде чем шить новый образ visionfive2.spi-flash.image, мы рекомендуем сохранить существующую прошивку на случай, если будет необходимо восстановить предыдущее содержимое GD25Q128E. Сделать это лучще несколько раз и сравнить контрольные суммы архивных образов:

bash-5.2# flashrom --programmer ch341a_spi -r GD25Q128E.bin   -c "GD25LQ128C/GD25LQ128D"
bash-5.2# flashrom --programmer ch341a_spi -r GD25Q128E-2.bin -c "GD25LQ128C/GD25LQ128D"
bash-5.2# flashrom --programmer ch341a_spi -r GD25Q128E-3.bin -c "GD25LQ128C/GD25LQ128D"

bash-5.2# sha256sum GD25Q128E-2.bin GD25Q128E-3.bin GD25Q128E.bin
658de4da3c9ec801e8c0c2cee8ba07bfb387019a682a15d9350e0103d52e372f  GD25Q128E-2.bin
658de4da3c9ec801e8c0c2cee8ba07bfb387019a682a15d9350e0103d52e372f  GD25Q128E-3.bin
658de4da3c9ec801e8c0c2cee8ba07bfb387019a682a15d9350e0103d52e372f  GD25Q128E.bin

Если контрольные суммы совпадают, то сохраненная копия верна и можно обновлять содержимое GD25Q128E с помощью команды:

bash-5.2# flashrom --programmer ch341a_spi --write spi-flash.image -c "GD25LQ128C/GD25LQ128D"

В случае успеха, на консоль будет выведено сообщение:

bash-5.2# flashrom --programmer ch341a_spi --write spi-flash.image -c "GD25LQ128C/GD25LQ128D"
flashrom v1.2 on Linux 6.1.20 (x86_64)
flashrom is free software, get the source code at https://flashrom.org

Using clock_gettime for delay loops (clk_id: 1, resolution: 1ns).
Found GigaDevice flash chip "GD25LQ128C/GD25LQ128D" (16384 kB, SPI) on ch341a_spi.
===

  .  .  .

Reading old flash chip contents... done.
Erasing and writing flash chip... Erase/write done.
Verifying flash... VERIFIED.

Теперь надо перевести переключатели вправо (RGPIO_0 = 0, RGPIO_1 = 0), как показано на рис.3, подключить SD-карту с образом Radix.Linux и, можно запускать плату.

VisionFive2 GPIO
Fig.3. VisionFive2 RGPIO_0 = 0, RGPIO_1 = 0

GRUB

GRUB версии 2.06 мы собрали с минимальным набором изменений, достаточных для работы на SoCs с архитектурой RISC-V. И если подключиться с помощью, например, minicom, к отладочному порту (рис. 3), то можно видеть процесс загрузки и, в том числе, интерфейс GRUB.

Если вы не хотите использовать GRUB, а предпочитаете чтобы U-Boot загружал ядро Linux самостоятельно, то вы можете просто удалить или переименовать файл bootriscv64.efi на первом разделе SD-карты так, как показано на следующем листинге:

bash-5.2# mkdir tmp
bash-5.2# mount /dev/sdg tmp
bash-5.2# cd tmp/efi/boot
bash-5.2# mv bootriscv64.efi bootriscv64.efi.backup

Boot from NVME

Мы немного изменили переменные окружения U-Boot c тем расчетом, чтобы последовательность выбора устройств для загрузки системы была следующей:

VisionFive2 # printenv boot_targets
VisionFive2 # boot_targets=mmc1 mmc0 nvme0 dhcp

Таким образом, если после загрузки с SD-карты инсталлировать систему на устройство /dev/nvme0n1 по инструкции представленной в разделе Install Instructions и извлечь SD-карту, то, при следующем включении питания, плата загрузится с NVME диска.

Однако если подключены оба устройства: SD-карта и NVME диск, то загрузка будет осуществляться с SD-карты.

GPU

SoC JH7110 содержит встроенный графический ускоритель Imagination BXE-4-32 MC1, работающий на частоте до 600 MHz. На работающей системе Radix.Linux вы можете собрать примеры программ mesa-demos и glmark2.

Сделать это можно, например, следующим образом:

bash-5.2$ git clone https://github.com/glmark2/glmark2
bash-5.2$ cd glmark2
bash-5.2$ mkdir build
bash-5.2$ cd build
bash-5.2$ meson setup --prefix=/usr -Dflavours=drm-gl,x11-gl . ..
bash-5.2$ ninja

И инсталлировать glmark2 от имени пользователя root:

bash-5.2# ninja install

Примеры mesa-demos, перед сборкой, достаточно сконфигурировать командой:

bash-5.2$ meson setup --prefix=/usr . ..

Запускать примеры необходимо используя переменную окружения GALLIUM_DRIVER=softpipe:

bash-5.2$ GALLIUM_DRIVER=softpipe gears
Gears
Fig.4. Gears

Переменная GALLIUM_DRIVER=softpipe необходима, так как llvmpipe еще не поддерживает архитектуру RISC-V.


В заключение, необходимо отметить, что компания StarFive уделяет большое внимание поддержке разработчиков программного обеспечения для своих устройств. Документацию и статьи, посвященные устройствам серии VisionFive можно найти на официальном сайте, где имеется исчерпывающая документация и большое количество примеров.