Repository navigation
v1.5 — звук и режимы HDMI, подсветка стиков, больше памяти
GammaOS Next (LineageOS 21 / Android 14) для карманной консоли AISLPC RG52 Mini на Rockchip RK3562. Здесь перечислено то, что изменилось после v1.4.
| Образ | GammaOSCore-RG52Mini-20261002-0852.img.zip, 2,00 ГиБ (2 145 296 330 байт) |
| sha256 архива | 412932a2b295a0d5d05d4975bab1cc751f0df57e29a86e56a6124dcb135d7a56 |
| sha256 образа | 7fc8bdf0fb0d4c3d26fb9efc1e46bee9aadffedd9775b292035fbac068cf2b72 |
| Пакет обновления | GammaOSCore-RG52Mini-20261002-0852-ota.zip — для тех, кто уже на v1.3 или v1.4 |
| Основа | GammaOS Next Core (вариант на базе Android TV), Android 14 |
| Ядро | Linux 5.10.226, mamaich/kernel_rk3562_rg52mini |
| Загрузчик | mamaich/u-boot-rk3562-rg52mini |
| Раздел vendor | от Android 13 (SyachOS), с вырезанным лишним и подменённым драйвером графики |
Перед обновлением по воздуху
Пока идёт обновление, не перезагружайте устройство, даже если экран чёрный. Обновление в это время продолжается, а в конце устройство перезагрузится само. Перезагрузка посреди записи оставит карту незагружаемой.
- После строки Checking… экран на 10–15 секунд гаснет: система передаёт его программе обновления. Потом появляются полоса и проценты.
- Пакет полный, из четырёх разделов (система, vendor, загрузочный раздел и загрузчик), и пишется дольше прежних: на быстрой карте около 6 минут, на медленной — до получаса. Подсветка стиков, звук по HDMI и новое ядро приходят только так.
- Обновление с v1.3 и с v1.4 проверено: ход записи на экране виден в обоих случаях. Если экран всё же останется чёрным — ждите, запись идёт (см. «Ход обновления снова виден» ниже).
Что нового
Памяти стало на 24 МиБ больше, загрузка на 3,6 с быстрее
Не фокус и не перенастройка: столько памяти на устройстве попросту не доставалось системе. Total RAM в dumpsys meminfo вырос с 2 003 520 K до 2 027 896 K, и ещё около 6 МиБ освободилось внутри ядра — они видны как свободная память.
Образ ядра стал на треть меньше (44,9 → 29,9 МБ), это +10,9 МиБ. Выключены таблица символов для статических функций, дескрипторы отладочных сообщений и трассировщик вызовов, отладочная сборка драйвера GPU и драйверы железа, которого нет ни на одной ревизии платы: камерный тракт, проводной Ethernet, SATA, NVMe, сырая флеш-память, аудиокодеки других плат, контроллеры сенсорных экранов, Btrfs и XFS. Всё, что может пригодиться снаружи — USB-камеры и тюнеры, USB-модемы и переходники на UART, USB-сеть, Bluetooth-свистки, геймпады, USB-звук, флешки с exFAT/FAT/NTFS, — осталось. Событийная трассировка, на которой держатся atrace и Perfetto, тоже.
Освобождён буфер логотипа загрузчика, 3,5 МиБ. Загрузчик резервирует его под заставку, а ядро его никогда не возвращало.
Параметры загрузки ядра, +5,4 МиБ: отображение памяти крупными блоками (rodata=on) и хэш-таблицы файлового кэша по реальной нужде, а не по объёму памяти. Они прописываются в extlinux.conf на загрузочном разделе.
Буфер консоли ядра вдвое меньше (16 бит на пиксель): 1,75 МиБ. Картинка при загрузке та же.
Загрузка от включения до готовности системы — 43,7 с вместо 45,4: загрузчик читает образ поменьше, а ядро не тратит время на поиск несуществующего железа. Ещё около полутора секунд дал логотип загрузчика: он пережат из 2,7 МБ в 22 КБ (восьмибитный BMP со сжатием RLE8, на вид тот же), а файлы с загрузочного раздела загрузчик читает медленно. С ним — 41,8 с (один замер).
Область защищённого мира сокращена с 10 МиБ до 6. Прошивка OP-TEE объявляет её загрузчику, а тот вырезает из памяти, доступной системе. Две находки: во-первых, ранние версии прошивки (до апреля 2024) укладывались в 8 МиБ вместо 10, как и написано в документации Rockchip, — взята самая свежая из таких. Во-вторых, хвост области — несекретное окно обмена сообщениями, и на этом устройстве оно не используется вовсе: Android к защищённому миру не обращается, а загрузчик заканчивает свои дела до запуска системы. Окно возвращено системе правкой в загрузчике.
Проверено тем, что могло сломаться: сон с пробуждением, смена частоты памяти под нагрузкой и сверка 700 МиБ, пропущенных через память.
Анимация загрузки держится до экрана оболочки
Раньше анимация заканчивалась за 7–9 секунд до того, как Daijisho показывал свою заставку, и всё это время экран был чёрным. Теперь она идёт, пока оболочка не нарисует первый экран. Если оболочка не появится за 20 секунд или открыто меню кнопки питания, анимация уходит сама. Выключается свойством persist.rg52.bootanim.hold=0.
Кадр анимации теперь в своём настоящем размере на экране, 480×480, а не 2880×2880: пока она держится, GPU не тратит силы и 32 МиБ памяти на уменьшение огромной текстуры 60 раз в секунду. Линии логотипа стали ровными.
Заодно исправлено моргание экрана негативом при каждой загрузке. Его давало подтверждение переключения режима мыши: gammapad при старте сбрасывает режим, и это считалось переключением. Теперь экран моргает только при настоящем переключении.
Ход обновления снова виден
Во время обновления по воздуху экран мог оставаться чёрным до самого конца записи, хотя само обновление шло нормально. Причин нашлось две: подсветку гасило выключение экрана перед прошивкой (если экран с момента загрузки хоть раз уходил в сон), а при долгой подготовке — таймаут экрана, после которого Android обнулял яркость. Теперь прошивальщик не даёт экрану погаснуть, пока готовится, а потом сам держит подсветку включённой. Действует для обновлений, запущенных уже из этой версии: прошивальщик берётся из работающей системы.
Игры больше не поворачивают экран
Приложение, запросившее портретную ориентацию, раньше разворачивало экран боком. Теперь экран всегда остаётся горизонтальным. Приложения, которые умеют подстроиться под горизонтальный экран (например, idTech4A++), так и работают, на весь экран; а те, что умеют только портретную ориентацию, показываются вертикальной полосой по центру. Переключатель — в GammaOS Toolbox, раздел Screen Rotation: Keep the screen in landscape (в русском интерфейсе — «Не поворачивать экран по запросу приложений»), по умолчанию включён.
Подсветка стиков работает
Кольца подсветки вокруг стиков теперь управляются из GammaOS, как на устройствах, которые GammaOS поддерживает из коробки: выбор цвета (JoystickLedPicker), GammaOS Toolbox → RGB, Nano. Подсветка гаснет вместе с экраном и возвращается с ним.
У контроллера подсветки семь цветов (красный, зелёный, синий, жёлтый, голубой, пурпурный, белый), «бегущий огонь», дыхание и четыре уровня яркости. Произвольный цвет сводится к ближайшему из семи, а левым и правым стиком по отдельности управлять нельзя — так устроено железо. Эффекты GammaOS:
- E1 — разноцветные огни бегут по кругу (как в заводской прошивке, по умолчанию);
- E2 — плавный перелив по цветам;
- E3 — дыхание выбранным цветом;
- свой цвет — ровный выбранный цвет;
- «цвет по экрану» — подсветка следует за картинкой.
Яркость по умолчанию следует за яркостью экрана; в GammaOS Toolbox это можно выключить и задать ползунком.
Подсветке нужен новый загрузочный раздел (в нём включён порт контроллера), поэтому она заработает после обновления полным пакетом или записи образа карты.
Режим выхода HDMI
GammaOS Toolbox → External Display → HDMI output mode (в русском интерфейсе — «Режим выхода HDMI»). По умолчанию «Авто», как и раньше: режим, который предпочитает телевизор. В списке — режимы, которые телевизор сообщил сам, и всегда 640×480, 1024×768, 1280×720 и 1920×1080 при 60 Гц: их можно выбрать, даже если телевизор не прислал свой список. Режим меняется сразу, без переподключения кабеля.
Пригодится, если картинка на телевизоре выглядит слишком крупной или мыльной: например, 1280×720 совпадает с разрешением встроенного экрана.
HDMI сразу показывает весь экран. Force mirror mode (GammaOS Toolbox → External Display) теперь включён по умолчанию: раньше на телевизор уходило только активное приложение отдельным дисплеем, а встроенный экран всё равно гас — видеоконтроллер у устройства один. И вопрос «Mirror to external display?» при Force mirror mode или External as primary больше не задаётся. Раньше он рисовался на погасшем встроенном экране, и чтобы его увидеть, приходилось дважды нажимать выключатель. Кто выключал Force mirror сам — настройка сохранится. Всё про HDMI на этом устройстве — в 05-hdmi.md.
Разгон памяти до 928 МГц — одним скриптом
Необязательная правка загрузчика во внутренней памяти теперь ставится скриптом install-ddr928.sh прямо на устройстве, в Android или в Linux стоковой прошивки, без UART: он сам проверяет устройство и версию загрузчика, делает резервную копию и сверяет запись, умеет вернуть стоковые 798 МГц. Риски прежние — 04-частота-памяти.md.
Исправлена и ручная инструкция: прежде она записывала файл загрузчика целиком, а в его хвосте лежит хранилище vendor (серийный номер, MAC-адреса) того устройства, с которого он снят. Теперь в файле только загрузчик, а пишутся только его две копии. Если вы ставили разгон по старой инструкции, верните своё хранилище из резервной копии — команда в описании.
Звук по HDMI
Раньше при подключённом HDMI звук всё равно шёл из динамиков устройства. Теперь он идёт на телевизор, а при отключении кабеля возвращается в динамик. Исправлено сразу в четырёх местах: в дереве устройства был выключен блок, через который процессор отдаёт звук HDMI-мосту (да ещё и указан не на те выводы); Android не замечал подключения кабеля; мост терял настройку звука, когда включалась картинка; а заводской эквалайзер аудио-HAL Rockchip ронял звуковую службу при каждом подключении и отключении HDMI — он отключён. Эквалайзеры уровня Android, например GammaEQ, это не затрагивает. Звук динамика может стать чуть другим — эквалайзер действовал и на него.
Звук HDMI приходит только с образом карты или полным пакетом обновления: там новое дерево устройства и новое ядро.
Известная ошибка, не наша, — в видеочасти Rockchip: иногда после отключения HDMI встроенный экран остаётся чёрным. Теперь его возвращает служба, которая срабатывает только в момент отключения кабеля (сон и пробуждение, как двойное нажатие кнопки питания). Подробности — в 05-hdmi.md.
Игры из папок EmuELEC видны в библиотеке
EmuELEC раскладывает игры одной приставки по папкам с разными названиями, и скачанное им, например, в ROMs/megadrive в библиотеке Daijisho не появлялось. Теперь у платформ есть дополнительные папки поиска:
| Платформа | Дополнительные папки в ROMs/ |
|---|---|
| Sega Genesis | megadrive, megadrivejp |
| NES | famicom, fds |
| SNES | sfc, snesna, satellaview, sufami |
| NeoGeo Pocket Color | ngp |
| Game Boy | sgb |
Это настройки Daijisho на свежей установке, то есть после записи образа карты. При обновлении по воздуху ваша библиотека не трогается: нужные папки можно добавить в настройках платформы самому. Для fds, satellaview и sufami эмулятору нужен BIOS.
Служба записи журнала больше не переполняет /metadata
Отладочная запись logcat в файл на разделе /metadata (11 МБ) заполняла его почти до конца, после чего служба падала и перезапускалась каждые 5 секунд. Запись убрана, оставшиеся файлы удаляются при загрузке. Вывод журнала в отладочный порт остался.
Размер zRAM — в процентах памяти
В GammaOS Toolbox поле zRAM size теперь задаёт долю памяти, 0–100 (было — мегабайты, а «вся память» ставилась только из меню выключателя). Пункт Swap Mode «zRAM 256 MB + swap file» стал «zRAM 13% (~256 MB) + swap file» — это тот же объём. Свойство переименовано в persist.rg52.zram.size_pct, поэтому после обновления размер zRAM возвращается к значению по умолчанию — вся память (размер файла подкачки сохраняется). Если вы выбирали другой режим Swap Mode, выберите его заново.
Исправлено попутно: при zRAM на всю память с подложкой на карте отдельный файл подкачки не убирался, хотя место на карте уже отдано подложке.
Тяжёлые игры живут на zram дольше
Низкопамятный убийца задач получил два новых предела, подобранных замерами на этом устройстве. Под самой тяжёлой нагрузкой — игра, которой нужно около 2 ГБ при 1,95 ГБ памяти, — она держится на 22 % дольше (замер в чередовании: 117 и 113 секунд на заводских пределах против 145 и 134 на новых). Совсем спасти её это не может: для такой игры нужен файл подкачки.
Поменялись два значения:
| Свойство | Было | Стало |
|---|---|---|
ro.lmk.swap_util_max |
95 | 100 (проверка снята) |
ro.lmk.thrashing_limit |
80 | 200 |
Прежние приходили из atv_lowram_defaults.mk — профиля для малопамятных телевизионных приставок — и для устройства, у которого вся подкачка это zram, оказались вредны.
Первой срабатывала проверка «доли вытесненного», и название у неё обманчивое: это не «сколько занято в подкачке», а доля вытесненной памяти среди всей вытесняемой. При zram без файла она упирается в потолок всегда — вытеснять больше некуда, — и убийца приходил за игрой на, по сути, здоровом состоянии. Второй предел поднят по той же причине: 80 % рассчитаны на возврат страницы с диска за миллисекунды, из zram она возвращается за микросекунды, и такой обмен можно терпеть дольше.
Обычной нагрузки это не касается: оба предела срабатывают только у края.
Заодно проверены и отвергнуты ходы, которые кажутся очевидными: увеличение zram до 200 % памяти (стало хуже), рекомендации Arch Wiki для настольных машин (swappiness=180 сократил жизнь игры вдвое) и замена zstd на втрое более быстрый lz4 (тоже вдвое хуже — решает не скорость сжатия, а коэффициент). Замеры и разбор — в 02-план.md.
Новая документация
- 05-hdmi.md — всё про HDMI: режимы, зеркалирование, звук, известные ошибки видеочасти;
- 06-emuelec-на-emmc.md — как настроить сосуществование EmuELEC/RGBox во внутренней памяти с GammaOS Next на карте (скрипт
restore-emmc.sh); - 07-настройки.md — что мы добавили и изменили в меню выключателя, GammaOS Toolbox и настройках Android TV, плюс скрытые свойства.
Подробности
Разбор решений, замеры и найденные подводные камни — в 02-план.md. Как собрать самому, включая образ карты — в 03-сборка.md.