2.9. ioctl CEC_DQEVENT

2.9.1. 名称

CEC_DQEVENT - 出队一个 CEC 事件

2.9.2. 概要

CEC_DQEVENT

int ioctl(int fd, CEC_DQEVENT, struct cec_event *argp)

2.9.3. 参数

fd

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

argp

2.9.4. 描述

CEC 设备可以发送异步事件。这些可以通过调用 CEC_DQEVENT() 来检索。如果文件描述符处于非阻塞模式并且没有待处理的事件,那么它将返回 -1 并将 errno 设置为 EAGAIN 错误代码。

内部事件队列是每个文件句柄和每个事件类型的。如果队列中没有更多空间,那么最后一个事件将被新事件覆盖。这意味着中间结果可能会被丢弃,但是最新的事件始终可用。这也意味着可以读取两个具有相同值的连续事件(例如,两个具有相同状态的 CEC_EVENT_STATE_CHANGE 事件)。在这种情况下,中间状态更改会丢失,但可以保证状态在两个事件之间确实发生了更改。

type cec_event_state_change
struct cec_event_state_change

__u16

phys_addr

当前物理地址。如果未设置有效的物理地址,则为 CEC_PHYS_ADDR_INVALID

__u16

log_addr_mask

当前声明的逻辑地址集。如果未声明逻辑地址,或者 phys_addrCEC_PHYS_ADDR_INVALID,则为 0。如果设置了位 15 (1 << CEC_LOG_ADDR_UNREGISTERED),则此设备具有未注册的逻辑地址。在这种情况下,所有其他位都为 0。

__u16

have_conn_info

如果非零,则 HDMI 连接器信息可用。仅当设置了 CEC_CAP_CONNECTOR_INFO 时,此字段才有效。如果设置了该功能并且 have_conn_info 为零,则表示 HDMI 连接器设备未实例化,原因可能是 HDMI 驱动程序仍在配置设备,或者 HDMI 设备已解除绑定。

type cec_event_lost_msgs
struct cec_event_lost_msgs

__u32

lost_msgs

设置为自文件句柄打开以来或自上次为此文件句柄出队此事件以来丢失的消息数。丢失的消息是最旧的消息。因此,当新消息到达并且没有更多空间时,将丢弃最旧的消息以为新消息腾出空间。消息队列的内部大小保证最近两秒内接收到的所有消息都将被存储。由于根据 CEC 规范,消息应在一秒钟内回复,因此这绰绰有余。

type cec_event
struct cec_event

__u64

ts

事件的时间戳,单位为纳秒。

时间戳取自 CLOCK_MONOTONIC 时钟。

要从用户空间访问同一时钟,请使用 clock_gettime()

__u32

event

CEC 事件类型,请参阅 CEC 事件类型

__u32

flags

事件标志,请参阅 CEC 事件标志

union {

(匿名)

struct cec_event_state_change

state_change

CEC_EVENT_STATE_CHANGE 事件发送的新适配器状态。

struct cec_event_lost_msgs

lost_msgs

CEC_EVENT_LOST_MSGS 事件发送的丢失消息数。

}

CEC 事件类型

CEC_EVENT_STATE_CHANGE

1

当 CEC 适配器的状态更改时生成。当调用 open() 时,将为该文件句柄生成一个初始事件,其中包含当时的 CEC 适配器状态。

CEC_EVENT_LOST_MSGS

2

如果由于应用程序没有足够快地出队 CEC 消息而丢失了一条或多条 CEC 消息,则生成此事件。

CEC_EVENT_PIN_CEC_LOW

3

如果 CEC 引脚从高电压变为低电压,则生成此事件。仅适用于设置了 CEC_CAP_MONITOR_PIN 功能的适配器。

CEC_EVENT_PIN_CEC_HIGH

4

如果 CEC 引脚从低电压变为高电压,则生成此事件。仅适用于设置了 CEC_CAP_MONITOR_PIN 功能的适配器。

CEC_EVENT_PIN_HPD_LOW

5

如果 HPD 引脚从高电压变为低电压,则生成此事件。仅适用于设置了 CEC_CAP_MONITOR_PIN 功能的适配器。当调用 open() 时,可以读取 HPD 引脚,如果 HPD 为低电平,则将为该文件句柄生成一个初始事件。

CEC_EVENT_PIN_HPD_HIGH

6

如果 HPD 引脚从低电压变为高电压,则生成此事件。仅适用于设置了 CEC_CAP_MONITOR_PIN 功能的适配器。当调用 open() 时,可以读取 HPD 引脚,如果 HPD 为高电平,则将为该文件句柄生成一个初始事件。

CEC_EVENT_PIN_5V_LOW

6

如果 5V 引脚从高电压变为低电压,则生成此事件。仅适用于设置了 CEC_CAP_MONITOR_PIN 功能的适配器。当调用 open() 时,可以读取 5V 引脚,如果 5V 为低电平,则将为该文件句柄生成一个初始事件。

CEC_EVENT_PIN_5V_HIGH

7

如果 5V 引脚从低电压变为高电压,则生成此事件。仅适用于设置了 CEC_CAP_MONITOR_PIN 功能的适配器。当调用 open() 时,可以读取 5V 引脚,如果 5V 为高电平,则将为该文件句柄生成一个初始事件。

CEC 事件标志

CEC_EVENT_FL_INITIAL_STATE

1

为打开设备时生成的初始事件设置。请参阅上表了解哪些事件执行此操作。这允许应用程序在 open() 时了解 CEC 适配器的初始状态。

CEC_EVENT_FL_DROPPED_EVENTS

2

如果已丢弃给定事件类型的一个或多个事件,则设置此标志。这表明应用程序无法跟上。

2.9.5. 返回值

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

ioctl CEC_DQEVENT 可以返回以下错误代码

EAGAIN

当文件句柄处于非阻塞模式且没有待处理的事件时返回此错误。

ERESTARTSYS

当处于阻塞模式等待事件到达时,接收到了中断(例如 Ctrl-C)。