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
物理地址格式错误。