2.10. ioctls CEC_G_MODE 和 CEC_S_MODE¶
CEC_G_MODE, CEC_S_MODE - 获取或设置 CEC 适配器的独占使用权
2.10.1. 概要¶
-
CEC_G_MODE¶
int ioctl(int fd, CEC_G_MODE, __u32 *argp)
-
CEC_S_MODE¶
int ioctl(int fd, CEC_S_MODE, __u32 *argp)
2.10.2. 参数¶
fd
由
open()
返回的文件描述符。argp
指向 CEC 模式的指针。
2.10.3. 描述¶
默认情况下,任何文件句柄都可以使用 ioctls CEC_RECEIVE 和 CEC_TRANSMIT,但为了防止应用程序互相干扰,必须能够获得对 CEC 适配器的独占访问权。此 ioctl 将文件句柄设置为发起者和/或跟随者模式,具体取决于所选模式。发起者是用于发起消息的文件句柄,即它命令其他 CEC 设备。跟随者是接收发送到 CEC 适配器的消息并处理它们的文件句柄。同一个文件句柄可以既是发起者又是跟随者,或者此角色可以由两个不同的文件句柄承担。
当接收到 CEC 消息时,CEC 框架将决定如何处理它。如果消息是对先前发送的消息的回复,则回复将发送回正在等待它的文件句柄。此外,CEC 框架将处理它。
如果消息不是回复,则 CEC 框架将首先处理它。如果没有跟随者,则消息将被丢弃,如果框架无法处理它,则将功能中止发送回发起者。如果有一个跟随者,则消息将传递给跟随者,后者将使用 ioctl CEC_RECEIVE 来将新消息出队。框架希望跟随者做出正确的决定。
除非跟随者另有要求,否则 CEC 框架将处理核心消息。跟随者可以启用直通模式。在这种情况下,CEC 框架将传递大多数核心消息而不处理它们,并且跟随者将必须实现这些消息。核心将始终处理一些消息,而不管直通模式如何。有关详细信息,请参阅 核心消息处理。
如果没有发起者,则任何 CEC 文件句柄都可以使用 ioctl CEC_TRANSMIT。如果有一个独占发起者,则只有该发起者可以调用 ioctls CEC_RECEIVE 和 CEC_TRANSMIT。跟随者当然总是可以调用 ioctl CEC_TRANSMIT。
可用的发起者模式是
|
0x0 |
这不是一个发起者,即它不能发送 CEC 消息或对 CEC 适配器进行任何其他更改。 |
|
0x1 |
这是一个发起者(设备打开时的默认值),它可以发送 CEC 消息并更改 CEC 适配器,除非有一个独占发起者。 |
|
0x2 |
这是一个独占发起者,此文件描述符是唯一可以发送 CEC 消息并更改 CEC 适配器的描述符。如果其他人已经是独占发起者,则尝试成为独占发起者将返回 |
可用的跟随者模式是
|
0x00 |
这不是一个跟随者(设备打开时的默认值)。 |
|
0x10 |
这是一个跟随者,它将接收 CEC 消息,除非有一个独占跟随者。如果未设置 CEC_CAP_TRANSMIT 或者指定了 CEC_MODE_NO_INITIATOR,则无法成为跟随者,在这种情况下,将返回 |
|
0x20 |
这是一个独占跟随者,只有此文件描述符将接收 CEC 消息进行处理。如果其他人已经是独占跟随者,则尝试成为独占跟随者将返回 |
|
0x30 |
这是一个独占跟随者,只有此文件描述符将接收 CEC 消息进行处理。此外,它会将 CEC 设备置于直通模式,允许独占跟随者处理大多数核心消息,而不是依赖 CEC 框架。如果其他人已经是独占跟随者,则尝试成为独占跟随者将返回 |
|
0xd0 |
将文件描述符置于引脚监视模式。只能与 CEC_MODE_NO_INITIATOR 组合使用,否则将返回 |
|
0xe0 |
将文件描述符置于监视器模式。只能与 CEC_MODE_NO_INITIATOR 组合使用,否则将返回 |
|
0xf0 |
将文件描述符置于“监视所有”模式。只能与 CEC_MODE_NO_INITIATOR 组合使用,否则将返回 |
核心消息处理详细信息
|
核心将返回使用 ioctl CEC_ADAP_S_LOG_ADDRS 设置的 CEC 版本,除非在直通模式下。在直通模式下,核心不执行任何操作,此消息必须由跟随者处理。 |
|
核心将返回使用 ioctl CEC_ADAP_S_LOG_ADDRS 设置的供应商 ID,除非在直通模式下。在直通模式下,核心不执行任何操作,此消息必须由跟随者处理。 |
|
核心将按照规范返回带有原因“功能被拒绝”的功能中止消息,除非在直通模式下。在直通模式下,核心不执行任何操作,此消息必须由跟随者处理。 |
|
核心将报告当前的物理地址,除非在直通模式下。在直通模式下,核心不执行任何操作,此消息必须由跟随者处理。 |
|
核心将报告使用 ioctl CEC_ADAP_S_LOG_ADDRS 设置的当前 OSD 名称,除非在直通模式下。在直通模式下,核心不执行任何操作,此消息必须由跟随者处理。 |
|
如果 CEC 版本早于 2.0,则核心不执行任何操作,否则它将报告使用 ioctl CEC_ADAP_S_LOG_ADDRS 设置的当前功能,除非在直通模式下。在直通模式下,核心不执行任何操作(对于任何 CEC 版本),此消息必须由跟随者处理。 |
|
如果设置了 CEC_CAP_RC 并且设置了 CEC_LOG_ADDRS_FL_ALLOW_RC_PASSTHRU,则生成一个遥控器按键。此消息始终传递给跟随者。 |
|
如果设置了 CEC_CAP_RC 并且设置了 CEC_LOG_ADDRS_FL_ALLOW_RC_PASSTHRU,则生成一个遥控器释放键。此消息始终传递给跟随者。 |
|
CEC 框架将记录报告的物理地址,然后将消息传递给跟随者。 |
2.10.4. 返回值¶
成功时返回 0,错误时返回 -1,并适当地设置 errno
变量。通用错误代码在 通用错误代码 章节中描述。
ioctl CEC_S_MODE 可以返回以下错误代码
- EINVAL
请求的模式无效。
- EPERM
请求了监视器模式,但进程没有
CAP_NET_ADMIN
功能。- EBUSY
其他人已经是独占跟随者或发起者。