B7A: QMI DMS time vs VNIIFTRI NTP (DMS = UTC - 0.28 s, sigma 1 ms; NITZ = DMS truncated to 1 s). B7B: a 1970 -> 2026 date -s step is harmless for the modem stack. B7C: aurora-modem probes DMS/NITZ along the start flow and steps CLOCK_REALTIME once at the first valid sample (REG registered/attached), never RTC; background SNTP check (query only) after START OK. 3/3 class-A cold boots PASS (residual +0.04/+0.36/+0.84 s), cache 14fe453a written (B7C_WRITE_VERIFIED) and verified by a normal power-on (V1, +0.26 s). Also publishes the prerequisite R2 (boot-hang / lk eMMC investigation, T4 telnet baseline that B7C builds on) and R3 (autonomous cold boot, NCM loss) material, and extends tools/publish-sanitize.py to r2/, r3/, b7/. Binary images, initramfs, busybox and raw logs stay out (see b7/*/SHA256SUMS).
74 lines
11 KiB
Markdown
74 lines
11 KiB
Markdown
# R2: ранние зависания bootchain, диагностика (2026-10-01)
|
||
|
||
Режим: только чтение. Во flash ничего не писалось, перезагрузок не было. B6P не трогали.
|
||
Живые чтения делались на текущей загрузке pc6 (uptime ~1000 с): PMIC через regmap debugfs 0-00, APSS WDT через `devmem`, только read.
|
||
|
||
## Данные
|
||
- 41 UART-лог (`logs/uart/*.log` на 480s, 29.09–30.09), 96 стартов SBL1. Разбор: `table.py` → `table.txt`, `sbltime.py` → `sbl.txt`.
|
||
- По каждому старту: тайминги SBL1 (B/D-метки), `batt_voltage`, стадия, на которой остановился, строка перед стартом (что его вызвало).
|
||
- PON: pc4/pc5/pc6 `pon.txt`, 22:30 (pc2→pc3), живой дамп `r2-pmic.txt` (блоки 0x0800 PON, 0x1000–0x1600 LBC, 0x4000 VM-BMS и др.).
|
||
|
||
## Классификация сбоев (текущая цепочка: lk1st + DB410c TZ + qhypstub, с 30.09 00:31)
|
||
|
||
| # | Время | Тип старта | Точка остановки | Что дальше | pm_device_init, мкс | batt, мВ |
|
||
|---|---|---|---|---|---|---|
|
||
| 1 | 14:27:22 | warm `reboot -f` | lk `target_init()` (до «MMC card») | самосброс через 15.0 с | 11773 | 4188 |
|
||
| 2 | 15:41:10 | power-on, класс A | после `SBL1, End` (нет UART_DM/lk) | стоит, нужен power-cycle | **11254** | 4199 |
|
||
| 3 | 15:45:06 | power-on | SBL1 DDR (после Pre_DDR_clock_init) | стоит | **17202** (аномалия) | – |
|
||
| 4 | 17:47:07 | warm `reboot -f` | SBL1 DDR (после Pre_DDR_clock_init) | стоит | 11742 | – |
|
||
| 5 | 18:00:31 | power-on, класс A | после `SBL1, End` | стоит (**нового нет в NOTES**) | **11285** | 4193 |
|
||
| 6 | 23:10:47 | power-on (перестановка АКБ) | SBL1 DDR | стоит | 11803 | – |
|
||
| 7 | 23:26:59 | power-on | после `SBL1, End` | стоит >10 мин | **16317** (аномалия; pm_driver 13938, cdt 25437) | 4202 |
|
||
| 8 | 23:40:25→39 | power-on | Linux, тишина после 1.9 с (/init, до модема) | сброс через ~10.6 с после последнего вывода | 11742 | 4198 |
|
||
| 9 | 23:40:39 | сброс класса A | lk `target_init()` | самосброс через 11.0 с | **11285** | 4197 |
|
||
| 10 | 23:40:50 | сброс класса A | после `SBL1, End` | стоит | **11224** | 4197 |
|
||
| 11 | 02:49:13 | warm `reboot -f` | lk `target_init()` | самосброс через 15.0 с | 11742 | 4192 |
|
||
| (12) | 22:00:55 | power-on | Linux, тишина с t=13.4 с (сразу после `SET online` модема) | висит 4 мин до power-cycle | 11773 (pm_driver 8265, PBL 214 мс: слегка аномально) | 4200 |
|
||
|
||
EDL-входы (остановка после `clock_init`, D=30) исключены: это штатный Sahara-путь.
|
||
|
||
## Наблюдения
|
||
|
||
### O1. Два вида старта по телеметрии SBL1 (бимодальность)
|
||
- **Класс B** (норма): pm_device_init 11.71–11.86 мс, SBL1 Start ≈ 155–160 мс. Сюда входят все warm `reboot -f` и все старты с PON_REASON=USB (pc4/5/6, 22:26).
|
||
- **Класс A**: pm_device_init 11.22–11.32 мс, SBL1 Start чаще ≈ 122–134 мс (PBL на ~33 мс короче). Сюда попали ручные power-cycle 15:43, 22:05, спонтанные сбросы 23:40:39/50 и reboot-edl из lk.
|
||
- PON reason для класса A **ни разу не снимался**: все захваты PON пришлись на старты класса B. Гипотеза: это рестарт без полного POR PMIC (SMPL / hard reset / KPD), а не USB-insertion. SMPL-триггер включён (PON 0x880 = 0xFE, бит1).
|
||
|
||
### O2. «SBL1 End → нет lk» почти исключительно в классе A
|
||
- Текущая цепочка: класс A — 3 зависания после SBL1 End плюс 1 зависание lk на 9 стартов. Класс B — 1 такое зависание на ~40 стартов, и это 23:26:59 с аномальными PMIC-таймингами.
|
||
- Stock-цепочка (stock TZ/hyp/aboot): класс A — 0 из 5, после SBL1 End зависаний не было ни разу.
|
||
- Точка остановки лежит между выходом SBL1 в QSEE (DB410c TZ) → qhypstub → первой строкой lk (UART_DM init). Это до lk1st/cache/B6P.
|
||
- Вывод (вероятный, не доказан): зависание на стыке **stock SBL1 ↔ DB410c TZ/qhypstub** на non-POR старте. Например, TZ/hyp по-разному обрабатывают сохранившееся состояние (IMEM/cookies/warm-boot) после неполного обесточивания. При холодном POR проблема не проявляется.
|
||
|
||
### O3. Warm `reboot -f` из mainline ненадёжен
|
||
- 9 warm reboot → 3 сбоя: 2× зависание lk в инициализации eMMC (`target_init` до «MMC card») с самосбросом через ровно ~15 с и 1× зависание SBL1 в DDR-init.
|
||
- Stock Android warm-restart (`Restarting system…`): 0 сбоев на ~9.
|
||
- Кандидаты: mainline/PSCI SYSTEM_RESET оставляет eMMC или DDR в состоянии, которое stock SBL1 и lk не ожидают (нет eMMC power-off notify/CMD0, DDR не в self-refresh). Для автономной работы это не важно: B6P не делает warm reboot.
|
||
|
||
### O4. Самосбросы через 11–15 с: не APSS WDT и не PMIC WD (по крайней мере в штатном состоянии)
|
||
- APSS WDT 0x0B017000: EN=0, STS=0, BARK/BITE = значения по умолчанию. В DT узла нет, ядро его не трогает.
|
||
- `watchdog0` — это PMIC PON WD: 0x857=0x00 (выключен), S1=0x3c.
|
||
- KPDPWR S1+S2 (0x840/0x841 = 10.256+2 с, reset enabled 0x843=0x80) ≈ 12.3 с. Близко к 11–15 с, но это потребовало бы нажатой кнопки питания. Не доказано.
|
||
- Кто сбрасывает зависший lk через ~15 с после warm reboot, не установлено. Кандидаты: watchdog, взведённый TZ на время загрузки, и KPDPWR.
|
||
|
||
### O5. Электрические признаки
|
||
- `batt_voltage` 4183–4202 мВ на всех стартах текущей цепочки, включая все сбои. Проблема не в разряженной АКБ (stock-сессии шли при 3.86–4.13 В без сбоев).
|
||
- 2 из 2 стартов с аномально долгими PMIC-шагами SBL1 (pm_device_init +5 мс, pm_driver_init +6 мс) закончились зависанием (#3, #7). Замедление приходится на SPMI/PMIC-операции, а не на всё подряд. Это признак PMIC «в процессе» (дребезг питания или контакта во время старта).
|
||
- #6, #8–#10 пришлись на моменты, когда пользователь трогал АКБ.
|
||
- #12 (22:00): Linux замолчал на t=13.4 с сразу после включения модема (рост тока). Кандидат на просадку питания, но PON не снят.
|
||
- POFF 0x80D=UVLO фиксируется и при обычном ручном обесточивании (pc5/pc6 после user power-cycle). Значит, UVLO в POFF сам по себе **не доказывает** просадку в работе. Вывод по 22:26 (pc2) нужно ослабить до «вероятно».
|
||
- PON 0x807 (PBL_STATUS): pc4=0x98 (чистое обесточивание, 0x80D=00), pc5/pc6=0xC8 (UVLO latched). Семантика битов в downstream-драйвере не описана, это только корреляция.
|
||
- LBC: BAT_IF 0x1208=0x83 (АКБ определена), USB_CHGPTH 0x1310=0x03. power_supply/vadc драйверов в ядре нет, живого Vbat из Linux нет.
|
||
|
||
## Вердикт (текущий, по вероятности)
|
||
1. **Питание/контакт АКБ — главный триггер.** Сбои кучкуются при манипуляциях с АКБ и на стартах с аномальными PMIC-таймингами. Холодный старт класса B с закреплённой АКБ проходит ~40:1.
|
||
2. **Уязвимость цепочки к non-POR стартам (qhypstub/DB410c TZ ↔ stock SBL1).** Она превращает дребезг питания в зависание вместо нормального перезапуска: класс A 4/9 против 0/5 на stock-цепочке. Это программный фактор, его можно исследовать дальше.
|
||
3. **Warm reboot из mainline** — отдельный, воспроизводимый (~1/3) программный дефект (eMMC/DDR на warm reset). Для B6P не критичен.
|
||
4. Аппаратный дефект SoC/DDR не подтверждается: при нормальных стартах DDR-init стабилен, `batt_voltage` в норме. Совсем исключить его нельзя.
|
||
5. «Случайность» как объяснение отвергается: у сбоев есть устойчивые признаки (класс A, аномальные тайминги, warm reboot).
|
||
|
||
## Что нужно дальше (руки пользователя; без записи во flash)
|
||
- **T1. Установить, что такое класс A:** снимать PON 0x800–0x80F на каждом старте, дошедшем до Linux (pc-boot.sh уже это делает), и отдельно воспроизвести A: короткое выдёргивание АКБ при подключённом USB (SMPL?), нажатие кнопки питания.
|
||
- **T2. Матрица холодных стартов по 10 штук, UART + PON:** (a) АКБ закреплена, USB вставляется последним; (b) USB подключён, АКБ вставляется последней; (c) старт кнопкой питания. Считать стадию остановки и класс A/B.
|
||
- **T3. Только USB без АКБ:** по словам пользователя, плата не стартует. Один раз проверить с UART, чтобы увидеть, где именно она останавливается (PBL/SBL1/UVLO).
|
||
- **T4. (по желанию)** Сравнить с stock-цепочкой на стартах класса A. Для этого нужна перепрошивка, и **только по GO**.
|