jetson-customize-camera
NVIDIA/skills
Habilite os sensores de câmera MIPI/GMSL em uma placa de suporte personalizada do Jetson Thor ou Orin, gerando uma sobreposição do kernel-DT a partir do DTSI do sensor incluído na árvore do código-fonte.
...Expandir tudoPersonalizar a câmera (configuração inicial do sensor CSI / MIPI / GMSL)
Visão geral
O Tegra264 (Thor) e o Tegra234 (Orin) expõem um único controlador tegra-capture-vi
com interface NVCSI e um conjunto fixo de portas CSI. A
configuração da câmera é:
- Seleção do sensor — escolhido a partir do conjunto de referências
.dtsique a NVIDIA fornece no código-fonte para a plataforma ativa. - Verificação de compatibilidade da placa-mãe + módulo — verificada em relação ao Guia de Desenvolvimento de Câmeras, Guia de Adaptação §Câmera, esquema da placa-mãe, TRM do módulo e mapa de pinos da placa-mãe.
- Fiação — derivada do
*.dtsi do `tegrana árvore do código-fonte, quando existir (o DTSI É a fonte de referência definitiva para a fiação); capturada por sensor a partir do usuário quando o sensor for personalizado.-camera- ` - Sobreposição do Kernel-DT — expanda com cpp o DTSI da árvore de código-fonte, extraia seu
corpo
fragment@Ne acrescente ao arquivo de sobreposição personalizado composto.dtspara o alvo ativo (conforme../../references/bsp-customization-kernel-dtb.md), verifique a sobreposição composta comfdtoverlay.O /jetson-build-sourcecompila a sobreposição composta e é responsável pelo registroOVERLAY_DTB_FILE+=na configuração da plataforma.
Agente, não orientado por tabela — a lista de sensores é construída em tempo de execução por meio da
inclusão de dtbos por sensor na árvore. Sem dicionário _THOR_CAMERAS, sem
questions.json, sem renderizador Python no caminho da pergunta.
Sem edição de ODMDATA — as câmeras não consomem canais UPHY (o CSI é um pool PHY separado). A skill emite apenas uma sobreposição de kernel-DT; a linha ODMDATA na configuração da operadora não é alterada por esta skill.
A saída é um único commit:
- Bloco
de fragmentode câmera@N(maiso nome do cabeçalho do Jetsonna raiz do composto, caso ainda não esteja presente) anexado à sobreposição personalizada composta.dtsconforme../../references/bsp-customization-kernel-dtb.md→ submetido ao repositóriobsp_sources/hardware.O /jetson-build-sourcecompila o composto para.dtboe é responsável por seu Makefile e registro no flash-conf.
Quando invocar
- O usuário diz “ativar câmera”, “configurar CSI”, “conectar um sensor Hawk /
Owl / IMX”, “câmera MIPI”, “câmera GMSL” ou solicita ativar
o tegra-capture-vi/ NVCSI em uma placa portadora personalizada. - O flash inicializa, mas
o v4l2-ctl --list-devicesnão mostra nenhum canaldo tegra-capture-vi, OU a enumeração de sensores em uma placa filha nova precisa ser confirmada. - Um sensor já estava habilitado e o usuário deseja adicionar outro (ativação de múltiplos sensores).
Pré-requisitos:
- Perfil ativo com os blocos
reference_devkit:+custom_carrier: existe (/Linux_for_Tegra/.git /jetson-init-source).O /jetson-derive-carrierfoi executado — o fork da configuração flash da carrier está no rastreador de overlay.existe e contém os arquivos/bsp_sources/hardware/nvidia/ /nv-public/overlay/ .dtsipor sensor na árvore (originários da extração do arquivo do Branch Ado /jetson-init-source).contém os cabeçalhos de macro necessários para o C++ (pode ser necessário executar/bsp_sources/kernel/kernel-noble/include/dt-bindings/ o source_sync.shse o Branch B tiver sido usado — consulte a Etapa 5a.i abaixo).- Documentos de referência registrados ou fornecidos no prompt:
Guia de Desenvolvimento da Câmera (no espelho
bsp_developer_guideou em caminho separado), Guia de Adaptação §Câmera, esquema da placa-portadora, TRM do SoC, Guia de Projeto do Módulo. dtc,cpp,fdtoverlayno PATH.
Procedimento
O procedimento detalhado passo a passo (Etapas 1–7, com todas as tabelas, blocos de código
e portas lógicas) está em
references/procedure.md. Resumo:
- Etapa 1 — Identifique o alvo ativo + abra os documentos de referência oficiais.
- Etapa 2 — Enumerar os sensores suportados por meio de busca global nos dtbos de câmera por plataforma na árvore de código-fonte; classificar como DPHY direto / GMSL / personalizado. Nunca invente sensores.
- Etapa 3 / 3a — Verifique o suporte da operadora e do módulo em relação ao DTSI, Guia de Desenvolvimento de Câmera, Guia de Adaptação §Câmera, TRM do SoC, Guia de Projeto de Módulo, esquema e mapa de pinos da operadora. Gere a tabela de fiação PRIMEIRO e, em seguida, acione o gate de confirmação ou personalização.
- Etapa 4 (apenas no caminho personalizado) — Questões de fiação por sensor agrupadas preenchidas automaticamente a partir do mapa de pinos da operadora.
- Etapa 5 — Acrescente exatamente UM fragmento
/* custom-bsp: camera:ao arquivo*/ .dtsde sobreposição personalizada composta (consulte../../references/bsp-customization-kernel-dtb.md). O caminho de clonagem expande via C++ o DTSI na árvore; o caminho personalizado une as respostas da Etapa 4 e as tabelas de modo no próprio local. Defina de forma idempotenteo `jetson-header-name`na raiz composta. Verifique com`dtc`+`fdtoverlay`(porta de pré-compilação de fragmento único; porta de exclusividade de árvore profunda pós-compilação). Confirme por meio da porta de visualização da mensagem de confirmação do fluxo de trabalho. - Etapa 6 — Verifique os SFIOs de pinos CAM auxiliares (
cam_i2c_*,, GPIOs de reset/PWDN/PWR_EN) por meio do_clk de extperiph pin_verifier.py; encaminhe as incompatibilidades para/jetson-customize-pinmux. - Etapa 7 — Grave de forma atômica o JSON de estado de execução no
e exiba o título; em seguida, conduza a cadeia de próximas etapas a jusante por meio de solicitações sequenciais/target-platform/ .jetson-customize-camera.json do tipo AskUserQuestion,conformereferences/procedure.mdPasso 7. A cadeia é um portal de fluxo de trabalho documentado, não uma pergunta de esclarecimento — o modo automático NÃO a isenta. Nunca substitua as solicitações por uma linha impressa do tipo “Próximo passo: …”.
Armadilhas
- Armadilha de fragmentos duplos. Contribua com exatamente UM
fragmentomarcado pela câmera@Npara a composição. Um segundo fragmento que contenha substituições de status aciona a fusão profunda do dtc → subárvores irmãs duplicadas (por exemplo, doistca9546@70) → a primeira correspondência em tempo de execução descarta a árvore profunda fornecida pelo dtsi → a câmera silenciosamente não enumera. Aplique o portão apenas no marcador desta habilidade (Etapa 5c). - A raiz do composto
compatívelpertence globalmente, não a esta habilidade. Não amplie a partir de nenhum dtbo por sensor dentro da árvoreque seja compatível(restrito ao SKU do devkit). Corrija a raiz do composto, se necessário. jetson-header-namede qualquer dtbo por sensor na árvore. Corrigido, independente da operadora; leia uma vez, cole na raiz dos metadados.- NÃO acrescente também o dtbo por sensor da árvore de código ao
OVERLAY_DTB_FILE. Registrar tanto sua sobreposição renderizada quanto o dtbo da árvore de códigodo Tegragera uma ligação de subdispositivo fantasma que bloqueia a enumeração da câmera.-p3971-camera- -overlay.dtbo - A sobreposição stub é uma armadilha conhecida. Submeter
tegra-capture-vi { status="okay"; num-channels=sem o corpo de ports / sensor / nvcsi bloqueia a câmera (; } falha na inicialização de todos os canais). Inserir o corpo COMPLETO do sensor via cpp + dtc. - As tabelas de modo do sensor devem ser inseridas, nunca criadas manualmente.
mode,sensor_modes,pixel_phase— copie literalmente do DTSI mais próximo na árvore de código. camera_common_regulator_get (null) ERR: -EINVAL= faltam as stringsavdd-reg/iovdd-reg/dvdd-reg— insira o corpo COMPLETO do sensor; os trilhos sempre ativos recorrem ao regulador fictício.- Referências externas
a rótulosdevem existir em__symbols__do DTB base. Usetarget-path = "/tegra-capture-vi"quando o rótulo estiver ausente; caso contrário,fdtoverlayretorna um valor diferente de zero comFDT_ERR_NOTFOUND. - Falha
no cppemdt-bindings/gpio/gpio.h: Arquivo inexistente= a árvore de código-fonte L4T não está preparada. Execute novamente/jetson-init-source(oscript source_sync.shdo Ramo B busca os cabeçalhos). Nunca invente a expansão da macro. - Sem edição do ODMDATA, sem edição da configuração do flash. A câmera não consome
pistas UPHY. O
ODMDATA="..."da configuração do carrier permanece inalterado.OVERLAY_DTB_FILE+=pertence à etapa/jetson-build-source5.0a — esta tarefa nunca altera a configuração de flash do carrier. - Não altere o BSP upstream em
. Todas as alterações são feitas em(rastreador de overlay) e/Linux_for_Tegra/ (/bsp_sources/ ficheiros .dtsde overlay) seguindo o padrão de commit “pristine + personalização”.
Referências
references/procedure.md— procedimento completo passo a passo das etapas 1 a 7 (extraído deste SKILL.md).references/csi-dt-bindings.md— notas de referência sobre ligações DT para CSI / nvcsi / vi.references/overlay-template.md— orientações sobre a forma da sobreposição com raiz de metadados + corpo clonado.references/camera-overlay-templates/— modelos iniciais.dts.tmpl:dphy-direct.dts.tmpl,gmsl-serdes.dts.tmpl.../../scripts/pin_verifier.py— verificador de pinos HSIO compartilhado (Etapa 6).../../references/platform_template.yaml—documentos:bloco utilizado na Etapa 1.../../context/bsp-customization-workflow.md— protocolo de edição de sobreposição.../jetson-customize-pinmux/SKILL.md— skill irmã autoinvocada pela Etapa 6 para corrigir incompatibilidades de pinos HSIO com SFIO (CAM I²C, MCLK, GPIOs de reset).../jetson-derive-carrier/SKILL.md— deve ser executada primeiro; produz a sobreposição base da portadora (o*-dynamic.dtbo) na qual as pilhas compostas desta habilidade são empilhadas posteriormente.../jetson-init-source/SKILL.md— gera o rastreador de overlay + o repositóriobsp_sources(com a árvore DTSI por sensorem hardware/nvidia/) que esta skill lê e no qual faz commits.
---
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 os arquivos
11 arquivosInstalar jetson-customize-camera
Baixe e descompacte os arquivos de habilidades no diretório .claude/skills/.
Baixar ZIPClone o repositório e copie os arquivos da habilidade para o seu projeto.
git clone https://github.com/NVIDIA/skills/tree/main/skills/jetson-customize-camera # Copy SKILL.md to your .claude/skills/ directory
Copiar





Lar
