5.17.2. Camera 调试指南
5.17.2.1. 范围
本
章节 概述 X5 Camera Bring-Up 的 流程,帮助 读者 快速 掌握 X5 Camera 框架。 说明
如何 新增 Camera 配置 并 成功 点亮 Camera。 各 Sensor 厂家
具体 实现(驱动、App、sample程序验证)与 常见问题 请 参见 下方「文档 组成」中 的 对应 章节。
5.17.2.2. 文档组成
| 章节 | 说明 |
|---|---|
| Camera 调试 |
流程 |
| OmniVision Sensor Bring-Up | OmniVision 系列 sensor os08c10 驱动、App 配置 |
| SmartSens Sensor Bring-Up | SmartSens 系列 sensor sc132gs 驱动、App 配置 |
| Sony Sensor Bring-Up | Sony 系列 sensor imx586驱动、App 配置 |
| Camera Sensor FAQ | I2C/MCLK/MIPI/Sensor 等 |
建议
5.17.2.3. 准备工作
软件资源:系统 BSP、sensor datasheet、sensor 的
初始化 序列。 硬件资源:以 EVB 开发板
为例 及 待 适配 的 Camera 模组、原理图 和pcb。

上
| 接口 | MIPI CSI Host | 最大 |
I2C Bus | Reset GPIO | LPWM/PWD | MCLK |
|---|---|---|---|---|---|---|
| 20 | MIPI_CSI0&1 | 4 lane | I2C4 | AON_GPIO_PIN0 - 498 | LSIO_SPI5_SCLK - lpwm0 | LSIO_SPI3_SCLK - mclk0 |
| 21 | MIPI_CSI2 | 2 lane | I2C2 | AON_GPIO_PIN4 - 502 | LSIO_SPI5_SSN - lpwm1 | LSIO_SPI3_MISO - mclk2 |
| 22 | MIPI_CSI3 | 2 lane | I2C7 | LSIO_GPIO1_06 - 353 | LSIO_SPI5_MISO - lpwm2 | LSIO_SPI3_MOSI - mclk3 |
X5 MIPI HOST (RX) 系统
单 Host 模式:每个 Host (0-3) 独立
支持 2 lane Lane 拼接
模式 :Host0+Host1、Host2+Host3 可分别 拼接 为 4 lane;EVB 默认 Host0+Host1 拼接,Host2/Host3 为单 Host。
5.17.2.4. 新 sensor 点亮步骤
在 X5 平台
修改
平台 :按设备树 (dts) 硬件 设计 配置 sensor 上电 GPIO、I2C、MCLK、LPWM。 添加 sensor 驱动
代码 :实现sensor_module_t的初始化/反 初始化、开流/关流、上下 电、增益/曝光 控制 等 接口。 添加 camera App 代码:配置 MIPI、SIF、camera sensor、LPWM、ISP 等
参数。 添加
默认 camera ISP 效果 :准备库 sensor_name_tuning.json,供 ISP 用例使用。 示例
程序运行 :用 get_vin_data / get_isp_data 查看 raw 图、帧率 与 ISP 图像 是否 符合 预期。 ISP 图像
调试 :连接 hbplayer,验证预览 驱动 增益 与 曝光 控制,搭建 ISP 调试 环境。
5.17.2.5. 修改平台设备树 (dts)
设备树kernel/arch/arm64/boot/dts/hobot/x5-evb.dtsi。
以下
//i2c 配置
&i2c4 {
status = "okay";
};
//lpwm 配置
&lpwm0 {
status = "okay";
/* conflict with camera pwd gpio */
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_lpwm0_0 &pinctrl_lpwm0_1
&pinctrl_lpwm0_2 &pinctrl_lpwm0_3>;
};
// dts: 在对应 vcon node 中设置 gpio,注意 vcon 端口号与 mipi rx 端口号 一 一对应
// vcon0 -- mipi_host0
// ....
// vcon3 -- mipi_host3
&mipi_host0 {
status = "okay";
pinctrl-names = "enable", "disable";
pinctrl-0 = <&pinctrl_sensor0_mclk>; //mclk0
pinctrl-1 = <&lsio_gpio0_24>;
snrclk-idx = <0>; //mclk index
};
&vin_vcon0 {
status = "okay";
/* camera sensor
* reset gpio: AON_GPIO0_00: 498
* pwd gpio: LSIO_GPIO1_00: 347
*/
pinctrl-names = "default";
pinctrl-0 = <&aon_gpio_0>;
gpio_oth = <498>; //reset gpio
bus = <4>; //i2c4
lpwm_chn = <0>; //open lpwm0 - channel0
};
vcon 是 X5 用于
1. sensor GPIO 配置
2. sensor I2C 配置
3. sensor MCLK 配置
4. sensor LPWM 配置
1. sensor GPIO 配置
sensor 时序
控制 相关 GPIO 由 vin_vcon节点中 的 gpio_oth描述。当仅
需 单个 GPIO 控制 时,直接 指定 对应 的 GPIO 编号 即可。可以 配置 如 gpio_oth = <498>; 当
需要 多个 GPIO 进行 控制 时,在 gpio_oth 属性 中 依次 列出 所有 GPIO 编号。可以 配置 如 gpio_oth = <498 386>; PinName 管脚
和 gpio 编号 对应 关系 的 查看 的 方法 参考hb_gpioinfo 工具 介绍
&vin_vcon0 {
...
pinctrl-names = "default";
pinctrl-0 = <&aon_gpio_0>;
gpio_oth = <498>; //reset gpio
...
};
2. sensor I2C 配置
X5 I2C bus number 需要
在 dts vcon 中 与 MIPI RX 端口 进行 绑定。 上面
的EVB配置 使用 的I2C4 bus = <4>;
&i2c4 {
status = "okay";
};
&vin_vcon0 {
status = "okay";
...
bus = <4>; //i2c4
};
3. sensor MCLK 配置
MCLK 为 Camera Sensor 主
时钟。若 由 X5 提供,需在 对应 mipi_host节点中 配置 pinctrl 与 snrclk-idx。注意:MCLK 默认
是 GPIO pin,使能 snrclk 或 运行 camera 程序 时,mipi 驱动 会 通过 pinctrl 切 到 mclk 功能。
&mipi_host0 {
status = "okay";
pinctrl-names = "enable", "disable";
pinctrl-0 = <&pinctrl_sensor0_mclk>; //mclk0
pinctrl-1 = <&lsio_gpio0_24>;
snrclk-idx = <0>; //mclk index
};
4. sensor LPWM 配置
当 Camera 使用 Slave Mode 时
需要 配置。在 DTS 中使 能 LPWM 并 在 vcon 中 配置 lpwm_chn。X5 SOC 输出
触发 时 需要 在 DTS 中 启用 LPWM 功能 并 配置 对应 的 lpwm_chn,映射 关系 如下:
| LPWM控制器 | Channel | 对应 Pinctrl | 物理 |
lpwm_chn |
|---|---|---|---|---|
| LPWM0 | 0 | pinctrl_lpwm0_0 |
LSIO_SPI5_SCLK | 0 |
| 1 | pinctrl_lpwm0_1 |
LSIO_SPI5_SSN | 1 | |
| 2 | pinctrl_lpwm0_2 |
LSIO_SPI5_MISO | 2 | |
| 3 | pinctrl_lpwm0_3 |
LSIO_SPI5_MOSI | 3 | |
| LPWM1 | 0 | pinctrl_lpwm1_0 |
LSIO_SPI3_SCLK | 4 |
| 1 | pinctrl_lpwm1_1 |
LSIO_SPI3_SSN | 5 | |
| 2 | pinctrl_lpwm1_2 |
LSIO_SPI3_MISO | 6 | |
| 3 | pinctrl_lpwm1_3 |
LSIO_SPI3_MOSI | 7 |
&lpwm0 {
status = "okay";
/* conflict with camera pwd gpio */
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_lpwm0_0 &pinctrl_lpwm0_1
&pinctrl_lpwm0_2 &pinctrl_lpwm0_3>;
};
&vin_vcon0 {
status = "okay";
...
lpwm_chn = <0>; //open lpwm0 - channel0
};
5. dts 验证
dts 配置
检查 可以 通过 hb_gpioinfo进行检查,详细 参考hb_gpioinfo 工具 介绍 下面
是 hb_gpioinfo 命令 对 管脚 复用 是否 配置 检查 的 结果,查看 配置 结果 是 正确 的。
# hb_gpioinfo | grep AON_GPIO_PIN0
line 0: unnamed output AON_GPIO_PIN0 498 aon_gpio_0 10 mA
# hb_gpioinfo | grep LSIO_SPI5_SCLK
line 0: unnamed input LSIO_SPI5_SCLK 347 pinctrl_lpwm0_0 2 mA
# hb_gpioinfo | grep LSIO_SPI3_SCLK
line 24: unnamed input LSIO_SPI3_SCLK 403 lsio_gpio0_24 9 mA
dts 配置
echo 498 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio498/direction
echo 0 > /sys/class/gpio/gpio498/value
sleep 0.1
echo 1 > /sys/class/gpio/gpio498/value
# 以 host0/rx0 为例,实际需要换成对应的 mipi rx 端口
# 一般是 24M 时钟输入,以实际为例
echo 24000000 > /sys/class/vps/mipi_host0/param/snrclk_freq
echo 1 > /sys/class/vps/mipi_host0/param/snrclk_en
i2cdetect -y -r 4
使用 i2cdetect 检测 sensor i2c 地址。如果
检测 到 正确 的 地址,如下 图 所示,则 表示 dts 配置 正确,否则 需要 检查 dts 配置,或者 按照 i2c 不通 步骤 进行 排查。 
5.17.2.6. 添加 sensor 驱动代码
不同
驱动位置与命名
源码
路径 :hbre/camsys/libcam/src/sensor/部署
路径 :编译生成 的 lib<sensor_name>.so拷贝到设备 /usr/hobot/lib/sensor/文件
命名 :<sensor_name>_utility.c;结构体/模块 :与名 <sensor_name>一致(如 sc132gs、os08c10、imx586 等),详见各 厂家 bringup。
sensor_module_t 接口
1. sensor_module_t 命名
| 项目 | 命名 |
示例 |
|---|---|---|
| 文件名 | <sensor_name>_utility.c |
sc132gs_utility.c |
| 结构 |
<sensor_name> |
sc132gs |
| module字 |
<sensor_name> |
"sc132gs" |
2. sensor_module_t 接口
驱动sensor_module_t,并
| 函数 |
功能 |
调用 |
|---|---|---|
init |
Sensor 初始化、Setting 下发 | hbn_camera_attach_to_vin |
deinit |
Sensor 去 |
hbn_camera_destroy / hbn_camera_detach_from_vin |
start |
Sensor 开流 | hbn_vflow_start |
stop |
Sensor 关流 | hbn_vflow_stop |
power_on |
Sensor 上电 | hbn_camera_attach_to_vin |
power_off |
Sensor 下电 | hbn_camera_destroy / hbn_camera_detach_from_vin |
aexp_gain_control |
增益 |
ISP 算法 |
aexp_line_control |
曝光 |
ISP 算法 |
userspace_control |
用户 |
用户 |
3. 3A 控制
对于 3A 控制,即userspace_control,X5 系统
| 函数 | 功能 | 传入 |
|---|---|---|
aexp_gain_control |
sensor 增益 |
info:sensor 总线 mode:sensor 运行 again:sensor again 参数,最大4个 dgain:sensor dgain 参数,最大4个 gain_num:sensor gain 参数 |
aexp_line_control |
sensor 曝光 |
info:sensor 总线 mode:sensor 运行 line:sensor line 参数,最大4个 line_num:sensor line 参数 |
awb_control |
sensor 端 awb 控制 | info:sensor 总线 mode:sensor 运行 rgain:sensor rgain bgain:sensor bgain grgain:sensor rrgain gbgain:sensor gbgain |
userspace_control |
hal 层 |
port:sensor 端口号 enable:使能 位 - HAL_LINE_CONTROL 0x00000001- HAL_GAIN_CONTROL 0x00000002- HAL_AWB_CONTROL 0x00000004 |
关键概念
vts/framelength:每帧
总行 数(有效 行 + 消隐 行),不同 sensor 命名 可能 不同,是 计算 曝光 / 行 时间 的 核心 参数。 lines_per_second:每秒
曝光 总行 数,可 通过 1/每行 时间 或 fps×vts 计算。 gain lut 表:ISP 3A 算法
输出 的 增益 索引 值 与 sensor 硬件 寄存器 值 的 映射 表,分为 analog gain 和 digital gain 两类,共 256 个 控制点(索引 0-255)。这个 映射 表 需要 用户 自己 生成,后面 会 对 不同 厂家 提供 生成 方式 举例 gain 倍率
转换 :所有 gain 索引值(X)对应 的 实际 倍率 计算公式 为 2^(X/32),控制 曲线 为 对数 型。 digital_gain_max/analog_gain_max: d_gain/a_gain 最大
倍率 索引 值。 exposure_time_min/exposure_time_max: 分别
为 短 曝光 每帧 最小/最大 曝光 行 数。 exposure_time_long_max:长
曝光 每帧 最大 曝光 行 数,HDR sensor 会 用到。 sensor 初始
增益 ,供isp ae算法曝光 值 使用,影响 前 几帧 图像 的 亮度。如果 关心 前 几帧 图像 亮度 需要 配置,配置 值为sensor setting的 寄存器 初始值 的index值 和 曝光 行 数。 analog_gain_init: sensor analog gain 初始值。可
选 配置。 digital_gain_init:sensor digital gain 初始值。可
选 配置。 exposure_time_init: sensor 曝光
初始值。可 选 配置。
bayer 格式:sensor 输出
的 原始 图像 像素 排列 模式,核心 参数 包括 bayer_pattern(像素排列 类型,如 RGGB/RCCC/RIrGB/RGIrB)和 bayer_start(RGGB 模式的 起始 像素,如 R/Gr/Gb/B),一般 sensor Spec 中有 描述。 在 Bayer 模式
中,图像 传感器 的 每个 像素点 上 放置 了 一个 滤光片,只 允许 特定 颜色 的 光 通过,滤光片 按照 特定 的 图案 排列,以 sc230ai 中 描述 bayer_start为 B(0,0) 为例。

Gain LUT 表 生成方式
为了
快速 生成 gain_lut 表,X5 提供 了gain_table.xlsx 表格,只 需要 填写 C4 的 增益 倍数 推导 寄存器 值 的 公式,即可 快速 生成 gain_lut 表 gain_lut 表
一般 适用 于 OmniVision 的sensor(gain控制 一般 以 整数+小数 线性组合)和Sony 的 sensor (gain控制 一般 以 线性 公式 进行 控制) SmartSens 的sensor gain控制,一般
采用 的 是 离散 档位 + 精细 调节,通常 查表 是 最快 的,不 需要 使用gain_table.xlsx 表格 生成 gain_table.xlsx 表格
的 存放 位置 在 系统 BSP 源码 包 的 hbre/camsys/libcam/src/sensor 下
驱动部署流程
执行
./bd.sh hbre camsys/libcam编译 sensor 库。将
out/deploy/hbre/lib/sensor下生成 的 lib<sensor_name>.so.*拷贝到板端 /usr/hobot/lib/sensor/。
各sensor厂家
5.17.2.7. 添加 camera App 代码
参考 BSP 中 app/samples/platform_samples/vp_sensors,配置 MIPI、SIF、camera sensor、LPWM、ISP 等。需vp_sensor_config_t。
源码
路径 :app/samples/platform_samples/vp_sensors部署:将
编译 得到 的 get_vin_data、get_isp_data 等 拷贝到 设备(如 /userdata)测试。编译方法 见 示例 开发 。指南
vp_sensor_config_t 配置项
vp_sensor_config_t 参数
5.17.2.8. 添加默认 camera ISP 效果库
板端
效果 库 路径: /usr/hobot/lib/sensor/<sensor_name>_tuning.json可
先 拷贝 同级 目录 下同 分辨率 的 json,将 sensor_name 改为 当前 sensor 作为 默认 效果 库。
5.17.2.9. 板端示例程序运行
get_vin_data:查看 raw 图
质量 与 帧 率,确认 无 严重 偏色、与 实物 颜色 一致。用法 见 sample_vin 程序运行 方法 。get_isp_data:查看 YUV 图像,确认
无 严重 偏色、无反色;精细 效果 由 ISP 调试。用法 见 sample_isp 程序运行 方法 。
5.17.2.10. ISP 图像调试预览与 2A 验证
在
能 正常 get_vin_data / get_isp_data 后,可 连接 hbplayer 预览 YUV,并 使用 tuning_tool 进行 ISP 调试。详见 hbplayer 和 tuning_tool 工具 使用指南 。2A 验证(AE/AWB):确认
写入 Sensor 的 曝光 与 增益 寄存器 符合 Spec;将 AE 切为 Manual 后 设置 aGain、dGain、integrationTime,通过 驱动 打印 或 i2ctransfer 读 寄存器 核对。
5.17.2.11. 小结
本文
为 Camera 调试 的总览:准备 硬件 与 软件资源 → 配置 dts → 实现 并 部署 sensor 驱动 → 配置 并 运行 App → 准备 效果 库 → 板端 抓 raw/ISP 图 → ISP 预览 与 2A 验证。 按 sensor 厂家
阅读 对应 分 章节 可 得到 连贯、可 操作 的 驱动/App/验证 说明;遇到 I2C、MCLK、MIPI、Sensor 等 问题 可 查 Camera Sensor FAQ。