VisionFive 2: одноплатный компьютер на базе RISC-V
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. Доставка в моем случае заняла ровно три недели.
Вид одноплатника сверху:

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

Мне досталась плата версии 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-карты:

Обращаю внимание, что выставлять нужно по шелкографии, а не надписи на переключателе.
Далее нам понадобится 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 соответственно:

Как обычно, 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 Гб памяти, и так далее. Не совсем правильно сравнивать эти одноплатники, но других у меня нет.