7.24. 虚拟媒体控制器驱动程序 (vimc)

vimc 驱动程序使用 V4L2 API 和 Media API 模拟复杂的视频硬件。它有一个捕获设备和三个子设备:传感器 (sensor)、去拜耳 (debayer) 和缩放器 (scaler)。

7.24.1. 拓扑

拓扑结构是硬编码的,尽管您可以在 vimc-core 中修改它并重新编译驱动程序以实现您自己的拓扑。这是默认拓扑

Diagram of the default media pipeline topology

vimc 上的媒体管道图

7.24.1.1. 配置拓扑

每个子设备都将带有其默认配置(像素格式、高度、宽度等)。需要配置拓扑以匹配每个链接子设备上的配置,以便通过管道传输帧。如果配置不匹配,流将失败。v4l-utils 包是一组用户空间应用程序,其中包含可用于配置 vimc 的 media-ctlv4l2-ctl。以下命令序列适用于默认拓扑:

media-ctl -d platform:vimc -V '"Sensor A":0[fmt:SBGGR8_1X8/640x480]'
media-ctl -d platform:vimc -V '"Debayer A":0[fmt:SBGGR8_1X8/640x480]'
media-ctl -d platform:vimc -V '"Scaler":0[fmt:RGB888_1X24/640x480]'
media-ctl -d platform:vimc -V '"Scaler":0[crop:(100,50)/400x150]'
media-ctl -d platform:vimc -V '"Scaler":1[fmt:RGB888_1X24/300x700]'
v4l2-ctl -z platform:vimc -d "RGB/YUV Capture" -v width=300,height=700
v4l2-ctl -z platform:vimc -d "Raw Capture 0" -v pixelformat=BA81

7.24.2. 子设备

子设备定义了拓扑中实体的行为。根据子设备的不同,实体可以有多个源或接收器类型的焊盘 (pads)。

vimc-sensor

使用视频测试图案生成器生成多种格式的图像。暴露:

  • 1 个源焊盘

vimc-lens

传感器的辅助镜头。支持自动对焦控制。使用辅助链接连接到 vimc-sensor。该镜头支持 FOCUS_ABSOLUTE 控制。

media-ctl -p
...
- entity 28: Lens A (0 pad, 0 link)
                type V4L2 subdev subtype Lens flags 0
                device node name /dev/v4l-subdev6
- entity 29: Lens B (0 pad, 0 link)
                type V4L2 subdev subtype Lens flags 0
                device node name /dev/v4l-subdev7
v4l2-ctl -d /dev/v4l-subdev7 -C focus_absolute
focus_absolute: 0
vimc-debayer

将拜耳格式的图像转换为非拜耳格式。暴露:

  • 1 个接收器焊盘

  • 1 个源焊盘

vimc-scaler

调整图像大小以符合源焊盘分辨率。例如:如果同步焊盘配置为 360x480,源焊盘配置为 1280x720,图像将被拉伸以适应源分辨率。在 vimc 限制内适用于任何分辨率(即使必要时缩小图像)。暴露:

  • 1 个接收器焊盘

  • 1 个源焊盘

vimc-capture

暴露节点 /dev/videoX 以允许用户空间捕获流。暴露:

  • 1 个接收器焊盘

  • 1 个源焊盘

7.24.3. 模块选项

Vimc 有一个模块参数用于配置驱动程序。

  • allocator=<无符号整数>

    内存分配器选择,默认为 0。它指定了缓冲区将如何分配。

    • 0: vmalloc

    • 1: dma-contig