编写设备驱动程序

DDI 中断函数

Solaris OS 提供了用于注册和取消注册中断的框架,并且提供了对消息告知中断 (Message Signaled Interrupt, MSI) 的支持。通过中断管理界面,可以处理优先级、功能和中断屏蔽,并可获取待处理信息。

中断功能函数

可使用以下函数获取中断信息:

ddi_intr_get_navail(9F)

返回可用于指定硬件设备和中断类型的中断的数量。

ddi_intr_get_nintrs(9F)

返回设备支持的指定中断类型的中断的数量。

ddi_intr_get_supported_types(9F)

返回设备和主机均支持的硬件中断类型。

ddi_intr_get_cap(9F)

针对指定的中断返回中断功能标志。

中断初始化和销毁函数

可使用以下函数创建和删除中断:

ddi_intr_alloc(9F)

为指定类型的中断分配系统资源和中断向量。

ddi_intr_free(9F)

针对指定的中断句柄释放系统资源和中断向量。

ddi_intr_set_cap(9F)

通过使用 DDI_INTR_FLAG_LEVEL 和 DDI_INTR_FLAG_EDGE 标志来设置指定中断的功能。

ddi_intr_add_handler(9F)

添加中断处理程序。

ddi_intr_dup_handler(9F)

仅适用于 MSI-X。将分配的中断向量的地址和数据对复制到同一设备上未使用的中断向量。

ddi_intr_remove_handler(9F)

删除指定的中断处理程序。

ddi_intr_enable(9F)

启用指定的中断。

ddi_intr_disable(9F)

禁用指定的中断。

ddi_intr_block_enable(9F)

仅用于 MSI。启用指定范围的中断。

ddi_intr_block_disable(9F)

仅用于 MSI。禁用指定范围的中断。

ddi_intr_set_mask(9F)

如果已启用指定的中断,则设置中断屏蔽码。

ddi_intr_clr_mask(9F)

如果已启用指定的中断,则清除中断屏蔽码。

ddi_intr_get_pending(9F)

如果主桥 (host bridge) 或设备支持这种中断待处理位,则读取此位。

优先级管理函数

可使用以下函数获取和设置优先级信息:

ddi_intr_get_pri(9F)

返回指定中断的当前软件优先级设置。

ddi_intr_set_pri(9F)

设置指定中断的中断优先级别。

ddi_intr_get_hilevel_pri(9F)

返回高级别中断的最低优先级别。

软中断函数

可使用以下函数处理软中断和软中断处理程序:

ddi_intr_add_softint(9F)

添加软中断处理程序。

ddi_intr_trigger_softint(9F)

触发指定的软中断。

ddi_intr_remove_softint(9F)

删除指定的软中断处理程序。

ddi_intr_get_softint_pri(9F)

返回指定中断的软中断优先级。

ddi_intr_set_softint_pri(9F)

更改指定软中断的相对软中断优先级。

中断函数示例

本节提供了执行以下任务的示例:


示例 8–1 更改软中断优先级

使用 ddi_intr_set_softint_pri(9F) 函数将软中断优先级到更改为 9。

if (ddi_intr_set_softint_pri(mydev->mydev_softint_hdl, 9) != DDI_SUCCESS)
    cmn_err (CE_WARN, "ddi_intr_set_softint_pri failed");


示例 8–2 检查待处理中断

使用 ddi_intr_get_pending(9F) 函数检查中断是否处于待处理状态。

if (ddi_intr_get_pending(mydevp->htable[0], &pending) != DDI_SUCCESS)
    cmn_err(CE_WARN, "ddi_intr_get_pending() failed");
else if (pending)
    cmn_err(CE_NOTE, "ddi_intr_get_pending(): Interrupt pending");


示例 8–3 设置中断屏蔽码

使用 ddi_intr_set_mask(9F) 函数设置中断屏蔽,以防止设备收到中断。

if ((ddi_intr_set_mask(mydevp->htable[0]) != DDI_SUCCESS))
    cmn_err(CE_WARN, "ddi_intr_set_mask() failed");


示例 8–4 清除中断屏蔽码

使用 ddi_intr_clr_mask(9F) 函数清除中断屏蔽。如果没有启用指定的中断,ddi_intr_clr_mask(9F) 函数将失败。如果 ddi_intr_clr_mask(9F ) 函数成功,则设备将开始生成中断。

if (ddi_intr_clr_mask(mydevp->htable[0]) != DDI_SUCCESS)
    cmn_err(CE_WARN, "ddi_intr_clr_mask() failed");