uzbek-plus/README.md

24 KiB
Raw Blame History

uzbek-plus — Project Aurora: mainline ARM64 Linux на LTE-модеме JZ08AU (MSM8916)

Плата JZ08AU-XPA-7J-R3 («Aurora»): Qualcomm MSM8916, 512 MiB RAM, eMMC 3.64 GiB, LTE-модем, Wi-Fi, дисплей. Стоковая прошивка — Android 4.4 (ядро 3.10). Здесь — журнал и воспроизводимые материалы перевода платы на mainline Linux 7.2.7 arm64, который загружается автономно с eMMC и поднимает LTE через ModemManager.

Это не прошивка «скачай и залей». Всё, что касается записи во flash, делалось на одном конкретном экземпляре, по одной стадии, с backup и readback-сверкой. Перед любой записью сделайте и проверьте полный backup СВОЕГО устройства (см. docs/QUICKSTART.md). Никогда не прошивайте NV/EFS-разделы (modemst1, modemst2, fsg, fsc, persist) с другого устройства — там калибровки RF и идентификаторы конкретного модема.

Статус (2026-10-07)

Подсистема Статус
ARM64 Linux (7.2.7, PSCI, 4 CPU) PASS
eMMC (HS200, строго read-only в Linux) PASS
USB NCM (gadget, 172.16.42.1/24) PASS
MPSS (modem remoteproc, rmtfs -r) PASS
QMI (rpmsg wwan ctrl) PASS
BAM-DMUX (wwan0) PASS
LTE registration PASS
LTE Internet (DNS/ICMP/HTTP/HTTPS) PASS
Direct boot с eMMC без хоста (B5) PASS / CLOSED
B6 — lifecycle модема (RAM) PASS / CLOSED
B6P — автозапуск модема из flash (persistent) PASS / CLOSED
B7 — время от сети (DMS/NITZ, без RTC) PASS / CLOSED
Wi-Fi (WCNSS/Pronto + wcn36xx, тестовая AP WPA2, автозапуск из flash) — B8 PASS / CLOSED (см. ниже)
Индикация (LED = подсветка дисплея), кнопки POWER/RESET; аудио n/a — B11/B12A CLOSED
Alpine Linux как основной root на userdata (OpenRC), откат в initramfs-rescue — B12P/B12Q PASS / persistent
Router stack: NAT/firewall (nftables) + dnsmasq для Wi-Fi LAN — B12R PASS / persistent
Wayland (Cage/Sway/wayvnc) и UI на экране 128×128 (aurora-ui, SDL2), кнопка POWER — B13/B14/B16 PASS
VPN для LAN: WireGuard через TURN-relay (fail-closed) — B15; прямой WG с откатом на relay — B22 PASS
Автономная работа без хоста, SSH (OpenSSH, X11 forwarding) — B17/B19 PASS
USB host / OTG (role switch, HID, накопители через хаб с питанием) — B18 PASS / persistent
Сторож LTE-bearer (netwatch) и журнал blackbox — B20 PASS
Дисплей ST7735S 128×128 (SPI): DRM/fbcon tty1, подсветка, автозапуск из flash — B9 PASS / CLOSED (см. ниже)
Батарея / зарядка: супервизор CHARGE → HOLD → батарея, FAULT safe clamp, автозапуск из flash — B10 PASS / CLOSED (см. ниже)
Ускоренная зарядка: ток CC 450 → 720 mA (только DTB) — B23 PASS / persistent (см. ниже)

Рабочая цепочка загрузки (baseline B5)

Power → stock SBL1 → DB410c TZ (TZ.BF.3.0) → qhypstub → lk1st (aboot, autoboot, splash на ST7735S через ~0.4 с)
      → cache: ext2 + extlinux/extlinux.conf → B23 (ядро b18 + DTB b23 + initramfs B12Q) → stage0 → switch_root в Alpine на userdata (p27, OpenRC)
      → модем, время, Wi-Fi AP + роутер + VPN, дисплей + aurora-ui, зарядка 720 mA, USB OTG (rescue: initramfs B9C-init при сбое Alpine)
Fallback: extlinux не найден / не парсится / не грузится → Android boot image из раздела boot (emmc1 rescue)

Текущее содержимое flash на референсной плате (sha256, первые 8 hex):

раздел содержимое sha256
sbl1, rpm, DDR, sec stock (не менялись) sbl1 6a661ec9, rpm 5a9b857b
GPT stock + tz 512K→1M, tzbak перенесён в свободный промежуток @LBA 305184 primary 6e850a5d, backup 795952a1
tz DB410c TZ.BF.3.0-00714, дополнен нулями до 1 MiB 8481892f
hyp qhypstub, до 512 KiB 1a963047
aboot lk1st (lk2nd 23.1 + патч B9L: SPI-панель ST7735S + splash) autoboot, подписан qtestsign, до 1 MiB 15208dbb (откат: B5a lk1st 3b8cd266)
boot emmc1 rescue image (+ нули до 16 MiB) e9579f33
cache ext2 + extlinux + B23 (ядро 7.2.7-aurora-b18, DTB b23, initramfs B12Q → Alpine) 01bfe522 (откат: B18 ac82811a → B15 212e0ca9 → B12R e85d862e → B12Q 59272cd3 → B12P 98d061ef → B10B-5 c3732515 → B9C b9ce13c9 → …)
recovery lk2nd 23.1 (fastboot) 0dfa60a0
userdata (p27) ext4 aurora-alpine: Alpine 3.24 root (B12P+), единственный RW-раздел — (изменяемый)
modem, NV/EFS, persist, system не менялись (Linux монтирует modem FAT только RO) —

Golden mm1 (Android boot image, для fastboot boot): aurora-mm1.img sha256 38c960ef…, ядро 7.2.7-aurora-bam1 #5. Все хэши целиком: b5a/SHA256SUMS, b5b/SHA256SUMS, bootchain-migration/SHA256SUMS, linux/*/SHA256SUMS, docs/BLOBS.md.

B11–B22 — Alpine, роутер, VPN, UI, USB host (2026-10-04…06)

Подробно — NOTES.md (сессии 39–49) и отчёты в logs/b11…logs/b15.

  • B11 (logs/b11/): индикаторных LED на плате нет — «LED» это подсветка дисплея (MPP4); кнопки POWER = KPDPWR, RESET = RESIN. B12A: аудио n/a (нет динамика/микрофона).
  • B12P/Q/R (b12/, logs/b12/): Alpine 3.24 на userdata p27; initramfs stage0 делает switch_root в Alpine (OpenRC), откат в прежний init при сбое проверок или ≥3 неподтверждённых загрузках; роутер nftables + dnsmasq для Wi-Fi LAN, изоляция управляющей сети.
  • B13/B14/B16/B21 (b13/, b14/, b16/): wlroots (Pixman, без GPU): Cage для UI, Sway+wayvnc для отладки; aurora-ui (C, SDL2) — LTE/IP/Wi-Fi/трафик/VBAT/PMIC/NAT/VPN на 128×128, страницы по кнопке POWER, гашение подсветки, игра.
  • B15/B22 (b15/, b22/): VPN только для LAN: policy routing (table 51820), fail-closed; WireGuard через TURN-relay, с B22 — прямой WG, если доступен (оператор в режиме белого списка его режет), индикатор белого списка.
  • B17/B19: работа без хоста; SSH (OpenSSH, X11 forwarding) по Wi-Fi.
  • B18 (b18/): USB OTG с переключением роли (aurora-usb), ядро b18; VBUS платой не выдаётся.
  • B20 (b20/): aurora-netwatch (восстановление bearer после detach) и aurora-blackbox (/var/log/aurora).

B23 status — ускоренная зарядка 720 mA: PASS, persistent (2026-10-07)

Отчёт: logs/b23/B23-RESULT.md, DTS: linux/dts/msm8916-jz08-aurora-b23.dts.

  • Изменено одно свойство DT: qcom,fast-charge-safe-current 500000 → 720000 → супервизор B10 пишет IBAT_MAX/IBAT_SAFE 0x04 (450 mA) → 0x07 (720 mA). Ядро и initramfs не менялись.
  • RAM-тест на USB-порту ноутбука: USB-тестер 0.724 A, без просадки VBUS, CC 55+ мин без срывов, PMIC максимум 55.7 °C.
  • Записано в cache (b23/B23-write.sh, HW EDL, readback + сверка разделов, 01bfe522), холодная загрузка с eMMC: IBAT_MAX 07. Откат: b23/B23-rollback.sh.
  • Фаза CC (до ≈4.1 V) примерно в 1.6 раза быстрее; хвост CV не меняется. Нагрузка платы (CPU, подсветка) идёт из того же входного тока.
  • Базовый образ B23 — B18 (ядро 7.2.7-aurora-b18, initramfs B12Q с Alpine); промежуточные этапы B11–B22 (Alpine-root, роутер, VPN, UI, USB host) в этом репозитории пока не опубликованы.

B10 status — батарея и зарядка: CLOSED, persistent validated (2026-10-04)

Production-профиль (Li-ion 3.8 V / 3000 mAh): потолок заряда 4.20 V, ток 450 mA, HOLD 4.05 V, full-min 4.15 V, CV-квалификация 60 min, safety timer запрограммирован на 512 min, FAULT safe clamp 4.00 V. Финальная проверка постоянной установки (cache c3732515): автономная class-A загрузка с eMMC; хеш живого cache перечитан и совпал; CHARGING / FAST; USB off → NO_USB (работа от батареи без сброса) → USB on → новый цикл; LTE / Wi-Fi / NCM / дисплей PASS; 15 min стабильности PASS. Отчёт: logs/b10/b10b5/B10-RESULT.md, дизайн: logs/b10/b10b3/B10B3-DESIGN.md, исходник драйвера: b10/b10b3/pm8916_lbc-v4.c.

  • Зарядник PM8916 LBC (линейный) + VADC VBAT + BMS-VM: свой супервизор поверх upstream pm8916_lbc (linux/patches/b10b3-lbc-supervisor-v3.patch
    • b10/b10b3/lbc-v3-to-v4-fault-clamp.diff = v4). Состояния NO_USB → CHARGING (4.20 V / 450 mA, safety timer 512 min) → HOLD (после 60 min CV при VBAT ≥ 4.15 V VDD_MAX опускается до 4.05 V: батарея стекает до полки, дальше плату питает USB) → USB вынут → батарея → USB → новый цикл. FAULT (VBAT > 4.25 V или CHG_FAILED): единственная запись — FAULT safe clamp to 4.00 V (VDD_MAX = 0x00), защёлка до извлечения USB/перезагрузки.
  • Проверено в RAM: CC/CV → HOLD, полка 4.03–4.06 V ~6 ч, USB 0.1 A на полке, HOLD → USB off → батарея без сброса, USB insert → новый цикл, warm reboot (программный вход в lk1st fastboot через PON reboot reason), FAULT-инъекция (тестовое ядро) → USB 0.000 A; затем production smoke.
  • Записано в cache (b10/b10b5/B10-write.sh, HW EDL, readback + сверка всех разделов) и проверено class-A загрузкой с eMMC без ввода.
  • Факты о железе (подробно в logs/b10/b10b3/B10B3-DESIGN.md, отчётах B10B3-*/B10B4-*/B10B5-*, logs/b10/b10b5/B10-RESULT.md): CHG_STATUS 00 + USB path 01 — защёлка, а не «заряжено»; CHG_EN = 0 заряд не останавливает; safety timer (TCHG = min/4 − 1) работает только в fast-charge (FAST_CHG_ON, path 02) и по истечении лишь выводит из него — ток идёт, CHG_FAILED не ставится; USB_SUSP (0x1347 bit0) вход не отключает; рабочий рычаг — VDD_MAX = 4.00 V (при VBAT > 4.00 V ток со входа → 0); после warm reboot SBL частично переинициализирует зарядник.
  • Ограничения (production):
    1. FAULT clamp не является гарантированным отключением заряда при VBAT < 4.00 V (зарядник может дозарядить до 4.00 V).
    2. Safety timer PM8916 сам физически заряд не прекращает (по истечении только выход из fast-charge).
    3. Снижение тока по температуре (thermal derating) не реализовано (PMIC до 58 °C при заряде + нагрузке CPU).
    4. Контакт батареи на этой плате аппаратно ненадёжен. Время CV 60 min — первое значение, не подбиралось.

B9 status — дисплей PASS (2026-10-03)

  • Встроенный экран — не DSI: 1.44" ST7735S 128×128 на SPI (MIPI-DBI type C), BLSP1 QUP4 spi@78b8000, 16 MHz, mode 3, CS0, D/C GPIO116, RESET GPIO118, RGB565, MADCTL 0xc8, смещение GRAM (2,3). Подсветка — PM8916 MPP4 как current sink 40 мА. Питание L17 2.85 V / L6 1.8 V. Всё восстановлено из stock LK (дизассемблер) и stock DTB: 19 init-команд в LK и DT совпадают побайтно.
  • Linux: upstream panel-mipi-dbi (firmware-файл со стоковой init-последовательностью, b9/b9b/mk-panel-fw.py), DRM + fbdev → fbcon 6x8 (21×16) на tty1, getty на tty1, UART-консоль сохранена (console=tty0 стоит до console=ttyMSM0). Подсветка: pinctrl MPP function "sink", drive-strength 7
    • gpio-backlight (регистры = стоковые 0x61/0x07/0x80), включается сервисом aurora-display через sysfs.
  • Cache B9C: 3 холодных загрузки с eMMC без ввода (2× class A + 1× class B, принято) — консоль ядра на экране, LTE + Wi-Fi AP, время, ошибок дисплея 0.
  • B9L: порт SPI-панели в lk2nd/lk1st под msm8916 (CAF spi_qup, клоки QUP4 16 МГц, модуль lk2nd/aurora; L17/L6 на этапе LK уже включены SBL). Сначала проверен в RAM (второй lk2nd через fastboot boot), затем прошит в aboot (lk1st 15208dbb, сборка воспроизводима, запись с readback и сверкой всех разделов). Теперь при включении splash (b9/b9l/splash/swag.png → RGB565) появляется через ~0.4 с, до Linux; затем fbcon. Патч: b9/b9l/persist/lk2nd-23.1-aurora-b9l-lk1st.patch, запись/откат: b9/b9l/persist/B9L-write.sh / B9L-rollback.sh.
  • Открыто: UI вместо консоли ядра, регулировка яркости, ~1 с темноты при передаче LK → Linux. Материалы: b9/, logs/b9/, NOTES.md сессия 37.

B8 status — Wi-Fi PASS (2026-10-03)

  • Pronto (WCNSS) через upstream qcom_wcnss remoteproc: штатный wcnss.mdt из RO-FAT modem, wcnss_mem фиксирован 0x8b600000/6 MiB, Iris qcom,wcn3620 (XO 19.2 MHz подтверждён прошивкой); штатный NV WCNSS_qcom_wlan_nv.bin из persist своего устройства (не публикуется). Без NV Pronto падает по Watchdog startup timeout каждые ~46 с.
  • Ядро: QCOM_WCNSS_PIL, CFG80211, MAC80211, WCN36XX built-in → phy0 (2.4 GHz, AP/managed) → wlan0.
  • Сервис aurora-wifi: после LTE START OK → WCNSS → wlan0 → hostapd 2.11 (тестовая AP, WPA2-PSK/CCMP, канал 6). PSK в репозитории нет (wifi.conf.in).
  • 3/3 холодных загрузки с eMMC без ввода: AP через 76–94 с после включения, телефон подключается и держит соединение, LTE не страдает.
  • Открыто: задержка кадров к клиенту в power save (у wcn36xx нет set_tim), нет regulatory.db (world 00), MAC 02:… из DT lk2nd.
  • Нет DHCP/NAT/DNS/firewall — это следующий этап (router stack). Материалы: b8/, logs/b8/, NOTES.md сессия 36.

B6P status — PASS

Implemented:

  • extlinux boot from cache (ext2, lk2nd 23.1 extlinux path; fallback — emmc1 из boot)
  • custom initramfs overlay поверх точных байтов golden mm1 (заменён только /init, добавлены контроллер, сервис, конфиг)
  • modem autostart: /init → /etc/init.d/aurora-modem start (без OpenRC), конфиг /etc/aurora/modem.conf
  • контроллер aurora-modem start|disconnect|stop|status: rmtfs -r -P -s → MSS → QMI → SIM → online → state machine регистрации (registered + PS attached, до 600 s) → udev/dbus/polkit/ModemManager → bearer → /32-маршруты; reconnect без перезапуска MSS; stop: bearer → routes → wwan down → MM → BAM-DMUX idle → MSS offline → rmtfs последним

Validation:

  • RAM (fastboot boot через RESET при включении): 3/3 загрузки, автозапуск, 3/3 reconnect без перезапуска MSS
  • 3/3 cold boots from flash (закреплённый АКБ): LTE registration 3.6–6.9 s, bearer established, data connectivity verified (DNS/ICMP/HTTP; HTTPS не требуется — часы 1970 до B7), clean shutdown verified
  • Работает с часами 1970 (RTC/NTP не трогались)

Safety:

  • eMMC writes: 0 (все блочные устройства getro=1, rmtfs -r держит EFS в RAM)
  • NV partitions unchanged (modemst1/2, fsg, fsc, persist — sha256 до/после каждой загрузки)
  • единственная запись во flash на этом этапе — cache с readback-сверкой; остальные разделы сверены с эталонами

Материалы: b6p/ (дизайн, preflight, сборка, скрипты записи/отката, тестовые скрипты), b6j/ (диагностика B6J–B6N), NOTES.md сессии 29–31.

Known issues

  • Early boot hangs before Linux startup (внутри SBL1 DDR-init, после SBL1, End, в lk1st target_init) — до чтения cache, не связано с B6P
  • Possible battery/contact instability: один сброс во время остановки модема, PMIC POFF reason = UVLO (under-voltage); с закреплённым АКБ не повторялся
  • Fast MSS restart may require investigation: повторная регистрация сразу после stop/start MSS в одном boot может не пройти
  • Единичные случаи (не воспроизведены): bearer поднят, но нет входящего трафика; зависание контроллера после online SET
  • Сигнал Beeline в месте установки маргинальный (RSRQ −13…−20 dB); регистрация иногда идёт через limited / соседние соты

Структура репозитория

путь что
NOTES.md подробный журнал всех сессий (sanitized)
docs/QUICKSTART.md порядок действий для второго устройства
docs/RECOVERY.md аппаратный EDL, откаты
docs/BUILD.md как пересобрать lk1st/lk2nd, ядро, DTB, initramfs, boot image, cache-образ
docs/BLOBS.md проприетарные/device-specific файлы, которых нет в репозитории: имя, sha256, назначение, где взять свой
linux/ DTS, фрагменты и полные kernel config, патч, init/скрипты initramfs, списки пакетов + APK sha256
lk2nd-build/, b5a/ запись сборки lk2nd/lk1st, config.h diff, скрипты записи/отката B5a
b5b/ генератор ext2/extlinux-образа cache, эмулятор сканирования lk2nd (исходники + результаты)
bootchain-migration/ preflight, write plan, редактор/валидатор GPT
b6/ первый RAM-only прототип контроллера (сессия 28)
b6j/ диагностика B6J–B6N: rmtfs-аудит, AT/QMI-снимки, state machine регистрации, харнессы
b6p/ persistent-интеграция: контроллер, сервис, конфиг, сборка initramfs/boot.img/cache, эмулятор, запись/откат, тесты
b7/ B7: время от сети (DMS/NITZ), проверка по NTP, cache B7C
b8/ B8: Wi-Fi — аудит, WCNSS/NV, wcn36xx, hostapd, сервис aurora-wifi, cache B8F (запись/откат/эмулятор)
b9/ B9: дисплей — аудит stock LK/DT, panel-mipi-dbi firmware, fbcon/сервис aurora-display, cache B9C, патч lk2nd (SPI-панель в LK)
b10/ B10: батарея/зарядка — аудит, супервизор v1–v4 (патчи/diff), тестовые DTB/сборки/скрипты, хуки B10B-4/5 (только тест), cache B10B-5 (запись/откат/эмулятор)
b11/…b22/ B11 LED/кнопки; B12 Alpine (rootfs, overlay, cache B12P/Q/R, роутер); B13 Wayland; B14/B16 aurora-ui (исходники); B15 VPN; B17 standalone; B18 USB OTG + cache; B20 netwatch/blackbox; B22 выбор VPN-пути
b23/ B23: ток зарядки 720 mA — сборка RAM-образа, монитор, cache B23 (сборка/эмулятор/запись/откат)
tools/ утилиты: UART-логгер, Sahara probe, распаковка boot.img, sanitizer публикации
logs/ sanitized логи: UART, QMI, ModemManager, EDL, результаты тестов
android/ снимок стокового Android (getprop, gpio, input, leds, …), sanitized

Что намеренно не опубликовано

Полные дампы eMMC и разделов, NV/EFS (modemst1/2, fsg, fsc), persist, userdata, файлы прошивки модема, стоковые SBL1/RPM/TZ/aboot/boot/recovery/system, Firehose-программер, DB410c TZ, собранные бинарники, Wi-Fi NV (WCNSS_qcom_wlan_nv.bin), PSK тестовой AP и образы с ним (B8F/B9C/B10 initramfs/cache/RAM-образы), логотип из stock LK. С B12: wifi.conf (SSID/PSK), конфиги и ключи WireGuard/relay, адрес VPN-сервера, сторонний relay-клиент и его исходники, учётные данные и TLS-ключ wayvnc, authorized_keys, образы rootfs/cache (B12–B23). Начиная с B10 сырые логи прогонов (мониторы, dmesg, snapshot, UART, журналы действий, дампы регистров, выводы эмулятора) не публикуются — только отчёты *.md и компактные таблицы *-diff.txt (правила в tools/publish-sanitize.py и .gitignore). Идентификаторы (IMEI, IMSI, ICCID, eMMC CID/serial, Sahara serial, MAC, номера сот, cookies) заменены на <PLACEHOLDER>. Как это сделано — tools/publish-sanitize.py; значения идентификаторов в репозиторий не попадают.