HSB/CSI 除錯、決策樹
| 檢查項 | 驗證 | 工具 |
|---|---|---|
| 電源 | AVDD/DVDD 到位、時序 | 示波器/電表 |
| Clock | MCLK 輸出、PLL 鎖定 | 示波器 / dmesg |
| I2C | i2cdetect(HSB 確認橋接) | i2c-tools |
| MIPI / HSB | dmesg 無錯 / Holoscan 收得到資料 | dmesg / Holoscan |
dmesg | grep -i -E "sensor|tegra|holoscan|csi|mipi"
ip link show # HSB 網路介面⚠️ Thor 具體 dmesg 訊號以官方文件為準。
1. dmesg 有感測器/tegra probe? ├─ error ─→ DTB / 電源 └─ ok ─┐ 2. (HSB) 乙太網路連通?橋接通? ├─ 否 ─→ 網路 / 橋接 └─ 是 ─┐ 3. i2cdetect 讀到感測器 ID? ├─ 否 ─→ I2C / 位址 └─ 是 ─┐ 4. argus/Holoscan 出圖 → ✅
dmesg | grep -i -E "ov9281|probe|csi|mipi|v4l2"
Bring-up 失敗九成是「時序」而非「電壓值」。感測器 datasheet 的 power-up sequence 通常長這樣:
| 檢查項 | 常見數值(依感測器) | 量測工具 |
|---|---|---|
| 電源穩定到 clock 啟動 | 1–10 ms | 示波器雙通道 |
| MCLK 頻率 | 24 MHz(常見) | 示波器頻率計 |
| RESET 低脈衝寬 | ≥ 1 µs | 示波器 |
| RESET 釋放到 I2C | ≥ 1 ms | 邏輯分析儀 |
# 階段 1:電源 sudo cat /sys/kernel/debug/gpio | grep -i reset # 確認 reset GPIO 定義 # 階段 2:clock(確認 MCLK 有輸出 24MHz) sudo cat /sys/kernel/debug/clk/clk_summary | grep -i mclk # 階段 3:I2C(先掃描) sudo i2cdetect -y <bus> # 0x36 出現 # 階段 4:讀 ID 驗證 sudo i2cget -y <bus> 0x36 0x300a # 0x92 # 階段 5:media graph + 取流(unit-05) media-ctl -p -d /dev/media0 | grep ov9281
| dmesg 徵兆 | 可能原因 | 下一步 |
|---|---|---|
i2c transfer error | I2C 不通 / 位址錯 / RESET 未釋放 | 檢查時序與位址 |
mclk ... not set | clock 沒有配置 | 查 DTB clocks 與 clk driver |
csi-2 recv timeout | MIPI 訊號/速率不匹配 | 查 lane 數、頻率、連接 |
no sensor detected | probe 沒通過 | 查 compatible、供電、ID |
HSB link down | 乙太網路層未通(HSB) | 檢查網路線/25GbE 設定 |
場景:Thor T5000 透過 HSB 接一顆 OV5640(5 MP),感測器距離 Thor 3 米,走 25GbE。Bring-up 過程中遇到「乙太網路 link up 但 I2C 橋接不通」的問題。
# 階段 1:乙太網路實體層 ip link show eth0 # 確認 link up ethtool eth0 | grep Speed # 25000Mb/s ping -c 5 <sensor-bridge-ip> # 橋接器 IP 可達 # 階段 2:I2C 橋接通道 i2cdetect -y <hsb-bridge-bus> # 0x36 出現 = I2C 橋接通 i2cget -y <hsb-bridge-bus> 0x36 0x300a # 0x92 = OV9281 ID # 若階段 2 失敗:檢查 HSB bridge 固件版本、I2C 橋接 channel 設定 # 階段 3:感測器資料流 # 確認感測器 init table 已透過 I2C 橋接寫入 # 確認 Holoscan channel 設定與感測器輸出格式一致 dmesg | grep -i "hsb\|sensor\|holoscan" # 預期:看到 "sensor detected" 或 Holoscan channel connected # 關鍵設計決策: # 1. HSB bring-up 必須「網路 → I2C → 資料流」三階段逐步驗證 # 2. 每階段通過後才進下一階段,避免在 I2C 不通時就開始調 ISP # 3. HSB 的 I2C 橋接有獨立的 bus 編號——與 CSI 的本地 I2C bus 不同
Thor T5000 的 clock tree 比 Orin 更複雜:MCLK 不是直接由 PLL 產生,而是經過 BPMP(Boot and Power Management Processor) 的 clock driver 分配。BPMP 是一顆獨立的 RISC-V 核心,負責電源管理與時鐘分配。感測器的 MCLK 實際上是 BPMP 從主 PLL 分頻後輸出的。
| 症狀 | 可能原因 | 解決方案 |
|---|---|---|
| dmesg 顯示 "CSI-2 recv timeout" 但感測器 I2C 通 | MIPI lane 頻率設定錯誤或 lane 連接不良 | 檢查 DTB 中的 lane 頻率設定;用示波器量測 clock lane 頻率;更換 FPC 連接線 |
| HSB bridge 固件升級後 I2C 不通 | 固件 API 版本不相容 / bridge 設定檔需更新 | 回滾固件版本;或更新 host 端的 bridge 驅動與設定檔 |
| RESET 釋放後 I2C 通但讀回 ID 為 0x00 | RESET 時序正確但 MCLK 未啟動(BPMP clock 設定錯) | dmesg 檢查 clock driver log;確認 BPMP 固件版本與 DTB clock 設定匹配 |
| bring-up 後取流正常但 10 分鐘後掉幀 | 感測器過熱導致 PLL 失鎖 | 量測感測器表面溫度;加入散熱措施;降低 fps 或加入溫度保護機制 |
| dmesg 無錯誤但 argus_camera 無輸出 | Argus 的 sensor mode 與實際感測器 mode 不匹配 | 用 argus_camera --list-cameras 檢查支援的 mode;確認 DTB mode 設定 |
場景:同一顆感測器模組要在 Thor 上同時支援 CSI(近距離、實驗室)與 HSB(遠距、量產)。專案目標:兩條路徑各自走完 bring-up,並證明「同一感測器、兩路徑、同一輸出」。
M1 硬體安裝(CSI) ├─ 電源、MCLK、RESET、I2C、CSI 線 └─ 通過:i2cdetect 出現 0x36 M2 CSI bring-up ├─ dmesg 確認 probe → media graph → 取流 └─ 通過:CSI 路徑出圖 M3 硬體安裝(HSB) ├─ 乙太網路(25GbE)連到感測器橋接器 ├─ ip link up、ethtool Speed=25000 └─ 通過:ping 通、速率正確 M4 HSB I2C 橋接 ├─ 找橋接 bus、i2cdetect、讀 ID └─ 通過:0x36 在橋接 bus 出現 M5 HSB 取流 ├─ Holoscan channel 設定 → SensorSourceOp └─ 通過:Holoscan 出圖 M6 一致性驗證 ├─ 同場景(固定光照)分別取 RAW ├─ 比較黑位、Bayer、histogram └─ 通過:兩路 RAW 內容一致(除了 HSB header offset) M7 環境變動復驗 └─ 通過:重插線材/換電源後重跑 M2/M5 全過
Step 1 電源 電表量 AVDD/DVDD;示波器查上電時序(若有) Step 2 Clock dmesg 確認 MCLK 設定;cat /sys/kernel/debug/clk/clk_summary | grep mclk Step 3 I2C i2cdetect -y <bus> → i2cget 0x300a → 0x92 Step 4 資料路徑 CSI:media-ctl + v4l2-ctl 取幀 HSB:ethtool + i2cdetect(橋接bus) + Holoscan 出圖 Step 5 記錄 每階段 log 存檔 + dmesg 收集 判讀指標(dmesg): i2c transfer error → I2C/位址/RESET mclk ... not set → clock/DTB csi-2 recv timeout → lane/速率/接線 HSB link down → 網路層 以上全無 + 出圖 → bring-up 完成
| 面向 | Thor T5000 | RPi5 | Orange Pi | Orin Nano |
|---|---|---|---|---|
| 供電驗證 | 電表/示波器 | 電表/示波器 | 電表/示波器 | 電表/示波器 |
| DTB overlay | dtso + U-Boot/extlinux | config.txt dtoverlay | DTB patch | dtso + extlinux |
| Clock 管理 | BPMP clock driver | vc4 / 簡單 clock | 全志 clock | BPMP clock driver |
| HSB 乙太網路層 | ✅ 25GbE 橋接 | ❌ | ❌ | ❌ |
| 感測器 probe 訊息 | dmesg(tegracam) | dmesg + libcamera log | dmesg | dmesg(tegracam) |
本單元涉及的關鍵 register,以及「讀→改→寫→驗證」的完整位元級操作序列:
| Register | 位址 | 功能 | Bit Field 說明 |
|---|---|---|---|
CSI_ERR_COUNTER | 0x0c0a0020 | CSI 錯誤計數器 | bit[15:8]=CRC error count, bit[7:0]=ECC error count |
VI_STATUS | 0x0c800004 | VI 狀態暫存器 | bit[0]=streaming, bit[3]=fifo_overflow |
# Step 1: 讀取目前值 $ devmem2 0x0c0a0020 w # 記錄 current_value # Step 2: 計算新值(設定 bit[0]=1) $ new_value=$((current_value | 0x0001)) # Step 3: 寫入 $ devmem2 0x0c0a0020 w $new_value # Step 4: 驗證 $ devmem2 0x0c0a0020 w # 確認 bit[0] = 1,其餘 bit 不變 # Step 5: 進階 — bitmask 操作 $ read_val=$(devmem2 0x0c0a0020 w | grep "Read" | awk '{print $NF}') $ mask=0x0001 $ expected=0x0001 $ [ $(($read_val & $mask)) -eq $expected ] && echo "PASS" || echo "FAIL: bit[0] not set"
1. CRC error 持續增加? ├─ 物理層:重新拔插排線、更換排線 ├─ 訊號完整性:降低 lane 速率(修改 DT 的 clock-frequency) └─ ESD 事件:sensor reset pin 接 GPIO,加 ESD 恢復邏輯 2. ECC error? ├─ Packet header 損壞 → 物理層問題 └─ 但 CRC OK → 可能是 MIPI 協議層 mismatch
1. VI_STATUS bit[3] = 1(overflow)? ├─ ISP 處理太慢 → 減少 resolution 或關閉不需要的 ISP block └─ DDR 帶寬不足 → 檢查 `cat /sys/kernel/debug/bpmp/debug/clk/vi/rate` 2. Frame drop 但無 overflow? ├─ 軟體 queue 滿了 → 增加 V4L2 buffer 數 └─ Sensor 端 frame rate 不穩 → 檢查 sensor PLL 設定
Bring-up 完整除錯 SOP:
| 步驟 | 動作 | 指令/方法 | 預期輸出 |
|---|---|---|---|
| Step 1 | 最小配置測試 | 只用 1 lane, 最低 resolution, 1 sensor | 排除 lane/scale 問題 |
| Step 2 | I2C 通路驗證 | `i2cget -y 1 0x60 0x300A w` | Chip ID 正確 |
| Step 3 | Streaming 測試 | `v4l2-ctl --stream-mmap --stream-count=1` | raw 檔非零 |
| Step 4 | CSI error 監控 | `watch -n 1 'devmem2 0x0c0a0020 w'` | error count = 0 |
| Step 5 | VI overflow 監控 | `devmem2 0x0c800004 w` | bit[3] = 0 |
| Step 6 | 逐步升級 | 2 lane → 4 lane → 更高 resolution | 每步確認無 error |
| Step 7 | 壓力測試 | `v4l2-ctl --stream-mmap --stream-count=1000` | 0 frame drop |
| Step 8 | 溫度監控 | `tegrastats` 看 thermal | SoC < 85°C |
| 面向 | Thor T5000 | RPi5 | Orange Pi | Orin Nano |
|---|---|---|---|---|
| CSI error 監控 | `devmem2` + register dump | `dmesg | grep csi` | `dmesg | grep csi` | `devmem2` + register dump |
| I2C 除錯工具 | `i2cget/set` + 腳本 | `i2cget/set` | `i2cget/set` | `i2cget/set` |
| Frame drop 偵測 | V4L2 sequence number | `libcamera-hello --frames 100` | `v4l2-ctl stream count` | V4L2 sequence number |
| Power 控制粒度 | Per-sensor GPIO + regulator | GPIO only | GPIO only | Per-sensor + GMSL |
| ESD 恢復機制 | ✅ | ❌ | ❌ | ✅ |
| 典型 bring-up 時間 | 2–4 hr | 30 min | 1–2 hr | 1–2 hr |
針對「Sensor Bring-up 與除錯」主題的完整 bring-up 步驟清單: