VisionFive 2: одноплатный компьютер на базе RISC-V

17 апреля 2023

VisionFive 2 — одноплатный компьютер на базе процессора StarFive JH7110. Примечателен тем, что в нем используется открытый набор инструкций RISC-V. В отличие от 1-ой версии, 2-ая версия VisionFive имеет интегрированный GPU. Это делает VisionFive 2 первым одноплатником на RISC-V, способным серьезно конкурировать с Raspberry Pi и другими одноплатниками на ARM. По крайней мере, в теории.

Примечание: Если вдруг тема RISC-V обошла вас стороной, обратите внимание на заметки Конфигурация FPGA в качестве RISC-V процессора и Превращаем BlackIce II в Arduino-совместимую RISC-V отладочную плату (гостевой пост Олега Бахарева).

Железо

Цена версии с 8 Гб ОЗУ составляет 9600 руб или ~123$. Плату можно приобрести на AliExpress. Доставка в моем случае заняла ровно три недели.

Вид одноплатника сверху:

Одноплатный компьютер VisionFive 2, вид сверху

Вид одноплатника снизу:

Одноплатный компьютер VisionFive 2, вид снизу

Мне досталась плата версии 1.2А. Судя по информации в сети, уже существует плата 1.3B. Не очень понятно, чем они отличаются, поскольку схема доступна только для последней версии.

Вот что у нас здесь по железу:

  • SoC StarFive JH7110, четыре ядра SiFive U74 по 1.5 ГГц. 64 бит, 2 Мб L2 кэша, набор инструкций RV64GC;
  • Данный SoC имеет встроенный GPU, Imagination BXE-4-32 MC1, работающий на частое до 600 МГц;
  • Память — LPDDR4, до 2800 Mbps. Платы бывают с 2 Гб, 4 Гб и 8 Гб памяти. У меня 8 Гб;
  • Доступны порты 3.5 мм аудио, 4 порта USB 3.0, HDMI 2.0 с заявленной поддержкой 1080p / 60 FPS или 4K / 30 FPS, два разъема RJ45 1 Gbit Ethernet, разъем MIPI CSI для подключения камеры, два разъема MIPI DSI для 1080p LCD, 40 пинов GPIO с распиновкой как у малины;
  • Внизу находятся разъем для карты MicroSD, eMMC разъем, M.2 разъем для M-keyed NVMe SSD. Загрузка осуществляется с MicroSD карты, рекомендуется объем от 32 Гб. Карта в комплект не входит;
  • Питается устройство через разъем USB-C. Рекомендуется блок питания 5 В на 3 A. БП в комплект не входит;
  • Все это на плате форм-фактора PicoITX, 100x72 мм, что немного крупнее Raspberry Pi;

Обращаю внимание, что в VisionFive 2 нет встроенных WiFi и Bluetooth. Если они нужны, используйте внешние USB-устройства.

К процессору не повредит приклеить небольшой радиатор. Как показывает практика, пассивного охлаждения одноплатнику достаточно. Я использовал комплект радиаторов для Raspberry Pi. Радиаторы были приклеены не только к CPU, но также к памяти и прочим крупным элементам. Хуже точно не будет.

Обновление загрузчика

Понять, как запустить на этом одноплатнике Linux, заняло некоторое время. Проект молодой. Документация имеется, но она сырая. Разбираться что к чему приходится по форумам и блогам.

Первым делом на плате необходимо обновить загрузчик. Тот, что прошит по умолчанию, не будет работать с последними образами Debian для этого одноплатника.

Идем в релизы VisionFive2 SDK и находим там последнюю версию. Я использовал версию 2.11.5. Из релиза качаем следующие файлы:

  • sdcard.img;
  • u-boot-spl.bin.normal.out;
  • visionfive2_fw_payload.img;

Пишем sdcard.img на MicroSD-карту:

sudo dd bs=16M if=sdcard.img of=/dev/mmcblk0

Здесь и далее я использую ноутбук под управлением Linux, но под MacOS шаги будут плюс-минус такие же.

Забегая вперед, скажу, что подойдет не всякая MicroSD-карта. Если вы ковыряли протокол SD-карт, то это не должно вас удивлять. У меня все получилось с SDHC картой на 32 Гб производства Samsung. В то же время, SDXC карта на 64 Гб от Sony не заработала с одноплатником.

Также необходимо перекинуть на SD’шку два других файла:

sudo mount /dev/mmcblk0p4 /mnt
sudo cp u-boot-spl.bin.normal.out /mnt/root/
sudo cp visionfive2_fw_payload.img /mnt/root/
sudo umount /mnt

С помощью DIP-переключателя на плате выбираем загрузку с SD-карты:

Выбор способа загрузку на VisionFive 2 при помощи DIP-переключателя

Обращаю внимание, что выставлять нужно по шелкографии, а не надписи на переключателе.

Далее нам понадобится USB-UART конвертер. Я использовал конвертер на базе PL2303. Важно, чтобы на нем была перемычка для выбора между 5-и вольтовой и 3.3-вольтовой логикой. Должна быть выбрана 3.3-вольтовая логика.

Открываем VisionFive 2 Single Board Computer Quick Start Guide [PDF] и находим в нем «Figure 2-4 Pinout Diagram». Из этой картинки мы понимаем, что UART выведен на GPIO-пины 6, 8 и 10: GND, TX и RX соответственно:

Пины UART на плате VisionFive 2

Как обычно, TX на плате подключаем к RX на конвертере, и наоборот, RX на плате — к TX на конвертере. GND подключаем к GND. Конвертер вставляем в USB-порт компьютера.

Узнаем, какое имя получило устройство:

sudo dmesg | grep tty | tail

В моем случае это ttyUSB3. Далее говорим:

sudo minicom -D /dev/ttyUSB3 -b 115200

Необходимо убедиться, что в настройках minicom отключен hardware flow control. Иначе ввод не будет работать и мы не сможем выполнять какие-либо команды.

Для этого:

  • Нажимаем Ctrl-A, O чтобы попасть в меню [configuration];
  • Выбираем Serial port setup, жмем Enter;
  • Нажимаем F, должны видеть F - Hardware Flow Control: No;
  • Нажимаем Enter, чтобы вернуться на шаг назад;
  • Выбираем Save setup as dfl, жмем Enter;
  • Выбираем Exit, жмем Enter;

Подаем питание на одноплатник. В minicom должны увидеть:

U-Boot SPL 2021.10 (Nov 10 2022 - 13:29:36 +0800)
... и так далее много текста ...

На плате в это время будет мигать зеленый светодиод. В конце вывода должно появиться:

... тут было много таинственного текста ...
Welcome to Buildroot
buildroot login:

Входим под пользователем root с паролем starfive.

Устанавливаем новый загрузчик на одноплатник:

flashcp -v u-boot-spl.bin.normal.out /dev/mtd0
flashcp -v visionfive2_fw_payload.img /dev/mtd1

Теперь можно сделать shutdown -r now. При загрузке первой строчкой должны увидеть что-то вроде:

U-Boot SPL 2021.10 (Mar 24 2023 - 01:42:56 +0800)
... и так далее много текста ...

Видим, что загрузчик был успешно обновлен.

Загружаемся под Debian

С новым загрузчиком есть шанс запустить официальный образ Debian согласно мануалу [PDF]. Образ качаем отсюда. На момент написания поста последним был релиз 202303.

Записываем его на SD-карту. Можно на ту же, что использовали ранее:

sudo dd bs=16M if=starfive-jh7110-тратата.img of=/dev/mmcblk0

Загружаемся. В minicom должны видеть что-то вроде:

...
[  OK  ] Started Modem Manager.
[  OK  ] Started Hostname Service.
         Starting Network Manager Script Dispatcher Service...
[  OK  ] Started GNOME Display Manager.
[  OK  ] Started Network Manager Script Dispatcher Service.
[  OK  ] Started OpenBSD Secure Shell server.

Debian GNU/Linux bookworm/sid starfive ttyS0

starfive login:

Заходим под пользователем user с паролем starfive.

Первым делом после загрузки рекомендуется растянуть корневой раздел в соответствии с фактически доступным местом.

Говорим:

sudo fdisk /dev/mmcblk1

Далее выполняем такие шаги:

Command (m for help): d
Partition number (1-4, default 4): 4

Partition 4 has been deleted.

Command (m for help): n
Partition number (4-128, default 4):
First sector (34-62521310, default 221184):
Last sector, +/-sectors or +/-size{K,M,G,T,P} ⏎
    (221184-62521310, default 62519295):

Created a new partition 4 of type 'Linux filesystem' ⏎
    and of size 29.7 GiB.
Partition #4 contains a ext4 signature.

Do you want to remove the signature? [Y]es/[N]o: N

Command (m for help): w

The partition table has been altered.
Syncing disks.

И затем:

sudo resize2fs /dev/mmcblk1p4

Ожидаемый вывод:

resize2fs 1.46.6-rc1 (12-Sep-2022)
Filesystem at /dev/mmcblk1p4 is mounted on /; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 4
The filesystem on /dev/mmcblk1p4 is now 7787264 (4k) blocks long.

Вывод df -h теперь должен показать, что под корневой раздел выделена большая часть доступного места на карте. В моем случае получилось 27 Гб.

На первый взгляд может показаться, что менять размеры разделов на живой системе — не самая лучшая затея. Но, вопреки интуиции, это вполне безопасно. Дело в том, что fdisk работает только с таблицей разделов. Сами же разделы он не трогает. Поэтому удаление раздела и создание нового, начинающегося с точно того же блока, является совершенно законной операцией. Никакая информация при этом не будет потеряна. Плюс к этому, EXT4 поддерживает on-line resizing, который и использует утилита resize2fs.

Переносим корневой раздел на NVMe диск

Использование NVMe SSD диска позволяет увеличить количество дискового пространства и повысить скорость дискового ввода-вывода. Если вы намерены продолжать использовать SD-карту, то этот раздел можно пропустить.

Я использовал недорогой NVMe M.2 диск на 250 Гб от Kingston. Выключаем одноплатник, вставляем NVMe диск в слот M.2, закрепляем винтом, включаем одноплатник. Должны увидеть новый диск:

$ lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
...пропущено...
nvme0n1     259:0    0 232.9G  0 disk

Теперь наша задача — перенести содержимое MicroSD карты на этот диск:

sudo sync
sudo dd bs=16M if=/dev/mmcblk1 of=/dev/nvme0n1

Не очень правильно делать это на работающей системе, но это самый простой способ. При условии, что здесь используется журналируемая ФС EXT4, все должно получиться. Копирование занимает примерно 20-25 минут.

На всякий случай проверяем раздел:

sudo fsck -yf /dev/nvme0n1p4

Также на всякий случай меняем UUID корневного раздела на SD-карте на случайный, чтобы его ID не конфликтовал с ID раздела на NVMe диске:

sudo tune2fs -O metadata_csum_seed -U random /dev/mmcblk1p4

Проверяем, что изменение вступило в силу:

sudo blkid | sort

Не уверен, что менять UUID действительно необходимо, но хуже не будет.

Наконец, правим extlinux.conf, чтобы в качестве корневого раздела монтировался раздел на NVMe диске, а не на SD-карте:

sudo sed -i 's/mmcblk1p4/nvme0n1p4/g' /boot/extlinux/extlinux.conf

Перезагружаемся:

sudo shutdown -r now

Если все было сделано правильно, то после перезагрузки корневой раздел окажется на NVMe диске:

$ df -h
...пропущено...
/dev/nvme0n1p4   30G  2.9G   27G  10% /

Осталось только увеличить размер раздела при помощи fdisk и resize2fs, как ранее это делалось для SD-карты. Результат должен выглядеть как-то так:

$ df -h
...пропущено...
/dev/nvme0n1p4  230G  2.5G  227G   2% /

К сожалению, полностью загружаться с NVMe диска одноплатник не умеет.

Последние штрихи

Втыкаем витую пару. На плате два Ethernet-разъема. Нам нужен тот что ближе к разъему HDMI (дальше от края платы). Другой разъем пока что не умеет получать настройки сети по DHCP. Должны мочь зайти на одноплатник по SSH.

Настраиваем локаль:

sudo dpkg-reconfigure locales

Если теперь просто попытаться обновить пакеты, то получим:

The following signatures were invalid: EXPKEYSIG B523E5F3FC4E5F2C

Решение заключается в том, чтобы открыть sources.list в VIM:

sudo apt install vim
sudo vim /etc/apt/sources.list

… и прописать туда:

# было:
# deb https://snapshot.debian.org/archive/debian-ports/тратата
deb http://ftp.ports.debian.org/debian-ports/ unstable main

Затем говорим:

wget "https://deb.debian.org/debian-ports/pool/main/d/debian-ports-"
"archive-keyring/debian-ports-archive-keyring_2023.02.01_all.deb"
sudo dpkg -i debian-ports-archive-keyring_2023.02.01_all.deb

Далее обновляемся и ставим пакеты как обычно в Debian. В моем случае предстояло обновить около 600 пакетов. Это заняло примерно 15 минут.

Очень важно. На вопрос:

Configuration file '/etc/default/u-boot'
 ==> Modified (by you or by a script) since installation.
 ==> Package distributor has shipped an updated version.
   What would you like to do about it ?  Your options are:
    Y or I  : install the package maintainer's version
    N or O  : keep your currently-installed version
      D     : show the differences between the versions
      Z     : start a shell to examine the situation
 The default action is to keep your current version.
*** u-boot (Y/I/N/O/D/Z) [default=N] ? N

… отвечаем N, иначе система потом не загрузится.

После обновления пакетов я проверил работу HDMI. Технически, он есть. Однако интерфейс тормозной и почему-то в оттенках розового. Насколько я понимаю, сейчас ведутся активные работы над полноценной поддержкой здешнего GPU. Пока что VisionFive 2 не является лучшим выбором для десктопа.

На этом этапе остается лишь поместить VisionFive 2 в какой-то корпус. Неплохая модель для 3D-печати была найдена на Printables. Ею я и воспользовался.

Заключение

Меня особенно интересовало, можно ли на этом железе собрать PostgreSQL. Оказалось, что можно, и система проходит make check-world. Документация тоже собирается. При помощи Meson и Ninja проект также компилируется. Если вы разработчик, и хотите тестировать проекты на необычном железе, то с этой задачей VisionFive 2 справляется отлично.

Какие-то серьезные бенчмарки я не проводил. Могу лишь сказать, что на моих задачах VisionFive 2 где-то на 15-50% быстрее Raspberry Pi 3 Model B+ с внешним SSD-диском, подключенным по USB. Точная цифра определяется характером нагрузки. Это не удивительно, ведь в RPi 3 есть только USB 2.0, доступен лишь 1 Гб памяти, и так далее. Не совсем правильно сравнивать эти одноплатники, но других у меня нет.

Метки: , , , .


Вы можете прислать свой комментарий мне на почту, или воспользоваться комментариями в Telegram-группе.