uzbek-plus/README.md
q 4983fe2f76 B10: finalize persistent PM8916 charging
- final persistent validation (cold2): autonomous class-A boot from cache c3732515, live cache hash re-read,
  CHARGING/FAST, USB remove/insert recovery, LTE/Wi-Fi/NCM/display PASS, 15-min stability PASS -> B10 CLOSED
- README: B7/B8/B9/B10 CLOSED, production profile (4.20 V / 450 mA / HOLD 4.05 V / full-min 4.15 V / CV 60 min /
  timer 512 min / FAULT safe clamp 4.00 V) and the four production limitations; NOTES session 38
- current tree cleaned of raw B10 run logs (monitor/dmesg/snapshot/UART excerpt/action logs/register dumps/emulator
  outputs); history (58dcb3d) not rewritten
- publication rules: tools/publish-sanitize.py and .gitignore keep B10+ logs to reports (*.md) and *-diff.txt tables
2026-10-04 19:48:10 +03:00

175 lines
18 KiB
Markdown
Raw 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-04)
| Подсистема | Статус |
|---|---|
| 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** (см. ниже) |
| Router stack (NAT/firewall/VPN) | TODO (следующий этап) |
| Дисплей ST7735S 128×128 (SPI): DRM/fbcon tty1, подсветка, автозапуск из flash — B9 | **PASS / CLOSED** (см. ниже) |
| Батарея / зарядка: супервизор CHARGE → HOLD → батарея, FAULT safe clamp, автозапуск из flash — B10 | **PASS / CLOSED** (см. ниже) |
## Рабочая цепочка загрузки (baseline B5)
```
Power → stock SBL1 → DB410c TZ (TZ.BF.3.0) → qhypstub → lk1st (aboot, autoboot, splash на ST7735S через ~0.4 с)
→ cache: ext2 + extlinux/extlinux.conf → B10B-5 (ядро b10b5 + DTB b10b3 + initramfs B9C: модем, время, Wi-Fi, дисплей) → ARM64 Linux → LTE + Wi-Fi AP + консоль на экране + зарядка
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 + B10B-5 (ядро 7.2.7-aurora-b10b5 = B9C + зарядник, DTB b10b3, initramfs B9C) | `c3732515` (откат: B9C `b9ce13c9` → B8F `857c9c30` → B7C `14fe453a` → T4 `9d3bc890` → B6P `9fea693a`) |
| recovery | lk2nd 23.1 (fastboot) | `0dfa60a0` |
| modem, NV/EFS, persist, system, userdata | не менялись (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).
## 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 (запись/откат/эмулятор) |
| `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.
Начиная с 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`; значения идентификаторов в репозиторий не попадают.