Установка Armbian на неподдерживаемые устройства

2017-09-10

Многим из читателей знаком дистрибутив Armbian - “серебряная пуля” для владельцев устройств серии Orange Pi. Без “этих ребят” наши одноплатники давно пылились бы на антресолях.

Возможно, кто-то уже убедился, что “ядра” под определенный процессор от Allwinner (H2/H3/A20/A10) одинаковые, а “дистрибутив” различается только настройками script.bin (для legacy-ядер) или uboot и Device Tree.

Механизм Device Tree был введен в ядрах 4.x для облегчения портирования Linux на новые устройства. Это файл, описывающий “дерево устройств” в некотором универсальном виде. При старте системы он передается в качестве параметра загрузчику, который уже в свою очередь правильно инициализирует систему. Вроде так :).

Таким образом открываются возможности для установки Armbian даже на те устройства, где он официально “не существует”.

Во избежании недоразумений - всё нижеописанное относится к устройствам на Allwinner A10/A20, других у меня в данный момент нет :) или они поддержаны.

Для этого есть два пути:

  • Путь правильный - собирать свою систему, благо разработчики Armbian предоставляют такую возможность. Нужно выбрать загрузчик под своё устройство, который будет использовать нужный DT-файл. Вполне годный вариант, если вы точно знаете, что у вас за девайс, и он поддержан в исходниках ядра linux-sunxi.
  • Путь неправильный - выбрать “похожий” вариант устройства и подкрутить его DT-файл. Потребуется куча усилий, но в результате вы можете вернуть к жизни какой-нибудь убогий девайс на Android 4.0.4.

Ясное дело, я выбрал путь второй (устройства черти-какие). Помня успешный опыт установки legacy-ядер от уважаемого romanrm от Cubieboard/Cubieboard2 на чудо-устройства из Поднебесной я решил попробовать установить mainline-версию Armbian на выводок устройств с КДПВ (картинки-для-привлечения-внимания).

Итак, слева направо:

  • Подделка под MK808C. Работает на Allwinner A20, но, в отличие от оригинала имеет всего 512 мегабайт памяти. Про оригинал можно почитать вот тут. Прошивка Android 4 для него есть, как пишут на 4pda - получена от продавца. Так что никаких кастомов и обновлений, то есть тупиковая ветвь эволюции. “Похож” на Cubieboard 2.
  • Measy U1A. Типа бренд. Allwinner A10, 1 гб памяти. Из положительных вещей - на нём работает Cyanogen. “Похож” на Cubieboard 1.
  • Странный образец по имени Intcrown. Очень похож на предыдущий, но вот только Cyanogen поставить нельзя (другой WiFi чип), есть какая-то прошивка на 4pda, искать в теме про MK802II (даже вспоминать об этом не хочу). Опять-таки похож на Cubieboard 1.

Ну а дальше всё просто - качаем дистрибутивы Armbian для Cubieboard 2 и 1, пишем на microSD и грузим. Небольшая загвоздка с Cubieboard 1 - в Armbian он помечен, как deprecated, т.е. ветка не развивается, но, к счастью, образ доступен для скачивания.

С удивлением обнаруживаем, что система вполне себе стартует, но в dmesg видим массу “красноты”, ибо у нас нет ни Ethernet, ни Sata, ну может ещё пары устройств. На этом этапе лучше обновить систему командами apt-get update и apt-get upgrade.

И тут начинается некоторая магия. Примеры будут для Cubieboard 1, для второй версии принцип тот же.

Шаг первый

Делаем копию DTB-файла, который будем мучить.

cd /boot/dtb sudo cp sun4i-a10-cubieboard.dtb sun4i-a10-cubieboard_patched.dtb

В файле /boot/armbianEnv.txt добавляем строчку:

fdtfile=sun4i-a10-cubieboard_patched.dtb

Перегружаем устройство и проверяем, что всё работает, как до редактирования.

Шаг второй

Для начала нужно декомпилировать dtb-файл в формат, пригодный для редактирования.

dtc -I dtb /boot/dtb/sun4i-a10-cubieboard_patched.dtb -O dts -o /boot/dtb/sun4i-a10-cubieboard_patched.dts

Шаг третий

Теперь открываем полученный .dts и редактируем. Хороший вопрос - что и как убирать :) Смотрим в dmesg, находим несуществующие устройства типа ethernet, sata, ir и меняем их статус из “okay” на статус “disabled”.

Вот пример для sata:

1
2
3
4
5
6
7
8
9
10
sata@01c18000 {
compatible = "allwinner,sun4i-a10-ahci";
reg = <0x1c18000 0x1000>;
interrupts = <0x38>;
clocks = <0x17 0x0 0x2 0x19>;
status = "disabled";
target-supply = <0x37>;
linux,phandle = <0x62>;
phandle = <0x62>;
};

Лучше отключать устройства по одному и проверять, достигнут ли желаемый эффект. Перед перезагрузкой нужно скомпилировать dts обратно в dtb.

dtc -I dts /boot/dtb/a10-cubieboard_patched.dts -O dtb -o /boot/dtb/a10-cubieboard_patched.dtb

Намылить-смыть-повторить.

Финально я лично получил вполне работающую систему. Главное тут - “не перехимичить” с устройствами, иначе останетесь без USB или там hdmi-вывода.

Шаг четвертый, последний и необязательный

В armbianconfig отключите обновления uboot и ядра. Это полезно, если не хотите повторять все приседания или гадать, почему система не грузится после обновления этих компонентов.

На выходе - правильно работающее устройство с ядром 4.x, которое вполне справится с задачами домашнего сервера.

Что ещё можно сделать? Например, для первого и третьего девайса на фотографии установить в nand систему на legacy ядре. В этом случае, правда, придётся выполнять отключение в script.bin - как его редактировать, можно почитать в документации на linux-sunxi. Но устанавливать не просто систему, а с GUI - ведь там будет работать аппаратное ускорение. И карманная рабочая станция вполне готова к работе :), а про винтажный Android забыть, как про страшный сон - всё равно прошивки скоро невозможно будет найти.

Да, кстати, если кто-то будет собирать какие-то 3rd-party драйвера с гитахаба в Armbian, тут нужно выполнить ещё один шажок, а именно:

1
2
cd /usr/src/linux-headers-YOUR_KERNEL-sunxi/scripts
sudo make recordmcount

После этого драйвера вполне себе собираются.

На этом вроде всё. Пожалуй, про Android-свистки уже хватит, много уже про них написано.


В массы

В трубу