camera调试:RK3588如何点亮一个sensor?

这篇具有很好参考价值的文章主要介绍了camera调试:RK3588如何点亮一个sensor?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

这篇文章讲一下如何点亮一个新的sensor,以在RK3588平台,点亮IMX577为例。

目录

(1)如何才能算点亮一个sensor?

(2)SENSOR_TYPE_RAW和SENSOR_TYPE_SOC

(3)sensor驱动移植

①sensor寄存器配置

②sensor上电时序

③v4l2_subdev_ops相关回调函数实现

④V4L2控制

⑤驱动注册入口函数probe

(4)dts配置解析

(5)驱动调试

(6)安卓cameraHAL注册sensor

(7)总结


(1)如何才能算点亮一个sensor?

①sensor的chipID可以通过i2c正确读取到,也就是i2c可以正常通信;

②使用media-ctl工具可以看到pipeline,可以看到sensor具体的分辨率和格式;

③使用V4L2工具抓图没有报错,有正常的数据输出,且使用V4L2的命令可以实现曝光增益等的控制,即可认为驱动没问题;

④xml配置SOC模式下,使用apk可以预览出图(图像可能会偏暗偏绿,后续再讲xml如何配置),到这一步可认为HAL没问题;

⑤自行移植其他sensor的效果文件,可以出图(图像效果可能会有异常,后续再讲如何初步修改效果文件),到这一步接下去就可以开始sensor的效果调试,如果需要找RK调试效果,也必须进行到这一步。

(2)SENSOR_TYPE_RAW和SENSOR_TYPE_SOC

这是配置给cameraHAL,确认sensor是什么类型。

SENSOR_TYPE_RAW:一般是RAWRGB的sensor,需要turnning 3A效果才能正常出图,需要正确的效果文件路径,才可以使用;

SENSOR_TYPE_SOC:一般是输出YUV或者RGB888/RGB565之类的sensor,不需要跑3A效果,一般用于自带ISP的sensor,不需要效果文件就可以使用;

一般调试RAW sensor过程中,如果使用V4L2已经可以抓图,那么可以先将sensor配置成SENSOR_TYPE_SOC模式,确认不跑3A情况下是否可以出图。

(3)sensor驱动移植

sensor的驱动位于drivers/media/i2c下,sensor驱动和RKCIF、RKISP控制器的驱动独立,二者异步注册,通过v4l2和media-framework框架,将pipeline连接。这里主要介绍一下sensor驱动的代码,dts配置等。sensor驱动主要分为几个部分:

①sensor寄存器配置

在supported_modes来定义不同的初始化mode,主要配置分辨率、图像格式、帧率、寄存器初始化列表等等,寄存器初始化列表,可直接按照厂家提供的填写。hts_def和vts_def可直接按照寄存器初始化列表填入值即可,exp_def可以看下datesheet是否有默认值,或者一般填写比vts略小。

static const struct imx577_mode supported_modes[] = {
	{
		.width = 4056,
		.height = 3040,
		.max_fps = {
			.numerator = 10000,
			.denominator = 300000,
		},
		.exp_def = 0x0c10,
		.hts_def = 0x2318,
		.vts_def = 0x0c2c,
		.bpp = 10,
		.bus_fmt = MEDIA_BUS_FMT_SRGGB10_1X10,
		.reg_list = imx577_linear_10bit_4056x3040_30fps_regs,
		.hdr_mode = NO_HDR,
		.link_freq_idx = 1,
		.vc[PAD0] = V4L2_MBUS_CSI2_CHANNEL_0,
	},

②sensor上电时序

不同的sensor上电时序不同,有的sensor对时序要求不严格,有的sensor则需要严格按照时序进行上电,否则可能会出现i2c不通的现象。

sensor的datasheet一般都有上电时序图,驱动代码中,按照时序配置即可,imx577上电时序如下,同样的,下电时序也需要按照datasheet描述实现。

static int __imx577_power_on(struct imx577 *imx577)
{
	int ret;
	u32 delay_us;
	struct device *dev = &imx577->client->dev;

	if (!IS_ERR(imx577->power_gpio))
		gpiod_set_value_cansleep(imx577->power_gpio, 1);

	usleep_range(1000, 2000);

	if (!IS_ERR_OR_NULL(imx577->pins_default)) {
		ret = pinctrl_select_state(imx577->pinctrl,
					   imx577->pins_default);
		if (ret < 0)
			dev_err(dev, "could not set pins\n");
	}
	ret = clk_set_rate(imx577->xvclk, IMX577_XVCLK_FREQ);
	if (ret < 0)
		dev_warn(dev, "Failed to set xvclk rate (24MHz)\n");
	if (clk_get_rate(imx577->xvclk) != IMX577_XVCLK_FREQ)
		dev_warn(dev, "xvclk mismatched, modes are based on 24MHz\n");
	ret = clk_prepare_enable(imx577->xvclk);
	if (ret < 0) {
		dev_err(dev, "Failed to enable xvclk\n");
		return ret;
	}
	if (!IS_ERR(imx577->reset_gpio))
		gpiod_set_value_cansleep(imx577->reset_gpio, 0);

	ret = regulator_bulk_enable(IMX577_NUM_SUPPLIES, imx577->supplies);
	if (ret < 0) {
		dev_err(dev, "Failed to enable regulators\n");
		goto disable_clk;
	}

	if (!IS_ERR(imx577->reset_gpio))
		gpiod_set_value_cansleep(imx577->reset_gpio, 1);

	usleep_range(500, 1000);
	if (!IS_ERR(imx577->pwdn_gpio))
		gpiod_set_value_cansleep(imx577->pwdn_gpio, 1);

	/* 8192 cycles prior to first SCCB transaction */
	delay_us = imx577_cal_delay(8192);
	usleep_range(delay_us, delay_us * 2);

	return 0;

disable_clk:
	clk_disable_unprepare(imx577->xvclk);

	return ret;
}

③v4l2_subdev_ops相关回调函数实现

v4l2_subdev_ops是框架控制sensor驱动的核心,这里介绍一下几个必不可少的回调函数:

  • .s_power,上下电函数,camera上下电的时候会调用这个地方。一般会用到pm_rntime来管理。

  • .ioctl,提供ioctl的接口。

  • s_stream,开关数据流的接口,包括stream on和stream off

  • .enum_mbus_code,枚举驱动支持的图像格式。

  • .enum_frame_size,枚举驱动支持的分辨率

  • .enum_frame_interval,这里除了反馈驱动支持的格式分辨率帧率以外,还有HDR模式的时候,也需要通过fie->reserved[0]成员进行反馈。

  • .get_fmt,获取sensor当前的format

  • .set_fmt,设置sensor的format

  • .get_selection,获取裁减信息

  • .get_mbus_config,获取bus配置,包括mipi/dvp接口,lane数,极性等等。

④V4L2控制

一般raw sensor需要控制exposure、gain、vblank等等,所以需要实现对应的接口函数

  • imx577_initialize_controls声明该驱动需要哪些control,并设置调整范围等信息。
  • imx577_set_ctrl接口,实现对exposure、gain、vblank的控制。

⑤驱动注册入口函数probe

在驱动注册的函数中,除了对dts的解析,获取时钟电源等等,比较重要的是media entity、V4L2 subdev的注册。关键点如下:

  • v4l2_i2c_subdev_init(),注册为一个 v4l2 subdev,参数中提供回调函数。
  • imx577_initialize_controls 初始化 v4l2 controls。
  • media_entity_init(),注册成为一个 media entity。
  • v4l2_async_register_subdev(),声明 Sensor 需要异步注册。因为 RKISP 及 RKCIF 都采用异步注册Sub Device,所以需要这个调用。

(4)dts配置解析

&csi2_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 = <&imx577_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 = <&mipi2_csi2_input>;
				data-lanes = <1 2 3 4>;
			};
		};
	};
};

&i2c3 {
	status = "okay";
	pinctrl-0 = <&i2c3m0_xfer>;

	imx577: imx577@1a {
		compatible = "sony,imx577";
		reg = <0x1a>;
		clocks = <&cru CLK_MIPI_CAMARAOUT_M3>;
		clock-names = "xvclk";
		pinctrl-names = "default";
		pinctrl-0 = <&mipim0_camera3_clk>;
		power-domains = <&power RK3588_PD_VI>;
		pwdn-gpios = <&gpio1 RK_PB3 GPIO_ACTIVE_HIGH>;
		// reset-gpios = <&gpio1 RK_PA7 GPIO_ACTIVE_HIGH>;
		// power-gpios = <&gpio1 RK_PA7 GPIO_ACTIVE_HIGH>;
		avdd-supply = <&vcc_mipicsi0>;
		rockchip,camera-module-index = <0>;
		rockchip,camera-module-facing = "back";
		rockchip,camera-module-name = "default";
		rockchip,camera-module-lens-name = "default";
		port {
			imx577_out0: endpoint {
				remote-endpoint = <&mipi_in_ucam0>;
				data-lanes = <1 2 3 4>;
			};
		};
	};
};

&csi2_dphy0_hw {
	status = "okay";
};

&mipi2_csi2 {
	status = "okay";

	ports {
		#address-cells = <1>;
		#size-cells = <0>;

		port@0 {
			reg = <0>;
			#address-cells = <1>;
			#size-cells = <0>;

			mipi2_csi2_input: endpoint@1 {
				reg = <1>;
				remote-endpoint = <&csidphy0_out>;
				data-lanes = <1 2 3 4>;
			};
		};

		port@1 {
			reg = <1>;
			#address-cells = <1>;
			#size-cells = <0>;

			mipi2_csi2_output: endpoint@0 {
				reg = <0>;
				remote-endpoint = <&cif_mipi_in2>;
				data-lanes = <1 2 3 4>;
			};
		};
	};
};
&rkcif {
	status = "okay";
};
&rkcif_mipi_lvds2 {
	status = "okay";

	port {
		cif_mipi_in2: endpoint {
			remote-endpoint = <&mipi2_csi2_output>;
		};
	};
};

&rkcif_mipi_lvds2_sditf {
	status = "okay";

	port {
		mipi_lvds2_sditf: endpoint {
			remote-endpoint = <&isp0_vir0>;
		};
	};
};

&rkcif_mmu {
	status = "okay";
};

&rkisp0 {
	status = "okay";

};

&isp0_mmu {
	status = "okay";
};

&rkisp0_vir0 {
	status = "okay";
	// rockchip,hw = <&rkisp_unite>;

	port {
		#address-cells = <1>;
		#size-cells = <0>;

		isp0_vir0: endpoint@0 {
			reg = <0>;
			remote-endpoint = <&mipi_lvds2_sditf>;
		};
	};
};

dts的配置主要是pipeline的配置,可参考RK官方的描述,7路camera对应的配置如下:

.hts camera,camera调试,android,驱动开发,linux

(5)驱动调试

sensor的驱动调试主要有以下关键点:

①移植sensor驱动:参考上述的介绍进行驱动代码的移植;

②根据使用的mipi接口来配置对应的dts,rk3588支持多个camera,因此这个步骤必须正确;

③确认i2c是否通讯成功,i2c通信成功才能正确设置sensor的寄存器;

④media-ctl 工具查看拓扑结构是否正常

⑤使用V4L2抓取图像,设置exp、gain等参数可以生效。

(6)安卓cameraHAL注册sensor

驱动调试完毕,还需要再HAL注册sensor,才能使用apk点亮。HAL获取sensor是通过解析xml文件的,对应设备的/vendor/etc/camera/camera3_profiles.xml,对应SDK代码的SDK/hardware/rockchip/camera/etc/camera/camera3_profiles_rk3588.xml。

①初步点亮的时候,可以先复制其他sensor的配置,修改name参数,对应驱动代码的中的名字,必须一致;

②修改moduleID参数,该参数对应dts的index,必须一致否则无法注册;

③修改添加该sensor对应的分辨率帧率等。

④dumpsys media.camera命令可以查看是否成功注册sensor,如果没有注册上,一般是xml配置错误,检查name和moduleID这两个属性。

⑤初步调试,还没效果文件,可以先设置SOC模式进行点亮,turnning完毕之后改成RAW模式。

(7)总结

总结一下,一个camera的初步点亮,主要就是驱动、HAL配置完成,即可使用apk预览。后面再详细说一下i2c通信失败排查、常用的调试手段、XML文件的配置解释以及常见的调试问题分析。文章来源地址https://www.toymoban.com/news/detail-829115.html

到了这里,关于camera调试:RK3588如何点亮一个sensor?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • RK3568 Camera点亮

    在现代移动设备中,常用一种接口用来连接SOC和LCD和Camera,这种接口就是MIPI 其中SOC和LCD连接叫 DSI(DisplayCommandSet),SOC和Camera连接叫CSI(DisplaySerialInterface)。 一般情况下,Camera和SOC有两个接口进行连接,分为为MIPI接口和I2C接口,其中MIPI接口用来传输图像的数据,数据传输路

    2024年02月12日
    浏览(52)
  • 53、RK3588测试视频编解码和 POE OAK Camera编码结合开发

    基本思想:一直想学rk3588的视频编解码,奈何没有设备,最近获得机会,利用空闲时间好好研究一番,正好手中的深度相机oak camera支持视频编码,逐想用软解编码和瑞芯微的mpp硬解码去走一波,本实验使用的poe-rj45接口和usb低电压接口测试 测试数据

    2024年02月06日
    浏览(87)
  • 我的NPI项目之Android Camera (二) -- 核心部件之 Camera Sensor

    说到Camera模组,我们比较关心的是用的什么样的sensor? sensor的分辨率多少,sensor的像素多大,sensor是哪家生产的等等一些问题。今天,我们就穿越时间,将sensor的历史扒一扒。 Wikipedia先看一下:history of Camera Camera的历史大体可以分为三大部分 : 核心部件Sensor : Sensor是什么

    2024年02月19日
    浏览(50)
  • RK3588-ES8388音频调试笔记

    本文是基于RK3588平台,音频芯片ES8388调试总结。 外接声卡:ES8388 步骤 ① dts配置 步骤 ② 编译烧写,调试 系统声音配置: ES8388设备驱动配置 查看声卡命令: cat /proc/asound/cards 将wav文件拷贝到板子上: RK Android 播放音乐 ( RK Android SDK 标配 tiny-alsa 工具 ): RK Android 录音: RK Li

    2024年02月16日
    浏览(54)
  • RK3588 - ES8388音频调试笔记

    专栏总目录 本文是基于RK3588平台,音频芯片ES8388调试总结。 外接声卡:ES8388 步骤 ① dts配置 步骤 ② 编译烧写,调试 系统声音配置: ES8388设备驱动配置 查看声卡命令: cat /proc/asound/cards 将wav文件拷贝到板子上: RK Android 播放音乐 ( RK Android SDK 标配 tiny-alsa 工具 ): RK Android

    2024年02月15日
    浏览(80)
  • RK3588-MIPI屏幕调试笔记:RK3588-MIPI-DSI之LCD上电初始化时序

    mipi屏调试一般都要在RK平台的dts中配置屏幕上电初始化时序 :panel-init-sequence和下电初始化时序:panel-exit-sequence。本文讲解如何配置屏幕的这些初始化时序。 注意:这里的parameter并不是指数据字节个数 0x05 命令类型:(DCS Short Write, no parameters) 0x15 命令类型:(DCS Short Write, 1 p

    2024年02月12日
    浏览(92)
  • ArmSoM-W3(RK3588)之调试UART

    专栏总目录 本文主要讲解如何关于RK3588开发板UART的使用和调试方法,包括UART作为普通串口和控制台两种不同使用场景 Rockchip UART (Universal Asynchronous Receiver/Transmitter) 基于16550A串口标准,完整模块支持以下功能: 支持5、6、7、8 bits数据位。 支持1、1.5、2 bits停止位。 支持奇校

    2024年02月10日
    浏览(63)
  • RK3588开发笔记-USB3.0接口调试

    目录 前言 一、资源介绍 二、硬件连接 三、设备树配置

    2024年02月08日
    浏览(43)
  • RK35XX系列(RK3568)Camera 热插拔功能 调试记录

    SOC:RK3568 system:Android12 kernel:kernel-4.19 芯片:NVP6158C xs9922 目前我的主板上NVP6158接入4路Camera走DVP通道,xs9922接入4路AHDCamera走mipi通道 RK kernel-4.19支持xs9922 nvp6158c驱动路径       drivers/media/i2c/xs9922/xs9922.c  drivers/media/i2c/nvp6158_drv/nvp6158_v4l2.c RK支持Camera热插拔复位机制,如果

    2024年02月13日
    浏览(51)
  • ArmSoM-W3之RK3588 - ES8388音频调试笔记

    专栏总目录 本文是基于RK3588平台,音频芯片ES8388调试总结。 外接声卡:ES8388 步骤 ① dts配置 步骤 ② 编译烧写,调试 系统声音配置: ES8388设备驱动配置 查看声卡命令: cat /proc/asound/cards 将wav文件拷贝到板子上: RK Android 播放音乐 ( RK Android SDK 标配 tiny-alsa 工具 ): RK Android

    2024年02月12日
    浏览(225)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包