Недавно компания OrangePi обновила линейку одноплатных компьютеров Orange Pi 5/5B/5+, распаяв на платах 32GB LDDR4 RAM. Однако данные платы вполне прилично работают и с меньшим объемом памяти на борту, а наличие SPI Nor Flash и возможность подключения NVMe диска делают эти платы достойными конкурентами среди одноплатных устройств.
Нас заинтересовал первый образец серии 5/5B/5+, а именно Orange Pi 5, на предмет того, как на данном устройстве поведет себя EDK II и можно ли его использовать так, как мы привыкли работать с обычными ПК.
Toolchain
Готовый toolchain для работы на 64-разрядных Linux-машинах можно получить на нашем FTP-сервере в каталоге toolchains/x86_64. Выбирать здесь нужно последнюю версию архива с именем aarch64-RK358X-linux-glibc-*.tar.xz.
Следует отметить, что данный toolchain не перемещаем и устанавливать его необходимо в каталог /opt/toolchains/. Для установки достаточно создать каталог и распаковать архив:
mkdir -p /opt/toolchains
cd /opt/toolchains
tar xJvf aarch64-RK358X-linux-glibc-1.9.8.tar.xz
Использовать toolchain довольно просто, но для удобства будет не лишним задать переменные окружения:
CROSS_COMPILE=/opt/toolchains/riscv64-RV64GC-linux-glibc/1.9.8/bin/riscv64-rv64gc-linux-gnu-
Которые обычно используются в Make-файлах U-Boot или ядра Linux.
Для самостоятельной сборки toolchain-а необходимо получить срез репозитория toolchains, например,
svn co svn://radix.pro/radix/toolchains/trunk toolchains
и выполнить команду make в соответствующем каталоге:
cd toolchains/products/RK358X-glibc/1.9.8
make -j8
Напомним здесь, что перед сборкой необходимо подготовить каталог /opt/toolchains/ для инсталляции toolchain-а и передать права на него пользователю, от имени которого осуществляется сборка.
U-Boot
Для сборки загрузчика лучше всего использовать код из репозитория u-boot-rockchip. Где тегом u-boot-rockchip-20231024 отмечен срез, обеспечивающий поддержку SPI Nor Flash XM25QU128C. Данная микросхема распаяна на плате и может служить для размещения как загрузчика U-Boot, так и efi-загрузчика EDK II.
Самостоятельно собрать загрузчик можно следующим образом:
git clone https://source.denx.de/u-boot/custodians/u-boot-rockchip.git
cd u-boot-rockchip
git archive --format=tar --prefix=u-boot-rockchip-2023.10/ u-boot-rockchip-20231024 | \
xz >../u-boot-rockchip-2023.10.tar.xz
cd ..
rm -rf u-boot-rockchip
tar xJvf u-boot-rockchip-2023.10.tar.xz
git clone https://github.com/rockchip-linux/rkbin.git
cd rkbin
git archive --format=tar --prefix=rkbin-20230519/ d6ccfe401ca84a98ca3b85c12b9554a1a43a166c | \
xz >../rkbin-20230519.tar.xz
cd ..
rm -rf rkbin
tar xJvf rkbin-20230519.tar.xz
cd u-boot-rockchip-2023.10
make orangepi-5-rk3588s_defconfig
make BL31=../rkbin-20230519/bin/rk35/rk3588_bl31_v1.38.elf \
ROCKCHIP_TPL=../rkbin-20230519/bin/rk35/rk3588_ddr_lp4_2112MHz_lp5_2736MHz_v1.11.bin \
CROSS_COMPILE=/opt/toolchains/aarch64-RK358X-linux-glibc/1.9.8/bin/aarch64-rk358x-linux-gnu-
cd ..
В результате, в каталоге u-boot-rockchip-2023.10, будут получены два файла: idbloader.img и u-boot.itb. На SD-карту данные файлы записываются по фиксированным адресам следующим образом:
dd if=idbloader.img of=/dev/sdh bs=512 seek=64
dd if=u-boot.itb of=/dev/sdh bs=512 seek=16384
Где имя устройства /dev/sdh следует заменить на имя, соответствующее подключеной SD-карте.
EDK II
Существует специальный репозиторий edk2-rk3588, в котором ведется работа по поддержанию таких устройств как Orange Pi 5/5B/5+, Radxa ROCK 5A/5B и многих других плат на базе семейства SoCs от компании Rockchip.
Получение кода EDK II и его сборка не представляет большой сложности:
git clone https://github.com/edk2-porting/edk2-rk3588.git
cd edk2-rk3588
git checkout -b v0.9.1.1 e9f0d3363e7db645e84a979542cc96b487d05f01
git submodule update --init --recursive
CROSS_COMPILE=/opt/toolchains/aarch64-RK358X-linux-glibc/1.9.8/bin/aarch64-rk358x-linux-gnu- \
./build.sh --device orangepi-5 \
--skip-rootfs-gen
В результате будет получен образ RK3588_NOR_FLASH.img, который, для начала, можно опробовать на примере загрузки с SD-карты:
dd if=RK3588_NOR_FLASH.img of=/dev/sdh
и уже затем, прошить его на микросхему XM25QU128C.
Есть несколько способов записи EDK II. Во-первых, это можно сделать на работающей системе Linux с помощью утилиты flashcp:
/sbin/flashcp RK3588_NOR_FLASH.img /dev/mtd0
Во-вторых, это можно сделать с помощью U-Boot, если разместить образ в файловой системе на загрузочной SD-карте.
Допустим, что в каталоге /boot/edk2/, в первом разделе с файловой систмой Ext4, мы имеем образ EDK II с именем spi-flash.image. Тогда остановив загрузку U-Boot с помощью клавиши
orange-pi5#
orange-pi5# sf probe
SF: Detected XM25QU128C with page size 256 Bytes, erase size 4 KiB, total 16 MiB
orange-pi5# load mmc 0:1 ${kernel_addr_r} /boot/edk2/spi-flash.image
7012864 bytes read in 597 ms (11.2 MiB/s)
orange-pi5# sf erase 0 +${filesize}
SF: 7016448 bytes @ 0x0 Erased: OK
orange-pi5# sf write ${kernel_addr_r} 0 ${filesize}
device 0 offset 0x0, size 0x6b0200
SF: 7012864 bytes @ 0x0 Written: OK
Таким образом, с помощью EDK II мы получаем возможность загружать операционную систему с NVMe диска. Причем на NVMe диске нет необходимости держать загрузчик в неразмеченном пространстве, и мы вправе создавать на диске разделы так, как мы привыкли делать на обычных персональных компьютерах.
Теперь, если мы разметим диск, например, следующим образом:
/sbin/fdisk -l /dev/nvme0n1
Disk /dev/nvme0n1: 238.47 GiB, 256060514304 bytes, 500118192 sectors
Disk model: NXM-256 2242
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: C50F960E-227F-6A4D-A6C8-78553D0C0822
Device Start End Sectors Size Type
/dev/nvme0n1p1 2048 526335 524288 256M EFI System
/dev/nvme0n1p2 526336 168298495 167772160 80G Linux filesystem
/dev/nvme0n1p3 168298496 467913911 299615416 142.9G Linux filesystem
/dev/nvme0n1p4 467914752 500117503 32202752 15.4G Linux swap
и в каталоге /efi/boot/ на первом разделе разместим загрузчик bootaa64.efi, то для загрузки операционной системы нам останется только отредактировать grub.cfg файл, который располагается в корневой файловой системе в каталоге /boot/grub/.
Для системы, работающей на плате Orange Pi 5, grub.cfg может выглядеть, например, следующим образом:
set menu_color_normal=black/light-gray
set menu_color_highlight=white/light-gray
set background_color=black
set timeout=5
font '/boot/grub/fonts/dejavusansmono.pf2'
loadfont dejavusansmono
menuentry 'Radix cross Linux' {
set root_uuid=491dab81-2ec5-4dd4-83dc-626dfbabcb0f
set part_uuid=0b5eaaf9-64c5-9f4c-9683-7305368f52e2
insmod gzio
insmod xzio
insmod part_gpt
insmod ext2
search --set=root --fs-uuid $root_uuid
devicetree ($root)/boot/rockchip/rk3588s-orangepi-5.dtb
linux ($root)/boot/Image root=PARTUUID=$part_uuid ro rootwait console=ttyS2,1500000n8 console=tty1
}
Здесь, значение переменной root_uuid соответствует UUID корневой файловой системы, а значение переменной part_uuid равно UUID раздела, на котором расположена эта файловая система.
Опробовать результат данной работы можно с помощью готовых образов операционной системы. Для этого надо загрузить файлы orange-pi5.boot-records, orange-pi5.ext4fs из каталога orange-pi5 и записать их на SD-карту с помошью следующих команд:
cat orange-pi5.boot-records orange-pi5.ext4fs > SDHC.img
dd if=SDHC.img of=/dev/sdh
Разумеется, имя устройства /dev/sdh необходимо изменить на имя, соответствующее подключенной SD-карте.
Загрузив Orange Pi 5 с SD-карты, вы можете прошить собственноручно собранный EDK II или установить систему Radix cross Linux на NVMe диск с помощью утилиты setup.
При последующем старте системы с NVMe диска вы увидите EDK II в работе,
а по клавише F2 сможете рассмотреть интерфейс и возможности Tianocore, который собран специально для SoC RK3588s. Далее в работу вступит загрузчик GRUB:
который, в свою очередь, передаст управление ядру Linux.