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。如果给定的 pad 值没有 EDID 支持,则将返回 EINVAL 错误代码。

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

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

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

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

注意

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

要设置接收器的 EDID 块,应用程序必须填写 padblocksedid 字段,将 start_block 设置为 0,并将 reserved 数组清零。无法设置 EDID 的一部分,它始终是全部或全部不设置。设置 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 块的 Pad。与视频设备节点一起使用时,pad 表示输入或输出索引,如 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 数据超过了硬件可以处理的数据。