iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >camera调试:RK3588如何点亮一个sensor?
  • 455
分享到

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

android驱动开发linux 2023-09-08 20:09:25 455人浏览 泡泡鱼
摘要

这篇文章讲一下如何点亮一个新的sensor,以在RK3588平台,点亮IMX577为例。 目录 (1)如何才能算点亮一个sensor? (2)SENSOR_TYPE_RAW和SENSOR_TYPE_SOC (3)sensor驱动移植 ①se

这篇文章讲一下如何点亮一个新的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);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对应的配置如下:

0b57c419cf974753b50e2ecf94236b92.png

(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://blog.csdn.net/qq_34341546/article/details/128875553

--结束END--

本文标题: camera调试:RK3588如何点亮一个sensor?

本文链接: http://www.lsjlt.com/news/400521.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • camera调试:RK3588如何点亮一个sensor?
    这篇文章讲一下如何点亮一个新的sensor,以在RK3588平台,点亮IMX577为例。 目录 (1)如何才能算点亮一个sensor? (2)SENSOR_TYPE_RAW和SENSOR_TYPE_SOC (3)sensor驱动移植 ①se...
    99+
    2023-09-08
    android 驱动开发 linux
  • pycharm如何断点调试
    在 pycharm 中进行断点调试,包括:打开调试工具栏;设置断点(左侧空白行号区域单击);开始调试(调试器下拉菜单);逐步执行代码(step over、step into、step o...
    99+
    2024-04-18
    pycharm
  • python如何实现断点调试
    这篇文章主要讲解了“python如何实现断点调试”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“python如何实现断点调试”吧!❤  什么是bug(缺陷)软件缺陷就是通常说的bug...
    99+
    2023-07-05
  • php如何设置断点调试
    这篇文章主要介绍了php如何设置断点调试的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇php如何设置断点调试文章都会有所收获,下面我们一起来看看吧。一、什么是断点调试断点调试是一种程序调试方式,它可以暂停程序的...
    99+
    2023-07-05
  • linux如何调试多个文件
    在Linux中,您可以使用调试器来调试多个文件。以下是一些常见的方法和工具:1. 使用gdb调试器:gdb是一个功能强大的调试器,可...
    99+
    2023-09-13
    linux
  • fiddler js断点调试如何设置
    要设置Fiddler的JavaScript断点调试,您可以按照以下步骤进行操作:1. 打开Fiddler并启动Web会话。2. 在F...
    99+
    2023-09-21
    js fiddler
  • Linux调试器中如何实现断点
    这篇文章将为大家详细讲解有关Linux调试器中如何实现断点,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。系列索引随着后面文章的发布,这些链接会逐渐生效。准备环境断点寄存器和内存Elves 和 dwarve...
    99+
    2023-06-28
  • 如何使用断点调试 Golang 函数?
    在 go 中使用 breakpoint 包进行断点调试:在要调试的行前添加 breakpoint 代码设置断点。使用 debugger.clearbreakpoint(&brea...
    99+
    2024-04-17
    调试 golang git
  • pycharm如何设置断点调试程序
    在 pycharm 中设置断点调试程序需要以下步骤:添加断点:在代码行单击鼠标左键,然后选择 "toggle breakpoint"。启动调试器:选择 "run" > "debug...
    99+
    2024-04-18
    pycharm
  • 如何在Eclipse中设置断点调试
    这篇文章给大家介绍如何在Eclipse中设置断点调试,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1  Debug视图1.1 线程堆栈视图  线程堆栈视图表示当前线程的堆栈,从中可以看出在...
    99+
    2023-05-31
    eclipse 中设置
  • 如何在一个解决方案中对webAPi进行调试/单元测试
    要在一个解决方案中对Web API进行调试和单元测试,可以按照以下步骤进行:1. 使用一个开发工具,如Visual Studio,创...
    99+
    2023-09-26
    webAPi
  • 调试JavaScript代码中如何手动断点
    小编给大家分享一下调试JavaScript代码中如何手动断点,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!手动断点断点是程序员调试代码时非常好用的利器,通过断点调...
    99+
    2023-06-27
  • vue中的代码如何进行断点调试
    目录vue代码进行断点调试下面开始调试总结vue代码进行断点调试 对于这样的代码,我们打两个断点,想要调试的话,需要在项目根目录,新建一个文件:vue.config.js,然后根据...
    99+
    2023-05-17
    vue代码 vue代码断点调试 vue断点调试
  • IDEA断点调试不起作用如何解决
    本文小编为大家详细介绍“IDEA断点调试不起作用如何解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“IDEA断点调试不起作用如何解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。IDEA断点调试,断点不起作用...
    99+
    2023-07-05
  • IDEA Debug如何实现多线程调试断点
    这篇文章主要介绍了IDEA Debug如何实现多线程调试断点,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。多线程调试断点Intellij IDEA 的debug断点...
    99+
    2023-06-27
  • eclipse中如何测试一个方法
    在Eclipse中,有多种方法可以测试一个方法。以下是其中几种常见的方法: 使用JUnit进行单元测试:JUnit是一个广泛使用的...
    99+
    2023-10-22
    eclipse
  • php如何去掉第一个点
    这篇文章主要讲解了“php如何去掉第一个点”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“php如何去掉第一个点”吧!去掉方法:1、用stripos()获取第一个点的出现位置,语法“strip...
    99+
    2023-06-30
  • C++ 函数调试详解:如何使用断点和观察点?
    c++++ 函数调试详解掌握断点和观察点能有效调试代码:断点:在代码执行时暂停程序的特定位置;观察点:在变量值发生变化时触发暂停。使用断点逐行执行代码,使用观察点监视变量变化。结合使用断...
    99+
    2024-05-04
    c++ 函数调试
  • 如何用一个printf()调用实现一个web服务器
    这篇文章将为大家详细讲解有关如何用一个printf()调用实现一个web服务器,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一...
    99+
    2024-04-02
  • 如何浅析Visual Studio调试中断点的设置
    本篇文章给大家分享的是有关如何浅析Visual Studio调试中断点的设置,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。我曾经问过很多人,你一般是怎么调试你的程序的?F9, ...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作