【无标题】

 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 速度会快很多。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值