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

指向 struct cec_log_addrs 的指针。

2.6.4. 描述

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

要设置新的逻辑地址,应用程序填写 struct 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

type cec_log_addrs
struct 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

标志。 请参见 struct 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 个字节包括 RC 配置文件和设备特性。 对于 CEC 1.4,您可以将此字段全部保留为 0,也可以根据 CEC 2.0 指南填写它,以便为 CEC 框架提供有关设备类型的更多信息,即使该框架不会直接在 CEC 消息中使用它也是如此。

struct 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-only 设备(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

struct cec_log_addrs 的内容无效。