Получив свой экземпляр (заказал еще до того как вышел 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

  • удалена запись 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 на данный момент.

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

Комментарии (7)


  1. akaAzazello
    20.01.2022 11:57
    +1

    Судя по всему у Allwinner D1 есть даже векторное расширение на 128 бит.

    Вы же про RISC-V Vector Extension? Есть шанс узнать чуть больше про него?


    1. maquefel Автор
      20.01.2022 12:00
      +1

      Вы же про RISC-V Vector Extension? Есть шанс узнать чуть больше про него?

      Да именно про него родимого.

      Так последний раздел на что ?

      Повторяю информацию:

      https://www.eevblog.com/forum/embedded-computing/risc-v-vector-extension-on-the-allwinner-d1/

      https://github.com/T-head-Semi/gcc/commit/f342d033dbaa0a748c4867b1edb7d97dddd71873

      За остальным надо лезть к Xuantie C9xx manual, который только на китайском.


      1. akaAzazello
        20.01.2022 14:37
        +1

        Спасибо за уточнение! Просто оставлю для всех интересующихся эту цитату brucehoult

        The unfortunate part is the Vector ISA implemented is the 20 month old
        draft 0.7.1. While this is very similar in spirit to what will shortly
        be the ratified 1.0 version and it's usually fairly easy to convert
        assembly language code from one to the other, it is
        incompatible at both
        the assembly-language and binary leve
        l.


        1. maquefel Автор
          20.01.2022 14:44

          Да всё абсолютно правильно. Но Vector ISA пока никто не сделал ни в каком виде (я не имею ввиду бравурные презентации), так что на безрыбье...


          1. akaAzazello
            20.01.2022 16:29

            Про безрыбье вы правы - проникшись элегентность RVV быстро обнаружил его отсутсвие реализации в той же почившей BeagleBone V ;)

            Меня что смущает - в коде Bruce Hoult есть лишь инструкции vmseq vmfirst vsb vlbuf, в то время как в указанном вами патче с поддержкой C906/910 vector integere/float в конфиге только для С910 - для С906 он отсутсвует - смотрите секции ;; vector integer и ;; vector float. Получается, только ассемблер для С906? И есть ли float?


            1. maquefel Автор
              20.01.2022 17:27

              Да много, что смущает не только это, могу только обязаться сообщить о результатах, как положительных так и отрицательных...


              1. akaAzazello
                20.01.2022 18:18

                Буду признателен!