7.27. ioctl VIDIOC_G_EDID, VIDIOC_S_EDID, VIDIOC_SUBDEV_G_EDID, VIDIOC_SUBDEV_S_EDID

7.27.1. 名称

VIDIOC_G_EDID - VIDIOC_S_EDID - VIDIOC_SUBDEV_G_EDID - VIDIOC_SUBDEV_S_EDID - 获取或设置视频接收器/发送器的 EDID

7.27.2. 概要

VIDIOC_G_EDID

int ioctl(int fd, VIDIOC_G_EDID, struct v4l2_edid *argp)

VIDIOC_S_EDID

int ioctl(int fd, VIDIOC_S_EDID, struct v4l2_edid *argp)

VIDIOC_SUBDEV_G_EDID

int ioctl(int fd, VIDIOC_SUBDEV_G_EDID, struct v4l2_edid *argp)

VIDIOC_SUBDEV_S_EDID

int ioctl(int fd, VIDIOC_SUBDEV_S_EDID, struct v4l2_edid *argp)

7.27.3. 参数

fd

open() 返回的文件描述符。

argp

指向 struct v4l2_edid 的指针。

7.27.4. 描述

这些 ioctl 可用于获取或设置与接收器的输入或发送器设备的输出关联的 EDID。它们可以与子设备节点 (/dev/v4l-subdevX) 或视频节点 (/dev/videoX) 一起使用。

当与视频节点一起使用时,pad 字段表示输入(对于视频捕获设备)或输出(对于视频输出设备)索引,如 ioctl VIDIOC_ENUMINPUTioctl VIDIOC_ENUMOUTPUT 分别返回的那样。当与子设备节点一起使用时,pad 字段表示子设备的输入或输出焊盘。如果给定的 pad 值没有 EDID 支持,则会返回 EINVAL 错误代码。

要获取 EDID 数据,应用程序必须填写 padstart_blockblocksedid 字段,将 reserved 数组清零,并调用 VIDIOC_G_EDID。从块 start_block 开始、大小为 blocks 的当前 EDID 将放置在 edid 指向的内存中。edid 指针必须指向至少 blocks * 128 字节大小的内存(一个块的大小为 128 字节)。

如果块数少于指定的数量,则驱动程序会将 blocks 设置为实际的块数。如果根本没有可用的 EDID 块,则会设置错误代码 ENODATA

如果必须从接收器检索块,则此调用将阻塞,直到它们被读取。

如果在调用 VIDIOC_G_EDID 时,start_blockblocks 都设置为 0,则驱动程序会将 blocks 设置为可用 EDID 块的总数,并且它将返回 0 而不复制任何数据。这是一种很容易发现有多少个 EDID 块的方法。

注意

如果根本没有可用的 EDID 块,则驱动程序会将 blocks 设置为 0 并返回 0。

要设置接收器的 EDID 块,应用程序必须填写 padblocksedid 字段,将 start_block 设置为 0,并将 reserved 数组清零。无法设置 EDID 的一部分,它始终是全部或没有。设置 EDID 数据仅对接收器有效,因为它对发送器没有意义。

驱动程序假定传入完整的 EDID。如果 EDID 块多于硬件可以处理的数量,则不会写入 EDID,而是设置错误代码 E2BIG,并将 blocks 设置为硬件支持的最大值。如果 start_block 是 0 以外的任何值,则会设置错误代码 EINVAL

要禁用 EDID,请将 blocks 设置为 0。根据硬件的不同,这会将热插拔引脚驱动为低电平,和/或以某种方式阻止源读取 EDID 数据。无论如何,最终结果都是相同的:EDID 不再可用。

type v4l2_edid
struct v4l2_edid

__u32

pad

要获取/设置 EDID 块的焊盘。当与视频设备节点一起使用时,焊盘表示输入或输出索引,如 ioctl VIDIOC_ENUMINPUTioctl VIDIOC_ENUMOUTPUT 分别返回的那样。

__u32

start_block

从这个块开始读取 EDID。设置 EDID 时必须为 0。

__u32

blocks

要获取或设置的块数。必须小于或等于 256(标准定义的最大块数)。当您设置 EDID 且 blocks 为 0 时,则禁用或擦除 EDID。

__u32

reserved[5]

为将来的扩展保留。应用程序和驱动程序必须将数组设置为零。

__u8 *

edid

指向包含 EDID 的内存的指针。最小大小为 blocks * 128。

7.27.5. 返回值

成功时返回 0,失败时返回 -1,并适当地设置 errno 变量。通用错误代码在 通用错误代码 章节中描述。

ENODATA

EDID 数据不可用。

E2BIG

您提供的 EDID 数据超出了硬件可以处理的范围。