單元 6 · Sensor Bring-up 與除錯

HSB/CSI 除錯、決策樹

6.1 Bring-up 四件事

檢查項驗證工具
電源AVDD/DVDD 到位、時序示波器/電表
ClockMCLK 輸出、PLL 鎖定示波器 / dmesg
I2Ci2cdetect(HSB 確認橋接)i2c-tools
MIPI / HSBdmesg 無錯 / Holoscan 收得到資料dmesg / Holoscan

6.2 上電時序

電源穩定MCLKRESET 釋放I2C 可通MIPI / HSB 輸出
HSB 特別注意:感測器資料走乙太網路(25GbE),I2C 也經橋接。先確認「網路連通 + 橋接通」才談感測器 register。

6.3 HSB 除錯重點(三步)

HSB 三步:① 乙太網路連線與頻寬(25GbE)② 感測器端與 host 端格式匹配 ③ I2C 橋接通道。先確認「感測器資料有進 GPU」再談畫質。

6.4 用 dmesg 追線索

除錯指令
dmesg | grep -i -E "sensor|tegra|holoscan|csi|mipi"
ip link show                              # HSB 網路介面

⚠️ Thor 具體 dmesg 訊號以官方文件為準。

6.5 Bring-up 決策樹

「取不到感測器資料」決策樹
1. dmesg 有感測器/tegra probe?
   ├─ error ─→ DTB / 電源
   └─ ok ─┐
2. (HSB) 乙太網路連通?橋接通?
   ├─ 否 ─→ 網路 / 橋接
   └─ 是 ─┐
3. i2cdetect 讀到感測器 ID?
   ├─ 否 ─→ I2C / 位址
   └─ 是 ─┐
4. argus/Holoscan 出圖 → ✅

6.7 深入:上電時序與 clock 驗證

電源穩定MCLK/XCLKRESET 釋放I2C 可通MIPI 輸出
最常見錯誤:RESET 未釋放就下 I2C → register「看似能寫但沒生效」。先確認 GPIO/時序,再碰 register。
dmesg 追線索
dmesg | grep -i -E "ov9281|probe|csi|mipi|v4l2"

6.8 練習:完整 Bring-up 演練

  1. dmesg 確認 probe 成功、讀到 ID。
  2. media-ctl 確認管線。
  3. v4l2-ctl 取到幀。

6.9 深入原理:上電時序的位元/電壓層級細節

Bring-up 失敗九成是「時序」而非「電壓值」。感測器 datasheet 的 power-up sequence 通常長這樣:

DVDD/AVDD 供電等待穩定(~10ms)MCLK 開始RESET 拉高釋放等待 ~1msI2C 可通
檢查項常見數值(依感測器)量測工具
電源穩定到 clock 啟動1–10 ms示波器雙通道
MCLK 頻率24 MHz(常見)示波器頻率計
RESET 低脈衝寬≥ 1 µs示波器
RESET 釋放到 I2C≥ 1 ms邏輯分析儀
最常見錯誤:RESET 未釋放就下 I2C → 感測器「有通電但不回應」,register 寫入無效。這是「能 i2cdetect 到、但讀回全 0」的典型原因。

6.10 Worked Example:完整 Bring-up 五階段

OV9281 標準 Bring-up SOP
# 階段 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
鐵則:每一階段「過」了才進下一階段。I2C 通 ≠ clock 對;clock 對 ≠ MIPI 對。一次驗證一層,別把時間花在「以為都通」上。

6.11 疑難排解:dmesg 訊號對照表

dmesg 徵兆可能原因下一步
i2c transfer errorI2C 不通 / 位址錯 / RESET 未釋放檢查時序與位址
mclk ... not setclock 沒有配置查 DTB clocks 與 clk driver
csi-2 recv timeoutMIPI 訊號/速率不匹配查 lane 數、頻率、連接
no sensor detectedprobe 沒通過查 compatible、供電、ID
HSB link down乙太網路層未通(HSB)檢查網路線/25GbE 設定

6.12 常見錯誤與陷阱

陷阱 1:MCLK 頻率設錯——感測器 datasheet 會指定(如 24 MHz),給錯頻率感測器可能啟動但不合規,造成偶發掉幀。
陷阱 2:RESET 是高電位釋放、低電位 assert——搞反 polarity,感測器永遠在 reset。GPIO 設定先確認 active-low/high。
陷阱 3:HSB 下把「網路通」當成「感測器通」——25GbE link up 只代表實體層通,I2C 橋接與感測器仍要分開驗證。

6.13 練習

  1. 照 6.10 的 SOP 走完一次 bring-up,記錄每階段通過訊號。
  2. 故意延後 RESET 釋放 1 秒,觀察「讀不到 ID」的現象。
  3. 整理你平台的 dmesg 對照表,補上自家感測器的關鍵 log。
看完這單元你應該能說出:
  • Bring-up 四件事。
  • HSB 除錯三步。
  • 照決策樹排解。
  • 「資料進 GPU」驗證。

延伸閱讀

6.14 進階真實情境 Worked Example:HSB 感測器的三階段 Bring-up

場景:Thor T5000 透過 HSB 接一顆 OV5640(5 MP),感測器距離 Thor 3 米,走 25GbE。Bring-up 過程中遇到「乙太網路 link up 但 I2C 橋接不通」的問題。

三階段 Bring-up SOP(HSB 專用)
# 階段 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 不同
設計決策:HSB bring-up 比 CSI 多一層「乙太網路 + 橋接」。標準做法是把原本的 4 件事(電源/clock/I2C/MIPI)擴展成 5 件事,最前面加上「乙太網路 link + 橋接通道」。

6.15 深入原理擴充:Thor 的 clock tree 與 PLL configuration

Thor T5000 的 clock tree 比 Orin 更複雜:MCLK 不是直接由 PLL 產生,而是經過 BPMP(Boot and Power Management Processor) 的 clock driver 分配。BPMP 是一顆獨立的 RISC-V 核心,負責電源管理與時鐘分配。感測器的 MCLK 實際上是 BPMP 從主 PLL 分頻後輸出的。

主 PLL(204 MHz)BPMP clock driverMCLK(24 MHz)感測器
容易忽略的邊界案例:若 BPMP 固件版本與 kernel device tree 不匹配,MCLK 可能被設定成錯誤的頻率(例如 48 MHz 而非 24 MHz)。感測器會啟動但 PLL 鎖定異常,造成「能取流但偶發幀率不穩」。用 dmesg 檢查 BPMP clock driver log,確認 MCLK 輸出頻率與感測器 datasheet 要求一致。

6.16 診斷式疑難排解表

症狀可能原因解決方案
dmesg 顯示 "CSI-2 recv timeout" 但感測器 I2C 通MIPI lane 頻率設定錯誤或 lane 連接不良檢查 DTB 中的 lane 頻率設定;用示波器量測 clock lane 頻率;更換 FPC 連接線
HSB bridge 固件升級後 I2C 不通固件 API 版本不相容 / bridge 設定檔需更新回滾固件版本;或更新 host 端的 bridge 驅動與設定檔
RESET 釋放後 I2C 通但讀回 ID 為 0x00RESET 時序正確但 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 設定

6.17 進階挑戰題

  1. 設計一個自動化 bring-up 腳本:從 dmesg 解析、I2C 掃描、media graph 驗證到取流測試,全自動化執行並輸出 HTML 報告。腳本必須能處理 HSB 與 CSI 兩種路徑。
  2. 分析 BPMP clock tree 對感測器啟動時序的影響:若 MCLK 有 100 µs 的啟動延遲,這對 OV9281 的上電時序有何影響?設計一個 BPMP log 的解析方法來驗證 MCLK timing。
  3. 設計一個長時間穩定性測試(24 小時):Thor + HSB + OV5640,每 10 分鐘記錄感測器溫度、MCLK 頻率、I2C error 計數與掉幀數。畫出四者的時序圖,找出「掉幀」與「溫度」的關聯。

6.18 專案級端到端 Worked Example:雙路徑 Bring-up 專案 — CSI 與 HSB 並行驗證

場景:同一顆感測器模組要在 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 全過
專案要點:雙路徑 bring-up 的最大教訓:CSI 通了不代表 HSB 通。HSB 多了「乙太網路 + 橋接 + Holoscan 解包」三層,每一層都要獨立驗證。此專案完成後,產出的「雙路徑對照表」是量產調校的基礎。

6.19 量測 / 驗證 SOP:Bring-up 五階段復驗

Bring-up SOP(Step 1–5)
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 完成

6.20 平台間對照:Bring-up 流程與工具

面向Thor T5000RPi5Orange PiOrin Nano
供電驗證電表/示波器電表/示波器電表/示波器電表/示波器
DTB overlaydtso + U-Boot/extlinuxconfig.txt dtoverlayDTB patchdtso + extlinux
Clock 管理BPMP clock drivervc4 / 簡單 clock全志 clockBPMP clock driver
HSB 乙太網路層✅ 25GbE 橋接
感測器 probe 訊息dmesg(tegracam)dmesg + libcamera logdmesgdmesg(tegracam)
選擇思考:Bring-up 的「四件事(電源/clock/I2C/資料路徑)」四平台相同。Thor/Orin 多一個 BPMP clock 層,HSB 多一個網路層——但驗證順序與邏輯完全可平移。

6.21 互動式檢核清單

6.18 Register 位元級完整工作流

本單元涉及的關鍵 register,以及「讀→改→寫→驗證」的完整位元級操作序列:

Register位址功能Bit Field 說明
CSI_ERR_COUNTER0x0c0a0020CSI 錯誤計數器bit[15:8]=CRC error count, bit[7:0]=ECC error count
VI_STATUS0x0c800004VI 狀態暫存器bit[0]=streaming, bit[3]=fifo_overflow
讀→改→寫→驗證 完整序列(以 CSI_ERR_COUNTER 為例)
# 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"

6.19 多層疑難排解決策樹

決策樹 1:CSI 錯誤爆量
1. CRC error 持續增加?
   ├─ 物理層:重新拔插排線、更換排線
   ├─ 訊號完整性:降低 lane 速率(修改 DT 的 clock-frequency)
   └─ ESD 事件:sensor reset pin 接 GPIO,加 ESD 恢復邏輯
2. ECC error?
   ├─ Packet header 損壞 → 物理層問題
   └─ 但 CRC OK → 可能是 MIPI 協議層 mismatch
決策樹 2:FIFO overflow / frame drop
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 設定

6.20 量測驗證完整 SOP

Bring-up 完整除錯 SOP:

步驟動作指令/方法預期輸出
Step 1最小配置測試只用 1 lane, 最低 resolution, 1 sensor排除 lane/scale 問題
Step 2I2C 通路驗證`i2cget -y 1 0x60 0x300A w`Chip ID 正確
Step 3Streaming 測試`v4l2-ctl --stream-mmap --stream-count=1`raw 檔非零
Step 4CSI error 監控`watch -n 1 'devmem2 0x0c0a0020 w'`error count = 0
Step 5VI 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` 看 thermalSoC < 85°C

6.21 四平台終極對照

面向Thor T5000RPi5Orange PiOrin 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 + regulatorGPIO onlyGPIO onlyPer-sensor + GMSL
ESD 恢復機制
典型 bring-up 時間2–4 hr30 min1–2 hr1–2 hr

6.22 完整 Bring-up 小 Checklist

針對「Sensor Bring-up 與除錯」主題的完整 bring-up 步驟清單: