OmniVision OC0TC1B-RAVA 400×400 黑白 Global Shutter CameraCubeChip。如果要在 Qualcomm AR1 上做 bringup,我会按“先控制通,再 MIPI 通,再 Camera Framework 通”的顺序做,别一上来就陷进 CamX XML。
先看这个 sensor 的关键特性:它支持 400×400,10-bit 下最高 240 fps;支持 1-lane D-PHY 或 1-trio C-PHY,D-PHY 最高 1 Gbps/lane;输出主要是 RAW8/RAW10,文档另外列出了 DCG 下 RAW12/14。
1. 先把硬件接口确认清楚
最基本连接应该是:
OC0TC1B Qualcomm AR1
------------------------------------------------
AVDD -----------------> 2.8 V
DVDD -----------------> 1.1 V (D-PHY)
1.0 V (C-PHY)
XVCLK -----------------> Camera MCLK
SCL -----------------> Camera I2C/SCCB SCL
SDA -----------------> Camera I2C/SCCB SDA
XSHUTDN <-------------- GPIO
MCP/MCN --------------> CSI CLK +/- [D-PHY]
MDP/MDN --------------> CSI DATA0 +/- [D-PHY]
文档定义 MCP/MCN 是 D-PHY clock pair,MDP/MDN 是 data pair;在 C-PHY 模式下,这几个 pin 会重新组成 trio。
第一次 bringup 我建议优先 D-PHY。
因为:
1-lane D-PHY
+
RAW10
+
400×400
对 AR1 来说带宽完全不是问题,而且调试思路比 C-PHY 清楚。
文档给出的典型规格是 D-PHY 1 Gbps/lane 或 C-PHY 1 Gsps/trio。
这里有个小地方要特别注意:datasheet 的 key specification 说 DVDD:C-PHY 1.0 V,D-PHY 1.1 V;而 reference schematic 文字写的是 DVDD 1.1 V,显然对应默认 D-PHY 使用方式。所以你决定 PHY mode 以后,要先和硬件确认 DVDD,不能随便切 C-PHY。
2. 第一阶段根本不要管 Camera Framework
你的第一个目标不是:
Camera App 出图
而应该只是:
AR1
↓
Power ON
↓
MCLK
↓
Reset
↓
I2C/SCCB
↓
能读 Sensor ID
也就是把它当普通 I2C 外设。
这个 sensor 的控制接口是 SCCB,本质上可以按 I2C 方式访问:
16-bit register address
8-bit register data
文档明确给了这个格式。
3. 先确定 I2C 地址
这个 Sensor 比普通 OV sensor 特殊一点,它的地址由:
STROBE/SID pin
上电时电压决定。
datasheet 给的是 8-bit SCCB address:
SID 0~0.7V write 0x6C
SID 0.7~1.4V write 0xC0
SID 1.4~2.1V write 0x20
SID 2.1~2.8V write 0x6A
Linux / Qualcomm DTS 一般使用 7-bit I2C 地址,因此相应就是:
0x6C >> 1 = 0x36
0xC0 >> 1 = 0x60
0x20 >> 1 = 0x10
0x6A >> 1 = 0x35
例如如果硬件把 SID 拉低:
reg = <0x36>;
这点很容易踩坑——datasheet 写 0x6C,而驱动里通常写 0x36。
4. Power Sequence 非常重要
这个 sensor 的上电不是简单“电源打开以后读 I2C”。
文档要求:
AVDD
↓
DVDD
↓
XVCLK active
↓
XSHUTDN release
↓
等待
↓
SCCB
尤其有几个明确条件:
XSHUTDN rising → ready >= 5 ms
第一次 SCCB transaction 前
XVCLK 至少已经跑 8192 cycles
PLL lock ≈ 0.2 ms
另外 XSHUTDN 是:
active LOW
硬复位至少保持:
>= 2 ms
所以 AR1 上的 power sequence 大概应该是:
regulator_enable(AVDD);
regulator_enable(DVDD);
enable MCLK;
XSHUTDN = 0;
delay >= 2 ms;
XSHUTDN = 1;
delay >= 5 ms;
read sensor ID;
实际 Qualcomm Camera Power Sequence 一般会通过 sensor XML / power setting 描述,而不是你手写这些 C 代码,但逻辑就是这个。
5. 第二阶段:只读 Sensor ID
这一步非常关键。
这个 Sensor 的 ID 寄存器至少有:
0x300A = 0xC7
0x300B = 0x54
0x300C = 0x43 // sub version
datasheet 明确定义 0x300A/0x300B 为 chip ID。
所以第一次调试的目标就是:
AR1
↓
I2C read
↓
0x300A -> C7
0x300B -> 54
得到:
chip_id = 0xC754
一旦这一步成功:
供电 + reset + MCLK + I2C + pinmux 基本已经全部验证。
这时才值得往 CSI 继续。
6. 第三阶段:让 Sensor 自己 Stream
这个 Sensor 很标准:
0x0100 = 0
是:
software standby
而:
0x0100 = 1
就是:
streaming
因此初始化过程本质上:
power on
↓
read ID
↓
0x0100 = 0
↓
写 OmniVision mode register table
↓
0x0100 = 1
↓
Sensor 开始发 MIPI
不过这里有个重要现实问题:
datasheet ≠ 完整 bringup register table
这份 datasheet 给你的是:
寄存器定义
但真正量产 Camera bringup 通常还需要 OmniVision 给的:
recommended register setting
mode table
例如:
400x400 RAW10 30fps
400x400 RAW10 120fps
400x400 RAW10 240fps
每一种都会是一长串:
0x030x PLL
0x380x timing
0x430x format
0x480x MIPI
...
你不应该自己根据 167 页 register table 猜出一套初始化值。
通常应该向 sensor vendor/FAE 拿:
OC0TC1B 400x400 RAW10 DPHY xxxMbps register setting
这才是 bringup 的核心输入之一。
7. AR1 端 CSI 配置
如果第一版选:
400x400
RAW10
1 Lane D-PHY
那么 AR1 端要配置类似:
Sensor:
400 x 400
RAW10
1 lane
D-PHY
↓
CSIPHY:
lane 0
D-PHY
matching settle / lane rate
↓
CSID:
CSI-2 DT = RAW10
VC = 0
↓
IFE / Camera pipeline
这里 AR1 端具体 XML 字段名要以你现有 Qualcomm BSP 为准,我不建议凭空写某个字段名,因为不同 CamX release 差别很大。
最有效的方法其实是:
找 AR1 上已经工作的一个 OmniVision RAW sensor,当模板复制。
例如:
已有 OV sensor
↓
复制 sensor XML
↓
换:
I2C address
chip ID
power sequence
resolution
lane number
RAW format
register table
MIPI rate
这比从 0 创建 Camera sensor 配置快很多。
8. MIPI 调试一定分层
你不要第一次就:
Camera App
↓
没图
↓
不知道哪里错
应该这样查。
① I2C ID
↓
② Sensor 0x0100 = 1
↓
③ 示波器确认 MIPI lane 有高速信号
↓
④ CSIPHY 是否 lock
↓
⑤ CSID 是否收到 SOF
↓
⑥ 是否有 CRC/ECC error
↓
⑦ IFE 是否收到 frame
↓
⑧ Camera App 出图
这个层次特别重要。
如果:
I2C OK
MIPI 没波形
那问题基本在:
Sensor init table
PLL
0x0100
MIPI PHY configuration
而不是 CamX。
如果:
Sensor MIPI 有波形
CSID 没 SOF
才重点看:
lane mapping
D-PHY/C-PHY mode
lane rate
settle
VC/DT
9. 这个 Sensor 有一个很好用的 Bringup 手段
datasheet 里甚至有:
0x48C0
Bit[0] = color_bar_test_en
也就是 MIPI color bar test。
这个对 Bringup 特别有价值。
你可以先:
真实像素
X
Sensor内部 Color Bar
↓
MIPI
↓
AR1 CSI
↓
出图
这样先把:
Sensor MIPI TX
+
PCB MIPI
+
AR1 CSIPHY
+
CSID
+
Camera pipeline
验证掉。
如果 Color Bar 能出,而真实 image 不正常:
问题往 Sensor analog / exposure / timing / ISP 方向找
如果 Color Bar 都不出:
优先查 MIPI / CSI 配置
这个调试方法非常实用。
我会实际这么做
如果明天让我拿这个 OC0TC1B 在 AR1 上 Bringup,我不会先写一大堆东西,而是:
Day 1
硬件确认
↓
AVDD / DVDD
MCLK
XSHUTDN
I2C
MIPI lane
↓
拿 vendor register table
然后:
Day 2
复制一个现有 OV sensor 配置
↓
Power Sequence
↓
I2C addr = 0x36(假设 SID low)
↓
读 0x300A / 0x300B
↓
看到 C7 54
然后:
Day 3
加入 400×400 RAW10 register table
↓
0x0100 = 1
↓
检查 MIPI
↓
检查 CSIPHY/CSID
↓
Color Bar
↓
真实图像
所以对 AR1 BSP 工程师来说,这个 sensor 的 bringup 核心其实就是:
硬件连线
↓
Power Sequence
↓
I2C ID
↓
Sensor Register Table
↓
MIPI D-PHY
↓
CSIPHY / CSID
↓
RAW10
↓
CamX
真正比较可能卡你的地方,我认为不是写 Linux driver,而是 OmniVision mode register table + Qualcomm CamX sensor XML + MIPI lane/clock 配置三者要完全匹配。
如果你愿意,我下一步可以直接基于你这份 OC0TC1B datasheet,按 AR1 Camera Sensor XML 的实际结构,给你列出“这个 sensor 需要填哪些字段、每个字段应该从 datasheet 哪一页拿”,这样就更接近实际 bringup 了。
很好,这一步其实就是 Qualcomm Camera Bringup 最核心的工作。
对于 AR1(和大部分高通平台)来说,Sensor Bringup 需要填写的内容其实都来自 Datasheet + Vendor Register Setting。
我按你这个 OC0TC1B 来举例。
一、AR1 Camera架构
先建立整体概念:
OC0TC1B
│
I2C/SCCB
│
Sensor Driver
MIPI CSI
│
CSIPHY
│
CSID
│
IFE
│
CamX
│
Camera HAL
│
App
你真正需要改的地方通常是:
vendor/
├─ sensor driver
├─ sensor xml
├─ chromatix
├─ tuning
└─ camera config
二、Sensor XML需要什么
一般类似:
<sensor>
<slaveInfo>
...
</slaveInfo>
<powerSequence>
...
</powerSequence>
<resolutionInfo>
...
</resolutionInfo>
</sensor>
三、Slave Info
这一部分直接来自 Datasheet。
I2C地址
datasheet:
SID low
Write Address = 0x6C
Read Address = 0x6D
换成Linux:
0x6C >> 1
= 0x36
所以:
<sensorSlaveAddress>
0x36
</sensorSlaveAddress>
Sensor ID
datasheet:
0x300A = 0xC7
0x300B = 0x54
因此:
<sensorIdRegAddr>
0x300A
</sensorIdRegAddr>
<sensorId>
0xC754
</sensorId>
四、Power Sequence
这是新手最容易错的。
datasheet给了:
AVDD
↓
DVDD
↓
XVCLK
↓
XSHUTDN Release
↓
5ms
↓
SCCB
所以Power Sequence大概:
VANA ON
VDIG ON
MCLK ON
RESET LOW
Delay 2ms
RESET HIGH
Delay 5ms
五、Clock配置
datasheet:
XVCLK
6~27MHz
通常:
MCLK = 24MHz
最常见。
六、MIPI配置
这里是Bringup重灾区。
Datasheet:
1 Lane DPHY
or
1 Trio CPHY
建议第一版:
DPHY
别碰CPHY。
所以:
lane_num = 1
phy_mode = DPHY
七、Pixel Format
Datasheet:
RAW8
RAW10
推荐:
RAW10
对应:
CSI_DT_RAW10
八、Resolution配置
Datasheet:
400 x 400
所以:
width = 400
height = 400
九、MIPI速率
Datasheet:
1Gbps/lane max
但实际第一版:
200Mbps
300Mbps
都够了。
因为:
400x400 RAW10
数据量极小。
十、Register Setting
这是最关键部分。
Camera Driver一般:
oc0tc1b_init_setting[]
里面:
0x0300
0x0301
0x0302
PLL
0x3800
0x3801
Timing
0x4800
MIPI
......
这一堆寄存器。
注意:
这些不能从datasheet硬推
实际必须拿:
OmniVision FAE
Register Setting
400x400 RAW10
例如:
OC0TC1B_400x400_RAW10_30fps.txt
这种文件。
十一、CSIPHY配置
高通侧:
lane_num
lane_assign
settle_time
例如:
Lane 0
Clock Lane
如果这里错:
Sensor有波形
CSIPHY不Lock
十二、CSID配置
必须匹配:
VC
DT
通常:
VC = 0
DT = RAW10
如果这里错:
CSIPHY OK
CSID SOF收不到
十三、Color Bar
这个Sensor有:
0x48C0
bit0
Color Bar Enable。
这是Bringup神器。
先不要接真实图像:
Sensor
↓
Color Bar
↓
MIPI
↓
AR1
如果能出彩条:
Sensor
MIPI
CSIPHY
CSID
IFE
全部通了
十四、实际Bringup顺序
我在项目里一般这样干:
Day1
确认供电
确认24MHz MCLK
确认Reset
确认I2C
然后:
i2cdetect
能看到:
0x36
Day2
读ID
0x300A
0x300B
得到:
C7
54
Day3
导入Vendor Register Table
0x0100 = 1
开始Streaming
Day4
示波器看MIPI
看到:
Clock Lane HS
Data Lane HS
Day5
看高通Log
通常:
dmesg
logcat
重点看:
CSIPHY lock
CSID SOF
Frame Done
Day6
打开Color Bar
看到:
彩条
Day7
关闭Color Bar
打开真实Sensor
出图
对于你现在做 AR1 AI眼镜 Camera Bringup,我认为最重要的经验是:
80%的问题都不是驱动代码,而是 Power Sequence、Vendor Register Table、MIPI Lane配置三件事。
很多新人会花几天改 Driver,其实:
I2C正常
ID正常
但是Vendor给的寄存器表不对
永远不会出图。
而真正高手拿到新Sensor第一件事不是写代码,而是先向 FAE 要:
Register Setting
Sensor XML模板
MIPI Rate
推荐Power Sequence
这样 Bringup 速度会快很多。

9181

被折叠的 条评论
为什么被折叠?



