uzbek-plus/README.md

210 lines
24 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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](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](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`](logs/b23/B23-RESULT.md), DTS: [`linux/dts/msm8916-jz08-aurora-b23.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/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](NOTES.md) | подробный журнал всех сессий (sanitized) |
| [docs/QUICKSTART.md](docs/QUICKSTART.md) | порядок действий для второго устройства |
| [docs/RECOVERY.md](docs/RECOVERY.md) | аппаратный EDL, откаты |
| [docs/BUILD.md](docs/BUILD.md) | как пересобрать lk1st/lk2nd, ядро, DTB, initramfs, boot image, cache-образ |
| [docs/BLOBS.md](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`; значения идентификаторов в репозиторий не попадают.