Получив свой экземпляр (заказал еще до того как вышел LicheeRV Dock), я конечно же полез за официальной инструкцией к производителю…
В принципе, я никогда не интересовался продуктами вроде Banana Pi или Orange Pi от Allwinner, взглянув на официальное чудо, я понял почему от этих продуктов все так воротят нос:
-
Прошивки для не китайцев «заботливо» лежат на MEGA (хочешь качать — плати деньги…)
-
Для прошивки карт используется «замечательный» инструмент под названием PhoenixCard (судя по китайским форумам он не слушается даже китайцев), который работает под Windows (что всегда хорошо!)
-
Официальный «SDK» обернут вместе c rootfs и разбит на архивы общей суммой >10 Gb (да-да и лежит на MEGA — то есть все равно заплатишь)
-
И изюминка — все образы в комплекте расчитаны на карты ёмкостью больше 16 Gib (у наший друзей написано 16 GB — card_needs_≥16GB.txt)
Квест про реверс (он в конечном счете не понадобился) и печальное ковыряние палкой данного продукта жизнедеятельности (то что я собрал с помощью SDK, так и не заработало…) мы опустим, так как, я наконец наткнулся на гайд для Sipeed Nezha от дяди Samuel’a Holland’a спасибо ему за это огромное…
И Sipeed LicheeRV и Sipeed Nezha обе используют SoC Allwinner D1 (sun20iw1p1), поэтому опыт полученный для Nezha применим и к данному случаю.
Я собрал данный гайд в кучу и объединил под общим проектом.
Содержимое
-
boot0 : zsbl (zero stage boot loader) используется вместо U-Boot SPL, как пишет автор, временно из-за инициализации DRAM
-
opensbi : практически ванильный с небольшими изменениями в MTIMER
-
u-boot : очень сильно изменен по сравнению с ванильным, но куда лучше чем то, что предоставляется в SDK
-
linux : очень большая проделанная работа причем на базе 5.16.0-rc1 (почти самое свежее)
-
riscv-gnu-toolchain : фактически везде используемый toolchain от RISC-V Foundation
Пока в проекте используется слегка модифицированный dts:
-
выключен emac
-
удалена запись spi-nand
По схематике вроде emac не должен сильно портить картину для LicheeRV Dock, но лучше включать что-то вдумчиво, тем более судя по всему он не совместим с LicheeRV 86 Panel, теже самые мысли по поводу NAND — поддержку его тоже лучше добавлять вдумчиво.
Сборка
Подтягиваем все подмодули:
$ git submodule update --init --recursive
После чего просто делаем make:
$ make
Собственного для этого всё и затевалось…
Если необходим внешний toolchain, а не идущий в комплекте либо предоставляем TARGET_CROSS_PREFIX:
$ TARGET_CROSS_PREFIX=riscv64-unknown-linux-gnu make
Либо просто можно прибить гвоздями прямо в Makefile после объявления:
TARGET_CROSS_PREFIX=riscv64-unknown-linux-gnu ifndef TARGET_CROSS_PREFIX ... $ make
Быстрое развертывание образа
В итоге мы получаем следующие файлы:
-
sun20i_d1_spl/nboot/boot0_sdcard_sun20iw1p1.bin
-
u-boot.toc1
-
u-boot/arch/riscv/dts/sun20i-d1-nezha-lichee.dtb
-
build-linux/arch/riscv/boot/Image.gz
-
initramfs.img.gz
boot0 в данный момент ожидает u-boot, opensbi, dtb в формате TOC1 (что бы это ни значило), конфиг файл для построения образа достаточно прозрачен:
[opensbi] file = opensbi/build/platform/generic/firmware/fw_dynamic.bin addr = 0x40000000 [dtb] file = u-boot/arch/riscv/dts/sun20i-d1-nezha-lichee.dtb addr = 0x44000000 [u-boot] file = u-boot/u-boot-nodtb.bin addr = 0x4a000000
Но с этим связана одна из задач, убрать boot0 совсем и вместо него использовать U-Boot SPL.
Пример прошивки карты (подразумевается что карта это /dev/sdd и она пустая, я просто затер начало — dd if=/dev/zero of=/dev/sdd bs=4096 count=100) :
# parted /dev/sdd --script mklabel gpt # parted /dev/sdd --script mkpart primary ext2 40MiB 100MiB # parted /dev/sdd --script mkpart primary ext4 100MiB 100% # mkfs.ext2 /dev/sdd1 # partion with kernel, dtb, initramfs # mkfs.ext4 /dev/sdd2 # partition for rootfs # mount /dev/sdd1 /mnt/sdcard/ # cp build-linux/arch/riscv/boot/Image.gz /mnt/sdcard/ # cp u-boot/arch/riscv/dts/sun20i-d1-nezha-lichee.dtb /mnt/sdcard/ # we use dtb from u-boot ! # cp initramfs.img.gz /mnt/sdcard/ # umount /mnt/sdcard # dd if=sun20i_d1_spl/nboot/boot0_sdcard_sun20iw1p1.bin of=/dev/sdd bs=8192 seek=16 # dd if=u-boot.toc1 of=/dev/sdd bs=512 seek=32800 # large offset thats why we make first partion on 40 MiB
Обратите внимание, что мы используем dtb из U-Boot, а не линуксовый. Разделы можно делать любые — как душе угодно, в U-Boot есть и fat, и ext, так что можно все запихать в один раздел, пока в наличии только простой rootfs с busybox, я планирую класть rootfs на NFS и доступ к нему посредством g_ether или WiFi. К сожалению Ethernet нету, так проще было и ядро грузить по сети (надеюсь получится через OpenOCD…).
Команды для U-Boot (пока не стал убирать их в env, так как не решил как именно буду грузиться) :
> load mmc 0:1 ${kernel_addr_r} Image.gz > load mmc 0:1 ${ramdisk_addr_r} initramfs.img.gz > load mmc 0:1 ${fdt_addr_r} sun20i-d1-nezha-lichee.dtb > setenv bootargs "earlycon=sbi console=ttyS0,115200n8 root=/dev/ram0 rw rdinit=/init" > booti ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r}
Смотрим:
licheerv # uname -a Linux nezha 5.16.0-rc1-13291-g2ca6d83489cd #2 PREEMPT Tue Jan 18 20:23:04 MSK 2022 riscv64 GNU/Linux
И приступаем к более интересным задачам…
Заключение
А задач очень много, особо хотелось бы отметить, что здесь использовался стандартный toolchain со стандартным gcc, у Xuantie есть собственная версия gcc c поддержкой кастомных инструкций и на это дело хотелось бы посмотреть в первую очередь.
Судя по всему у Allwinner D1 есть даже векторное расширение на 128 бит.
Есть JTAG, который нужно освоить в первую очередь, есть RISC-V HPM…
Про саму плату хочу отметить, что стоит она 1 918,51 руб. (цена на 19 января 2022, 14:12 — я её успел купить за 1 835,14 руб.) с carrier board c wifi, это на данный момент самый дешевый Linux SBC сразу готовый к работе без возни с проводами (и пусть кто знает дешевле напишет об этом, серьезно хочу знать).
Не говоря уж про, что это самый дешевый доступный RISC-V с MMU на данный момент.
Библиография
-
https://linux-sunxi.org/Allwinner_Nezha — сюда смотрим в первую очередь!
-
https://www.eevblog.com/forum/embedded-computing/risc-v-vector-extension-on-the-allwinner-d1/
ссылка на оригинал статьи https://habr.com/ru/post/646655/
Добавить комментарий