编写设备驱动程序

电源级别

通过设备导出的 pm-components 属性,设备电源管理框架可了解设备支持的电源级别。电源级别值必须是正整数。对电源级别的解释由设备驱动程序编写者确定。在 pm-components 属性中必须按单一递增顺序列出电源级别。该框架将 0 电源级别解释为关闭。如果框架由于相关性必须打开设备电源,则它会将每个组件都设置为其最高电源级别。

以下示例给出了某驱动程序的 .conf 文件中的 pm-components 项,该驱动程序实现了一个电源管理组件(即磁盘主轴马达)。磁盘轴马达是组件 0。该轴马达支持两个电源级别。这两个级别表示“停止”和“全速旋转”。


示例 12–1 pm-component 项样例

pm-components="NAME=Spindle Motor", "0=Stopped", "1=Full Speed";

以下示例说明如何在驱动程序的 attach() 例程中实现示例 12–1


示例 12–2 使用 pm-components 属性的 attach(9E) 例程

static char *pmcomps[] = {
    "NAME=Spindle Motor",
    "0=Stopped",
    "1=Full Speed"
};
/* ... */
xxattach(dev_info_t *dip, ddi_attach_cmd_t cmd)
{
    /* ... */
    if (ddi_prop_update_string_array(DDI_DEV_T_NONE, dip,
        "pm-components", &pmcomp[0],
        sizeof (pmcomps) / sizeof (char *)) != DDI_PROP_SUCCESS)
        goto failed;
    /* ... */

以下示例给出了实现两个组件的帧缓存器。组件 0 是支持四个不同电源级别的帧缓存器电子设备。组件 1 表示所连接的监视器的电源管理状态。


示例 12–3 多组件 pm-components

pm-components="NAME=Frame Buffer", "0=Off", "1=Suspend", \
    "2=Standby", "3=On",
    "NAME=Monitor", "0=Off", "1=Suspend", "2=Standby", "3=On";

首次连接设备驱动程序时,框架并不了解设备的电源级别。在以下情况下,会进行电源转换:

进行电源转换后,框架将开始跟踪每个设备组件的电源级别。如果驱动程序已通知框架电源级别,则也会进行跟踪。驱动程序通过调用 pm_power_has_changed(9F) 通知框架电源级别的更改。

系统将计算每个可能的电源转换的缺省阈值。这些阈值基于系统空闲阈值。可以使用 pmconfigpower.conf(4) 覆盖缺省阈值。当组件电源级别未知时,将使用基于系统空闲阈值的其他缺省阈值。