Стартуем Sipeed LicheeRV — Nezha CM C906 без официального SDK

Получив свой экземпляр (заказал еще до того как вышел LicheeRV Dock), я конечно же полез за официальной инструкцией к производителю…

В принципе, я никогда не интересовался продуктами вроде Banana Pi или Orange Pi от Allwinner, взглянув на официальное чудо, я понял почему от этих продуктов все так воротят нос:

  1. Прошивки для не китайцев «заботливо» лежат на MEGA (хочешь качать — плати деньги…)

  2. Для прошивки карт используется «замечательный» инструмент под названием PhoenixCard (судя по китайским форумам он не слушается даже китайцев), который работает под Windows (что всегда хорошо!)

  3. Официальный «SDK» обернут вместе c rootfs и разбит на архивы общей суммой >10 Gb (да-да и лежит на MEGA — то есть все равно заплатишь)

  4. И изюминка — все образы в комплекте расчитаны на карты ёмкостью больше 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 не должен сильно портить картину для 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 на данный момент.

Библиография

Читайте так же:

  • Как оптимизировать производительность сайта. Расширенные рекомендацииКак оптимизировать производительность сайта. Расширенные рекомендации Привет! Это снова Сергей Кузнецов, руководитель отдела Frontend-разработки в AGIMA. Недавно я рассказывал здесь про оптимизацию сайта в разрезе показателей Google PageSpeed. И теперь хочу вернуться к этой теме. Сегодняшняя статья будет не слишком длинной, но, надеюсь, для многих […]
  • В Индии заново представили Redmi Note 10S. И он оказался дешевле глобальной версииВ Индии заново представили Redmi Note 10S. И он оказался дешевле глобальной версии Сегодня в Индии состоялась официальная премьера смартфона Redmi Note 10S. Эта модель ранее вышла в версии для глобального рынка, а ее индийский вариант не имеет никаких технических отличий. Но отличается цена, и заметно. Индийский Redmi Note 10S в базовой версии с 6 ГБ ОЗУ и 64 ГБ […]
  • Google Marketing Livestream 2021: новинки рекламы и аналитикиGoogle Marketing Livestream 2021: новинки рекламы и аналитики 27 мая состоялось очередное ежегодное мероприятие Google Marketing Livestream 2021, во время которого компания традиционно представила свои новинки в области рекламы и аналитики. Ниже – обзор всех продуктовых анонсов. 1. Бета-запуск нового типа кампаний Performance Max Google Ads […]
  • Удалёнка: инструкция по выживаниюУдалёнка: инструкция по выживанию А когда ты находишься дома, тебе ничего не нужно сделать, чтобы вернуться с работы. Ты просто закрыл ноутбук — и всё, ты на кровати, потому что ты и так был на кровати, ты забыл встать с утра. Ты вообще забыл переодеться, ты до сих пор в пижаме.В подкаст «Да как так-то» пришёл Евгений […]