2.6. ioctls CEC_ADAP_G_LOG_ADDRS 和 CEC_ADAP_S_LOG_ADDRS

2.6.1. 名称

CEC_ADAP_G_LOG_ADDRS, CEC_ADAP_S_LOG_ADDRS - 获取或设置逻辑地址

2.6.2. 概要

CEC_ADAP_G_LOG_ADDRS

int ioctl(int fd, CEC_ADAP_G_LOG_ADDRS, struct cec_log_addrs *argp)

CEC_ADAP_S_LOG_ADDRS

int ioctl(int fd, CEC_ADAP_S_LOG_ADDRS, struct cec_log_addrs *argp)

2.6.3. 参数

fd

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

argp

指向结构体 cec_log_addrs 的指针。

2.6.4. 描述

要查询当前 CEC 逻辑地址,应用程序使用指向结构体 cec_log_addrs 的指针调用 ioctl CEC_ADAP_G_LOG_ADDRS,驱动程序会将逻辑地址存储在该结构体中。

要设置新的逻辑地址,应用程序需要填写结构体 cec_log_addrs,并使用指向该结构体的指针调用 ioctl CEC_ADAP_S_LOG_ADDRS。只有当设置了 CEC_CAP_LOG_ADDRS 时, ioctl CEC_ADAP_S_LOG_ADDRS 才可用(否则将返回 ENOTTY 错误代码)。只有在启动器模式下(请参阅 ioctls CEC_G_MODE 和 CEC_S_MODE)的文件描述符才能调用 ioctl CEC_ADAP_S_LOG_ADDRS,否则将返回 EBUSY 错误代码。

要清除已存在的逻辑地址,请将 num_log_addrs 设置为 0。在这种情况下,将忽略所有其他字段。适配器将进入未配置状态,并且 cec_versionvendor_idosd_name 字段都将重置为默认值(CEC 版本 2.0,无供应商 ID 和空的 OSD 名称)。

如果物理地址有效(请参阅 ioctl CEC_ADAP_S_PHYS_ADDR),则此 ioctl 将阻塞,直到所有请求的逻辑地址都被声明。如果文件描述符处于非阻塞模式,则它不会等待逻辑地址被声明,而是直接返回 0。

当逻辑地址被声明或清除时,将发送 CEC_EVENT_STATE_CHANGE 事件。

当逻辑地址类型已定义时尝试调用 ioctl CEC_ADAP_S_LOG_ADDRS 将返回错误 EBUSY

类型 cec_log_addrs
结构体 cec_log_addrs

__u8

log_addr[CEC_MAX_LOG_ADDRS]

已声明的实际逻辑地址。这由驱动程序设置。如果没有逻辑地址可以被声明,则将其设置为 CEC_LOG_ADDR_INVALID。如果此适配器是未注册的,则 log_addr[0] 设置为 0xf,所有其他地址设置为 CEC_LOG_ADDR_INVALID

__u16

log_addr_mask

此适配器已声明的所有逻辑地址的位掩码。如果此适配器未注册,则 log_addr_mask 设置位 15 并清除所有其他位。如果此适配器完全未配置,则 log_addr_mask 设置为 0。由驱动程序设置。

__u8

cec_version

此适配器应使用的 CEC 版本。请参阅 CEC 版本。用于实现 CEC_MSG_CEC_VERSIONCEC_MSG_REPORT_FEATURES 消息。请注意,CEC 框架不允许使用 CEC_OP_CEC_VERSION_1_3A

__u8

num_log_addrs

要设置的逻辑地址数量。必须 ≤ available_log_addrs,由 ioctl CEC_ADAP_G_CAPS 返回。此结构中的所有数组都只填充到索引 available_log_addrs-1。其余数组元素将被忽略。请注意,CEC 2.0 标准允许最多使用 2 个逻辑地址,尽管某些硬件支持更多。 CEC_MAX_LOG_ADDRS 为 4。驱动程序将返回它可以声明的实际逻辑地址数量,这可能小于请求的数量。如果此字段设置为 0,则 CEC 适配器应清除所有已声明的逻辑地址,并且所有其他字段将被忽略。

__u32

vendor_id

供应商 ID 是一个 24 位数字,用于标识特定的供应商或实体。可以根据此 ID 定义特定于供应商的命令。如果您不想要供应商 ID,请将其设置为 CEC_VENDOR_ID_NONE

__u32

flags

标志。有关可用标志的列表,请参阅 结构体 cec_log_addrs 的标志

char

osd_name[15]

CEC_MSG_SET_OSD_NAME 消息返回的屏幕显示名称。

__u8

primary_device_type[CEC_MAX_LOG_ADDRS]

每个逻辑地址的主要设备类型。有关可能的类型,请参阅 CEC 主要设备类型

__u8

log_addr_type[CEC_MAX_LOG_ADDRS]

逻辑地址类型。有关可能的类型,请参阅 CEC 逻辑地址类型。驱动程序将使用其声明的实际逻辑地址类型来更新此字段(例如,它可能必须回退到 CEC_LOG_ADDR_TYPE_UNREGISTERED)。

__u8

all_device_types[CEC_MAX_LOG_ADDRS]

CEC 2.0 特有:所有设备类型的位掩码。请参阅 CEC 所有设备类型标志。它在 CEC 2.0 CEC_MSG_REPORT_FEATURES 消息中使用。对于 CEC 1.4,您可以将此字段保留为 0,也可以根据 CEC 2.0 指南填写它,以便为 CEC 框架提供有关设备类型的更多信息,即使该框架不会直接在 CEC 消息中使用它。

__u8

features[CEC_MAX_LOG_ADDRS][12]

每个逻辑地址的功能。它在 CEC 2.0 CEC_MSG_REPORT_FEATURES 消息中使用。12 个字节包括遥控器配置文件和设备功能。对于 CEC 1.4,您可以将此字段全部保留为 0,也可以根据 CEC 2.0 指南填写它,以便为 CEC 框架提供有关设备类型的更多信息,即使该框架不会直接在 CEC 消息中使用它。

结构体 cec_log_addrs 的标志

CEC_LOG_ADDRS_FL_ALLOW_UNREG_FALLBACK

1

默认情况下,如果没有可以声明的请求类型的逻辑地址,则它将返回到未配置状态。如果设置了此标志,则它将回退到未注册的逻辑地址。请注意,如果明确请求了未注册的逻辑地址,则此标志不起作用。

CEC_LOG_ADDRS_FL_ALLOW_RC_PASSTHRU

2

默认情况下,CEC_MSG_USER_CONTROL_PRESSEDCEC_MSG_USER_CONTROL_RELEASED 消息仅传递给关注者(如果有)。如果设置了此标志,则这些消息也会传递给遥控器输入子系统,并将显示为击键。此功能需要明确启用。如果 CEC 用于输入密码等,则您可能不想启用此功能,以避免对击键进行简单的窥探。

CEC_LOG_ADDRS_FL_CDC_ONLY

4

如果设置了此标志,则设备是 CDC-Only。CDC-Only CEC 设备是只能处理 CDC 消息的 CEC 设备。

所有其他消息都将被忽略。

CEC 版本

CEC_OP_CEC_VERSION_1_3A

4

根据 HDMI 1.3a 标准的 CEC 版本。

CEC_OP_CEC_VERSION_1_4B

5

根据 HDMI 1.4b 标准的 CEC 版本。

CEC_OP_CEC_VERSION_2_0

6

根据 HDMI 2.0 标准的 CEC 版本。

CEC 主要设备类型

CEC_OP_PRIM_DEVTYPE_TV

0

用于电视。

CEC_OP_PRIM_DEVTYPE_RECORD

1

用于录制设备。

CEC_OP_PRIM_DEVTYPE_TUNER

3

用于带调谐器的设备。

CEC_OP_PRIM_DEVTYPE_PLAYBACK

4

用于播放设备。

CEC_OP_PRIM_DEVTYPE_AUDIOSYSTEM

5

用于音频系统(例如,音频/视频接收器)。

CEC_OP_PRIM_DEVTYPE_SWITCH

6

用于 CEC 开关。

CEC_OP_PRIM_DEVTYPE_VIDEOPROC

7

用于视频处理器设备。

CEC 逻辑地址类型

CEC_LOG_ADDR_TYPE_TV

0

用于电视。

CEC_LOG_ADDR_TYPE_RECORD

1

用于录制设备。

CEC_LOG_ADDR_TYPE_TUNER

2

用于调谐器设备。

CEC_LOG_ADDR_TYPE_PLAYBACK

3

用于播放设备。

CEC_LOG_ADDR_TYPE_AUDIOSYSTEM

4

用于音频系统设备。

CEC_LOG_ADDR_TYPE_SPECIFIC

5

用于第二台电视或视频处理器设备。

CEC_LOG_ADDR_TYPE_UNREGISTERED

6

如果你只想保持未注册状态,请使用此选项。用于纯 CEC 开关或仅 CDC 设备(CDC:能力发现和控制)。

CEC 所有设备类型标志

CEC_OP_ALL_DEVTYPE_TV

0x80

这支持电视类型。

CEC_OP_ALL_DEVTYPE_RECORD

0x40

这支持录制类型。

CEC_OP_ALL_DEVTYPE_TUNER

0x20

这支持调谐器类型。

CEC_OP_ALL_DEVTYPE_PLAYBACK

0x10

这支持播放类型。

CEC_OP_ALL_DEVTYPE_AUDIOSYSTEM

0x08

这支持音频系统类型。

CEC_OP_ALL_DEVTYPE_SWITCH

0x04

这支持 CEC 开关或视频处理类型。

2.6.5. 返回值

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

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

ENOTTY

未设置 CEC_CAP_LOG_ADDRS 功能,因此不支持此 ioctl。

EBUSY

CEC 适配器当前正在配置自身,或者已经配置且 num_log_addrs 非零,或者另一个文件句柄处于独占跟随者或发起者模式,或者文件句柄处于 CEC_MODE_NO_INITIATOR 模式。

EINVAL

cec_log_addrs 结构的内容无效。