docs(hardware): v2 — ретро-ревью (8 находок)

- ELM327 = software-дисциплина (полноценный CAN-узел, может TX); физический read-only
  инвариант только на нативном CAN в silent-режиме (уточнить architecture/sec-privacy §1)
- конверт входа по ISO 7637-2/16750-2: 9-16В, cold-crank ~6В, jump-start 24В, load-dump TVS
  (вместо размытого «40+В»); under-voltage brown-out + гистерезис → graceful shutdown
- hold-up как числовой контракт (ток×hold-time×дератинг −40°C/старение) + load-shedding
- §1a тепловой/механический конверт + темп-класс (industrial/AEC-Q100) + cold-start + охлаждение
- детект ACC кондиционированный: debounce + crank-приоритет (нет ложного shutdown на старте)
- контракт задней камеры (CVBS, reverse-сигнал, latency-бюджет #11, fail-safe), CAN front-end
  (трансивер/заземление/ESD/backfeed pin16), тир носителей /data (eMMC прод / SD dev)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-21 00:58:10 +03:00
parent 3790715fc7
commit d9209987e4
+63 -6
View File
@@ -3,7 +3,7 @@
> Целевой таргет, топология питания, периферия — и **HAL/BSP** для портирования под > Целевой таргет, топология питания, периферия — и **HAL/BSP** для портирования под
> другое железо/авто (то самое «API для автопроизводителей/автолюбителей» из vision). > другое железо/авто (то самое «API для автопроизводителей/автолюбителей» из vision).
Статус: **v1 (на ревью).** Статус: **v2 (на ревью).** v2 — после ретро-ревью (8 находок).
Связано с: [architecture.md](../architecture.md) · [dev-environment.md](../dev-environment.md) · [data-model.md](data-model.md) (§7 DBC) · [security-privacy.md](security-privacy.md) (якорь доверия) · домены A/B/E/J/K Связано с: [architecture.md](../architecture.md) · [dev-environment.md](../dev-environment.md) · [data-model.md](data-model.md) (§7 DBC) · [security-privacy.md](security-privacy.md) (якорь доверия) · домены A/B/E/J/K
--- ---
@@ -14,18 +14,33 @@
Panfrost GPU, мощности хватает на плавный UI и **локальную мелкую LLM**; это же класс Panfrost GPU, мощности хватает на плавный UI и **локальную мелкую LLM**; это же класс
реальных автоголов. реальных автоголов.
## 1a. Тепловой и механический конверт 🟡
- **Конверт температур (цель):** работа ~−20…+70 °C, выживание/хранение ~−40…+85 °C —
под автомобильные крайности (солнечный нагрев салона; зимний холод).
- **Температурный класс** SoC-модуля и eMMC: industrial (40…+85, AEC-Q100) **или** явно
принять consumer-риск для reference с письменным обоснованием + caveat по retention eMMC.
- **Холодный старт** (eMMC + DDR) при минимуме конверта — тест-кейс −30 °C.
- **Охлаждение:** пассив (радиатор) vs актив — против worst-case sun-load (RK3588 горячий). 🟡
- Софтовый throttling (a-base §10) это **не** заменяет — он не лечит отсутствие конверта/класса.
## 2. Хранилище ## 2. Хранилище
- **eMMC** — rootfs, **read-only**. - **eMMC** — rootfs, **read-only**.
- **Раздел `/data`** (SD/eMMC) — read-write, **журналируемый**. - **Раздел `/data`** — read-write, **журналируемый**. Тип ФС + контракт записи — [a-base](../domains/a-base-system.md) §3.
- **Тир носителей `/data`:** **eMMC — прод/reference** (полные power-safe-гарантии); **SD —
dev/опционально** (power-safe деградирован: хуже при резком обрыве, нет прод-гарантий износа) — не для парка.
- Прямое следствие power-safe (принцип #5): запись только в `/data`. - Прямое следствие power-safe (принцип #5): запись только в `/data`.
## 3. Питание (критично) — power-safe by design ## 3. Питание (критично) — power-safe by design
- **Управляемый power-path:** питание устройства коммутируется по зажиганию. - **Управляемый power-path:** питание устройства коммутируется по зажиганию.
- **Детект ACC/зажигания** — через GPIO (12 В → level-shift). - **Детект ACC/зажигания** — через GPIO (12 В → level-shift).
- **Автомобильная защита входа:** широкодиапазонный DC-DC + защита от **load-dump, - **Конверт входа (по ISO 7637-2 / 16750-2):** номинал ~9–16 В непрерывно; **cold-crank**
транзиентов и переплюсовки** (бортовые 12 В грязные — скачки до 40+ В). детерминированная работа при просадке до ~6 В (не reset-петля); **under-voltage** — порог
brown-out + гистерезис → детерминированный graceful shutdown; **over-voltage / 24 В
jump-start** — выдержать норматив; **load-dump** — TVS-клипер (несупрессированные пики
сильно выше 40 В); широкодиапазонный DC-DC + reverse-polarity.
- **Hold-up энергия** для graceful shutdown при резком пропадании 12 В. - **Hold-up энергия** для graceful shutdown при резком пропадании 12 В.
- **Secure boot** (verified boot RK3588) — **якорь доверия first-party** (из - **Secure boot** (verified boot RK3588) — **якорь доверия first-party** (из
[security-privacy.md](security-privacy.md): first-party = вшит в подписанный образ). [security-privacy.md](security-privacy.md): first-party = вшит в подписанный образ).
@@ -39,6 +54,21 @@ Panfrost GPU, мощности хватает на плавный UI и **лок
Рекомендую MCU-копилот: он же закрывает watchdog и пробуждение. (Прошивка МК — домен B.) Рекомендую MCU-копилот: он же закрывает watchdog и пробуждение. (Прошивка МК — домен B.)
**Бюджет hold-up (числовой контракт; sizing — здесь, sequencing — домен B):** энергия =
worst-case ток (SoC + контроллер хранилища при флаше/unmount) × hold-time (верхняя оценка
flush+durable-write+unmount с запасом) × **дератинг** (низкая T −40 °C: ёмкость/ESR supercap
падают; старение). **Load-shedding:** при детекте power-loss сбрасываем тяжёлые потребители
(усилитель, подсветка, модем) → hold-up кормит ТОЛЬКО SoC+хранилище (power-path должен уметь
селективно держать SoC-рейл). **Латентный бюджет:** «детект → старт shutdown → последний
fsync». Различать резкий обрыв 12 В (hold-up + немедленный флаш) vs управляемый ACC-off.
**Детект ACC — кондиционированный сигнал, не голый уровень GPIO:** debounce/glitch-фильтр +
минимальная стабильная длительность ACC-off **больше** worst-case cold-crank-просадки;
гистерезис + **приоритет crank** (не инициировать shutdown, пока возможен запуск двигателя —
по восстановлению напряжения/RPM), иначе ложный shutdown→ребут на нормальном старте. Это
ответственность MCU-копилота (он эмитит дебаунснутый ACC + shutdown-imminent → ipc
`AccChanged`/`ShutdownImminent`); для supercap-only — то же в софте на SoC. → инвариант домена B.
## 4. Периферия ## 4. Периферия
| Узел | Старт | Прод / позже | | Узел | Старт | Прод / позже |
@@ -64,6 +94,26 @@ Panfrost GPU, мощности хватает на плавный UI и **лок
read-запросы OBD-II разрешены (без них не прочитать ошибки). Чистый listen-only — read-запросы OBD-II разрешены (без них не прочитать ошибки). Чистый listen-only —
только для пассивного пути. только для пассивного пути.
**ELM327 ≠ физическая гарантия:** ELM327 — полноценный CAN-узел (ACK-ит кадры, по AT-командам
может слать произвольные) → на ELM327-пути read-only = **software-дисциплина** (нет write-кода
в Vehicle-Data, нет write-метода/capability). **Физический** инвариант «ноль TX, писать некуда»
держится только на **нативном CAN в silent-режиме** (приходит с прод-путём, не на MVP). Поэтому
формулировки architecture §1 / security-privacy §1 про «физический факт» строго верны лишь для
нативного silent-CAN; на ELM327 скомпрометированный Vehicle-Data способен инжектить кадры.
ELM327 не убираем (E §3 — путь для старых не-CAN авто), но где нужна жёсткая гарантия — адаптер без TX.
**Задняя камера (контракт захвата; safety НЕ заявляем, принцип #1):** стандарт CVBS (PAL/NTSC) +
разрешение/fps; источник «задняя включена» — провод фонаря з.х. (GPIO, надёжнее/быстрее) vs CAN
gear-сигнал (тогда gear нужен в data-model); **латентность — инженерный бюджет** (#11:
time-to-first-frame + steady-state; verified boot добавляет Stage-0 задержку, мерить отдельно),
не регуляторное требование; **fail-safe:** при отказе чипа — явное «нет сигнала», не замёрзший
кадр (#4). Оверлей/UX — домен J.
**CAN front-end (электрика):** bus-fault-protected трансивер с расширенным common-mode;
корректное заземление/общий референс + обработка ground-offset; ESD/транзиент на CAN-H/L
(ISO 7637, шинная сторона — отдельно от §3); защита от backfeed через OBD-II pin 16 при любом
порядке включения. **Даже listen-only не должен электрически нагружать/искажать шину** (физ. бэкап #1).
## 5. HAL / board-support (портирование) ## 5. HAL / board-support (портирование)
**HAL абстрагирует железо-специфичное**, чтобы платформа переносилась на другие **HAL абстрагирует железо-специфичное**, чтобы платформа переносилась на другие
@@ -86,7 +136,7 @@ DBC/маппинг сигналов** (см. [data-model.md](data-model.md) §7)
Портируемость — силами других через BSP/HAL. Портируемость — силами других через BSP/HAL.
- 🟡 **Выбор конкретной платы — отложен** (решение по доступности/цене). Кандидаты: - 🟡 **Выбор конкретной платы — отложен** (решение по доступности/цене). Кандидаты:
Radxa Rock 5B / 5B+, Orange Pi 5 / 5 Plus, Khadas Edge2 — критерии: mainline-поддержка, Radxa Rock 5B / 5B+, Orange Pi 5 / 5 Plus, Khadas Edge2 — критерии: mainline-поддержка,
доступность (в т.ч. в РФ), цена, IO (CAN-способные пины). доступность (в т.ч. в РФ), цена, IO (CAN-способные пины), **температурный класс**, наличие **battery-RTC**.
--- ---
@@ -96,7 +146,9 @@ DBC/маппинг сигналов** (см. [data-model.md](data-model.md) §7)
- ◻️ **Прошивка MCU-копилота** (детект ACC, sequencing, watchdog, протокол к SoC). → домен B. - ◻️ **Прошивка MCU-копилота** (детект ACC, sequencing, watchdog, протокол к SoC). → домен B.
- ◻️ **Ранний путь задней камеры** (Stage 0 boot) — аппаратная сторона. → домен J + B. - ◻️ **Ранний путь задней камеры** (Stage 0 boot) — аппаратная сторона. → домен J + B.
- 🟡 **Подписанные OTA** (вторая половина цепочки доверия; secure boot закрыт здесь). → домен A. - 🟡 **Подписанные OTA** (вторая половина цепочки доверия; secure boot закрыт здесь). → домен A.
- **Тепловой режим** → резолв в [a-base-system.md](../domains/a-base-system.md) §10 (мониторинг SoC + throttling; радиатор/корпус — hardware). - 🟡 **Тепловой режим — софт закрыт** в [a-base](../domains/a-base-system.md) §10; **hardware-сторона открыта** (конверт/темп-класс/cold-start/охлаждение — §1a).
- ◻️ **Бюджет hold-up** (числа: ток/hold-time/дератинг) — выбор supercap/cap гейтится этим (§3).
- ◻️ **CAN-front-end части** (трансивер/защита) + **battery-RTC** на reference-плате — финализировать при выборе платы.
-**Износ eMMC/SD** → резолв в [a-base-system.md](../domains/a-base-system.md) §9–§10 (journald volatile, tmpfs, zram вместо swap, write-minimization). -**Износ eMMC/SD** → резолв в [a-base-system.md](../domains/a-base-system.md) §9–§10 (journald volatile, tmpfs, zram вместо swap, write-minimization).
--- ---
@@ -111,3 +163,8 @@ DBC/маппинг сигналов** (см. [data-model.md](data-model.md) §7)
| CAN | пассивный listen-only + OBD read-запросы (без state-changing TX); ELM327 на старте | 2026-06-16 | | CAN | пассивный listen-only + OBD read-запросы (без state-changing TX); ELM327 на старте | 2026-06-16 |
| Доверие | secure boot анкорит first-party; подпись OTA — домен A | 2026-06-16 | | Доверие | secure boot анкорит first-party; подпись OTA — домен A | 2026-06-16 |
| Портируемость | HAL + BSP; один reference-таргет first-party | 2026-06-16 | | Портируемость | HAL + BSP; один reference-таргет first-party | 2026-06-16 |
| Конверт входа | ISO 7637-2/16750-2: 916В, cold-crank ~6В, jump-start 24В, load-dump TVS | 2026-06-16 |
| Hold-up | числовой бюджет (ток×hold×дератинг) + load-shedding; sizing — здесь, sequencing — B | 2026-06-16 |
| Тепло | конверт −20…+70 / −40…+85, темп-класс, cold-start, охлаждение (🟡); софт — A §10 | 2026-06-16 |
| ELM327 | read-only = software-дисциплина; физ. инвариант — только нативный silent-CAN | 2026-06-16 |
| Носители `/data` | eMMC прод (полный power-safe) / SD dev (деградировано) | 2026-06-16 |