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. Доставка в моем случае заняла ровно три недели.
Вид одноплатника сверху:
Вид одноплатника снизу:
Мне досталась плата версии 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-карту:
Здесь и далее я использую ноутбук под управлением Linux, но под MacOS шаги будут плюс-минус такие же.
Забегая вперед, скажу, что подойдет не всякая MicroSD-карта. Если вы ковыряли протокол SD-карт, то это не должно вас удивлять. У меня все получилось с SDHC картой на 32 Гб производства Samsung. В то же время, SDXC карта на 64 Гб от Sony не заработала с одноплатником.
Также необходимо перекинуть на SD’шку два других файла:
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-порт компьютера.
Узнаем, какое имя получило устройство:
В моем случае это ttyUSB3. Далее говорим:
Необходимо убедиться, что в настройках 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 должны увидеть:
... и так далее много текста ...
На плате в это время будет мигать зеленый светодиод. В конце вывода должно появиться:
Welcome to Buildroot
buildroot login:
Входим под пользователем root
с паролем starfive
.
Устанавливаем новый загрузчик на одноплатник:
flashcp -v visionfive2_fw_payload.img /dev/mtd1
Теперь можно сделать shutdown -r now
. При загрузке первой строчкой должны увидеть что-то вроде:
... и так далее много текста ...
Видим, что загрузчик был успешно обновлен.
Загружаемся под Debian
С новым загрузчиком есть шанс запустить официальный образ Debian согласно мануалу [PDF]. Образ качаем отсюда. На момент написания поста последним был релиз 202303.
Записываем его на SD-карту. Можно на ту же, что использовали ранее:
Загружаемся. В 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
.
Первым делом после загрузки рекомендуется растянуть корневой раздел в соответствии с фактически доступным местом.
Говорим:
Далее выполняем такие шаги:
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.
И затем:
Ожидаемый вывод:
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, закрепляем винтом, включаем одноплатник. Должны увидеть новый диск:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
...пропущено...
nvme0n1 259:0 0 232.9G 0 disk
Теперь наша задача — перенести содержимое MicroSD карты на этот диск:
sudo dd bs=16M if=/dev/mmcblk1 of=/dev/nvme0n1
Не очень правильно делать это на работающей системе, но это самый простой способ. При условии, что здесь используется журналируемая ФС EXT4, все должно получиться. Копирование занимает примерно 20-25 минут.
На всякий случай проверяем раздел:
Также на всякий случай меняем UUID корневного раздела на SD-карте на случайный, чтобы его ID не конфликтовал с ID раздела на NVMe диске:
Проверяем, что изменение вступило в силу:
Не уверен, что менять UUID действительно необходимо, но хуже не будет.
Наконец, правим extlinux.conf, чтобы в качестве корневого раздела монтировался раздел на NVMe диске, а не на SD-карте:
Перезагружаемся:
Если все было сделано правильно, то после перезагрузки корневой раздел окажется на NVMe диске:
...пропущено...
/dev/nvme0n1p4 30G 2.9G 27G 10% /
Осталось только увеличить размер раздела при помощи fdisk
и resize2fs
, как ранее это делалось для SD-карты. Результат должен выглядеть как-то так:
...пропущено...
/dev/nvme0n1p4 230G 2.5G 227G 2% /
К сожалению, полностью загружаться с NVMe диска одноплатник не умеет.
Последние штрихи
Втыкаем витую пару. На плате два Ethernet-разъема. Нам нужен тот что ближе к разъему HDMI (дальше от края платы). Другой разъем пока что не умеет получать настройки сети по DHCP. Должны мочь зайти на одноплатник по SSH.
Настраиваем локаль:
Если теперь просто попытаться обновить пакеты, то получим:
Решение заключается в том, чтобы открыть sources.list в 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
Затем говорим:
"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 минут.
Очень важно. На вопрос:
==> 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 Гб памяти, и так далее. Не совсем правильно сравнивать эти одноплатники, но других у меня нет.
Метки: Linux, RISC-V, Девайсы, Электроника.
Вы можете прислать свой комментарий мне на почту, или воспользоваться комментариями в Telegram-группе.