По прошлым статьям мы помним, что для запуска debian на среднестатистической дешман приставки обычно требуется:
1) поиск базового дерева устройств + допиливание его для полноценной работы девайса
2) сборка ядра (иногда с патчами для SoC) + приведение конфига в debian подобный вид
3) создание rootfs через debootstrap и запаковка её в ubi с параметрами nand (или в ext4 в случае еmmc)
4) прошивка всей этой радости через u-boot по uart через tftp/usb в конкретные области (играясь с hex адресами)
5) правка переменных u-boot под новую разметку и добавление специфичных параметров ядра (тоже по uart).
Новичку это непривычно/непонятно, поэтому многие из них задаются вопросом "почему так сложно?", делая аналогии с обычным ПК.
Да, на обычном ПК все проще - никакие dts не нужны (так как об оборудовании ядру расскажет bios), загружается ядро с помощью обычного efi загрузчика (например grub), и для многого железа драйвера уже майнлайн ядре. Вставил флешку с установщиком debian, загрузился в него, поставил ОС с помощью клавиатуры глядя в монитор - и готово, никакого uart, никаких левых сборок и инструкций из инета, красота.
А можно ли получить тоже самое, но от дешманской приставки с авито? Типа купил провайдерское недоразумение за 300-500р на старом залоченном андройде, записал на флешку исошник свежего debian для arm (скачанный с оф. сайта), и поставил как на обычный комп. Возможно? Звучит как бред, но для некоторых приставок это действительно возможно, причем с минимум телодвижений😁. И сегодня мы будем делать именно это. Ну а пока немного предыстории.
Листал я очередным скучным вечером авито в приступе дешман-приставочного шопоголизма, и наткнулся на нонейм приставку с наклейкой от провайдера Seven Sky. Беглое гугление дало понять, что это Sunchip CX-968 с Allwinner H3 - а это круто. Ибо SoC в mainline u-boot и mainline linux, да и вообще на нем много всяких Orange Pi/Banana Pi. При цене в 500р надо брать (но не выше, железо старовато).
Рассмотрим начинку:
SoC: Allwinner H3 (armv7hf, cortex-a7 4 core)
RAM: 1GB DDR3
EMMC: 8GB
Microsd: SDXC
USB: 2.0 x2
WIFI: Broadcom BCM43362 (распаян модулем AMPAK AP6210) (SDIO)
Ethernet: 100Mbit
VIDEO: Mali-400 (1080@60 / 4k@30) (HDMI)
AV: jack 3.5
Питание: 5V (4.0x1.7)






Из бросающегося в глаза - видим serial порт с подписанной распиновкой (параметры 115200n8), копеечную экономию на SMA коннекторе (wifi антенна запаяна), и два свободных посадочных места под чипы памяти. Память увеличивать не будем (для наших игр хватит и гига), да и для этого придется менять текущие чипы в том числе (так как контроллер памяти - 32 битный, а стоит два чипа по 16 бит). Еще приятно, что вместо одной (или двух судя по плате) nand флешек мы имеем emmc (минус геморрой с ubi). Ну и зачем-то приставку сделали слишком тяжелой (по весу как две приставки), причина - металлическая пластина в корпусе (благо на саморезах и снимается). Радиатор на SoC мелкий, но SoC не греется вообще - так что более чем хватает.
Рассмотрим текущее софтовое положение приставки. Мне приставка пришла с провайдерским (с залоченным apk от их tv) андройдом 4. По uart меня встретил залоченный u-boot из 2011 и третье ядро linux. Печаль. Если говорить про андройд, то Allwinner для H3 давала sdk для 4 и 5 андройдов, но энтузиасты в сети собирали и андройды до 7 включительно. А выше - облом (нужны драйвера и новые HAL’ы, которых для H3/Mali-400 нет). Но нас андройды и не интересуют, мы смотрим в сторону linux - и видим armbian под множество H3 девайсов. И на приставке его даже можно завести с dts от чего-то похожего (в надежде на работу без косяков), но armbian я не люблю, ибо есть debian (который и так поддерживает arm). И главное - сегодня я обещал легкий путь с установкой debian с официального образа с флешки (а не прошивку из кастомного armbian образа) - им и пойдем.
Но для начала поясним, почему на этом девайсе вообще такое возможно? Повторюсь - потому что поддержка Allwinner H3 есть в майнлайн u-boot и linux. То есть u-boot и linux его поддерживают из коробки, причем речь действительно о хорошей поддержке, а не о "ядро стартует, а pinmux/nand/emmc/video - пилите сами" (привет amlogic aml8726-mx/meson6).
Соответственно, план такой: пишем на microsd последний u-boot с видеоконсолью/вводом с клавы и поддержкой efi, грузимся с microsd, прошиваем u-boot, грузимся из u-boot с флешки в установщик debian и ставим debian. Модить установщик debian не придется - дерево устройств ядро установщика подцепит из таблиц от u-boot. Модить сам дебиан тоже не придется - поддержка оборудования для Allwinner H3 уже в ядре debian. Cначала я дам инструкции и собранный u-boot для тех, кто хочет "просто поставить debian без заморочек". Потом дам краткие инструкции для тех, кто хочет собрать u-boot сам.
Если просто хочешь поставить debian без заморочек
Тут лежат необходимые файлы/склейки с u-boot. Качай microsd_8k-isnotstored_1m-mmc-f0000.img и пиши на microsd:
dd if=microsd_8k-isnotstored_1m-mmc-f0000.img of=/dev/sdX
В выключенную приставку вставляй microsd, клаву с монитором, и подавай питание. Увидишь такую вот красоту (если будет двойной старт - не страшно):

Далее прерывай загрузку, и шей u-boot+envs в emmc:
mmc dev 0 && mmcinfo
mmc read 42000000 800 500
mmc dev 1 && mmcinfo
mmc write 42000000 10 500
#вырубить питание приставки и вытащить microsd
#включить питание приставки и сохранить envs
saveenv
После выполнения команд выше - вырубай питание приставки и вставляй в приставку флешку с установщиком debian. Как её сделать? Просто скачай образ debian для armhf и распакуй его на отформатированную в fat32 флешку.
Теперь подай питание на приставку, прерви загрузку u-boot и грузись с флешки в установщик командой:
bootefi bootmgr
Появится grub установщика. Выбираем Advanded option > Expert install. Видим что ядро успешно поймало dtb, грузится, и видим сам установщик.




Установку производим как обычно, за несколькими нюансами:
1) Разметка
emmc размечаем вручную, таблицу разделов выбираем mbr (у gpt заголовок будет мешать u-boot, т.к. u-boot лежит на участке 8..600 kb), размечаем так:
1й раздел - 1 МБ - не использовать (зона для u-boot)
2й раздел - 50 МБ - EFI
3й раздел - все остальное место - / в ext4 (или другая фс, +можете даже замутить luks если пофиг на производительность).
Также можно сделать подкачку, но не советую - лучше настроить zram позже.
И далее до применения разметки сносим первый раздел (чтобы осталось свободное место в 1МБ до начала разделов).
2) Efivars
На вопрос об установке debian в removable efi path (путь съемных носителей) - отвечаем да.
3) Готово
После завершения установки (после ребута) вынимаем флешку с установщиком и проверяем, что дебиан нормально стартует.
Завершающий этап - осталось допились пару мелочей:
1) Заводим wifi
Для этого ставим прошивку и делаем симлинки:
apt update
apt install firmware-brcm80211
ln -s /lib/firmware/brcm/brcmfmac43430a0-sdio.bin '/lib/firmware/brcm/brcmfmac43430a0-sdio.roofull,beelink-x2.bin'
ln -s /lib/firmware/brcm/brcmfmac43430-sdio.AP6212.txt '/lib/firmware/brcm/brcmfmac43430a0-sdio.roofull,beelink-x2.txt'
2) Графика
Если ставили графику (или будете ставить потом) - для её работы надо выделить видеопамять. Выделяем как минимум 128МБ видеопамяти (или 192, но выше 256 смысла нет), добавив в параметры ядра cma=размер. Также рекомендую ядру дать консоль tty1 чтобы лог запуску писался на экран + рекомендую убрать параметр quiet. Правка параметров ядра в нашем случае выполняется в /etc/default/grub в параметре GRUB_CMDLINE_LINUX. По итогу параметры ядра будут такие:
cma=128M console=tty1
Не забываем обновить конфиг grub:
update-grub
3) Ускоряем 2D
OpenGL у нашего SoC медленный, так что (как бы это тупо не звучало) - для ускорения 2D надо вырубить 2D ускорение:
в /etc/X11/xorg.conf.d/21-h3-noglamor.conf пишем
Section "Device"
Identifier "H3-DisplayEngine-NoGlamor"
Driver "modesetting"
Option "kmsdev" "/dev/dri/card1"
Option "AccelMethod" "none"
Option "ShadowFB" "true"
EndSection
Ребутаемся после тюнинга.
Если хочешь все собрать сам
Окей, делаем все руками:
#Клоним последний uboot
git clone https://source.denx.de/u-boot/u-boot.git
#Берем defconfig от похожего бокса - beelink x2
make CROSS_COMPILE=arm-linux-gnueabihf- beelink_x2_defconfig
#из dts от beelink x2 выкидываем gpio управлялки регуляторами (+ кнопку питания) чтоб не мешали (иначе рандомный usb может не работать). все ок, ибо питания изначально и так поднимаются правильно (dts также есть по ссылке в прошлом разделе)
nano arch/arm/dts/sun8i-h3-beelink-x2.dts
#efi активен по дефолту.
#envs можно выставить в "is not stored". и если envs не нужны, то можно этот же u-boot прошить на emmc (загрузка debian будет идти через removable efi path, это не помешает). но если envs нужны - выбирай какое-либо хранилище.
#и меняй другие параметры при желании
make CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
#собираем u-boot
make CROSS_COMPILE=arm-linux-gnueabihf- -j $(nproc)
#пишем u-boot на microsd с 8го килобайта (именно там аппаратный загрузчик из SoC ищет u-boot) чтоб грузануться с microsd
dd if=u-boot-sunxi-with-spl.bin of=/dev/sdX bs=8k seek=1
#в выключенную приставку вставляем microsd, подаем питание, загружается u-boot.
#если хотите прошить u-boot с microsd в emmc, то команды такие
mmc dev 0 && mmcinfo
mmc read 42000000 10 500
mmc dev 1 && mmcinfo
mmc write 42000000 10 500
Ну а далее согласно прошлому разделу ставим и тюним debian.
Немного пояснений напоследок:
Q: EFI в u-boot настоящий?
A: Нет, это прослойка над u-boot. Тем не менее, практически все фичи настоящего efi тут в наличии.
Q: А можно поставить EFI Setup утилиту и получить менюшки как на компе?
A: Никто не мешает поставить любой EFI payload, даже скомпиленное руками подобие EFI Setup из edk2. Вопрос разве что в целесообразности.
Q: Какие еще дистрибутивы linux аналогичным образом могу поставить на эту приставку?
A: Любые, которые есть под armhf (armv7).
Q: Требуемый мне дистр имеет только поддержку aarch64 (armv8 / arm64). Что брать на авито из дешмана для аналогичных целей?
A: Можно Allwinner H6 (по сути 64 битная версия H3) и многие другие Allwinner. Или что-то из новых Amlogic, начиная с S905. Или что-то из Rockchip (много вариантов). Но все равно надо проверять майнлайн статус u-boot/linux конкретного SoC перед покупкой.
Q: Как все-таки поставить efi shell на эту приставку? (мне нечего делать)
A: Ставь пакет:
apt update
apt install efi-shell-arm
и добавь пункт в grub - в файл /etc/grub.d/40_custom допиши:
menuentry "EFI shell arm" {
chainloader /usr/share/efi-shell-arm/shellarm.efi
}
и обнови конфиг grub:
update-grub
теперь efi shell доступен из меню grub.
