5.17.7. Camera 调试FAQ
下面
| 错误码 | 定义 | 排查 |
|---|---|---|
| 203 | HB_CAM_INIT_FAIL | sensor 初始化 |
| 205 | HB_CAM_START_FAIL | sensor 启动 |
| 207 | HB_CAM_I2C_WRITE_FAIL | sensor i2c 不通,可以 |
| 217 | HB_CAM_SENSOR_POWERON_FAIL | sensor 上电 |
| 218 | HB_CAM_SENSOR_POWEROFF_FAIL | sensor 下电 |
5.17.7.1. FAQ
下面
目录
| 分类 | 问题 | 链接 |
|---|---|---|
| I2C | i2c 不通 | i2c 不通 |
| MCLK | 如何 |
如何 |
| MCLK | 查看 mclk 频率 |
查看 mclk 频率 |
| MIPI | 无法 |
无法 |
| MIPI | MIPI 报错 | MIPI 报错 |
| MIPI | MIPI 参数 |
MIPI 参数 |
| MIPI | 如何 |
如何 |
| MIPI | 如何 |
如何 |
| MIPI | 如何 |
如何 |
| MIPI | 如何 |
如何 |
| MIPI | 如何 |
如何 |
| Sensor | Sensor 库 check 或 load error | Sensor 库 check 或 load error |
| Sensor | Sensor 作为 slave mode 配置 | Sensor 作为 slave mode 配置 |
| 图像 | Dump 出 |
Dump 出 |
| Gain | gain 索引 |
gain 索引 |
| VTunerClient | 连接VTunerClient | 连接VTunerClient |
| VTunerClient | 如何 |
如何 |
5.17.7.2. I2C
i2c 不通
使用 i2cdetect 命令

通过 logcat 可以

排查
硬件
检查 camera 模组
连接 是否 正常 检查 GPIO 配置:
reset gpio
pwd (sensor xshutdown) gpio
power_en gpio
mclk
使用
万用表 和 示波器 进行 测量 并 一一 排除
检查
模组 供电: 查看
模组 pin list 或 原理图 测量
供电 情况,可能 包括 3.0V/2.8V/1.8V/1.2V 等
检查 I2C 信号:
保证 I2C SDA 和 SCLK 上拉,一般
是 上拉到 1.8V 默认 SCLK 为 100K,确保
满足 sensor I2C 速率 要求,否则 需要 修改 dts I2C 默认 速率
检查 MCLK:
保证 mclk (sensor extclk) 管脚
有 波形,一般 是 24M 或 27M
检查
上电 时序: 保证 sensor 上电
时序 符合 sensor spec 要求
软件
检查 I2C 配置:
I2C number 与
实际 硬件 配置 是否 相符 I2C addr 与
实际 硬件 配置 是否 相符
检查 DTS 绑定:
X5 MIPI host 与 I2C number 在 dts 中
进行 绑定 如 mipi host0 使用 I2C number 4,必须
保证 dts 绑定 的 bus 与 实际 相符
5.17.7.3. MCLK
如何修改 MCLK 驱动电流
MCLK 默认
是 gpio pin,当使 能 snrclk 或者 运行 camera 程序 时,mipi 驱动 会 通过 pinctrl select 将 pin 选择 为 mclk 对应 的 pin。 
想要
调整 mclk 驱动电流,则 需要 修改 mclk 对应 的 pin driver-strength。 

查看 mclk 频率和使能的状态
cat /sys/class/vps/mipi_host0/status/snrclk
snrclk : sensor0_mclk
support : enable disable
state : enable #当前状态:enable
freq : 24000000
5.17.7.4. MIPI
无法进入 HS,MIPI start error
MIPI 无法

可能
1. Sensor 没有
Slave mode:
Sensor 为 slave mode,需要
外界 trigger 信号 才能 正常 出流 检查 trigger 信号
配置 并 测量 trigger 信号 是否 产生
Master mode:
Sensor start 会
自动 调用 给 sensor 写入 寄存器,会 主动 出流 使用
示波器 测量 MIPI data lane 确定 是否 有 数据 没有
数据 需要 确认 stream_on_setting 开流 寄存器 是否 配置 正确
2. Sensor 提前
Sensor setting 中
可能 会 有 出流 的 配置,sensor init 后 便 会 自己 出流 这种
情况 不 满足 X5 MIPI 时序 要求,需要 将 sensor setting 中 的 出流 配置 注释 掉,在 sensor_start 中 出 流 static uint32_t sc230ai_linear_init_setting[] = { .... // 0x0100,0x01, // 在 setting 最后不包含 开流 的配置 } static uint32_t sc230ai_stream_on_setting[] = { 0x0100,0x01, };
如果 sensor 特性
要求 必须 在 sensor setting 中有 出流 配置,则 需要 手动 跳过 HS check
跳过 HS check 方法:
临时
# 注意需要把 mipi host 换成对应的端口号
echo 1 > /sys/class/vps/mipi_host0/param/stop_check_instart
集成
static mipi_config_t mipi_config = {
.rx_enable = 1,
...
.rx_ex_mask = 0x40,
.rx_attr_ex = {
.stop_check_instart = 1,
}
};
MIPI 报错
MIPI PHY Fatal 报错

MIPI PHY fatal 报错,为 MIPI 物理层
MIPI 参数确定
Framelength (VTS)
定义:
帧
长,表示 camera 一帧 曝光 多少 行 包括
有效 高度 和 消隐 区 (VBlank) 的 行 数
获取
寄存器
读取(推荐): Sensor spec 中
一般 会 提供 读取 帧 长 的 寄存器 在 sensor 完成
初始化 后,读取 该 寄存器 并打印 出来
示波器
测量: 如果 sensor spec 没有
提供,需要 实际 测量 MIPI data 管脚,一般 示波器 测量 的 图 如下:

蓝色
圈内 为 有效 信号: 32ms,红色 圈内 为 blanking 信号,长度: 68ms,总长度 为:100ms 图像 height 为 1080,则
传输 1080 个 pixel 用 了 32ms,则 加上 blanking 传输 的 pixel,可 计算 出: framelength = 1080 * 100 / 32 = 3375
Linelength (HTS)
定义:
行长,表示 camera 曝光
一行 有 多少 个 pixel 包括
有效 宽度 和 消隐 区 (HBlank) 的 宽度
获取
寄存器
读取(推荐): Sensor spec 中
一般 会 提供 读取 行长 的 寄存器 在 sensor 完成
初始化 后,读取 该 寄存器 并打印 出来
示波器
测量: 如果 sensor spec 没有
提供,需要 实际 测量 MIPI data 管脚,一般 示波器 测量 的 图 如下:

蓝色
圈内 是 一行 有效 数据信号,长度 为 24.2us,红色 圈内 为 blanking 信号,长度:5.4us,总长度 为 24.2 + 5.4 = 29.6us 图像 width 为 1920,则
传输 1920 个 pixel 用 了 24.2us,则 带上 blanking 传输 的 pixel,可以 计算 出: linelength = 1920 * 29.6 / 24.2 = 2348
MIPI CLK
说明:
Sensor 为 MIPI TX 端,X5 SOC 为 MIPI RX 端
MIPI clk 由 sensor 端
决定,配置 一般 可 由 Sensor 原厂 FAE 获取
配置
X5 MIPI clk 为
双 边沿 采样,是 实际 物理 上(或 示波器 上 测量 的 信号 频率)的 2 倍 且
为 多个 lane 的 clk 总和 计算公式:
X5 mipi clk = 2 * lane 数量 * 物理 clk示例:sensor 2 lane 配置,物理
上 每条 lane 的 物理 clk 为 500M 则:
X5 mipi clk = 2 * 2 * 500M = 2000M,配置填写 2000 硬件
条件 允许 的 情况 下,也 可以 使用 差分 示波器 进行 测量
Settle
定义:
Settle 是 MIPI 协议
中 的 概念,先 简单 介绍 一下 settle 信号: 
MIPI 从 LP 进入
到 HS 状态 时,硬件 信号 上 可能 会 有 一个 脉冲 信号 MIPI 接收器
则 需要 通过 延时 settle time,避开 这个 脉冲 信号,再 打开 接收器,接收 MIPI 数据 SETTLE 值
由 prepare 和 部分 zero 信号 组成,如上图 所示
获取
1. 使用
可以
使用 默认值 0,MIPI 驱动 中 会 自动 计算 一个 能够 运行 的 settle 值
2. 试错
Settle 值
是 一个 范围 [0-120] 如果
设置 不 正确 则 会 报 MIPI phy_fatal 错误,类似 下图 所示: 
所以
我们 可以 通过 试错 法来 找到 该 范围 一般
调试 阶段,可以 从 0 - 120 之间 数值 尝试,低于 某个 值 A 会 报 该 错误,高于 某个 值 B 也 会 报该 错误,则 settle 取 [A B] 的 中间 值
3. 实际
可以
使用 示波器 抓取 MIPI data lane(D+ 和 D- 两条 lane 需要 同时 测量) 从 LP 到 HS 的 过程,根据 波形 直接 测量 settle 时 长 对应 的 数值,一般 示波器 测量 图 如下: 
蓝色
圈内,为 hs-preapre = 14ns 红色
圈内,为 hs-zero = 154ns 单位
时间 UI = 1s / (MIPI 物理 单个 lane clk / 2) = 1s / (405M / 2) = 4.94 ns min = prepare / UI = 14 / 4.94 = 3 UI
max = (prepare + zero) / UI = (154 + 14) / 4.94 = 34 UI
settle = (min+max) / 2 = 19 UI
如何修改 MIPI 驱动电流
说明:
X5 SOC 端
作为 MIPI RX,无法 修改 MIPI 驱动电流 需要
从 MIPI TX 端(sensor 端)来 修改,请 咨询 sensor FAE
如何查看 HOST(RX) 设备当前运行状态和配置
查看
cat /sys/class/vps/mipi_host0/status/info
查看
cat /sys/class/vps/mipi_host0/status/cfg
如何查看 HOST(RX) 设备寄存器
方法:
通过 sysfs 进行
寄存器 dump,便于 调试
cat /sys/class/vps/mipi_host0/status/regs
如何配置同一个 HOST RX 多 VC sensor 模组
前提条件:
MIPI TX 端(sensor 模组
端)需要 通过 不同 的 virtual channel 发送数据 例如:vc0 发送 sensor0 数据,vc1 发送 sensor1 数据
配置
1. MIPI 配置

2. VIN 配置

3. 多 VC 输出
如果
需要 多个 VC 都 输出,则 配置 多条 pipeline 每条 pipeline 分别
配置 对应 的 vc_index
如何打开 MIPI 驱动的 log
# 改成对应的 mipi host 端口
# 将 mipi debug 信息输出到 pr_debug
echo 1 > /sys/class/vps/mipi_host0/param/dbg_value
# 打开对应文件的 debug,pr_debug 信息打印到 demgs 和 /dev/kmsg
echo "file hobot_mipi_host.c +p" > /sys/kernel/debug/dynamic_debug/control
echo "file hobot_mipi_host_ops.c +p" > /sys/kernel/debug/dynamic_debug/control
# 注: 若要打印到串口,需将 kernel 的 console 打印等级配到 INFO 以上,如:
echo 8 > /proc/sys/kernel/printk
5.17.7.5. Sensor
Sensor 库 check 或 load error
Sensor 库 check error,说明 sensor 驱动

可能
1. 编译
Sensor 编译
错误,没有 编译 正常,就 push 到 板端 进行 加载
2. 框架
编译
正常,但是 没有 按照 HBN 框架 来 编写 需要
按照 sensor 驱动 文件 添加 规则 来 编写 sensor 驱动
Sensor 作为 slave mode 配置
说明:
如果 sensor 作为 slave mode,则
需要 外部 触发 信号,sensor 才能 正常 曝光,输出 图像 数据
配置
1. 触发
依据
客户 需求,触发 信号 可以 来自 于: 其他
作为 master mode 的 sensor 输出 的 FSYNC 信号 X5 SOC LPWM 管脚
输出 的 信号
触发
信号 的 要求(如高 低电平、最小 脉冲 宽度)请 咨询 Sensor 原厂 FAE
2. Sensor setting:
Sensor 作为 slave mode,需要
修改 对应 的 init setting 可能
需要 修改 power on/power off setting 等 请
咨询 Sensor 原厂 FAE
3. 无
配置
完成 后,如果 没有 触发 信号,sensor 无法 正常 出图 MIPI 可能
会 报 无法 进入 HS 的 错误 可以
配置 MIPI nocheck 属性,参考 如下: 
或者
# 以 host0/rx0 为例,实际需要换成对应的 mipi rx 端口
echo 1 > /sys/class/vps/mipi_host0/param/nocheck
如何配置 yuv sensor ?
yuv 排列
planar:把 Y 数据,U 数据
和 V 数据 单独 放置3块 位置,形成3个 平面。 semi-planar:把 Y 数据
独立,UV 数据 放在 一起,形成2个 平面。 packed:YUV 数据
打包 在 一起,无论 单独 的 Y 数据 U 数据 还是 V 数据,地址 都 不是 连续 的。
yuv 命名
YUVxxxP,YUVxxxSP:比如:YUV422P,YUV420SP。根据 planar,semi-planer 和 packed 的
类型 来 定义 的。planar 就是P,注意 顺序 都 是 Y 前 U 中 V 后。semi-planar 就是 SP,注意 顺序 都 是 Y 前 UV 后。 Ixxx:比如:I422,I420。planar 的
别称,I422 就是 YUV422P,I420 就是 YUV420P。 NVxx,YVxx:比如:NV12,NV21,NV16,YV12。NV 代表
属于 semi-planar,12代表 一个 像素 所 占 的 实际 bits。NV12 是 YUV420SP,每个 像素 占据1个 Y(8Bit)+1/4 个UV(8 * 2 / 4 = 4bit) =12bits。
添加 yuv sensor, 首先
8bit YUV422SP(semi-planar): 又
称为 NV16,Y 单独 占 一块 地方,U、V紧 挨着 排 在 一起,占 一块 地方,且 U 前 V 后,即 YYYYYYY…….UVUVUVUV……,sensor 及 mipi 配置 中,format 填写 0x1E,pack_mode 填写 2,stride 为 1倍 的 width。 8bit YUV422P(packed): 又
称为 YUYV422,YUV 4:2:2 采样,YUV 共 占 一块 地方,按 像素点 交错 存储,如 YUVYUVYUVYUV,sensor 及 mipi 配置 中,format 填写 0x1E,pack_mode 填写 1,stride 为 2倍 的 width。 8bit YUV420SP(semi-planar): 又
称为 NV12,Y 单独 占 一块 地方,U、V紧 挨着 排 在 一起,占 一块 地方,且 U 前 V 后,即 YYYYYYY…….UVUVUVUV……,sensor 及 mipi 配置 中,format 填写 0x18, pack_mode 填写 2,stride 为 1倍 的 width。
如需
注意,yuv sensor 接入
5.17.7.6. 图像
Dump 出的图带竖条纹问题
出图


原因:
有组 DATA LANE 的 P/N 接反
MIPI 数据
是 按 byte 拆分 给 各 lane 传输 的,最后 再 组包 解析 任何
一个 DATA LANE 有 问题,都 会 报出 CRC 问题 若
只 某 一 LANE 上 有 接反 问题,则 会 出现 上述 出图 有 一定 规律 竖 条纹(每隔 几个 byte 有 1 个 异常 byte 值)
解决
检查
硬件 连接,确认 DATA LANE 的 P/N 是否 正确 连接
5.17.7.7. gain 索引值和 增益倍率 对照表
ISP(图像
信号处理器)的 3A(自动 曝光/自动 白平衡/自动 对焦)算法 需要 控制 sensor 的 增益(gain)。但 ISP 和 sensor 使用 不同 的 增益 表示 方式: ISP 增益
以倍率(ratio) 表示(如 1x, 2x, 4x,255x),会 将 倍率 转换 为 0-255 的 索引 传递值 给 sensor 驱动
转换
下面
| 索引 (x) | 增益 |
索引 (x) | 增益 |
索引 (x) | 增益 |
索引 (x) | 增益 |
|---|---|---|---|---|---|---|---|
| 0 | 1.000 | 64 | 4.000 | 128 | 16.000 | 192 | 64.000 |
| 1 | 1.022 | 65 | 4.088 | 129 | 16.350 | 193 | 65.401 |
| 2 | 1.044 | 66 | 4.177 | 130 | 16.708 | 194 | 66.834 |
| 3 | 1.067 | 67 | 4.269 | 131 | 17.074 | 195 | 68.297 |
| 4 | 1.091 | 68 | 4.362 | 132 | 17.448 | 196 | 69.792 |
| 5 | 1.114 | 69 | 4.458 | 133 | 17.830 | 197 | 71.321 |
| 6 | 1.139 | 70 | 4.555 | 134 | 18.221 | 198 | 72.882 |
| 7 | 1.164 | 71 | 4.655 | 135 | 18.620 | 199 | 74.478 |
| 8 | 1.189 | 72 | 4.757 | 136 | 19.027 | 200 | 76.109 |
| 9 | 1.215 | 73 | 4.861 | 137 | 19.444 | 201 | 77.776 |
| 10 | 1.242 | 74 | 4.967 | 138 | 19.870 | 202 | 79.479 |
| 11 | 1.269 | 75 | 5.076 | 139 | 20.305 | 203 | 81.219 |
| 12 | 1.297 | 76 | 5.187 | 140 | 20.749 | 204 | 82.998 |
| 13 | 1.325 | 77 | 5.301 | 141 | 21.204 | 205 | 84.815 |
| 14 | 1.354 | 78 | 5.417 | 142 | 21.668 | 206 | 86.672 |
| 15 | 1.384 | 79 | 5.536 | 143 | 22.143 | 207 | 88.570 |
| 16 | 1.414 | 80 | 5.657 | 144 | 22.627 | 208 | 90.510 |
| 17 | 1.445 | 81 | 5.781 | 145 | 23.123 | 209 | 92.492 |
| 18 | 1.477 | 82 | 5.907 | 146 | 23.629 | 210 | 94.517 |
| 19 | 1.509 | 83 | 6.037 | 147 | 24.147 | 211 | 96.587 |
| 20 | 1.542 | 84 | 6.169 | 148 | 24.675 | 212 | 98.701 |
| 21 | 1.576 | 85 | 6.304 | 149 | 25.216 | 213 | 100.863 |
| 22 | 1.610 | 86 | 6.442 | 150 | 25.768 | 214 | 103.071 |
| 23 | 1.646 | 87 | 6.583 | 151 | 26.332 | 215 | 105.328 |
| 24 | 1.682 | 88 | 6.727 | 152 | 26.909 | 216 | 107.635 |
| 25 | 1.719 | 89 | 6.874 | 153 | 27.498 | 217 | 109.992 |
| 26 | 1.756 | 90 | 7.025 | 154 | 28.100 | 218 | 112.400 |
| 27 | 1.795 | 91 | 7.179 | 155 | 28.715 | 219 | 114.861 |
| 28 | 1.834 | 92 | 7.336 | 156 | 29.344 | 220 | 117.377 |
| 29 | 1.874 | 93 | 7.497 | 157 | 29.987 | 221 | 119.947 |
| 30 | 1.915 | 94 | 7.661 | 158 | 30.643 | 222 | 122.573 |
| 31 | 1.957 | 95 | 7.829 | 159 | 31.314 | 223 | 125.257 |
| 32 | 2.000 | 96 | 8.000 | 160 | 32.000 | 224 | 128.000 |
| 33 | 2.044 | 97 | 8.175 | 161 | 32.701 | 225 | 130.803 |
| 34 | 2.089 | 98 | 8.354 | 162 | 33.417 | 226 | 133.667 |
| 35 | 2.134 | 99 | 8.537 | 163 | 34.148 | 227 | 136.594 |
| 36 | 2.181 | 100 | 8.724 | 164 | 34.896 | 228 | 139.585 |
| 37 | 2.229 | 101 | 8.915 | 165 | 35.660 | 229 | 142.642 |
| 38 | 2.278 | 102 | 9.110 | 166 | 36.441 | 230 | 145.765 |
| 39 | 2.327 | 103 | 9.310 | 167 | 37.239 | 231 | 148.957 |
| 40 | 2.378 | 104 | 9.514 | 168 | 38.055 | 232 | 152.219 |
| 41 | 2.430 | 105 | 9.722 | 169 | 38.888 | 233 | 155.552 |
| 42 | 2.484 | 106 | 9.935 | 170 | 39.739 | 234 | 158.958 |
| 43 | 2.538 | 107 | 10.152 | 171 | 40.610 | 235 | 162.439 |
| 44 | 2.594 | 108 | 10.375 | 172 | 41.499 | 236 | 165.995 |
| 45 | 2.650 | 109 | 10.602 | 173 | 42.408 | 237 | 169.630 |
| 46 | 2.709 | 110 | 10.834 | 174 | 43.336 | 238 | 173.345 |
| 47 | 2.768 | 111 | 11.071 | 175 | 44.285 | 239 | 177.140 |
| 48 | 2.828 | 112 | 11.314 | 176 | 45.255 | 240 | 181.019 |
| 49 | 2.890 | 113 | 11.561 | 177 | 46.246 | 241 | 184.983 |
| 50 | 2.954 | 114 | 11.815 | 178 | 47.258 | 242 | 189.034 |
| 51 | 3.018 | 115 | 12.073 | 179 | 48.293 | 243 | 193.173 |
| 52 | 3.084 | 116 | 12.338 | 180 | 49.351 | 244 | 197.403 |
| 53 | 3.152 | 117 | 12.608 | 181 | 50.431 | 245 | 201.726 |
| 54 | 3.221 | 118 | 12.884 | 182 | 51.536 | 246 | 206.143 |
| 55 | 3.292 | 119 | 13.166 | 183 | 52.664 | 247 | 210.657 |
| 56 | 3.364 | 120 | 13.454 | 184 | 53.817 | 248 | 215.269 |
| 57 | 3.437 | 121 | 13.749 | 185 | 54.996 | 249 | 219.983 |
| 58 | 3.513 | 122 | 14.050 | 186 | 56.200 | 250 | 224.800 |
| 59 | 3.589 | 123 | 14.358 | 187 | 57.431 | 251 | 229.723 |
| 60 | 3.668 | 124 | 14.672 | 188 | 58.688 | 252 | 234.753 |
| 61 | 3.748 | 125 | 14.993 | 189 | 59.973 | 253 | 239.893 |
| 62 | 3.830 | 126 | 15.322 | 190 | 61.287 | 254 | 245.146 |
| 63 | 3.914 | 127 | 15.657 | 191 | 62.629 | 255 | 250.514 |

5.17.7.8. VTunerClient
连接VTunerClient
1 X5 板端
2 进入
echo 1 > /sys/kernel/debug/isp/tune
./run_tuning.sh --run 4
3 PC 电脑

4 新



5 通过 TCP 连接

注意:IP 地址
6 连接

这里
如何使用 VTunerClient 验证 2A
一、验证
AE(自动
曝光) 确认 写入 Sensor 的 曝光 值 与 增益 寄存器 符合 规格书(Spec)要求。 AWB(自动
白平衡) 若 Sensor 支持 AWB 寄存器 写入,确认 其 写入 值 符合 规格书 要求。
二、X5 ISP AE 调节
Sensor 曝光
输出 图像 后,SOC ISP 会 接收 到 一帧 数据。 ISP 首先
统计 该 帧 数据 的 亮度 信息。 ISP Tuning 中
会 预设 一个 AE Target(目标 亮度 值)。 若
统计 亮度 与 AE Target 不 一致,ISP AE 算法 将 计算 出新 的 曝光 时间 与 增益值,并 通过 驱动 写入 Sensor。 调节
持续 进行,直至 统计 亮度 接近 AE Target。 环境
亮度 变化 会 再次 触发 该 调节 过程。
三、实际
将 AE 模式
切换 为 Manual(手动),以便 观察 与 控制 调节 过程。

如果 Manual Mode View UI 显示

自行

然后