HiFive Unmatched

Материал из ALT Linux Wiki
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Stub.png
Данная страница находится в разработке.
Эта страница ещё не закончена. Информация, представленная здесь, может оказаться неполной или неверной.


SiFive HiFive Unmatched -- плата в форм-факторе Mini-ITX с SoC на архитектуре RISCV64GC. Поддерживется портом Sisyphus на riscv64 и используется в нём в качестве основных сборочных узлов.

В дистрибутивных ядрах un-def поддержка Unmatched началась с 5.12.18-alt1.rv64, в u-boot начиная с 2021.07-alt1.

Образы ALT

На текущий момент еженедельно собираются регулярные сборки: Regular/riscv64. Образы требуется записать через alt-rootfs-installer или вручную.

Запись с помощью alt-rootfs-installer

Требуется установить alt-roofs-installer версии не ниже 0.5.2.

root# alt-rootfs-installer --target=HiFive-Unmatched --image-in=/path/to/<image>-riscv64.img.xz --media=/dev/sdX

Если на плате не установлен графический адаптер и записывается образ с графикой, то необходимо добавить опцию --vnc=1. Про режим подробнее написано в: Regular/riscv64#VNC .

Установка образов вручную

Для запуска образов на SiFive HiFive Unmatched (FU740) SoC необходимо выполнить следующие шаги:

Шаг 0. Запись образа и монтирование:

root$ xzcat /path/to/<image>-riscv64.img.xz | dd of=/dev/sdx bs=4M status=progress 
root$ udiskctl mount /dev/sdX2

Корневой раздел будет примонтирован в /run/media/root/<UUID>

Шаг 1. Добавляем разделы для записи U-Boot SPL (Secondary Program Loader) и U-Boot :

root$ sgdisk -a 1 \
 --new=3:34:2081         --change-name=3:'spl' --typecode=3:5B193300-FC78-40CD-8002-E86C45580B47 \
 --new=4:2082:10273      --change-name=4:'uboot'  --typecode=4:2E54B353-1271-4842-806F-E436D6AF6985 \
/dev/sdX

Шаг 2. U-Boot SPL (Secondary Program Loader) и U-Boot находятся в корневом разделе записанного образа. Запишем их на разделы 3 и 4 соответственно:

root$ dd if=/run/media/root/<UUID>/usr/share/u-boot/sifive_unmatched/u-boot-spl.bin of=/dev/sdX3 bs=1M
root$ dd if=/run/media/root/<UUID>/usr/share/u-boot/sifive_unmatched/u-boot.itb of=/dev/sdX4 bs=1M
root$ sync

Шаг 2.б. Альтернативный вариант: скачаем последнюю версию пакета u-boot-sifive. Можно воспользоваться ссылкой riscv64 со страницы https://packages.altlinux.org/ru/sisyphus_riscv64/srpms/u-boot-sifive/rpms/.

Из пакета нужно извлечь файлы u-boot-spl.bin и u-boot.itb и записать их на разделы 2 и 3 соответственно:

user$ rpm2cpio u-boot-sifive-*riscv64.rpm | cpio -vi --to-stdout './usr/share/u-boot/sifive_unmatched/u-boot-spl.bin' > u-boot-spl.bin
user$ rpm2cpio u-boot-sifive-*riscv64.rpm | cpio -vi --to-stdout './usr/share/u-boot/sifive_unmatched/u-boot.itb' > u-boot.itb
root$ dd if=u-boot-spl.bin of=/dev/sdX3 bs=1M
root$ dd if=u-boot.itb of=/dev/sdX4 bs=1M
root$ sync

Шаг 3. Переключить режим загрузки с EFI на extlinux.conf. Для этого необходимо убрать флаг boot с раздела fat32:

root$ parted /dev/sdX set 1 boot off

VNC

По умолчанию образ рассчитан на работу с видеокартой. Если видеокарты нет, то нужно активировать режим vnc: Regular/riscv64#VNC .

Root на NVME

Можно скопировать корневую файловую систему с SD карты на NVME и настроить её использование следующим образом:

Создайте раздел на NVME, например, с помощью fdisk.

Отформатируйте раздел NVME:

mkfs.ext4 -m1 -L ROOT /dev/nvme0n1p1

Смонтируйте раздел:

mount /dev/nvme0n1p1 /mnt

Скопируйте на раздел NVME содержимое rootfs:

rsync -ax / /mnt

Опция -x позволяет скопировать только содержимое rootfs, но не других подмонтированных файловых систем. Копирование может занять значительное время.

Посмотрите UUID раздела NVME, например, так:

lsblk -f
NAME        FSTYPE       LABEL UUID                                 ...
...
└─nvme0n1p1 ext4   1.0   ROOT  dc155086-4ee4-42f6-87be-bcc67b2b93e6 ...

Исправьте значение UUID в файле /mnt/boot/extlinux/extlinux.conf

append root=UUID=dc155086-4ee4-42f6-87be-bcc67b2b93e6 ...

Исправьте значение UUID в файле /mnt/etc/fstab

UUID=dc155086-4ee4-42f6-87be-bcc67b2b93e6       /       ext4 ...

EFI на NVME

TBD.

Grub

В репозиториях собран grub 2.06, работающий на Unmatched с поверх u-boot, реализующего EFI. Однако такая конфигурация работает менее стабильно чем более простая, в которой u-boot непосредственно загружает ядро. Поэтому использование grub с Unmatched пока рекомендуется исключительно для тестирования grub.

TBD: описать установку grub.

Обновление U-Boot на SD-карте

MSEL[3:0] = 1011

На данный момент в ALT u-boot (SPL и proper) автоматически никак не обновляется. Если после обновления пакета u-boot-sifive в репозитории хочется обновить U-Boot на SD-карте, это можно сделать, выполнив следующие команды от рута:

cd /usr/share/u-boot/sifive_unmatched
by_pt () { lsblk -lo NAME,PARTTYPE | grep "$1" | cut -d\  -f1; }
dd if=u-boot-spl.bin of=/dev/$(by_pt 5b193300-fc78-40cd-8002-e86c45580b47) bs=1M
dd if=u-boot.itb  of=/dev/$(by_pt 2e54b353-1271-4842-806f-e436d6af6985) bs=1M
sync

Для загрузки с SD-карты (и игнорирования SPI flash) рекомендуется перевести переключатели MSEL (рядом с серийным номером около батарейки) в положение 1011 (см. фото). Это положение по умолчанию, соответвующее загрузке с SD-карты.

Загрузка с SPI Flash

На HiFive Unmatched есть встроенная SPI флешка. С её помощью можно загрузиться без SD-карты: на SPI Flash записывается u-boot SPL и основной u-boot, а ядро и корневой раздел находятся на M2 NVME.

Вам понадобится достаточно свежее ядро (подойдёт наш un-def >= 5.16.8-alt2.rv64) и u-boot (u-boot-sifive >= 2022.01-alt2). Инструкция по прошивке есть, например, документации U-Boot. К ALT её можно адаптировать так:

Разметим SPI flash

  • Загрузитесь, например, с SD-карты. Убедитесь, что флешка обнаружена ядром:
# ls -l /dev/mtdblock0
brw-rw---- 1 root disk 31, 0 мая  5 21:55 /dev/mtdblock0
# lsblk  | grep mtd
mtdblock0    31:0    0    32M  0 disk
  • Поставьте u-boot-sifive (содержит собранные u-boot и u-boot SPL, которые мы будем записывать) и gdisk (содержит утилиту sgdisk, которой мы будем пользоваться).
apt-get install u-boot-sifive gdisk
  • Разметьте флешку:
sgdisk --clear -a 1 \
    --new=1:40:2087     --change-name=1:spl   --typecode=1:5B193300-FC78-40CD-8002-E86C45580B47 \
    --new=2:2088:10279  --change-name=2:uboot --typecode=2:2E54B353-1271-4842-806F-E436D6AF6985 \
    --new=3:10280:10535 --change-name=3:env   --typecode=3:3DE21764-95BD-54BD-A5C3-4ABE786F38A8 \
    /dev/mtdblock0

Запишем u-boot

  • Запишите на неё SPL и основной u-boot:
cd /usr/share/u-boot/sifive_unmatched
dd if=u-boot-spl.bin of=/dev/mtdblock0 bs=4096 seek=5 conv=sync
dd if=u-boot.itb of=/dev/mtdblock0 bs=4096 seek=261 conv=sync

Эти же две команды можно использовать для обновления U-Boot на SPI flash после установки новой версии пакета u-boot-sifive.

Включение загрузки с SPI flash

MSEL[3:0]: 0110
MSEL[3:0] = 0110
  • Выключите unmatched
  • Переведите переключатели MSEL (рядом с серийным номером около батарейки) в положение 0110 (см. фото, 0 ближе к процессору).
  • Можно вынуть SD-карту и загрузиться. Обратите внимание на сообщения вначале загрузки:
U-Boot SPL 2022.01 (Jan 25 2022 - 16:59:30 +0000)
Trying to boot from SPI

U-Boot 2022.01 (Jan 25 2022 - 16:59:30 +0000)
[...]

Tips & tricks

U-Boot и порядок загрузки

Порядок загрузки по умолчанию:

boot_targets=nvme0 usb0 mmc0 scsi0 pxe dhcp

nvme0: загрузка с nvme, если есть.

usb0: с USB-флешки (или жёсткого диска или SSD, подключенного к USB через переходник). На Unmatched это работает на USB-портах, расположенных ближе к разъёму ethernet; в двух других U-Boot может не видеть флешку. На флешке может быть ISO, записанная dd (протестировано на регулярках), или готовый rootfs, например записанный alt-rootfs-installer.

mmc0: загрузка с SD-карты (если есть).

Даже при наличии других носителей, можно загрузиться с нужного "вручную". Например, для загрузки с USB при подключенном NVME-носителе:

  1. Подключитесь к uart и включите плату.
  2. Когда появится приглашение "Hit any key to stop autoboot:", нажмите любую клавишу.
  3. Введите следующие команды
pci enum
run bootcmd_usb0

Вместо run bootcmd_usb0 можно дать команду run bootcmd_mmc0 для загрузки с SD-карты.

Светодиоды

Сменить цвет яркого светодиода на случайный (требуется ядро 6.0.3 или выше):

od  -Anone -t u1  -N3 /dev/urandom  > /sys/class/leds/d2/multi_intensity