RV1126摄像头调试
摄像头类型
调试摄像头时候首先确定摄像头的接口类型:
- mipi接口:当前主要使用的摄像头接口,速度快,抗干扰强。
- LVDS接口:
- DVP接口:相对于mipi接口,传输速率有限,一般5M或以下的摄像头用这种接口。
...........(待补充)。
数据类型:
不同的摄像头肯能采集到的数据是不同的:
RAW:这种类型是原始数据,一般要经过tuining,来还原数据,效果和摄像头镜头以及tuning参数有很大的关系。
Grey:(灰度图像),可根据需求,是否要调试ae以及lsc。
YUV:不需要tuning,用起来方便,摄像头自带isp或者soc,都输出这种格式。也有一些 特殊的图像转换芯片。
......各种格式的细分待补充。
摄像头的设备数配置
mipi接口的
这里以我手头的瑞芯微的RV1126平台为例sensor为豪威的os04a10:
os04a10: os04a10@36 {
compatible = "ovti,os04a10";
reg = <0x36>;//i2c地址7位
clocks = <&cru CLK_MIPICSI_OUT>;
clock-names = "xvclk";
power-domains = <&power RV1126_PD_VI>;
pinctrl-names = "rockchip,camera_default";
pinctrl-0 = <&mipicsi_clk0>;
//电源
avdd-supply = <&vcc_avdd>;
dovdd-supply = <&vcc_dovdd>;
dvdd-supply = <&vcc_dvdd>;
//power管脚分配以及有效电平
pwdn-gpios = <&gpio1 RK_PD4 GPIO_ACTIVE_HIGH>;
rockchip,camera-module-index = <1>;//定义多个摄像头的时候做个区分不可重复
rockchip,camera-module-facing = "front";//摄像头的前后标识
rockchip,camera-module-name = "CMK-OT1607-FV1";//模块名
rockchip,camera-module-lens-name = "M12-40IRC-4MP-F16";//镜头名
//模块名和镜头名,主要是通过这个功能的关键字找对应的效果文件xxx.xml,YUV格式的设备不需要这个文件。
ir-cut = <&cam_ircut0>;//这个是滤光片就是摸个io的拉低拉高。//他有单独的设备树
port {
ucam_out0: endpoint {
remote-endpoint = <&mipi_in_ucam0>;
data-lanes = <1 2 3 4>;
};
};
};
port是摄像头在内部的级联关系。默认为:
sensor0 -> csi_dphy0 -> ivcap -> isp0 -> ispp0
&csi_dphy0 {
status = "okay";
ports {
#address-cells = <1>;
#size-cells = <0>;
port@0 {
reg = <0>;
#address-cells = <1>;
#size-cells = <0>;
mipi_in_ucam0: endpoint@1 {
reg = <1>;
remote-endpoint = <&ucam_out0>;
data-lanes = <1 2 3 4>;
};
};
port@1 {
reg = <1>;
#address-cells = <1>;
#size-cells = <0>;
csidphy0_out: endpoint@0 {
reg = <0>;
remote-endpoint = <&mipi_csi2_input>;
};
};
};
};
//====================我是分割线=======================//
&rkisp {
status = "okay";
};
&rkisp_vir0 {
status = "okay";
ports {
port@0 {
reg = <0>;
#address-cells = <1>;
#size-cells = <0>;
isp_in: endpoint@0 {
reg = <0>;
remote-endpoint = <&mipi_lvds_sditf>;
};
};
};
};
//=========================我是分割线===========================//
&rkispp {
status = "okay";
/* the max input w h and fps of mulit sensor */
//max-input = <2688 1520 30>;
};
如果是两个摄像头直接在rv1109-evb-ddr3-v12-facial-gate.dts
中去修改。
sensor0->csi_dphy0->csi2->vicap->isp1->ispp1
sensor1->csi_dphy1->isp0->ispp0
注意lane的修改。
DVP接口:
可以参照ar0230来:
具体分析:还未使用过(暂时略)。
驱动参数说明:
以os04a10为例子:
影响数据接收的:
Mipi的频率:
#define MIPI_FREQ_360M 360000000
#define MIPI_FREQ_648M 648000000
#define PIXEL_RATE_WITH_360M (MIPI_FREQ_360M * 2 / 10 * 4)
#define PIXEL_RATE_WITH_648M (MIPI_FREQ_648M * 2 / 12 * 4)
os04a10支持 raw10 和 raw12 数据输出, 对应有两种 mipi 输出频率,分别是raw10 使用 360M
raw12 使用 648M,对应 pix_rate 是 mipi 频率 * 2(双沿采样)/10(bit 位)* 4(lane 数)
mipi 都是双沿采样都*2,其他的根据摄像头的参数定,还需要注意 lane 数,并不一定是你接
了 4lane,就一定配置 4lane,有些厂商给的是 2 lane 的寄存器,根据配置,摄像头只有 2lane
输出,所以还是配 2(根据摄像头实际输出定)。
摄像头的寄存器配置
static const struct os04a10_mode supported_modes[] = {
{
.bus_fmt = MEDIA_BUS_FMT_SBGGR10_1X10,//格式
.width = 2688,
.height = 1520,
.max_fps = {
.numerator = 10000, //最大帧率30fps
.denominator = 302834,
},
.exp_def = 0x0240,
.hts_def = 0x02dc * 4, //hts和cts的默认值可以在reg_list中找到
.vts_def = 0x0cb0,
.reg_list = os04a10_linear10bit_2688x1520_regs,
.hdr_mode = NO_HDR,
.vc[PAD0] = V4L2_MBUS_CSI2_CHANNEL_0,
}
}
摄像头id
#define CHIP_ID 0x530441
#define OS04A10_REG_CHIP_ID 0x300a
寄存器和 id,如果读到的值不匹配,节点都注册不上
影响效果的
define OS04A10_REG_EXP_LONG_H 0x3501
#define OS04A10_REG_EXP_MID_H 0x3541
#define OS04A10_REG_EXP_VS_H 0x3581
#define OS04A10_REG_HCG_SWITCH 0x376C
#define OS04A10_REG_AGAIN_LONG_H 0x3508
#define OS04A10_REG_AGAIN_MID_H 0x3548
#define OS04A10_REG_AGAIN_VS_H 0x3588
#define OS04A10_REG_DGAIN_LONG_H 0x350A
#define OS04A10_REG_DGAIN_MID_H 0x354A
#define OS04A10_REG_DGAIN_VS_H 0x358A
#define OS04A10_GAIN_MIN 0x10
#define OS04A10_GAIN_MAX 0xF7C
#define OS04A10_GAIN_STEP 1
#define OS04A10_GAIN_DEFAULT 0x10
这些是曝光和 gian 的寄存器这些但如果在最开始调试的时候,可以把
os04a10_set_hdrae
os04a10_set_conversion_gain
os04a10_init_conversion_gain
以及
case V4L2_CID_EXPOSURE:
case V4L2_CID_ANALOGUE_GAIN
下面这些设置曝光和 gain 的都注释掉
但是在 tuning 前一定要配置正确,主要是注意 gain,gain 设置的寄存器要和 xml 效果文件
里面的公式匹配,具体见 tuning 参数说明文档。
其他参数
#define OS04A10_REG_TEST_PATTERN 0x5080
#define OS04A10_TEST_PATTERN_ENABLE 0x80
#define OS04A10_TEST_PATTERN_DISABLE 0x0
#define OS04A10_REG_VTS 0x380e
//========我是分割线=================//
#define OS04A10_FLIP_REG 0x3820
#define MIRROR_BIT_MASK BIT(1)
#define FLIP_BIT_MASK BIT(2)
这些寄存器直接根据datasheet配置好,分别是测试模式,彩条这些,调试的时候可以用,vts,以及镜像翻转寄存器。
调试手段
拓扑结构
media-ctl 工具:
先看下 ls /dev/media* 可以看看有几个 media 节点
查看拓扑结构的命令为:media-ctl –d /dev/mediaX –p
X 为 0 ,1,2,3…..,有几个 media 节点,就打印几个拓扑出来看看
看看摄像头是否在拓扑结构里,基本上只要 i2c 通信正常,就能看到节点
Os04a10 的拓扑结构为 sensor0->csi_dphy0->csi2->vicap->isp0->ispp0
根据默认的关系 vipcap ,isp 和 ispp 各会有一个 media 节点
们可以换从 vipcap 抓图
注意:我们默认应用会跑起来,提前要先 stop 掉,或者将应用从对应目录移除后重启。
对应 ipc 和闸机的应用分别为
oem/RkLunch.sh
etc/init.d/S06_ QfacialGate
抓原图
vipcap 对应的节点为 video0
先敲命令:echo 0 > /sys/devices/platform/rkcif_mipi_lvds/compact_test
为默认是紧凑型格式,这个命令之后就是正常一点对应 2 个字节
然后抓图
v4l2-ctl -d /dev/video0 --set-fmt-video=width=2688,height=1520,pixelformat=BG10
--stream-mmap=3 --stream-skip=10 --stream-to=/mnt/mp.out --stream-count=1 --stream-poll
这个是抓 raw10 数据,从最开始能抓图的节点,vipcap 不能将格式转换成 yuv,所以用原图
抓。
抓YUV图
经过 isp 和 ispp 处理后,我们可以抓 yuv 图,这个得先有 iq 文件才可以。...........
Debug
打印 log
dev_err(dev, "Unexpected sensor id(%06x), ret(%d)\n", id, ret);
os04a10 1-0036-1: Unexpected sensor id(000000), ret(-5)
i2c 不通,在读取 id 之前
os04a10_power_on(os04a10);会上电,所以操作都在这个函数里,确定在这里面供
电,clk,各管脚都正常了。仔细量了。
如果是其他摄像头要确定 i2c 地址正常,挂在哪个 i2c 通道下面,dts 里面都是 7 位地址,
注意不要写错了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)