jetson-customize-camera
NVIDIA/skills
Habilita los sensores de cámara MIPI/GMSL en una placa base personalizada Jetson Thor u Orin generando una superposición del kernel-DT a partir del DTSI del sensor incluido en el árbol de fuentes.
...Expandir todoPersonalizar la cámara (puesta en marcha del sensor CSI / MIPI / GMSL)
Descripción general
Tegra264 (Thor) y Tegra234 (Orin) exponen un único controlador tegra-capture-vi
con NVCSI como interfaz y un conjunto fijo de puertos CSI. La
puesta en marcha de la cámara consiste en:
- Selección del sensor: se elige del conjunto de referencias
.dtsique NVIDIA incluye en el árbol de fuentes para la plataforma activa. - Comprobación de compatibilidad de la placa base y el módulo: se verifica con respecto a la Guía de desarrollo de cámaras, la Guía de adaptación (apartado «Cámara»), el esquema de la placa base, el TRM del módulo y el mapa de pines de la placa base.
- Cableado: derivado del archivo
*.dtsi de «tegraincluido en el árbol del proyecto, cuando exista (el DTSI ES la fuente de referencia definitiva para el cableado); capturado por el usuario para cada sensor cuando el sensor es personalizado.-camera- » - Superposición del kernel-DT: expandir con cpp el DTSI del árbol de código, extraer su
cuerpo
fragment@Ny añadirlo al archivo de superposición personalizado compuesto.dtspara el objetivo activo (según../../references/bsp-customization-kernel-dtb.md), verificar la superposición compuesta confdtoverlay./jetson-build-sourcecompila la superposición compuesta y se encarga del registroOVERLAY_DTB_FILE+=en la configuración del operador.
Basado en agentes, no en tablas: la lista de sensores se genera en tiempo de ejecución mediante
la inclusión global de los dtbos por sensor del árbol del sistema. Sin diccionario _THOR_CAMERAS, sin
questions.json, sin renderizador de Python en la ruta de la pregunta.
Sin edición de ODMDATA: las cámaras no consumen carriles UPHY (CSI es un grupo PHY independiente). La skill solo emite una superposición del DT del kernel; la línea ODMDATA de la configuración del carrier no se ve afectada por esta skill.
El resultado es una única confirmación:
El fragmentode cámara@Nbloque (másel nombre del encabezado de Jetsonen la raíz del compuesto si aún no está presente) se añade a la superposición personalizada compuesta.dtssegún../../references/bsp-customization-kernel-dtb.md→ confirmado en el repositorio de hardwarebsp_sources/./jetson-build-sourcecompila el compuesto a.dtboy se encarga de su Makefile y del registro en flash-conf.
Cuándo invocarlo
- El usuario dice «activar la cámara», «configurar CSI», «conectar un sensor Hawk /
Owl / IMX», «cámara MIPI», «cámara GMSL», o solicita activar
tegra-capture-vi/ NVCSI en una tarjeta portadora personalizada. - La memoria flash arranca, pero
v4l2-ctl --list-devicesno muestra ningún canalde tegra-capture-vi, O BIEN es necesario confirmar la enumeración de sensores en una tarjeta secundaria nueva. - Anteriormente se había habilitado un sensor y el usuario desea añadir otro (puesta en marcha multisensor).
Requisitos previos:
- Perfil activo con
reference_devkit:+custom_carrier:blocks. Existe /Linux_for_Tegra/.git(/jetson-init-source).- Se ha ejecutado
/jetson-derive-carrier: la bifurcación de la configuración flash del carrier se encuentra en el rastreador de superposiciones. Existe /bsp_sources/hardware/nvidia/y contiene los archivos/nv-public/overlay/ .dtsipor sensor integrados en el árbol (procedentes de la extracción del archivo de la rama Ade /jetson-init-source).contiene los encabezados de macros que necesita C++ (puede que sea necesario ejecutar/bsp_sources/kernel/kernel-noble/include/dt-bindings/ source_sync.shsi se ha utilizado la rama B; véase el paso 5a.i más abajo).- Documentación de referencia registrada o facilitada en el momento solicitado:
Guía de desarrollo de la cámara (en el espejo
de bsp_developer_guideo en una ruta independiente), Guía de adaptación §Cámara, esquema del soporte, TRM del SoC, Guía de diseño del módulo. dtc,cppyfdtoverlayen PATH.
Procedimiento
El procedimiento detallado paso a paso (pasos 1–7, con todas las tablas, bloques de código
y puertas) se encuentra en
references/procedure.md. Resumen:
- Paso 1 — Identificar el objetivo activo y abrir la documentación de referencia.
- Paso 2 — Enumerar los sensores compatibles mediante la búsqueda global en el árbol de los dtbos de cámara por plataforma; clasificarlos como DPHY directo / GMSL / personalizados. Nunca inventar sensores.
- Paso 3 / 3a — Comparar la compatibilidad del operador y del módulo con el DTSI, la Guía de desarrollo de cámaras, la Guía de adaptación §Cámara, el TRM del SoC, la Guía de diseño de módulos, el esquema y el mapa de pines del operador. Generar la tabla de cableado PRIMERO y, a continuación, activar la puerta de «confirmar o personalizar».
- Paso 4 (solo ruta personalizada) — Cuestiones de cableado por sensor agrupadas y rellenadas automáticamente a partir del mapa de pines del operador.
- Paso 5 — Añade exactamente UN fragmento
/* custom-bsp: camera:al archivo*/ .dtsde superposición personalizada compuesta (véase../../references/bsp-customization-kernel-dtb.md). La ruta «Clone» expande mediante C++ el DTSI integrado en el árbol; la ruta personalizada empalma las respuestas del paso 4 y las tablas de modos in situ. Establece de forma idempotentejetson-header-nameen la raíz compuesta. Verifica condtc+fdtoverlay(puerta de fragmento único previa a la compilación; puerta de unicidad de árbol profundo posterior a la compilación). Confirma a través de la puerta de vista previa del mensaje de confirmación del flujo de trabajo. - Paso 6 — Verifica los SFIO de pines CAM auxiliares (
cam_i2c_*,pines GPIO de reset/PWDN/PWR_EN) mediante, pin_verifier.py; deriva las discrepancias a/jetson-customize-pinmux. - Paso 7 — Realiza una escritura atómica del archivo JSON de estado de ejecución en
y emite el titular; a continuación, impulsa la cadena de pasos siguientes mediante solicitudes secuenciales/target-platform/ .jetson-customize-camera.json de «AskUserQuestion»segúnreferences/procedure.mdPaso 7. La cadena es una etapa documentada del flujo de trabajo, no una pregunta aclaratoria: el modo automático NO la exime. Nunca sustituyas las solicitudes por una línea impresa que diga «Siguiente paso: …».
Puntos a tener en cuenta
- Trampa de doble fragmento. Aporta exactamente UN
fragmentoetiquetado por la cámara@Na la composición. Un segundo fragmento que contenga anulaciones de estado desencadena una fusión profunda de dtc → subárboles hermanos duplicados (p. ej., dostca9546@70) → la primera coincidencia en tiempo de ejecución descarta el árbol profundo proporcionado por dtsi → la cámara, de forma silenciosa, no enumera. Aplica la compuerta únicamente al marcador de esta habilidad (Paso 5c). - La raíz del compuesto
compatiblees de propiedad global, no de esta habilidad. No amplíes a partir de ningún dtbo por sensor dentro del árbolque sea compatible(restringido por devkit-SKU). Corrige la raíz del compuesto si es necesario. jetson-header-namede cualquier DTB per-sensor del árbol. Corregido, independiente del operador; léelo una vez y pégalo en la raíz de metadatos.- NO añadas también el dtbo por sensor incluido en el árbol a
OVERLAY_DTB_FILE. Si registras tanto tu superposición renderizada como el dtbode superposición de Tegraincluido en el árbolse produce un enlace de subdispositivo fantasma que bloquea la enumeración de la cámara.-p3971-camera- -overlay.dtbo - La superposición «stub» es un error conocido. Al confirmar
tegra-capture-vi { status="okay"; num-channels=sin el cuerpo de puertos / sensor / nvcsi, la cámara deja de funcionar (; } fallo en la inicialización de todos los canales). Incorpora el cuerpo COMPLETO del sensor mediante cpp + dtc. - Las tablas de modos del sensor deben insertarse, nunca escribirse a mano.
mode,sensor_modes,pixel_phase: cópialas tal cual del DTSI más parecido del árbol de fuentes. camera_common_regulator_get (null) ERR: -EINVAL= faltan las cadenasavdd-reg/iovdd-reg/dvdd-reg— integra el cuerpo COMPLETO del sensor; los raíles siempre activos recurren a un regulador ficticio.- Las referencias externas
a etiquetasdeben existir en__symbols__del DTB base. Utilizatarget-path = "/tegra-capture-vi"cuando la etiqueta no esté presente; de lo contrario,fdtoverlaydevuelve un valor distinto de cero conFDT_ERR_NOTFOUND. - Error
de cppendt-bindings/gpio/gpio.h: No existe tal archivo= el árbol de código fuente de L4T no está preparado. Vuelve a ejecutar/jetson-init-source(el script source_sync.shde la rama B recupera los encabezados). Nunca inventes la expansión de la macro. - No se edita ODMDATA ni la configuración de la memoria flash. La cámara no consume
carriles UPHY. El valor
ODMDATA="..."de la configuración del carrier no se modifica.OVERLAY_DTB_FILE+=pertenece al paso 5.0a de/jetson-build-source: esta tarea nunca modifica la configuración de la memoria flash del carrier. - No modifiques el BSP de origen en
. Todas las modificaciones se realizan en(rastreador de superposiciones) y/Linux_for_Tegra/ (/bsp_sources/ archivos .dtsde superposición) siguiendo el patrón de commits «pristine + personalización».
Referencias
references/procedure.md— procedimiento completo paso a paso de los pasos 1 a 7 (extraído de este SKILL.md).references/csi-dt-bindings.md— Notas de referencia sobre enlaces DT de CSI / nvcsi / vi.references/overlay-template.md— orientación sobre la forma de superposición «metadata-root + clone-body».references/camera-overlay-templates/— plantillas.dts.tmplde inicio:dphy-direct.dts.tmpl,gmsl-serdes.dts.tmpl.../../scripts/pin_verifier.py— verificador compartido de pines HSIO (Paso 6).../../references/platform_template.yaml—Documentos:bloque utilizado en el paso 1.../../context/bsp-customization-workflow.md— Protocolo de edición de superposiciones.../jetson-customize-pinmux/SKILL.md— habilidad homóloga invocada automáticamente por el paso 6 para corregir las discrepancias entre pines HSIO y SFIO (CAM I²C, MCLK, GPIO de reinicio).../jetson-derive-carrier/SKILL.md— debe ejecutarse en primer lugar; genera la superposición base del carrier (el*-dynamic.dtbo) sobre la que se apilan posteriormente las pilas compuestas de esta habilidad.../jetson-init-source/SKILL.md— genera el rastreador de superposición y el repositoriobsp_sources(con el árbol DTSI por sensorde hardware/nvidia/) que esta habilidad lee y en el que realiza confirmaciones.
---
name: jetson-customize-camera
description: Enable MIPI/GMSL camera sensors on a Jetson Thor or Orin custom carrier by rendering a kernel-DT overlay from the in-tree sensor DTSI.
license: Apache-2.0
---
# Customize camera (CSI / MIPI / GMSL sensor bring-up)
## Overview
Tegra264 (Thor) and Tegra234 (Orin) expose a single `tegra-capture-vi`
controller fronted by NVCSI and a fixed set of CSI ports. Camera
bring-up is:
1. **Sensor selection** — picked from the set NVIDIA ships in-tree
`.dtsi` references for on the active platform.
2. **Carrier + module support check** — verified against the Camera
Development Guide, Adaptation Guide §Camera, carrier schematic,
Module TRM, and carrier pinmap.
3. **Wiring** — derived from the in-tree
`tegra<soc>-camera-<sensor>*.dtsi` when one exists (**the DTSI IS
the wiring source of truth**); captured per-sensor from the user
when the sensor is custom.
4. **Kernel-DT overlay** — cpp-expand the in-tree DTSI, extract its
`fragment@N` body, append into the composite custom overlay
`.dts` for the active target (per
[`../../references/bsp-customization-kernel-dtb.md`](../../references/bsp-customization-kernel-dtb.md)),
verify the composite with `fdtoverlay`.
`/jetson-build-source` compiles the composite and owns the
carrier conf's `OVERLAY_DTB_FILE+=` registration.
**Agentic, not table-driven** — sensor list is built at runtime by
globbing in-tree per-sensor dtbos. No `_THOR_CAMERAS` dict, no
`questions.json`, no Python renderer in the question path.
**No ODMDATA edit** — cameras don't consume UPHY lanes (CSI is a
separate PHY pool). The skill emits only a kernel-DT overlay; the
ODMDATA line in the carrier conf is untouched by this skill.
The output is **one commit**:
- Camera `fragment@N` block (plus `jetson-header-name` on the
composite root if not already present) appended to the composite
custom overlay `.dts` per
[`../../references/bsp-customization-kernel-dtb.md`](../../references/bsp-customization-kernel-dtb.md)
→ committed to the `bsp_sources/` hardware repo.
`/jetson-build-source` compiles the composite to `.dtbo` and
owns its Makefile + flash-conf registration.
## When to invoke
- The user says "enable camera", "configure CSI", "wire a Hawk /
Owl / IMX sensor", "MIPI camera", "GMSL camera", or asks to bring
up `tegra-capture-vi` / NVCSI on a custom carrier.
- Flash boots but `v4l2-ctl --list-devices` shows no
`tegra-capture-vi` channels, OR sensor enumeration on a fresh
daughter-card needs to be confirmed.
- A sensor was previously enabled and the user wants to add another
(multi-sensor bring-up).
**Prerequisites:**
- Active profile with `reference_devkit:` + `custom_carrier:` blocks.
- `<source.root_path>/Linux_for_Tegra/.git` exists
(`/jetson-init-source`).
- `/jetson-derive-carrier` has run — the carrier flash-conf fork is
in the overlay tracker.
- `<source.root_path>/bsp_sources/hardware/nvidia/<chip-dir>/nv-public/overlay/`
exists and contains the in-tree per-sensor `.dtsi` files (sourced
by `/jetson-init-source`'s Branch A archive extract).
- `<source.root_path>/bsp_sources/kernel/kernel-noble/include/dt-bindings/`
contains the macro headers cpp needs (`source_sync.sh` may need to
run if Branch B was used — see Step 5a.i below).
- Source-of-truth docs registered or supplied at prompt:
Camera Development Guide (in `bsp_developer_guide` mirror or
separate path), Adaptation Guide §Camera, carrier schematic, SoC
TRM, Module Design Guide.
- `dtc`, `cpp`, `fdtoverlay` on PATH.
## Procedure
Detailed step-by-step procedure (Steps 1–7, with all tables, code
blocks, and gates) lives in
[`references/procedure.md`](references/procedure.md). Summary:
1. **Step 1** — Resolve active target + open source-of-truth docs.
2. **Step 2** — Enumerate supported sensors by globbing in-tree
per-platform camera dtbos; classify as DPHY-direct / GMSL /
custom. Never invent sensors.
3. **Step 3 / 3a** — Cross-check carrier + module support against
DTSI, Camera Development Guide, Adaptation Guide §Camera, SoC TRM,
Module Design Guide, schematic, and carrier pinmap. Render the
wiring table FIRST, then issue the confirm-or-customize gate.
4. **Step 4** (custom path only) — Batched per-sensor wiring
questions auto-filled from the carrier pinmap.
5. **Step 5** — Append exactly ONE `/* custom-bsp: camera:<sensor> */`
fragment to the composite custom overlay `.dts` (see
[`../../references/bsp-customization-kernel-dtb.md`](../../references/bsp-customization-kernel-dtb.md)).
Clone path cpp-expands the in-tree DTSI; custom path splices Step-4
answers + mode tables in-place. Idempotently set
`jetson-header-name` on the composite root. Verify with
`dtc` + `fdtoverlay` (pre-compile single-fragment gate;
post-compile deep-tree uniqueness gate). Commit via the
workflow's commit-message preview gate.
6. **Step 6** — Verify ancillary CAM pin SFIOs (`cam_i2c_*`,
`extperiph<m>_clk`, reset/PWDN/PWR_EN GPIOs) via
`pin_verifier.py`; route mismatches to `/jetson-customize-pinmux`.
7. **Step 7** — Atomic-write run-state JSON sidecar at
`<workspace>/target-platform/<profile-stem>.jetson-customize-camera.json`
and emit the headline, then drive the downstream next-step chain via
sequential `AskUserQuestion` prompts per `references/procedure.md`
Step 7. **The chain is a documented workflow gate, not a clarifying
question — auto-mode does NOT exempt it.** Never substitute a
printed "Next step: …" line for the prompts.
## Gotchas
- **Dual-fragment trap.** Contribute exactly ONE camera-tagged
`fragment@N` to the composite. A second one carrying status
overrides triggers dtc deep-merge → duplicate sibling subtrees
(e.g. two `tca9546@70`) → runtime first-match drops the dtsi-
supplied deep tree → camera silently doesn't enumerate. Gate on
this skill's marker only (Step 5c).
- **Composite root `compatible` is owned globally, not by this
skill.** Don't widen from any in-tree per-sensor dtbo's
`compatible` (devkit-SKU-gated). Fix the composite root if needed.
- **`jetson-header-name` from any in-tree per-sensor dtbo.** Fixed,
carrier-agnostic; read once, paste onto the metadata root.
- **DO NOT also append the in-tree per-sensor dtbo to
`OVERLAY_DTB_FILE`.** Registering both your rendered overlay AND
the in-tree `tegra<soc>-p3971-camera-<sensor>-overlay.dtbo`
produces a phantom subdev bind that bricks camera enumeration.
- **Stub overlay is a known footgun.** Committing
`tegra-capture-vi { status="okay"; num-channels=<N>; }` with no
ports / sensor / nvcsi body bricks the camera (`all channel init
failed`). Splice the FULL sensor body via cpp + dtc.
- **Sensor mode tables must be spliced, never hand-authored.**
`mode<N>`, `sensor_modes`, `pixel_phase` — copy verbatim from the
closest in-tree DTSI.
- **`camera_common_regulator_get (null) ERR: -EINVAL`** = missing
`avdd-reg` / `iovdd-reg` / `dvdd-reg` strings — splice the FULL
sensor body; always-on rails fall back to dummy regulator.
- **External `&label` refs must exist in base DTB's `__symbols__`.**
Use `target-path = "/tegra-capture-vi"` when the label is absent;
`fdtoverlay` exits non-zero with `FDT_ERR_NOTFOUND` otherwise.
- **`cpp` failure on `dt-bindings/gpio/gpio.h: No such file`** =
L4T source tree isn't staged. Re-run `/jetson-init-source` (Branch
B's `source_sync.sh` fetches the headers). Never fabricate the
macro expansion.
- **No ODMDATA edit, no flash-conf edit.** Camera doesn't consume
UPHY lanes. The carrier conf's `ODMDATA="..."` is untouched.
`OVERLAY_DTB_FILE+=` is owned by `/jetson-build-source` Step
5.0a — this skill never touches the carrier flash conf.
- **Don't touch the upstream BSP at `<bsp_image.root_path>`.** All
edits land in `<source.root_path>/Linux_for_Tegra/` (overlay
tracker) and `<source.root_path>/bsp_sources/` (overlay `.dts`)
under the pristine + customization commit pattern.
## References
- [`references/procedure.md`](references/procedure.md) — full
step-by-step Steps 1–7 procedure (extracted from this SKILL.md).
- [`references/csi-dt-bindings.md`](references/csi-dt-bindings.md) —
CSI / nvcsi / vi DT binding reference notes.
- [`references/overlay-template.md`](references/overlay-template.md) —
guidance on the metadata-root + clone-body overlay shape.
- [`references/camera-overlay-templates/`](references/camera-overlay-templates/)
— starter `.dts.tmpl` templates: `dphy-direct.dts.tmpl`,
`gmsl-serdes.dts.tmpl`.
- [`../../scripts/pin_verifier.py`](../../scripts/pin_verifier.py)
— shared HSIO pin verifier (Step 6).
- [`../../references/platform_template.yaml`](../../references/platform_template.yaml)
— `documents:` block consumed by Step 1.
- [`../../context/bsp-customization-workflow.md`](../../context/bsp-customization-workflow.md#workflow-invariants)
— overlay edit protocol.
- [`../jetson-customize-pinmux/SKILL.md`](../jetson-customize-pinmux/SKILL.md) —
sibling skill auto-invoked by Step 6 to fix HSIO pin SFIO
mismatches (CAM I²C, MCLK, reset GPIOs).
- [`../jetson-derive-carrier/SKILL.md`](../jetson-derive-carrier/SKILL.md)
— must run first; produces the carrier base overlay (the
`*-dynamic.dtbo`) this skill's composite stacks after.
- [`../jetson-init-source/SKILL.md`](../jetson-init-source/SKILL.md) —
produces the overlay tracker + `bsp_sources` repo (with the
`hardware/nvidia/<chip-dir>/` per-sensor DTSI tree) this skill
reads and commits into.
Todos los archivos
11 archivosInstalar jetson-customize-camera
Descarga y descomprime los archivos de habilidades en tu directorio .claude/skills/.
Descargar ZIPClona el repositorio y copia los archivos de la habilidad a tu proyecto.
git clone https://github.com/NVIDIA/skills/tree/main/skills/jetson-customize-camera # Copy SKILL.md to your .claude/skills/ directory
Copiar





Hogar
