摘要
创建中断对象。
声明
#include <zircon/syscalls.h>
zx_status_t zx_interrupt_create(zx_handle_t src_obj,
uint32_t src_num,
uint32_t options,
zx_handle_t* out_handle);
说明
zx_interrupt_create() 会创建一个表示物理或虚拟中断的中断对象。
如果 options 为 ZX_INTERRUPT_VIRTUAL,则系统会忽略 src_obj 和 src_num,并返回虚拟中断。
否则,src_obj 必须是用于创建平台中断或 PCI 对象的合适资源,并且 src_num 是关联的中断编号。这会将中断的创建限制在驱动程序框架的内部。驱动程序通过各种驱动程序框架 API 获取物理中断。
实体中断会遵循选项 ZX_INTERRUPT_MODE_EDGE_LOW、ZX_INTERRUPT_MODE_EDGE_HIGH、ZX_INTERRUPT_MODE_LEVEL_LOW、ZX_INTERRUPT_MODE_LEVEL_HIGH 和 ZX_INTERRUPT_REMAP_IRQ。
实体中断和虚拟中断均会遵循选项 ZX_INTERRUPT_TIMESTAMP_MONO。使用此选项创建的中断将从 zx_interrupt_wait() 返回单调时间戳,并假定传递给 zx_interrupt_trigger() 的时间戳位于单调时间轴上。默认情况下,这些时间戳在启动时间轴上运行。
这些句柄将具有 ZX_RIGHT_INSPECT、ZX_RIGHT_DUPLICATE、ZX_RIGHT_TRANSFER(允许通过 zx_channel_write() 将它们发送到其他进程)、ZX_RIGHT_READ、ZX_RIGHT_WRITE(对于 zx_interrupt_ack() 是必需的)、ZX_RIGHT_WAIT(对于 zx_interrupt_wait() 是必需的)和 ZX_RIGHT_SIGNAL(对于 zx_interrupt_trigger() 是必需的)。
当发生底层物理中断或对虚拟中断调用 zx_interrupt_trigger() 时,中断被称为“触发”。当触发的某个中断绑定到某个端口(使用 zx_interrupt_bind())时,系统会将数据包传送到该端口。
如果未绑定到端口,则可以使用 zx_interrupt_wait() 等待中断对象。
无法使用 zx_object_wait_ 调用族等待中断。
权限
src_obj 必须具有资源种类 ZX_RSRC_KIND_IRQ。
返回值
zx_interrupt_create() 会在成功时返回 ZX_OK。如果失败,系统会返回负错误值。
错误
ZX_ERR_BAD_HANDLE src_obj 句柄无效(如果这不是虚拟中断)
ZX_ERR_WRONG_TYPE src_obj 句柄的类型不适合创建中断。
ZX_ERR_ACCESS_DENIED src_obj 句柄不允许执行此操作。
ZX_ERR_INVALID_ARGS options 包含无效的标志,或者 out_handle 参数是无效的指针。
ZX_ERR_NO_MEMORY 因内存不足而失败。用户空间没有很好的方式来处理这种(不太可能发生的)错误。在未来的 build 中,此错误将不再出现。