前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >camera调试:RK3588 MIPI/DVP camera关键配置

camera调试:RK3588 MIPI/DVP camera关键配置

作者头像
用户6280468
发布2024-02-26 14:22:13
1.6K0
发布2024-02-26 14:22:13
举报
文章被收录于专栏:txp玩Linuxtxp玩Linux

前言:

上一篇文章介绍了如何在RK3588上面点亮一个sensor,以MIPI camera IMX577为例进行介绍的,从前面的文章也知道,RK3588最多支持6路MIPI camera,一路DVP,因此这篇文章作为补充,分别介绍一下MIPI camera和DVP camera的配置重点。

一、常用camera接口介绍:

按照不同的接口进行分类,常见的camera有:USBcamera、MIPI camera、DVP camera。

①USB camera:

USB Camera常见的数据格式有:YUYV/MJPEG/H.264 YUYV:传输的是YUV数据,数据量很大,分辨率和帧率较低,一般由后端对数据进行再处理,用于一些特殊用途(虹膜、红外人脸识别等)。MJPEG:一般用于分辨率相对较低的USB Camera(720P,VGA),传输数据较大。H.264:一般用于分辨率较高的USB Camera(1080p,720p),传输数据较小。

②MIPI camera:

MIPI为低压差分信号,传输速度快,抗干扰能力强,一般支持800万及以上像素的camera。目前主流手机camera模组都使用MIPI传输,传输时使用4对差分数据信号和1对差分时钟信号。

③DVP camera:

DVP Camera或称为并口Camera,接口如下图所示,一般支持BT601/BT656/BT1120数据的传输。DVP是并口传输,速度相对较慢,传输的带宽较低,一般用于500万像素以下的camera。需要使用PCLK时钟、VSYNC场同步、HSYNC行同步、D[0:11]并口数据,可以是8/10/12bit/16bit数据位大小。

二、RK3588 调试:

①概述:

连接框图如下所示,这边简单介绍一下RK3588 camera配置的关键要点。

根据上述的结构图可以大概看出MIPI和DVP分别是如何连接的,关键点如下:

  • rk3588支持两个dcphy,节点名称分别为csi2_dcphy0/csi2_dcphy1。每个dcphy硬件支持RX/TX同时使用,对于camera输入使用的是RX。支持DPHY/CPHY协议复用;需要注意的是同一个dcphy的TX/RX只能同时使用DPHY或同时使用CPHY。
  • rk3588支持2个dphy硬件,这里我们称之为dphy0_hw/dphy1_hw,两个dphy硬件都可以工作在full mode 和split mode两种模式下。1. dphy0_hw 和 dphy1_hw
    1. full mode:节点名称使用csi2_dphy0 和 csi2_dphy3,最多支持4 lane。
    2. split mode:拆分成2个phy使用,分别为csi2_dphy1(使用0/1 lane)、csi2_dphy2(使用2/3 lane),dphy1_hw 则拆分成csi2_dphy4和csi2_dphy5,每个phy最多支持2 lane。
    3. 当dphy0_hw使用full mode时,链路需要按照csi2_dphy1这条链路来配置,但是节点名称csi2_dphy1需要修改为csi2_dphy0,软件上是通过phy的序号来区分phy使用的模式。dphy1_hw同理。
  • 使用上述mipi phy节点,需要把对应的物理节点配置上;csi2_dcphy0_hw/csi2_dcphy1_hw/csi2_dphy0_hw/csi2_dphy1_hw
  • 每个mipi phy都需要一个csi2模块来解析mipi协议,节点名称分别mipi0_csi2~mipi5_csi2。
  • rk3588所有camera数据都需要通过vicap,再链接到isp。rk3588仅支持一个vicap硬件,这个vicap支持同时输入6路mipi phy,及一路dvp数据,所以我们将vicap分化成rkcif_mipi_lvds~rkcif_mipi_lvds5、rkcif_dvp等7个节点,各个节点的绑定关系需要严格按照框图的节点序号配置。
  • 每个vicap节点与isp的链接关系,通过对应虚拟出的XXX_sditf来指明链接关系。
  • rk3588支持2个isp硬件,每个isp设备可虚拟出多个虚拟节点,软件上通过回读的方式,依次从ddr读取每一路的图像数据进isp处理。对于多摄方案,建议将数据流平均分配到两个isp上。
  • 直通与回读模式:
    1. 直通:指数据经过vicap采集,直接发送给isp处理,不存储到ddr。需要注意的是hdr直通时,只有短帧是真正的直通,长帧需要存在ddr,isp再从ddr读取。
    2. 回读:指数据经过vicap采集到ddr,应用获取到数据后,将buffer地址推送给isp,isp再从ddr获取图像数据。
    3. 再dts配置时,一个isp硬件,如果只配置一个虚拟节点,默认使用直通模式,如果配置了多个虚拟节点默认使用回读模式。

②RK3588 MIPI配置:

RK3588最多情况下可以使用4个2lane,2个4lane的MIPI接口camera,关键配置注意如下:

驱动接口配置:

驱动主要注意g_mbus_config接口的配置,该接口需要配置使用的是DVP接口还是MIPI接口,是MIPI DPHY还是MIPI CPHY,例如IMX577配置为V4L2_MBUS_CSI2_DPHY;其次,若是MIPI接口,该接口还需要配置lane数,IMX577配置为4lane;最后还需要配置虚拟通道数,如IMX577,线性模式配置一个通道,HDR模式则需要配置两个通道,若是多路vc的

代码语言:javascript
复制
static int imx577_g_mbus_config(struct v4l2_subdev *sd, unsigned int pad,
    struct v4l2_mbus_config *config)
{
 struct imx577 *imx577 = to_imx577(sd);
 const struct imx577_mode *mode = imx577->cur_mode;
 u32 lane_num = imx577->bus_cfg.bus.mipi_csi2.num_data_lanes;
 u32 val = 0;
 
 val = 1 << (lane_num - 1) |
  V4L2_MBUS_CSI2_CHANNEL_0 |
  V4L2_MBUS_CSI2_CONTINUOUS_CLOCK;
 if (mode->hdr_mode != NO_HDR)
  val |= V4L2_MBUS_CSI2_CHANNEL_1;
 
 config->type = V4L2_MBUS_CSI2_DPHY;
 config->flags = val;
 
 return 0;
}

dts配置

dts配置可以参考上一篇文章的IMX577的配置,这边主要强调几个重点:

data-lanes:配置lane数,如果是4lane则为<1 2 3 4>,2lane则为<1 2>;

camera-module-name和camera-module-lens-name:RAW sensor跑aiq时会用到;

RAW sensor配置:sensor->csi2_dphy->mipi_csi->rkcif_mipi_lvds ... rkcif_mipi_lvds_stdif->rkisp_vir

YUV/RGB888 sensor的配置:sensor->csi2_dphy->mipi_csi->rkcif_mipi_lvds

YUV或者RGB888的sensor,一般自带isp,直接输出YUV422的图像,不需要经过RK3588的isp,因此直接在vicap级存储到ddr即可。

③RK3588 DVP camera:

RK3588有一个DVP接口,支持BT601/BT656/BT1120等,同样的,如果是RAW的sensor,需要配置到ISP,如果是YUV的,则不需经过ISP,关键配置如下:

BT601接口:

BT601接口配置关键点:

hsync-active/vsync-active必须配置,用于v4l2框架异步注册识别BT601接口,若不配置会识别为BT656接口;

pclk-sample/bus-width可选;

必须在sensor驱动的g_mbus_config接口中,通过flag指明当前sensor的hsync-acitve/vsyncactive/pclk-ative的有效极性,否则会导致无法收到数据;

pinctrl需要引用对,以对bt601相关gpio做相应iomux,否则会导致无法收到数据;

驱动接口配置如下:

代码语言:javascript
复制
static int gc2145_g_mbus_config(struct v4l2_subdev *sd, unsigned int pad_id,
    struct v4l2_mbus_config *config)
{
 struct gc2145 *gc2145 = to_gc2145(sd);
 
  config->type = V4L2_MBUS_PARALLEL;
  config->flags = V4L2_MBUS_HSYNC_ACTIVE_HIGH |
    V4L2_MBUS_VSYNC_ACTIVE_LOW |
    V4L2_MBUS_PCLK_SAMPLE_RISING;
 
 return 0;
}

dts配置与BT656和BT1120基本相同,这里不再重复,参考下面BT656/BT1120即可;

BT656/BT1120:

配置关键点如下:

hsync-active/vsync-active不要配置,否则v4l2框架异步注册时会识别为BT601;

pclk-sample/bus-width可选;

必须在sensor驱动的g_mbus_config接口中,通过flag变量指明当前sensor的pclk-ative的有效极性,否则会导致无法收到数据;

必须实现v4l2_subdev_video_ops中的querystd接口,指明当前接口为ATSC接口,否则会导致无法收到数据;

必须实现RKMODULE_GET_BT656_MBUS_INFO,BT656/BT1120都是调用这个ioctl,接口兼容,实现参考drivers/media/i2c/nvp6158_drv/nvp6158_v4l2.c

pinctrl需要引用对,以对bt656/bt1120相关gpio做相应iomux,否则会导致无法收到数据。

g_mbus_config接口示例代码如下:

代码语言:javascript
复制
static int lt8619c_g_mbus_config(struct v4l2_subdev *sd, unsigned int pad,
        struct v4l2_mbus_config *cfg)
{
 struct lt8619c *lt8619c = to_lt8619c(sd);
 
 cfg->type = V4L2_MBUS_BT656;
 if (lt8619c->clk_ddrmode_en) {
  cfg->flags = RKMODULE_CAMERA_BT656_CHANNELS |
   V4L2_MBUS_PCLK_SAMPLE_RISING |
   V4L2_MBUS_PCLK_SAMPLE_FALLING;
 } else {
  cfg->flags = RKMODULE_CAMERA_BT656_CHANNELS |
   V4L2_MBUS_PCLK_SAMPLE_RISING;
 }
 
 return 0;
}

querystd接口示例如下:

代码语言:javascript
复制
static int lt8619c_querystd(struct v4l2_subdev *sd, v4l2_std_id *std)
{
 struct lt8619c *lt8619c = to_lt8619c(sd);
 
 if (lt8619c->yuv_output_mode == BT656_OUTPUT)
  *std = V4L2_STD_PAL;
 else
  *std = V4L2_STD_ATSC;
 
 return 0;
}

dts配置参考如下:

代码语言:javascript
复制
&i2c2 {
 status = "okay";
 pinctrl-names = "default";
 pinctrl-0 = <&i2c2m4_xfer>;
 
 nvp6158: nvp6158@30 {
  compatible = "nvp6158-v4l2";
  status = "okay";
  reg = <0x30>;
  clocks = <&cru CLK_CIFOUT_OUT>;
  clock-names = "xvclk";
  power-domains = <&power RK3588_PD_VI>;
  pinctrl-names = "default";
  pinctrl-0 = <&cif_clk &cif_dvp_clk &cif_dvp_bus8 &cif_dvp_bus16>;
  // pwr-gpios = <&gpio1 RK_PA6 GPIO_ACTIVE_HIGH>;
  pwr2-gpios = <&gpio1 RK_PA5 GPIO_ACTIVE_HIGH>;
  rst-gpios = <&gpio1 RK_PA3 GPIO_ACTIVE_HIGH>;
  // rst2-gpios = <&gpio3 RK_PC1 GPIO_ACTIVE_HIGH>;
  // pwdn-gpios = <&gpio1 RK_PA4 GPIO_ACTIVE_HIGH>;
  // pwdn2-gpios = <&gpio4 RK_PA6 GPIO_ACTIVE_HIGH>;
  rockchip,camera-module-index = <0>;
  rockchip,camera-module-facing = "back";
  rockchip,camera-module-name = "default";
  rockchip,camera-module-lens-name = "default";
  rockchip,dvp_mode = "BT1120"; //BT656 or BT1120 or BT656_TEST
  rockchip,channel_nums = <4>; //channel nums, 1/2/4
  rockchip,dual_edge = <1>; // pclk dual edge, 0/1
  rockchip,default_rect= <1920 1080>; // default resolution
  port {
   nvp6158_out: endpoint {
    remote-endpoint = <&dvp_in_bcam1>;
   };
  };
 };
};
 
&rkcif {
 status = "okay";
};
 
&rkcif_dvp {
 status = "okay";
 ports {
  #address-cells = <1>;
  #size-cells = <0>;
 
  port@0 {
   #address-cells = <1>;
   #size-cells = <0>;
   /* Parallel bus endpoint */
   dvp_in_bcam1: endpoint@1 {
    reg = <1>;
    remote-endpoint = <&nvp6158_out>;
    bus-width = <16>;
   };
  };
 };
};
 
&rkcif_mmu {
 status = "okay";
};

同样的,dts配置中,如果是YUV的sensor,则只需要上述配置,连接到rkcif_dvp节点即可,如果是RAW的sensor,则需要添加rkcif_dvp_sditf节点,并连接到rkisp_vir的节点。

参考:http://t.csdnimg.cn/r7kNF

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-02-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 txp玩Linux 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言:
  • 一、常用camera接口介绍:
    • ①USB camera:
      • ②MIPI camera:
        • ③DVP camera:
        • 二、RK3588 调试:
          • ①概述:
            • ②RK3588 MIPI配置:
              • ③RK3588 DVP camera:
              相关产品与服务
              人脸识别
              腾讯云神图·人脸识别(Face Recognition)基于腾讯优图强大的面部分析技术,提供包括人脸检测与分析、比对、搜索、验证、五官定位、活体检测等多种功能,为开发者和企业提供高性能高可用的人脸识别服务。 可应用于在线娱乐、在线身份认证等多种应用场景,充分满足各行业客户的人脸属性识别及用户身份确认等需求。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档