Sensor Bringup,即"影像点亮",是指将一颗新的 Camera 传感器从硬件接入到软件驱动的完整调试过程——从一块"黑砖"到稳定输出清晰图像。
┌─────────────────────────────────────────────────────────────────┐
│ Sensor Bringup 全景图 │
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ 资料准备 │──▶│ 硬件确认 │──▶│ 软件配置 │──▶│ 出图调试 │ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
│ ·Datasheet ·原理图引脚 ·DTS设备树 ·I2C通信验证 │
│ ·Setting文件 ·电源时序 ·Sensor驱动 ·MIPI信号确认 │
│ ·平台约束 ·MIPI连接 ·XML模组配置 ·ISP中断检查 │
│ ·I2C总线 ·编译注册 ·AE/AWB调优 │
└─────────────────────────────────────────────────────────────────┘╔══════════════════════╤══════════════════════════════════════════╗
║ 文档 │ 用途 ║
╠══════════════════════╪══════════════════════════════════════════╣
║ Sensor Datasheet │ 电源时序、I2C协议、寄存器地图、MIPI特性 ║
║ 原厂 Application Note│ 参考设计、电源树、时钟要求 ║
║ Sensor Setting │ 分辨率/Mclk/帧率/raw位宽/mipi_lane数 ║
║ 主控平台参考手册 │ CSI约束(最大MIPI速率/MCLK范围) ║
║ 主板原理图 │ 引脚连接、电源树、GPIO映射 ║
╚══════════════════════╧══════════════════════════════════════════╝┌─────────────────────────────────────────────────┐
│ T7300 vs T612 影像能力对比 │
├───────────────┬────────────────┬────────────────┤
│ 参数 │ T7300 │ T612 │
├───────────────┼────────────────┼────────────────┤
│ 制程 │ 6nm │ 12nm │
│ ISP代数 │ 第7代 │ 第5代 │
│ 影像引擎 │ Vivimagic 7th │ Vivimagic 5th │
│ 最大像素支持 │ 1.08亿 │ 1亿级 │
│ ISP核数 │ 四核 │ 双核 │
├───────────────┴────────────────┴────────────────┤
│ ⚠️ 注意:申请 Sensor Setting 时,务必告知原厂 │
│ 平台型号和 MIPI 速率上限,避免速率超限! │
└─────────────────────────────────────────────────┘拿到原理图后,不需要看懂全部,只需找到 Camera 相关的接口部分:
┌─────────────────────────────────┐
│ 主控 SoC (T7300/T612) │
│ │
CM_RST_L ◄─────┤ GPIO44 MIPI_CSI0 │
CM_PWRDN ◄─────┤ GPIO46 │ │
CM_I2C_SDA ◄────►│ I2C1_SDA │ │
CM_I2C_SCL ◄────►│ I2C1_SCL │ │
CM_MCLK ◄─────┤ CLK_SENSOR0 │ │
│ │ │
└────────────────┼────────────────┘
│
MIPI D0P/N │ D1P/N CLKP/N
│
┌────────────────▼────────────────┐
│ │
│ Camera Sensor 模组 │
│ │
│ ┌─────┐ ┌──────┐ ┌─────┐ │
│ │AVDD │ │ DVDD │ │DOVDD│ │
│ └──┬──┘ └──┬───┘ └──┬──┘ │
│ │ │ │ │
│ (模拟电源) (数字电源) (I/O电源) │
└──────────────────────────────────┘信号 | 原理图常见命名 | 说明 | 配置位置 |
|---|---|---|---|
Reset | CM_RST_L / LCM_RSTN | 低电平有效,拉低复位 | DTS reset-gpios |
Power Down | CM_PWRDN | 休眠控制 | DTS power-down-gpios |
I2C SDA/SCL | CM_I2C_SDA/SCL | 控制总线 | DTS &i2c 节点 |
MCLK | CM_MCLK | 主时钟,通常24MHz | DTS clock-names |
MIPI Data | D0P/N, D1P/N ... | 数据通道,数对数=lane数 | Sensor驱动 |
AVDD | 模拟电源 | 对噪声敏感,纹波<10mVpp | DTS vddcama-supply |
DVDD | 数字核心电源 | — | DTS vddcamd-supply |
DOVDD | I/O电源 | 需与主控电压匹配 | DTS vddio-supply |
Sensor 对上电时序有严格要求,典型时序如下:
┌──────────────────────────────────────────────────────┐
│ Sensor 上电时序 (Typical) │
时间 │ │
▲ │ │
│ │ ┌─────────────────────── │
│ │ DOVDD ───┘ │
│ │ ┌─────────────────────── │
│ │ AVDD ─────┘ │
│ │ ┌─────────────────────── │
│ │ DVDD ───────┘ │
│ │ ┌───────┐ │
│ │ MCLK ─────────┘ └─── │
│ │ ┌───────┐ │
│ │ RESET ──────────┘ └──── (高电平工作) │
│ │ ┌────────── │
│ │ PWRDN ─────────────┘ (低电平工作) │
│ │ │
│ └──┬───┬───┬───┬───┬───┬───┬───┬───┬───┬──▶ │
│ T0 T1 T2 T3 T4 T5 T6 T7 T8 │
└──────────────────────────────────────────────────────────┘
⚠️ 具体延时要求以 Sensor Datasheet 为准,时序不对可能导致
I2C 不通、出图异常甚至芯片损坏!┌─────────────────────────────────────────────────────────────┐
│ 展锐 Camera 配置架构 │
│ │
│ ┌─────────────┐ ┌──────────────┐ ┌──────────────────┐ │
│ │ Kernel层 │ │ Vendor层 │ │ Device层 │ │
│ │ │ │ │ │ │ │
│ │ ·DTS设备树 │ │ ·Sensor驱动 │ │ ·sensor_config │ │
│ │ 电源/GPIO │ │ (libcamera) │ │ .xml │ │
│ │ 时钟/CSI │ │ ·AF驱动 │ │ ·BoardConfig.mk │ │
│ │ │ │ ·Tuning参数 │ │ │ │
│ │ │ │ ·ISP配置 │ │ │ │
│ └──────┬──────┘ └──────┬───────┘ └────────┬─────────┘ │
│ │ │ │ │
│ └────────────────┼────────────────────┘ │
│ ▼ │
│ ┌──────────────────────┐ │
│ │ Sensor Bringup 完成 │ │
│ │ Camera 正常出图 │ │
│ └──────────────────────┘ │
└─────────────────────────────────────────────────────────────┘DTS 是所有配置的基石,描述了硬件连接和参数设置。
&i2c1 {
status = "okay";
sensor_main: sensor-main@6c {
compatible = "sprd,sensor-main";
reg = <0x6c>; // I2C 7位地址 (0x6c)
/* 时钟配置 */
clock-names = "clk_src", "sensor_eb",
"clk_96m", "clk_76m8",
"clk_48m", "clk_26m";
clocks = <&mm_clk CLK_SENSOR0>,
<&mm_gate CLK_MM_SENSOR0_EB>,
<&g12_pll CLK_TWPLL_96M>,
<&g12_pll CLK_TWPLL_76M8>,
<&g12_pll CLK_TWPLL_48M>,
<&ext_26m>;
/* 电源配置 */
vddio-supply = <&vddcamio>; // I/O电源 (DOVDD)
vddcama-supply = <&vddcama1>; // 模拟电源 (AVDD)
vddcamd-supply = <&vddcamd0>; // 数字电源 (DVDD)
vddcammot-supply = <&vddcammot>; // 马达电源 (VCM)
/* MIPI PHY 和 CSI 绑定 */
sprd,phyid = <3>;
csi = <&csi0>;
/* GPIO 控制 */
reset-gpios = <&ap_gpio 44 0>; // Reset 引脚
power-down-gpios = <&ap_gpio 46 0>; // Power Down 引脚
status = "okay";
};
};DTS 配置要点图解:
DTS 配置五要素
┌───────────────────────────────────────┐
│ │
│ ① I2C 地址 ──→ reg = <0x6c> │
│ │
│ ② 电源轨 ──→ vddio / vddcama / │
│ vddcamd / vddcammot │
│ │
│ ③ 时钟 ──→ clock-names / clocks │
│ │
│ ④ GPIO ──→ reset / power-down │
│ │
│ ⑤ CSI绑定 ──→ sprd,phyid / csi │
│ │
└───────────────────────────────────────┘驱动位于 vendor/sprd/modules/libcamera/sensor/sensor_drv/classic/<厂商>/<IC>/ 下。
⚠️ I2C 地址常见坑:
Sensor Datasheet 标注的地址可能是 7位 或 8位:
┌───────────────────────────────────────────────┐
│ 7位地址: 0x36 ──→ 代码中 reg = <0x6c> │
│ (0x36 << 1 = 0x6c) │
│ │
│ 8位地址: 0x6c ──→ 代码中 reg = <0x6c> │
│ (直接使用) │
│ │
│ 规律: 如果地址 < 0x7F,大概率是7位地址 │
│ 需要左移1位才是代码中的值 │
└───────────────────────────────────────────────┘Sensor Setting 是原厂提供的寄存器初始化序列,格式示例:
static uint8_t init_data[] = {
// 格式: data_type, wait_ms, reserved, length, payload...
0x39, 0x00, 0x00, 0x04, 0xFF, 0x98, 0x81, 0x03, // 切换Page
0x23, 0x00, 0x00, 0x02, 0x01, 0x00, // 写寄存器
0x23, 0x00, 0x00, 0x02, 0x02, 0x00, // 写寄存器
// ... 更多初始化命令
0x23, 0x78, 0x00, 0x02, 0x11, 0x00, // Sleep Out (等待120ms)
0x23, 0x0A, 0x00, 0x02, 0x29, 0x00, // Display On (等待10ms)
CMD_END
};发送初始化命令的流程:
┌──────────┐ ┌──────────────┐ ┌────────────┐
│ 解析命令 │────▶│ MIPI DSI写 │────▶│ 等待延时 │
│ 数据类型 │ │ payload到 │ │ cmds->wait │
│ 长度 │ │ Sensor寄存器 │ │ ms │
└──────────┘ └──────────────┘ └─────┬──────┘
▲ │
│ 下一条命令 │
└──────────────────────────────────────┘
(直到 CMD_END) MIPI CSI-2 配置三要素
┌───────────────────────────────────────────┐
│ │
│ Lane数 (1/2/4) │
│ ├── 决定数据传输带宽 │
│ ├── 原理图数 D0P/N, D1P/N 对数 │
│ └── 必须与 Setting 一致 │
│ │
│ CLK速率 │
│ ├── 决定每Lane传输速率 │
│ ├── 不可超过平台CSI最大支持速率 │
│ └── T7300: 最高支持 2.5Gbps/lane │
│ T612: 最高支持 2.0Gbps/lane │
│ │
│ Raw格式 (raw8/raw10/raw12) │
│ ├── 决定像素位宽 │
│ └── 必须与Setting输出格式匹配 │
│ │
└───────────────────────────────────────────┘
计算公式:
所需带宽 = 分辨率 × 帧率 × 位宽 × 1.2(开销)
例如: 1920×1080×30×10×1.2 ≈ 747 Mbps
2-lane 配置: 每lane约 374 Mbps ✅ (远低于上限) ┌─────────────────────────────────────────────┐
│ AE (自动曝光) 配置 │
│ │
│ 曝光时间 │
│ ├── 最小值: sensor_line_length / fps │
│ └── 最大值: sensor_frame_length - offset │
│ │
│ 模拟增益 (Analog Gain) │
│ ├── 最小值: 1.0x (或 sensor 支持的最小值) │
│ └── 最大值: 依据 Datasheet 增益表 │
│ │
│ ⚠️ 关键: 确保增益值正确写入 Sensor 寄存器 │
│ 和 ISP firmware 算法同步更新 │
└─────────────────────────────────────────────┘device/sprd/<平台>/<项目>/camera/sensor_config.xml
<!-- Camera 模组配置 -->
<CameraModuleCfg>
<!-- 摄像头位置: 0=后摄 1=前摄 -->
<SlotId>0</SlotId>
<!-- ⚠️ 必须与驱动文件夹名、TuningName 严格一致! -->
<SensorName>gc5035</SensorName>
<!-- 朝向: BACK=后摄 FRONT=前摄 -->
<Facing>BACK</Facing>
<!-- 旋转角度: 0/90/180/270 -->
<Orientation>270</Orientation>
<!-- VCM (音圈马达) 对焦配置 -->
<VCM>
<AfName>cn3927</AfName>
<Mode>2</Mode>
</VCM>
<!-- OTP (光学校准数据) 配置 -->
<OTP>
<E2prom>
<OtpName>general</OtpName>
<I2cAddr>0xa0</I2cAddr>
<E2promNum>0</E2promNum>
<E2promSize>8192</E2promSize>
</E2prom>
</OTP>
<!-- Tuning 参数名: 必须与 its_param 文件夹名一致 -->
<TuningParameter>
<TuningName>gc5035</TuningName>
</TuningParameter>
</CameraModuleCfg>命名一致性检查:
⚠️ 以下四处名称必须完全一致,否则 Camera 无法匹配!
sensor_config.xml ──── SensorName: "gc5035"
│
sensor_drv/ ───────── 驱动文件夹: gc5035/
│
its_param/ ────────── 参数文件夹: gc5035/
│
TuningParameter ───── TuningName: "gc5035"
│
▼
✅ 全部一致才能正常工作sensor_lib_cfg.mk 中添加:ifeq ($(GC5035),1)
GLOBAL_DEFINES += CONFIG_LCD_GC5035
MODULE_SRCS += \
$(LOCAL_DIR)/classic/Galaxycore/gc5035/sensor_gc5035_mipi_raw.c
endifsensor_cfg.c 中注册:const SENSOR_MATCH_T back_sensor_infor_tab[] = {
// ...
#ifdef GC5035
{MODULE_SUNNY, "gc5035", &g_gc5035_mipi_raw_info,
{&cn3927v_drv_entry, 0},
{&general_otp_entry, 0x6e, SINGLE_CAM_ONE_EEPROM, 8192}},
#endif
// ...
};BoardConfig.mk 中添加 Tuning 列表:# tuning param support list
TUNING_PARAM_LIST := "gc8034,gc8034_rear,hi846_front,hi846,gc5035" ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐
│ Step 1 │ │ Step 2 │ │ Step 3 │ │ Step 4 │ │ Step 5 │
│ 上电检查 │───▶│ I2C通信 │───▶│ MIPI信号│───▶│ ISP中断 │───▶│ 出图验证 │
└─────────┘ └─────────┘ └─────────┘ └─────────┘ └─────────┘
·各路电源电压 ·i2cdetect ·示波器测 ·内核log ·抓取raw图
是否正常 扫描地址 MIPI lane 检查中断 确认无异常
·电源时序是否 ·读取chip_id ·MCLK频率 ·SOF/EOF ·testpattern
符合Datasheet 是否正确 是否正确 帧中断 验证# 查看各路电源状态
cat /sys/class/regulator/*/microvolts
# 或用示波器测量关键测试点:
# AVDD = 2.8V ?
# DVDD = 1.2V ?
# DOVDD = 1.8V ?# 扫描 I2C 总线,确认 sensor 是否被识别
i2cdetect -y -r 1
# 如果扫描到地址(如 0x36),说明 I2C 硬件连接正常
# 如果扫描不到 → 检查硬件:供电、I2C上拉电阻、地址是否正确 I2C 调试排查路径:
i2cdetect 扫不到地址?
│
├──▶ 检查供电:示波器量 AVDD/DVDD/DOVDD
│ └── 电压不对?→ 查 DTS 电源配置 & 硬件
│
├──▶ 检查 I2C 总线:示波器量 SDA/SCL 波形
│ └── 无波形?→ 查 DTS I2C 节点 & GPIO 复用
│
├──▶ 检查地址:7位 vs 8位是否搞混
│
└──▶ 检查 MCLK:是否有 24MHz 时钟输出
└── 无时钟?→ 查 DTS clocks 配置# 用示波器测量 MIPI lane 差分信号
# 确认有数据传输(差分信号跳变)
# 检查 MCLK 频率
# 典型值 24MHz,需与 Setting 一致# 查看内核启动 log,搜索 camera/ISP 相关中断
dmesg | grep -i "isp\|csi\|camera\|sensor"
# 正常应看到 SOF (Start of Frame) / EOF (End of Frame) 中断
# 如果没有中断 → 大概率 MIPI 配置有误# 抓取 raw 图
# 使用平台提供的抓图工具
# 1. 先让 sensor 出 test pattern
# 如果 test pattern 也异常 → MIPI 配置问题
# 如果 test pattern 正常 → Sensor Setting 或 Tuning 问题
# 2. 检查图像亮度 → AE/AWB 配置
# 3. 检查图像颜色 → CCM / BLC 配置┌────────────────┬──────────────┬───────────────────────────────────────┐
│ 现象 │ 大概率原因 │ 排查方法 │
├────────────────┼──────────────┼───────────────────────────────────────┤
│ I2C 不通 │ 硬件连接/供电 │ ① i2cdetect 扫描 │
│ │ │ ② 示波器量供电/I2C波形 │
│ │ │ ③ 确认地址7位/8位 │
│ │ │ ④ 检查 MCLK 是否输出 │
├────────────────┼──────────────┼───────────────────────────────────────┤
│ ISP 无中断 │ MIPI 配置错误 │ ① 检查 lane 数/CLK/格式 │
│ │ │ ② 打印 debug 信息定位 │
│ │ │ ③ devmem 读寄存器状态 │
├────────────────┼──────────────┼───────────────────────────────────────┤
│ 花屏 / 横条纹 │ Setting 有误 │ ① 抓 raw 图检查 │
│ │ │ ② 出 test pattern 区分 │
│ │ │ ③ test pattern也错 → MIPI配置 │
├────────────────┼──────────────┼───────────────────────────────────────┤
│ 帧率不对 │ MIPI 配置 │ 核对 lane 数、CLK 配置 │
├────────────────┼──────────────┼───────────────────────────────────────┤
│ 图像过亮/过暗 │ AE 配置错误 │ ① 检查 AE 最大/最小值限制 │
│ │ │ ② 调试工具开关 LTM/DNLP 定位 │
├────────────────┼──────────────┼───────────────────────────────────────┤
│ 图像偏紫色 │ IRCut 异常 │ 确认 IRCut 是否正常工作 │
├────────────────┼──────────────┼───────────────────────────────────────┤
│ 图像偏绿色 │ BLC/CCM 问题 │ ① 调试工具开关 CCM 模块 │
│ │ │ ② 修改 BLC 值观察 │
├────────────────┼──────────────┼───────────────────────────────────────┤
│ Camera打不开 │ 名称不匹配 │ 检查四处命名一致性: │
│ │ │ XML / 驱动文件夹 / Tuning / its_param │
└────────────────┴──────────────┴───────────────────────────────────────┘工具 | 用途 | 示例命令 |
|---|---|---|
i2cdetect | I2C总线扫描 | i2cdetect -y -r 1 |
i2cget | 读取Sensor寄存器 | i2cget -y 1 0x36 0x0A |
devmem | 读取SoC寄存器 | devmem 0xXXXXXXXX |
dmesg | 内核日志 | dmesg | grep -i camera |
示波器 | 测量电压/波形/时序 | — |
逻辑分析仪 | 抓取I2C/MIPI时序 | — |
ISP调试工具 | 开关各ISP模块 | 平台专用工具 |
vendor/sprd/modules/libcamera/
├── sensor/
│ ├── sensor_drv/classic/<厂商>/<IC>/ ← Sensor 驱动
│ │ ├── sensor_gc5035_mipi_raw.c
│ │ ├── sensor_gc5035_mipi_raw.h
│ │ └── Android.mk
│ ├── af_drv/<IC>/ ← AF (对焦) 驱动
│ ├── tuning_param/<平台>/<厂商>/<IC>/ ← Tuning 参数
│ ├── sensor_cfg.c ← Sensor 注册表
│ ├── sensor_lib_cfg.mk ← 编译配置
│ └── tunning_lib_cfg.mk ← Tuning 编译配置
├── isp/ ← ISP 配置
└── its_param/ ← ISP Tuning 参数
device/sprd/<平台>/<项目>/
├── camera/sensor_config.xml ← Camera 模组 XML 配置
└── BoardConfig.mk ← Board 编译配置
kernel/arch/arm64/boot/dts/sprd/
└── <项目>.dts ← DTS 设备树配置╔══════════════════════════════════════════════════════════════════╗
║ ║
║ ① 资料准备 ║
║ Datasheet + Setting + 原理图 + 平台约束 ║
║ │ ║
║ ▼ ║
║ ② 硬件确认 ║
║ 原理图提取: Reset/PWDN/I2C/MCLK/MIPI Lane/电源引脚 ║
║ │ ║
║ ▼ ║
║ ③ DTS 配置 ║
║ I2C地址 + 电源 + 时钟 + GPIO + CSI绑定 ║
║ │ ║
║ ▼ ║
║ ④ Sensor 驱动配置 ║
║ Setting + I2C地址 + chip_id + MIPI(Lane/CLK/Raw格式) + AE/AWB ║
║ │ ║
║ ▼ ║
║ ⑤ XML 模组配置 ║
║ SlotId + SensorName + VCM + OTP + TuningName (命名一致!) ║
║ │ ║
║ ▼ ║
║ ⑥ 编译注册 ║
║ sensor_lib_cfg.mk + sensor_cfg.c + BoardConfig.mk ║
║ │ ║
║ ▼ ║
║ ⑦ 验证调试 ║
║ 上电 → I2C → MIPI → ISP中断 → 出图 → TestPattern → AE/AWB ║
║ │ ║
║ ▼ ║
║ ✅ Sensor Bringup 完成,Camera 正常出图! ║
║ ║
╚══════════════════════════════════════════════════════════════════╝以上是基于展锐4G 与 5G平台的一个点亮汇总,有任何疑问可以联系交流。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。