7.9. Intel Image Processing Unit 6 (IPU6) 输入系统驱动

版权所有 © 2023--2024 Intel Corporation

7.9.1. 简介

本文档介绍位于 drivers/media/pci/intel/ipu6 下的 Intel IPU6(第六代图像处理单元)输入系统(MIPI CSI2 接收器)驱动程序。

Intel IPU6 可以在某些 Intel SoC 中找到,但并非所有 SKU 都有

  • Tiger Lake

  • Jasper Lake

  • Alder Lake

  • Raptor Lake

  • Meteor Lake

Intel IPU6 由两个组件组成 - 输入系统 (ISYS) 和处理系统 (PSYS)。

输入系统主要用作 MIPI CSI-2 接收器,接收和处理来自传感器的图像数据,并将帧输出到内存。

有两个驱动模块 - intel-ipu6 和 intel-ipu6-isys。 intel-ipu6 是一个 IPU6 通用驱动程序,用于执行 PCI 配置、固件加载和解析、固件身份验证、DMA 映射和 IPU-MMU(内部内存映射单元)配置。 intel_ipu6_isys 实现了 V4L2、媒体控制器和 V4L2 子设备接口。 IPU6 ISYS 驱动程序支持通过 V4L2 子设备传感器驱动程序连接到 IPU6 ISYS 的摄像头传感器。

注意

有关 IPU6 硬件的更多信息,请参见 Intel IPU6 驱动

7.9.2. 输入系统驱动

输入系统驱动程序主要配置 CSI-2 D-PHY,构建固件流配置,向固件发送命令,从硬件和固件获取响应,然后将缓冲区返回给用户。 ISYS 表示为多个 V4L2 子设备以及视频节点。

ipu6 isys media graph with multiple streams support

支持多个流的 IPU6 ISYS 媒体图

该图已使用以下命令生成

fdp -Gsplines=true -Tsvg < dot > dot.svg

7.9.2.1. 使用 IPU6 ISYS 捕获帧

IPU6 ISYS 用于从连接到 CSI2 端口的摄像头传感器捕获帧。 下表列出了 ISYS 支持的输入格式

IPU6 ISYS 支持的输入格式

RGB565, RGB888

UYVY8, YUYV8

RAW8, RAW10, RAW12

7.9.2.1.1. 示例

这是一个在 Dell XPS 9315 笔记本电脑上进行 IPU6 ISYS 原始捕获的示例。 在此机器上,ov01a10 传感器连接到 IPU ISYS CSI-2 端口 2,它可以生成 sBGGR10 格式、分辨率为 1280x800 的图像。

使用媒体控制器 API,我们可以通过 media-ctl [1] 和 yavta [2] 配置 ov01a10 传感器,以将帧传输到 IPU6 ISYS。

# Example 1 capture frame from ov01a10 camera sensor
# This example assumes /dev/media0 as the IPU ISYS media device
export MDEV=/dev/media0

# Establish the link for the media devices using media-ctl
media-ctl -d $MDEV -l "\"ov01a10 3-0036\":0 -> \"Intel IPU6 CSI2 2\":0[1]"

# Set the format for the media devices
media-ctl -d $MDEV -V "ov01a10:0 [fmt:SBGGR10/1280x800]"
media-ctl -d $MDEV -V "Intel IPU6 CSI2 2:0 [fmt:SBGGR10/1280x800]"
media-ctl -d $MDEV -V "Intel IPU6 CSI2 2:1 [fmt:SBGGR10/1280x800]"

一旦媒体管道配置完成,就可以使用 yavta 工具设置所需的传感器特定设置(例如曝光和增益设置)。

例如

# and that ov01a10 sensor is connected to i2c bus 3 with address 0x36
export SDEV=$(media-ctl -d $MDEV -e "ov01a10 3-0036")

yavta -w 0x009e0903 400 $SDEV
yavta -w 0x009e0913 1000 $SDEV
yavta -w 0x009e0911 2000 $SDEV

一旦设置了所需的传感器设置,就可以如下进行帧捕获。

例如

yavta --data-prefix -u -c10 -n5 -I -s 1280x800 --file=/tmp/frame-#.bin \
        -f SBGGR10 $(media-ctl -d $MDEV -e "Intel IPU6 ISYS Capture 0")

使用上述命令,以 1280x800 分辨率、sBGGR10 格式捕获 10 帧。 捕获的帧作为 /tmp/frame-#.bin 文件提供。

这是另一个来自 Lenovo X1 Yoga 笔记本电脑上的摄像头传感器 ov2740 的 IPU6 ISYS RAW 和元数据捕获示例。

media-ctl -l "\"ov2740 14-0036\":0 -> \"Intel IPU6 CSI2 1\":0[1]"
media-ctl -l "\"Intel IPU6 CSI2 1\":1 -> \"Intel IPU6 ISYS Capture 0\":0[1]"
media-ctl -l "\"Intel IPU6 CSI2 1\":2 -> \"Intel IPU6 ISYS Capture 1\":0[1]"

# set routing
media-ctl -R "\"Intel IPU6 CSI2 1\" [0/0->1/0[1],0/1->2/1[1]]"

media-ctl -V "\"Intel IPU6 CSI2 1\":0/0 [fmt:SGRBG10/1932x1092]"
media-ctl -V "\"Intel IPU6 CSI2 1\":0/1 [fmt:GENERIC_8/97x1]"
media-ctl -V "\"Intel IPU6 CSI2 1\":1/0 [fmt:SGRBG10/1932x1092]"
media-ctl -V "\"Intel IPU6 CSI2 1\":2/1 [fmt:GENERIC_8/97x1]"

CAPTURE_DEV=$(media-ctl -e "Intel IPU6 ISYS Capture 0")
./yavta --data-prefix -c100 -n5 -I -s1932x1092 --file=/tmp/frame-#.bin \
    -f SGRBG10 ${CAPTURE_DEV}

CAPTURE_META=$(media-ctl -e "Intel IPU6 ISYS Capture 1")
./yavta --data-prefix -c100 -n5 -I -s97x1 -B meta-capture \
    --file=/tmp/meta-#.bin -f GENERIC_8 ${CAPTURE_META}

7.9.3. 参考