2.7. ioctls CEC_ADAP_G_PHYS_ADDR 和 CEC_ADAP_S_PHYS_ADDR

2.7.1. 名称

CEC_ADAP_G_PHYS_ADDR, CEC_ADAP_S_PHYS_ADDR - 获取或设置物理地址

2.7.2. 概要

CEC_ADAP_G_PHYS_ADDR

int ioctl(int fd, CEC_ADAP_G_PHYS_ADDR, __u16 *argp)

CEC_ADAP_S_PHYS_ADDR

int ioctl(int fd, CEC_ADAP_S_PHYS_ADDR, __u16 *argp)

2.7.3. 参数

fd

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

argp

指向 CEC 地址的指针。

2.7.4. 描述

要查询当前的物理地址,应用程序调用 ioctl CEC_ADAP_G_PHYS_ADDR 并传递一个指向 __u16 的指针,驱动程序会将物理地址存储在该位置。

要设置新的物理地址,应用程序将物理地址存储在一个 __u16 中,并调用 ioctl CEC_ADAP_S_PHYS_ADDR 并传递一个指向此整数的指针。 只有在设置了 CEC_CAP_PHYS_ADDR 时,ioctl CEC_ADAP_S_PHYS_ADDR 才可用(否则将返回 ENOTTY 错误代码)。 只有在发起者模式下才能调用 ioctl CEC_ADAP_S_PHYS_ADDR(请参阅 ioctls CEC_G_MODE 和 CEC_S_MODE),否则将返回 EBUSY 错误代码。

要清除现有的物理地址,请使用 CEC_PHYS_ADDR_INVALID。 适配器将进入未配置状态。

如果已定义逻辑地址类型(请参阅 ioctl CEC_ADAP_S_LOG_ADDRS),则此 ioctl 将阻塞,直到声明了所有请求的逻辑地址。 如果文件描述符处于非阻塞模式,则它不会等待声明逻辑地址,而是直接返回 0。

当物理地址更改时,将发送 CEC_EVENT_STATE_CHANGE 事件。

物理地址是一个 16 位数字,其中每 4 位代表物理地址 a.b.c.d 的一位数字,其中最高有效 4 位代表 “a”。 CEC 根设备(通常是电视)的地址为 0.0.0.0。 连接到电视输入的每个设备的地址均为 a.0.0.0(其中 “a” ≥ 1),依次连接到这些设备的设备的地址为 a.b.0.0 等。 因此,支持最多 5 个设备的拓扑。 设备应使用的物理地址存储在接收器的 EDID 中。

例如,电视每个 HDMI 输入的 EDID 都将具有 a.0.0.0 形式的不同物理地址,源将读取并用作其物理地址。

2.7.5. 返回值

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

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

ENOTTY

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

EBUSY

另一个文件句柄处于独占跟随者或发起者模式,或者文件句柄处于模式 CEC_MODE_NO_INITIATOR

EINVAL

物理地址格式不正确。