CSI-2/HSB、Jetson+Holoscan
Jetson Thor T5000(同平台 T4000)提供三種感測器路徑:
| 路徑 | 說明 | 適用 |
|---|---|---|
| MIPI CSI-2 | 16 lanes,最多 6 顆相機 | 近距離高速 |
| Holoscan Sensor Bridge(HSB) | 感測器經乙太網路(25GbE)進 GPU | 遠距離/多感測器融合 |
| USB 相機 | 即插即用 | 快速原型 |
MIPI CSI-2 由 clock lane(DDR clock)與 data lanes 組成。Thor 的 CSI 介面提供最多 16 lanes,lane 以差動訊號(D-PHY)傳輸,在 clock 的雙沿(rising + falling)各送 1 bit,因此每條 lane 的資料速率是 clock 的兩倍。
每個資料封包包含:Packet Header(資料型態 DT、word count)、Payload(像素資料)、Packet Footer(ECC/CRC)。讀取「hs-freq-range」或 CSI-2 速率時,遇到 CRC error 增加通常代表 訊號完整性 或 lane 數設定錯。
| 參數 | 說明 | 檢查方式 |
|---|---|---|
| lane 數 | 感測器 → CSI 的資料通道數 | DT 設定 / dmesg |
| 每 lane 速率 | Gbps/lane,決定總頻寬 | HSB 設定檔 / 示波器 |
| raw data type | 如 RAW10/RAW12/YUV | v4l2 --list-formats-ext |
TX timeout。# 每幀 raw bits 1280 × 800 × 10 bit = 10,240,000 bit ≈ 1.28 MB/frame # 每秒資料量 1.28 MB × 120 fps = 153.6 MB/s ≈ 1.23 Gbps # 用 4 lanes、每 lane 1 Gbps → 4 Gbps 綽綽有餘 # 對照:16 lanes 全部只給一個感測器 = 浪費;16 lanes 是給多顆 + 高解析用的
1. 感測器離主機 < 30cm 且有現成 CSI 接頭? ├─ 是 → MIPI CSI-2(延遲最低) └─ 否 ─┐ 2. 需要超過 1 顆感測器同步、或部署在移動載具? ├─ 是 → HSB(乙太網路,25GbE,可達數十米) └─ 否 ─┐ 3. 只要快速原型、不要求低延遲/精確同步? └─ 是 → USB 相機(最省事,犧牲效能)
⚠️ HSB 具體接頭數、速率上限以 NVIDIA 官方文件為準。
camera offload engine 是 Thor 把感測器資料「收進來、整理好」的第一站:負責解封包(HSB 的乙太網路封包或 CSI-2 packet)、重新排列成連續 buffer、必要時做 格式轉換,再交給 GPU。它不負責影像品質——品質是 ISP 的事(unit-07 起)。
場景:一台自駕實驗車搭載 Thor T5000,車身前後左右共 6 顆 OV5640(5 MP、RAW10、30 fps),全部走 HSB(25GbE)接入 Thor,Holoscan 管線即時融合成環景。
每顆 OV5640:2592×1944 × 10 bit × 30 fps ≈ 1.50 Gbps 6 顆總計:≈ 9.0 Gbps 25GbE 裸速 25 Gbps → 保留 50% overhead → 可用 ≈ 12.5 Gbps 9.0 < 12.5 → 可行 Holoscan 配置: SensorSourceOp × 6(每顆獨立 channel) PreprocessOp(resize + format 轉換,GPU) FusionOp(六路拼接 / 立體匹配) InferenceOp(物件偵測 / 語義分割) # 設計決策: # 1. 選 HSB 而非 CSI:6 顆感測器分布在車身,走乙太網路省布線、抗干擾 # 2. 每顆獨立 I2C 橋接通道:避免多顆共用 I2C 的 address 衝突風險 # 3. PTP(IEEE 1588)同步六路曝光時間戳:確保車速 60 km/h 時幀間距差 < 0.5 ms
Thor T5000 的多媒體引擎不只是 ISP。它整合了 NVDEC 8th generation(硬體解碼器,支援 H.265/AV1 多流解碼)、NVENC(硬體編碼)、OFI(Optical Flow Engine) 與 ISP。OFI 能在硬體層面輸出每像素光流向量,讓物理 AI 管線在不佔 GPU 的情況下取得運動資訊。
| 症狀 | 可能原因 | 解決方案 |
|---|---|---|
| HSB 有 link up 但 Holoscan 收不到資料 | I2C 橋接通道未建立 / 感測器未啟動輸出 | 用 i2cdetect 確認橋接通道;確認感測器 register 設定正確後重新觸發 streaming |
| 多顆感測器中有一顆偶發掉幀 | 25GbE 頻寬不足或 PCIe bus 競爭 | 降低該感測器 fps;檢查 host 端 buffer queue 深度;用 ethtool 檢查網路 drop 計數 |
| CSI-2 接單顆感測器正常,接兩顆後畫面撕裂 | Lane 數分配錯誤或 DTB overlay 未更新 | 確認每顆感測器的 lane 數設定正確;重新產生 DTB overlay 並驗證 media graph |
| camera offload engine 後畫面時間戳跳號 | offload engine buffer 溢位或 DMA 對齊錯誤 | dmesg 檢查 buffer overflow 警告;確認 DMA stride 與感測器 mode 匹配 |
| USB 相機在 Thor 上比 CSI 慢 3 幀延遲 | USB 匯流排排程 + 驅動層 buffer 佇列 | 改用 CSI 或 HSB 以降低延遲;若必須用 USB,降低解析度以減少 USB transfer 時間 |
這是一個整合全站 16 個單元的旗艦專案。目標:在 Thor T5000 上,把一顆全新的 OV9281 從「沒有驅動」帶到「Holoscan 管線輸出第一張圖」,並完成基礎調校。以里程碑(M0–M6)組織,每個里程碑都有通過標準與對應單元。
M0 環境與目標定義(unit-01) ├─ 選定路徑:CSI(實驗室原型) ├─ 選定軟體堆疊:V4L2 + Argus → Holoscan └─ 通過:頻寬估算 ≤ 50% 可用、堆疊清單齊全 M1 硬體與電源(unit-06) ├─ 供電(AVDD/DVDD)、MCLK 24MHz、RESET GPIO └─ 通過:示波器量測上電時序符合 datasheet M2 驅動與 DTB overlay(unit-04) ├─ 建立 ov9281 的 DT overlay(compatible / reg / clocks / reset-gpios) ├─ 重建並載入 overlay └─ 通過:dmesg 看到 probe 成功、讀到 ID 0x92 M3 取流(unit-05) ├─ v4l2-ctl 取 1 幀 NV12 + 1 幀 RAW └─ 通過:檔案大小符合、media graph link 全啟用 M4 資料驗證(unit-08) ├─ 解包 RAW10、驗證 Bayer order、黑位 └─ 通過:Gr≈Gb、黑位=固定常數 M5 基礎調校(unit-10~14) ├─ AE 收斂、AWB 灰卡、LSC 網格、NR/Sharpen └─ 通過:SNR≥30dB、ΔE<3、四角亮度差<5% M6 回歸與交付(unit-15/16) ├─ 多場景回歸、寫 SOP、進 repo └─ 通過:回歸全過、文件齊全
目的:在「開始任何影像品質工作之前」,先證明平台相機子系統健康。此 SOP 是 M0–M3 的正式化版本,適合每次環境變動後重跑。
Step 1 盤點介面 lspci | grep -i camera / ip link show # CSI/HSB 路徑存在 Step 2 確認工具鏈 which v4l2-ctl media-ctl i2c-tools holoscan # 皆可用 Step 3 掃描感測器 i2cdetect -y <bus> # 0x36 出現 Step 4 讀 ID i2cget -y <bus> 0x36 0x300a # 0x92 Step 5 media graph media-ctl -p -d /dev/media0 # 感測器→CSI→VI→video 全啟用 Step 6 取流 v4l2-ctl -d /dev/video0 --stream-mmap=3 --stream-count=1 --stream-to=f.nv12 Step 7 檔案大小驗證 ls -l f.nv12 # 1280×800 NV12 = 1,536,000 B Step 8 記錄 tee -a bringup_log.txt # 時間戳 + 全部輸出 判讀指標: ✅ 全部通過 → 進入調校(unit-10 起) ⚠️ Step 3–4 失敗 → unit-03/06 ⚠️ Step 5 失敗 → unit-04(DTB/驅動) ⚠️ Step 6–7 失敗 → unit-05(取流/格式)
| 面向 | Thor T5000 | RPi5 | Orange Pi | Orin Nano |
|---|---|---|---|---|
| 感測器路徑 | CSI-2(16 lanes)+ HSB(25GbE) | CSI-2(2×4 lanes) | CSI-2(4 lanes) | CSI-2 / GMSL |
| 軟體堆疊 | V4L2/Argus + Holoscan | libcamera + V4L2 | V4L2(感測器內建 ISP) | V4L2/Argus |
| 多感測器規模 | 6+(16 lanes 全用) | 2(兩組 CSI port) | 1–2 | 4–6(依型號) |
| 遠距感測器 | ✅ HSB(數十米) | ❌ | ❌ | ⚠️ GMSL(串行化) |
| GPU 直連資料 | ✅ Blackwell + GPUDirect | ❌(CPU 導向) | ❌ | ✅ Ampere |
| 典型定位 | 次世代物理 AI | 學習/原型 | 底層 DIY | 工業量產 |
完成本單元後,逐項勾選(- [ ])並實際執行過:
本單元涉及的關鍵 register,以及「讀→改→寫→驗證」的完整位元級操作序列:
| Register | 位址 | 功能 | Bit Field 說明 |
|---|---|---|---|
VI_CFG_CSI_IPCx | 0x0c800000+0x100*n | VI CSI Port 配置 | bit[3:0]=lane數, bit[5:4]=data type |
# Step 1: 讀取目前值 $ devmem2 0x0c800000+0x100*n w # 記錄 current_value # Step 2: 計算新值 $ new_value=$(current_value | 0x0001) # Step 3: 寫入 $ devmem2 0x0c800000+0x100*n w $new_value # Step 4: 驗證讀回值與預期一致 $ devmem2 0x0c800000+0x100*n w $ [ "$(devmem2 0x0c800000+0x100*n w | grep Read)" = "expected" ] && echo "PASS" || echo "FAIL"
1. `dmesg | grep -i csi` 出現 "no device"? ├─ 檢查 device tree overlay 是否載入:`cat /proc/device-tree/soc/csi*/status` │ ├─ "okay" → 驅動問題,查 module 版本 │ └─ "disabled" → DT overlay 未 apply,重跑 sudo ubootOverlayApply └─ DT 正常但仍 no device → 硬體層:MIPI 排線接觸、lane 接線對照表
1. `ip link show` 看 25GbE介面是否 UP?
├─ DOWN → cable/switch 問題;換線或直連測試
└─ UP → ping 感測器 IP
├─ timeout → 防火牆或 VLAN 設定;檢查 `sudo iptables -L`
└─ OK → port 不匹配;確認 Holoscan sensor driver config 的 portThor 相機子系統總驗證 SOP:
| 步驟 | 動作 | 指令/方法 | 預期輸出 |
|---|---|---|---|
| Step 1 | 確認硬件連接 | MIPI 排線、25GbE cable、電源供應 | 排線無鬆動、cable LED 亮 |
| Step 2 | 載入 DT overlay | `sudo ubootOverlayApply` + 重開機 | dmesg 出現 CSI/HSB 初始化訊息 |
| Step 3 | 列出 V4L2 裝置 | `v4l2-ctl --list-devices` | 出現 /dev/video0 以上裝置 |
| Step 4 | 列出支援格式 | `v4l2-ctl -d /dev/video0 --list-formats-ext` | RAW10/RAW12 出現 |
| Step 5 | 取一幀 | `v4l2-ctl -d /dev/video0 --stream-mmap --stream-count=1 --stream-to=frame.raw` | 非零位元組檔案 |
| Step 6 | 目視檢查 | `dd if=frame.raw bs=1 count=100 | xxd` | Header 合理(DT=0x2B for RAW10) |
| Step 7 | HSB 感測器連通測試 | `ping | ping OK、port open |
| Step 8 | GPU 路徑驗證 | 跑 Holoscan sample pipeline 確認 frame 進 GPU | nvdec/nvenc 記憶體有分配 |
| 面向 | Thor T5000 | RPi5 | Orange Pi | Orin Nano |
|---|---|---|---|---|
| 感測器路徑 | CSI-2 + HSB(乙太網路) | CSI-2(2 port) | CSI-2(1 port) | CSI-2 + GMSL |
| 最大 lane 數 | 16 | 4(2×2) | 2 | 4–8 |
| HSB 遠距 | ✅ | ❌ | ❌ | ⚠️ |
| DT overlay 方式 | `ubootOverlayApply` | 自動(dtoverlay=) | bootscript 或 armbianEnv | hardkernel dtb |
| V4L2 工具完整度 | 完整 | 完整 | 部分 | 完整 |
| 支援同步取流 | ✅ | ⚠️ | ❌ | ✅ |
| 典型 bring-up 時間 | 2–4 hr(含 DT overlay) | 30 min | 1–2 hr(DT 手改) | 1–2 hr |
針對「平台相機生態總覽」主題的完整 bring-up 步驟清單: