Document X4 USB power limits from root hub diagnostics

This commit is contained in:
DCCONSTRUCTIONS
2026-09-10 11:04:04 +03:00
parent 505844adc3
commit 3b85299fd9
5 changed files with 178 additions and 12 deletions
@@ -65,7 +65,52 @@ def report():
)
def launch():
def usb_report():
"""Read xHCI root-hub capabilities; never open the attached camera or switch ports.
This is an engineering observation, not an installation prerequisite.
usbutils must already exist: this reader never installs or repairs anything.
The same versioned file is executed in the owner terminal and retained with
its report. A hub's advertised switching capability is not a VBUS measurement.
"""
if os.geteuid() != 0:
raise ValueError("Use the owner terminal")
roots = []
for root in sorted(Path("/sys/bus/usb/devices").glob("usb[0-9]*")):
if not re.fullmatch(r"usb[0-9]+", root.name):
continue
device = root.resolve(strict=True)
if (device.parent / "driver").resolve().name != "xhci_hcd":
continue
if (root / "idVendor").read_text().strip() != "1d6b":
continue
if (root / "idProduct").read_text().strip() not in {"0002", "0003"}:
continue
bus = int((root / "busnum").read_text())
address = int((root / "devnum").read_text())
if not 1 <= bus <= 999 or address != 1:
raise ValueError("Unexpected root-hub address")
before = {"utc": datetime.now(UTC).isoformat(), "monotonic": time.monotonic()}
result = subprocess.run(
["/usr/bin/lsusb", "-v", "-s", f"{bus}:1"],
capture_output=True, text=True, timeout=10,
env={"PATH": "/usr/bin:/bin", "LC_ALL": "C"},
)
roots.append({
"root": str(device), "before": before,
"returncode": result.returncode,
"stdout": result.stdout, "stderr": result.stderr,
})
if not roots:
raise ValueError("No admitted Linux xHCI root hubs")
print(json.dumps({
"schema": "missioncore.node.x4-usb-power-diagnostic/v1",
"utc": datetime.now(UTC).isoformat(), "monotonic": time.monotonic(),
"roots": roots, "port_writes": False, "electrical_measurement": False,
}), flush=True)
def launch(usb=False):
if os.geteuid() == 0:
raise ValueError("Launch as the desktop owner")
source = Path(__file__).resolve()
@@ -76,18 +121,22 @@ def launch():
raise ValueError("Diagnostic artifact changed")
os.umask(0o077)
folder = source.with_suffix("")
if usb:
folder = folder.with_name(folder.name + "-usb")
folder.mkdir(mode=0o700, exist_ok=True)
info = folder.lstat()
if folder.is_symlink() or info.st_uid != os.getuid() or info.st_mode & 0o077:
raise ValueError("Diagnostic directory must be private")
script = folder / "read-report"
title = "чтение возможностей USB-портов" if usb else "чтение ошибки подготовки X4"
mode = "--read-usb" if usb else "--read"
script.write_text(
"#!/bin/bash\nset -uo pipefail\numask 077\nprintf '%s\\n' "
"'Mission Core: чтение ошибки подготовки X4' "
"'Mission Core: " + title + "' "
"'Изменений системы и команд камеры не будет. Введите пароль Ubuntu.'\n"
"/usr/bin/sudo /usr/bin/python3 -I '"
+ str(source)
+ "' --read 2>&1 | /usr/bin/tee '"
+ "' " + mode + " 2>&1 | /usr/bin/tee '"
+ str(folder / "report.json")
+ "'\nmc_x4_result=${PIPESTATUS[0]}\nprintf "
"'\\nКод завершения: %s\\nНажмите Enter, чтобы закрыть.\\n' "
@@ -134,5 +183,9 @@ if __name__ == "__main__":
report()
elif sys.argv[1:] == ["--launch"]:
launch()
elif sys.argv[1:] == ["--read-usb"]:
usb_report()
elif sys.argv[1:] == ["--launch-usb"]:
launch(usb=True)
else:
sys.exit("Use --launch or --read")
sys.exit("Use --launch, --read, --launch-usb or --read-usb")
@@ -742,3 +742,61 @@ Mac monotonic446251.627551791→446492.403596291,239 USB samples,exit0,stderr em
официальный tasker_get_agent_instructions вернул timeout60s; никаких Ops mutations
этим вызовом не было. Результат и очередь сохранены здесь; синхронизация
MISSIONCOR-77 остаётся следующему успешному обращению MCP.
## PORT01 — измерения порта и смена следующего контроля,10.09.2026
По прямому указанию владельца другой кабель исключён из ближайшего gate;
нужны измерения Ubuntu и программный/аппаратный обход. Причина ещё открыта.
Read-only SSH07:48:51.510684 UTC,Ubuntu monotonic324839.391772184:
USB2/USB3 peer-пара X4 active,disable0,not attached,over_current_count0; xHCI
D0,control on,runtime PM forbidden. Power_supply пуст; hwmon показывает только
CPU, датчиков VBUS/USB current нет. Extra07:55:04.082038 UTC,monotonic325211.963130727:
обе early_stop=no,USB3 LPM permitted u1_u2. Это не electrical qualification.
Private0600 readonly.jsonl SHA-256
cc5f8c1b2a2e771a3bdc1a2fdfbcd64d6003d644b63f2d7cd1edf950e46fb3a1;
extra.jsonl SHA-256 b93a68508bddbd8f8d025472ca042ad67b7eed3173b7f7fc74e0f814a33ec91f.
В kernel обнаружено отдельное окно после завершённого REPLUG03:
07:40:3840 USB2 -71/attempt power cycle;07:40:42.968 Mass Storage070a:4026;
07:40:59.096 disconnect. Внешний триггер этого цикла не установлен.
Sudo -n lsusb root-hub reader вернул password required, никаких USB changes.
Следующий reader входит в versioned engineering artifact
apps/node-agent/packaging/diagnose_x4_profile.py (--launch-usb/--read-usb),
SHA-256 711fdbc2dd56305443c72fac6ab4c69e1afc8d68500a6b0c31cb203ed3c478d5.
Python syntax проверен. Владелец авторизует только чтение xHCI root descriptors
через локальный sudo TTY; две команды lsusb ограничены10s каждая. Использует
уже установленный usbutils, ничего не устанавливает. Read-only engineering
не является prerequisite запуска X4 и не меняет installed model0.1.3-3/Node0.8.19.
Стейджинг — приватный файл /var/tmp с именем по SHA, отчёт0600, никакого
изменения systemd/udev/прав/портов. Повторное чтение не имеет device effects.
Rollback не требуется; перед любым будущим переключением портов сначала
изменяется и квалифицируется shipped installer/versioned preparation.
Результат root reader ещё не получен; аппаратный VBUS и recovery не приняты.
PORT01 root reader complete07:59:04.582247 UTC,Ubuntu monotonic325452.463335022.
Обе команды lsusb returncode0,stderr empty; root-hubs.json0600 SHA-256
b521133ccd252abb45bdc9e7a21595797461713deeb1156fd7df91e5e5917616.
Оба xHCI root hubs USB2/USB3: wHubCharacteristic0x000a,No power switching,
Per-port overcurrent protection. USB2 port2 power/no connect; USB3 port2
power/Rx.Detect/no connect. Стандартное VBUS switching на встроенном Mini не
предоставлено. Это не измерение фактического напряжения/тока и не доказательство
причины firmware/USB сбоя. Агент не отправлял port reset/disable/PM writes.
Дальше программный recovery имеет смысл после правильной enumeration; полный
power recovery требует проверенного внешнего индивидуального VBUS switching
и отдельно доказанной схемы выключения X4 с/без батареи. Повторная установка
SDK отсутствие камеры на USB не исправляет. В планах10/11 больше нет ожидания
замены кабеля от владельца. Ops MCP восстановился: инструкции/проект/context
считаны, MISSIONCOR-77 обновлён штатным update_structured_blocks08:01:54 UTC,
включая REPLUG03; автономность/питание не отмечены выполненными.
PORT01 handoff08:03:28.643589 UTC,Mac monotonic447888.607800625:
Core8000 operational,Node online,D455 online/streaming,X4 offline/idle.
Private0600 handoff.json SHA-256
104a204df2f5daea6f0828623c6506bbe7ae1de7d8b65bc5c711ac5747f33557.
Канонический Core оставлен работающим. Никаких новых viewer/worker/observer
процессов не запускалось; root descriptor reader завершился. Локальное
диагностическое окно после результата ждёт Enter, не выполняет работу.
@@ -94,4 +94,14 @@ REPLUG02/LIVE07 восстановление: после выполненног
OWNER03: владелец подтвердил автоматический Android mode после camera off/on→USB in и просмотр изображений X4 и D455 при переходах между их карточками в Core. Текущий Node snapshot обеих камер online/streaming; одновременное отображение,30 минут потока и FPS/latency ещё не измерены. Следующий hardware control — idle replug, затем active replug; установленные службы в этом уточнении не менялись.
REPLUG03: idle USB replug также failed. Preview STOP и fresh idle/recording0 подтверждены до извлечения; после возврата кабеля до конца239-sample observer X4 не перечислилась на USB. Активная трансляция непосредственно при отключении не является необходимым условием отказа; предыдущий SDK lifecycle и физические причины ещё не разделены. Следующий control — другой data cable без camera restart и без смены порта; наличие кабеля ожидается от владельца. Ops write отложен: официальный instructions read получил timeout60s.
REPLUG03: idle USB replug также failed. Preview STOP и fresh idle/recording0 подтверждены до извлечения; после возврата кабеля до конца239-sample observer X4 не перечислилась на USB. Активная трансляция непосредственно при отключении не является необходимым условием отказа; предыдущий SDK lifecycle и физические причины ещё не разделены. Владелец затем отклонил замену кабеля как ближайший gate; PORT01 переносит приоритет на адресную диагностику и программное восстановление порта. Ops write отложен: официальный instructions read получил timeout60s.
PORT01: read-only sysfs обеих половин разъёма X4: active, disable0, not attached, early_stop=no, over_current_count0; xHCI D0/control on/runtime PM forbidden. Признаков текущего усыпления нет; VBUS/ток не измерены (датчики не доступны). После REPLUG03 observer kernel записал новый краткий Mass Storage attach07:40:4259, без SDK mode. Подготовлен versioned read-only root-hub reader diagnose_x4_profile.py --launch-usb; аппаратное power switching и USB recovery пока не проверены. Подробности и private hashes в ledger/плане11.
PORT01 root reader завершён07:59:04 UTC: обе команды lsusb code0, USB2/USB3
wHubCharacteristic0x000a, No power switching. USB3-порт X4 power/Rx.Detect/no connect.
Стандартного адресного VBUS off/on встроенный контроллер Mini не предоставляет.
USB writes не выполнялись. Следующий аппаратный путь — отдельный управляемый
хаб с доказанным VBUS switching и отдельной проверкой полного выключения X4
при выбранной схеме батареи/питания. Ops MISSIONCOR-77 обновлён, включая ранее
отложенный REPLUG03; power/replug/recovery checker остаются открытыми.
+2 -2
View File
@@ -12,7 +12,7 @@ B11/P09,09.09: эта реализация готова и прошла38 Ubuntu
Предварительное условие NET01 закрыто NET02/NET03,10.09: CoreNode восстановили канал через Tailscale с прежними trust/identity. В Core подтверждены несколько свежих mTLS heartbeat, endpoint revision1. После восстановления заново читать актуальное состояние камеры перед любыми preview/model операциями; прежний stale inventory не подтверждает её текущее состояние.
P10/PREP05 complete: Node0.8.19 и X4 model0.1.3-3 установлены штатно. LIVE06 подтвердил первый и повторный START, active verify и viewer reopen:1083 декодированных кадра1280×640, без SD записи. REPLUG01 выявил отказ active USB replug; REPLUG02/LIVE07 восстановили камеру после camera off/on. OWNER03 подтвердил автоматический Android mode после этого включения. REPLUG03 подтвердил такой же отказ при fresh idle/preview0. Теперь первый контроль — другой data cable при том же порту/включённой камере, затем раздельная диагностика порта/питания и boot сценарии. Задержка NET03 recovery и длительная video stability остаются открытыми.
P10/PREP05 complete: Node0.8.19 и X4 model0.1.3-3 установлены штатно. LIVE06 подтвердил первый и повторный START, active verify и viewer reopen:1083 декодированных кадра1280×640, без SD записи. REPLUG01 выявил отказ active USB replug; REPLUG02/LIVE07 восстановили камеру после camera off/on. OWNER03 подтвердил автоматический Android mode после этого включения. REPLUG03 подтвердил такой же отказ при fresh idle/preview0. Владелец исключил замену кабеля из ближайшего gate. PORT01: порты/контроллер активны, early_stop=no, перегрузок0; измерителей VBUS/тока нет. Root reader подтвердил No power switching у обоих xHCI root hubs: штатно снимать VBUS встроенного порта нельзя. Следующая аппаратная ветка — управляемый хаб, с отдельной квалификацией питания/полного выключения X4; программный recovery SDK/preview — после возврата USB. Задержка NET03 recovery и длительная video stability остаются открытыми.
OWNER03: владелец видит изображение X4 и D455 через Core при переходах между карточками. Read-only Node snapshot обеих камер online/streaming. Длительная одновременная работа и измерения ещё не приняты.
@@ -30,7 +30,7 @@ camera settings/file download. Конкретная матрица, доказа
|---|---|---|
| Завершено, P5 | Общие состояния loading в DG: pending инициирующей кнопки, центр content region, отсутствие бесконечной загрузки после ошибки. Shared frontend для Core и Node, каталог и правила. | UI01/N09 установлен в Core8000 и Node0.8.18. Сборки/819 Core tests, DG tests/catalog и Node checks прошли. Browser geometry, normal/expanded/Escape, light/dark и error lifecycle проверены. Native Node visual QA ещё открыта. |
| B11 ограниченно принят, P3/P4 | Исправлено очищение feed при повторном START и проверка активного потока через новый decoder. PREP05/LIVE06: repeat START, live verify, viewer reopen complete. |1083 кадра1280×640; долгий capture и все возможные причины stale отдельно не приняты. |
| Первый следующий, P3/P4 | Локализация failed idle и active replug: другой data cable при том же порту/включённой камере; затем раздельные port/power/boot controls. После возврата USB — SDK recovery/preview intent по плану11. | Возврат того же экземпляра без переустановки и ручного режима, восстановление изображения; VBUS доказан отдельным физическим тестом. |
| Первый следующий, P3/P4 | PORT01: штатное VBUS switching встроенного Mini не поддерживается. Для power recovery нужен проверенный управляемый хаб и раздельные battery/power/boot controls; изменения сначала входят в packaged preparation. Замену кабеля владелец не выбрал. После возврата USB — SDK recovery/preview intent по плану11. | Возврат того же экземпляра без переустановки и ручного режима, восстановление изображения; VBUS доказан отдельным физическим тестом. |
| Следующий, P4 + P5 | Совместимый локальный просмотр в установленном Node/WebKit. Исходный план предусматривает HTTP/fMP4 carrier от той же медиа-сессии; переиспользуются общие media lifecycle/lease части K1, без импорта K1 protocol или второго SDK владельца X4. | На Ubuntu в приложении Node есть движущееся изображение; одновременно открыт удалённый Core. Закрытие одного зрителя сохраняет другого, не меняет SD recording. Все runtime dependencies входят в .deb/profile. |
| Затем, P4C | Матрица поддержанных действий по фактическим SDK headers и capabilities: camera settings, normal photo/video, ISO/exposure/WB/resolution, отдельные SD start/stop и фото. Проверять readback, mode dependencies и отображение результата. | Явные адресные команды из обеих UI, реальные результаты на камере, неизвестный outcome не переигрывается автоматически. Не обещать все режимы SDK до их проверки; shutter/EV setters и неподдержанные поля перечисляются отдельно. |
| P4C + общий source-record workflow | Получение содержимого выбранного файла на Node и в Core, bounded transfer, прерывание/продолжение, длина/hash и происхождение. Каталог уже есть, download ещё нет. | Пользователь получает существующий файл без shell; повторы/обрыв связи не меняют оригинал на SD. Незавершённый записываемый файл обрабатывается явно. |
@@ -86,10 +86,55 @@ X4 offline,Node и D455 online. Worker остановлен штатно, superv
этого отказа. Прежний preview/SDK lifecycle, кабель, контакт, host port, питание
и firmware ещё не разделены. Автоматический SDK retry не может восстановить
устройство, пока его нет на USB. Повторять тот же active replug следующим шагом
недостаточно для локализации. Следующий control — другой data cable при том же
порту и той же включённой X4; наличие кабеля запрошено, тест ещё не выполнен.
При недоступности другого кабеля выбирается отдельный hardware control,
не допускающий reset всего контроллера или нарушения работы D455.
недостаточно для локализации. Предлагался другой data cable; тест не выполнен.
Последующее указание владельца: замену кабеля не использовать как ближайший
gate, исследовать программный обход и измерения на Ubuntu. Это смена приоритета,
а не доказательство локализации причины в firmware.
## PORT01 — чтение портов и контроллера, 10.09.2026
07:48:51 UTC: Macmini6,2, Intel xHCI8086:1e31, Linux7.0.0-31-generic.
Обе логические половины точного разъёма X4 связаны через sysfs peer. Каждая
имеет disable0, state not attached, runtime active, over_current_count0.
Контроллер D0, power/control on, runtime PM forbidden. В07:55:04 обе early_stop
имеют no; USB3 usb3_lpm_permit=u1_u2. Текущего усыпления/блокировки после ошибки
не обнаружено. Разрешённый LPM не доказывает, что он вызвал прошлый disconnect.
Счётчик перегрузок0 не является измерением напряжения или доказательством
достаточного питания. Доступные power_supply/hwmon не показывают VBUS/ток порта.
После завершения окна REPLUG03 kernel дополнительно зарегистрировал USB2
descriptor errors -71 и собственный attempt power cycle07:40:3840;07:40:42.968
X4 появилась как Mass Storage070a:4026, затем disconnect07:40:59.096.
Внешнее действие, вызвавшее этот дополнительный цикл, не установлено. Это новые
события после observer, а не исправление его239-sample результата.
Выполнен read-only шаг — описание возможностей питания обоих xHCI root hubs
через уже установленный lsusb, в versioned diagnose_x4_profile.py --launch-usb.
Нужен root для чтения дескрипторов; после sudo -n password required reader
запущен через локальный owner terminal и завершился07:59:04 UTC.
Диагностический читатель не является runtime prerequisite: он не устанавливает
пакеты, не переключает порты и не открывает камеру. Любое последующее изменение
USB сначала входит в shipped installer/versioned preparation. По
[Linux ABI](https://raw.githubusercontent.com/torvalds/linux/master/Documentation/ABI/testing/sysfs-bus-usb)
наличие disable само по себе не подтверждает аппаратное снятие VBUS. Действие
разрешается проектировать только для проверенной USB2/USB3 пары, с возвратом
обоих портов во включённое состояние; глобальный reset затронет D455 и HID.
Root reader07:59:04.582247 UTC,monotonic325452.463335022: обе lsusb команды
returncode0,stderr empty. USB2 и USB3 root hubs имеют wHubCharacteristic0x000a:
**No power switching**, Per-port overcurrent protection. USB2 port2: power,
без connect; USB3 port2: power,Rx.Detect,без connect. Это аппаратно заявленные
возможности и логический статус, не физическое измерение5V. Стандартного
переключения VBUS этот контроллер не предоставляет; попытка sysfs disable
не рассматривается как доказанный power cycle. Root/port writes не выполнялись.
Следующий путь полного автономного восстановления требует отдельно проверить
хаб с индивидуальным VBUS switching и достаточным внешним питанием. Само
отключение VBUS при батарее не перезапускает гарантированно X4; режим без
батареи и USB power-on требуют отдельной аппаратной приёмки. До её появления
подтверждённый способ возврата — camera off/on, затем USB in (REPLUG02).
Никакая новая покупка/схема питания здесь не выполнялась. Программный recovery
SDK/preview остаётся отдельным инкрементом после возврата правильного USB mode.
## Поведение текущего приложения
@@ -148,7 +193,7 @@ disconnect для части прошивок; текущий bridge его не
| 2. Повторное подключение | Контролируемое USB disconnect/reconnect при открытом наблюдении: offline камеры при online Node, прежний device_id, новая session_id, отсутствие повторной установки и ручного выбора Android. Замерить время SDK-ready/первого кадра. |
| 3. Холодный запуск | Отдельно camera power cycle и reboot Ubuntu, с фиксацией battery presence, USB mode retention, wake-on-power, порядка запуска служб. Не объединять результаты этих сценариев. |
| 4. Автовосстановление | По выявленным отказам добавить bounded SDK reopen/backoff/watchdog per instance. Для включённого профиля автопросмотра хранить намерение preview отдельно от SDK-сессии и восстанавливать его после подтверждения той же камеры; UI пересоздаёт WebRTC на новой сессии. SD-запись/фото не повторяются. |
| 5. Питание разъёма | Включить адресную диагностику/действие в versioned preparation artifact. Прочитать hub capability, сопоставить USB2/USB3 пару, проверить физический VBUS off/on и сохранность остальных портов. Только после доказанного питания — сценарий без батареи и измерение потребления при запуске/preview. |
| 5. Питание разъёма | Включить адресную диагностику/действие в versioned preparation artifact. Прочитать hub capability, сопоставить USB2/USB3 пару, проверить физический VBUS off/on и сохранность остальных портов. PORT01: встроенный контроллер сообщает No power switching. Следующая аппаратная ветка — отдельный управляемый хаб; только после доказанного питания — сценарий без батареи и измерение потребления при запуске/preview. |
| 6. Приёмка | Несколько успешных replug/cold-start циклов,30 минут выбранного потока, измерение задержки и восстановления; все зависимости/права/правила/откаты входят в installer, чистый OS image остаётся отдельной проверкой. |
Целевой профиль: после однократной подготовки включение борта приводит к