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。
联系方式:arnoldlu@qq.com