LXR | KVM | PM | Time | Interrupt | Systems Performance | Bootup Optimization

Linux v4l2子系统(6):MIPI CSI2

关键词:CSI2、endpoint、Entity、Pad等。

1 CSI2 Host架构图

 2 CSI Host的DTS配置和初始化

    mipi2_csi2: mipi2-csi2@fdd30000 {
        compatible = "rockchip,rk3588-mipi-csi2";
        reg = <0x0 0xfdd30000 0x0 0x10000>;
        reg-names = "csihost_regs";
        interrupts = <GIC_SPI 147 IRQ_TYPE_LEVEL_HIGH>,
                 <GIC_SPI 148 IRQ_TYPE_LEVEL_HIGH>;
        interrupt-names = "csi-intr1", "csi-intr2";
        clocks = <&cru PCLK_CSI_HOST_2>;
        clock-names = "pclk_csi2host";
        resets = <&cru SRST_P_CSI_HOST_2>, <&cru SRST_CSIHOST2_VICAP>;
        reset-names = "srst_csihost_p", "srst_csihost_vicap";
        status = "disabled";
    };

&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>;--来自于csi2_dphy0的csidphy0_out。
                        };
                };

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

                        mipi2_csi2_output: endpoint@0 {
                                reg = <0>;
                                remote-endpoint = <&cif_mipi2_in0>;--输出到rkcif_mipi_lvds2的cif_mipi2_in0。
                        };
                };
        };
};

其中device_id的data部分定义了PAD数量:

static const struct of_device_id csi2_dt_ids[] = {
...
    {
        .compatible = "rockchip,rk3588-mipi-csi2",
        .data = &rk3588_csi2_match_data,
    },
    { /* sentinel */ }
};
MODULE_DEVICE_TABLE(of, csi2_dt_ids);

static const struct csi2_match_data rk3588_csi2_match_data = {
    .chip_id = CHIP_RK3588_CSI2,
    .num_pads = CSI2_NUM_PADS_MAX,--RK3588 PAD数为12。
};

#define CSI2_NUM_PADS_MAX        12

 rkcif_csi2_plat_drv_init进行CSI2 Host初始化:

  • 为CSI HOST2建立subdev设备。
  • 获取硬件资源,创建中断处理函数。
  • 创建Entity的Sink/Source pad。
  • 解析port/endpoint,建立Media Graph。
rkcif_csi2_plat_drv_init
  ->platform_driver_register
    ->csi2_driver
      ->csi2_probe
        ->v4l2_subdev_init--注册操作函数集为csi2_subdev_ops的subdev,设备名称为"rockchip-mipi-csi2"。V4L2_SUBDEV_FL_HAS_DEVNODE表示需要创建device node。
        ->devm_request_irq--获取中断并注册中断处理函数。
          ->rk_csirx_irq1_handler--中断1的处理函数。
          ->rk_csirx_irq2_handler--中断2的处理函数。
        ->csi2_media_init--0作为Sink Pad,其他作为Source Pad。           ->media_entity_pads_init             ->media_gobj_create--创建Media Graph节点,并将起加入到对应列表上。
        ->csi2_notifier
          ->v4l2_async_notifier_init
          ->v4l2_async_notifier_parse_fwnode_endpoints_by_port--解析/mipi2-csi2@fdd30000/ports/port@0/下的所有endpoint。
          ->v4l2_async_subdev_notifier_register
          ->v4l2_async_register_subdev--注册创建v4l2 subdev节点。

 CSI Host作为Subdev的操作函数集如下:

static const struct v4l2_subdev_core_ops csi2_core_ops = {
    .subscribe_event = rkcif_csi2_subscribe_event,
    .unsubscribe_event = v4l2_event_subdev_unsubscribe,
    .s_power = rkcif_csi2_s_power,
    .ioctl = rkcif_csi2_ioctl,
#ifdef CONFIG_COMPAT
    .compat_ioctl32 = rkcif_csi2_compat_ioctl32,
#endif
};

static const struct v4l2_subdev_video_ops csi2_video_ops = {
    .s_stream = csi2_s_stream,
};

static const struct v4l2_subdev_pad_ops csi2_pad_ops = {
    .get_fmt = csi2_get_set_fmt,
    .set_fmt = csi2_get_set_fmt,
    .get_selection = csi2_get_selection,
    .set_selection = csi2_set_selection,
    .get_mbus_config = csi2_g_mbus_config,
};

static const struct v4l2_subdev_ops csi2_subdev_ops = {
    .core = &csi2_core_ops,
    .video = &csi2_video_ops,
    .pad = &csi2_pad_ops,
};

 CSI2设备:

  • 对应的v4l2设备为/dev/v4l-subdev0,设备操作函数为csi2_subdev_ops。
  • 在Media子系统中对应的Entity为rockchip-mipi-csi2,包含1个Sink Pad,11个Source Pad。

posted on 2024-04-11 23:59  ArnoldLu  阅读(40)  评论(0编辑  收藏  举报

导航