Поскольку мне не требуется от платы работы с графикой (GPU mali400), для которой есть только фирменные бинарные драйверы, раз и навсегда собранные для старого ядра linux-3.4, мне ничто не мешало установить на неё Arch Linux ARM со штатным ядром (на данный момент linux-armv7-4.7.3-1).
Всё описанное ниже проверено на плате Sunshine-A20-Lite с подключённым гигабитным Ethernet, жестким диском SATA, и звуком. Видео мне не нужно, но подключив HDMI-монитор для проверки фреймбуфера, я убедился, что при его наличии ядро действительно активирует simple-framebuffer, как и обещали разработчики sunxi-linux.org .
Установка
Установка Arch Linux на Sunshine принципиально не отличается от установки на аналогичные платы на Allwinner A20, например Cubietruck
Вы можете следовать приведённой выше инструкции для Cubietruck, только использовать мою сборку загрузчика u-boot-sunxi-with-spl.bin , а в /boot/dtbs/ на карточке положить мою сборку Device Tree sun7i-a20-sunshine.dtb
Как я это сделал
Поскольку для Sunshine готовой сборки загрузчика и .dtb ещё не было, мне понадобилось:
1) составить файл Device Tree на основе аналогичного .dts для Cubietruck;
2) собрать U-Boot с настройками специально для Sunshine.
Для меня самым проблематичным отличием Sunshine как от Cubietruck, так и всех других плат на A20, поддержка которых включена в имеющиеся шаблоны сборки (configs/*_defconfig) U-Boot и Device Tree, оказалась подача напряжения 2.5V для Ethernet и SATA от выхода LDO3 микросхемы AXP209. Соответственно, чтобы поднять сеть, мне пришлось начать составление Device Tree с добавления секций для LDO3 (и заодно LDO4) по образцу OLinuxIno-Lime2, только с другим напряжением. Далее я выкинул из .dts описание всего отсутствующего на Sunshine оборудования, и добавил поддержку всего присутствующего, хотя бы разведённого на штырьки, которое удалось найти в sun7i-a20.dtsi, сверяясь со схемой Sunshine и .dts аналогичных плат, где такое оборудование есть.
DRAM
Настройка памяти свелась к установке в шаблоне сборки загрузчика частоты В дальнейшем, при разборе кода U-Boot я обнаружил, что остальные параметры, в зависимости от выбранной частоты, устанавливаются довольно похожие на те, что заданы в board/sunxi/dram_cubietruck.c "родной" сборки загрузчика. Многократное тестирование памяти проблем не выявило, время выполнения теста на Arch Linux и "родной" тестовой сборке практически не отличается.
Поскольку вся разница в настройках памяти для полной и Lite версий платы заключалась в её объёме, который в коде свежего U-Boot вообще никак не указан и определяется автоматически, как загрузчиком, так и ядром, я могу предположить, что моя сборка U-Boot будет работать не только на моей Lite, но и на полной версии платы.
Ethernet
Настройку как прописано в gmac_core.c "родной" сборки ядра
я штатно вписал в шаблон сборки загрузчика.
Кроме того, U-Boot даёт и другой способ настройки, не требующий его пересборки, достаточно вписать в начало скрипт-конфига загрузчика (boot.txt). Здесь 0x01c20164 адрес регистра, 0x1406 = 6 + (5<<10), 6 не меняется, а значение TX_DELAY нужно сдвинуть на 10 бит (умножить на 2^10).
По моим наблюдениям, сеть работает бесперебойно со скоростью RX~920мбит/с, TX~720мбит/с при TX_DELAY от 1 до 5, при 6 TX падает до ~520мбит/с, при 7 сеть не работает вообще, при 0 работает с перебоями. Поскольку работа с сетью интенсивно загружает процессор, параллельное чтение или запись отправляемых/получаемых данных сильно замедляет обмен. Мне удалось удалось добиться скорости записи по сети (через NFS) на SATA-HDD, подключённый к плате ~240мбит/с, и чтения ~440мбит/с.
Полный набор файлов для сборки Device Tree: dts.tar.xz , ими я заменил всё содержимое каталога arch/arm/dts в исходниках U-Boot, после сборки получив сразу и загрузчик, и бинарный файл Defive Tree.
Патч на настройки сборки U-Boot, включающий возможность чтения загрузчиком UUID раздела: 0001-arch-linux-arm-modifications.patch . Требуется для штатного boot.scr ArchLinuxARM. Накладывается командой или в корне дерева исходников U-Boot.
Собирать U-Boot можно тулчейном на десктопе, но поскольку это всё же не ядро, я собирал его прямо на плате в tmpfs, это занимает около 5 минут.
Скрипт для сборки Device Tree отдельно от загрузчика и ядра: mkdtb . Требуется пакет dtc и gcc, от cpp используется только препроцессор, так что тулчейн для этого не понадобится в любом случае.
Скрипт для сборки конфига U-Boot: mkscr . Требуется пакет uboot-tools.
Пример собранного boot.scr с добавленным прямо туда TX_DELAY=4 и параметрами ядра для включения вывода процесса загрузки в консоль на мониторе HDMI. Для работы с монитором эти параметры не требуется, просто без них на экране не будет виден сам процесс загрузки Arch Linux.
спасибо добрый человек! если бы не эта строчка, то я бы еще неделю скакал вокруг подъема сетевого интерфейса на свежем юбуте..
за ядро не скажу - пока не рассматривал, но в юбуте, что в # U-Boot 2014.10-rc2 Configuration
что в # U-Boot 2016.11-rc1 Configuration
есть в файле include/configs/sunxi-common.h
параметр
по дефолту прописано 2ГБ и с этим значением плата (-lite) виснет, стартует только после исправления на 512МБ..
u-boot-2016.07, строчка действительно есть, но плата A20-lite стартует без каких-либо изменений в этой строчке.
Единственный патч в моей сборке – общий от ArchLinuxARM: 0001-arch-linux-arm-modifications.patch
В Sunshine-A20_defconfig задана только частота.
Собрал ядро последнее из stable, сделал всё как написано - сети нет. В u-boot сеть есть, ядро не видит https://pastebin.com/wiVaLBgJ
Можете конфиг ядра подкинуть, может что-то забыл в нем проставить?
p.s. разобрался. Там драйвер называется STM, а в нем лежит уже искомый sunxi gmac. Я снял все флажки, не обратив внимание - вверху же еще sunxi emac висит =) очень легко на автомате поставить не то =)