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 通信正常,就能看到节点

image-20230319193240802

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

image-20230319193535612

先敲命令: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 位地址,
注意不要写错了。

posted @   shydragon  阅读(162)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示