Chinaunix首页 | 论坛 | 博客
  • 博客访问: 307495
  • 博文数量: 63
  • 博客积分: 2018
  • 博客等级: 大尉
  • 技术积分: 694
  • 用 户 组: 普通用户
  • 注册时间: 2010-02-23 16:34
文章存档

2010年(63)

我的朋友

分类: LINUX

2010-02-23 16:50:09

Linux的电源管理支持
本文件简要介绍了如何使用您的电源管理
Linux系统以及如何添加电源管理的支持Linux的驱动程序。
APM或ACPI?
------------
如果你有一个比较新的x86移动,桌面或服务器系统,
它支持的可能是高级电源管理(APM)或
高级配置和电源接口(ACPI)。 ACPI是这两种技术的电源管理中较新的一种,
并提出在操作系统手中
,比使用BIOS控制的APM 可以提供更大的灵活性以及可扩展性。
最好的方法来确定,如果不是,你的系统支持,是
建立既符合ACPI和APM内核为2.3.x启用ACPI的(是
默认启用)。如果ACPI可以work,
ACPI驱动程序将覆盖和禁用APM,否则APM驱动
将被使用。
不要抱怨,你不能同时启用和运行ACPI和APM 。
碎ACPI或损坏,有些人
想得到了一套完整的工作特性,但您
根本无法混合和匹配两者。机器一次控制的只有一个电源管理接口。想想看..
用户空间守护进程
------------------
APM和ACPI都依赖于用户空间的守护进程,apmd和工具acpid
分别要完全发挥作用。从你的Linux发行版或从Internet(见下文) 获得这两项守护进程
并确保他们在系统启动过程的某个时候 开始。
继续并启动这两个。如果ACPI或APM在你的系统上是不可用的,
相关的守护进程将退出。
  apmd:〜apenwarr / apmd /
  工具acpid:
驱动程序接口 - 废弃,请勿使用!
----------------*************************
注:pm_register(),pm_access(),pm_dev_idle()和friends废弃。
请不要使用它们。相反,你应该适当挂钩
您的驱动程序到驱动程序模型,并使用它的suspend()/resume()
回调做这种东西。
如果你正在编写一个新的驱动程序或维持旧驱动程序,它
应包括电源管理支持。如果没有电源管理
支持,单一驱动程序可能 阻止具有电源管理功能的系统
使之不能suspend(安全)。
概述:
1)用“pm_register”  注册的每一个设备实例
2)在访问硬件之前 调用“pm_access”。
   (这将确保该硬件是awake和ready)
3)在进入挂起suspend状态(ACPI的D1-D3)前  或在从挂起到恢复resuming(ACPI的D0)
   你的“pm_callback”被调用。
4)当设备不被使用 调用“pm_dev_idle”
   (可选,但将改进闲置设备检测)
5)当卸载,用“pm_unregister”注销设备
/ *
 *说明:用电源管理子系统 注册设备
 *
 *参数:
 *类型 - 设备类型(PCI设备,系统设备,...)
 *身份证 - 例号或唯一标识符
 * cback - 请求处理回调(suspend, resume,...)
 *
 *返回:在error注册 PM装置或NULL
 *
 *例子:
 * dev= pm_register(PM_SYS_DEV,PM_SYS_VGA,vga_callback);
 *
 *   struct pci_dev *pci_dev = pci_find_dev(...);
 *   dev = pm_register(PM_PCI_DEV, PM_PCI_ID(pci_dev), callback);
 * /
struct pm_dev *pm_register(pm_dev_t type, unsigned long id, pm_callback cback);
/ *
 *说明:用电源管理子系统 注销设备
 *
 *参数:
 * dev - 从pm_register 返回的设备
 * /
void pm_unregister(struct pm_dev *dev);
/ *
 *说明:注销与回调函数匹配的所有设备
 *
 *参数:
 * cback - 之前注册的request callback
 *
 *注:从旧的APM接口提供更容易的移植
 * /
void pm_unregister_all(pm_callback cback);
/ *
 *电源管理的request callback
 *
 *参数:
 * dev - 从pm_register之前返回的设备
 * rqst - 请求类型
 *data - 数据,如果有的话,与请求相关联的
 *
 *返回:如果请求是成功的,0
 * EINVAL  如果不支持请求
 * EBUSY   如果该设备正在忙,无法处理请求
 * ENOMEM  如果设备由于内存无法处理请求
 *
 *详细内容:该设备请求回调将提交要求
 *设备/系统进入挂起状态(ACPI的D1的维生素D3)或
 *或之后的设备/系统恢复从挂起(ACPI的D0)用来。
 *对于PM_SUSPEND,在ACPIḎ国家正在通过签订
 *为“数据”参数回调。该设备
 *司机应保存(PM_SUSPEND)或恢复(PM_RESUME)
 *设备上下文请求时,被称为回调。
 *
 *一旦驱动程序从suspend request返回0(成功)
 *,它不应该处理任何进一步要求
 *或访问硬件直到产生一个对“pm_access”的调用。
 * /
typedef int (*pm_callback)(struct pm_dev *dev, pm_request_t rqst, void *data);
驱动程序详细信息
--------------
这仅仅是一个快速问答,直到一个真正的驱动作者
为电源管理提供指导。
问:是一个设备暂停? When is a device suspended?
设备可以暂停基于直接用户的要求(如:笔记本电脑盖子
关闭),系统功耗的政策(如睡眠控制台后30分钟
活动),或设备的电力政策(如断电后设备5
分钟的活动)
问:司机必须荣誉挂起的请求? Must a driver honor a suspend request?
没有,驱动程序可以返回从挂起的请求并EBUSY本
将停止吊销制度。当一个请求暂停
失败了,所有的设备都暂停,恢复和系统继续
运行。暂停试可以在以后的时间。
问:驱动程序块暂停/恢复的要求呢? Can the driver block suspend/resume requests?
是的,司机可以推迟从挂起或恢复回报
请求,直到该设备已准备好处理请求。它
有利于返回从尽快
要求为暂停/恢复连续完成。
问:什么情况下挂起/恢复启动的?
阿暂停或恢复启动的内核线程上下文。
它是安全的块,分配内存,发起请求
或其他任何你可以在内核。
问:请继续暂停后到达?
有可能。这是司机的责任要排队(*),
失败,或丢弃任何要求回国后到达
成功的请求暂停。重要的是,在
驱动程序不能访问其设备,直到收到后
作为该设备的总线请求恢复可能不再
是活动的。
(*)如果一个驱动程序请求队列后处理
    简历都知道,设备,网络等
    可能在不同的状态比在暂停时间。
    它可能会更好下降请求,除非
    司机是一个存储设备。
问:我有管理的巴士专用电源管理寄存器
不,这是公交车司机的责任管理
的PCI,USB接口,电源管理等登记。巴士司机
或电源管理子系统也将启用任何
唤醒功能,该设备已。
问:那么,真的,什么我需要做支持暂停/恢复?
您需要保存的任何设备情况下,将
如果丢失的设备是断电,然后恢复
它的恢复时间。当ACPI是积极的,有
三个层次的设备暂停状态; D1和D2和D3的。
(挂起状态通过的“数据”的论据
到设备回调。)与维生素D3,设备供电
关闭并失去所有方面,D1和D2是浅权力
国家和需要较少的设备上下文被保存。至
它的安全性,一切都只是保存在暂停和恢复
一切都在恢复。
问:我在哪里可以暂停存储设备上下文?
无处不在内存中,kmalloc的一个缓冲区或存储它
在设备描述符。您是保证的
内存的内容将恢复和可
前恢复,甚至当系统挂起到磁盘。
问:我需要做的ACPI与APM的与等?
驱动程序不需要知道具体的电源管理
技术处于活动状态。他们只需要知道
何时覆电源管理系统的要求
他们暂停或恢复。
问:有关设备依赖?
当一个驱动注册一个设备,电源管理
子系统使用所提供的资料建立
依赖的设备(如USB设备X上树
USB控制器辎于PCI总线Z是)当电源
管理要暂停设备,它首先发送
一要求暂停其驱动,然后是巴士司机,
等,到系统总线。设备恢复
进行相反的方向。
问:谁做的其他信息我联系
   让我的特定驱动程序的电源管理/设备?
ACPI的开发邮件列表:
系统接口 - 废弃,请勿使用!
----------------*************************
如果您提供新的电源管理支持的Linux(例如:
加入像APM或ACPI支持的东西),你应该
与司机沟通,通过现有的通用动力
管理界面。
/ *
 *发送请求中的所有设备
 *
 *参数:
 * rqst - 请求类型
 *数据 - 数据,如果有的话,与请求相关联的
 *
 *返回:0如果请求是成功的
 *见“pm_callback的错误”回归
 *
 *详细内容:步行注册设备清单,并呼吁pm_send
 *每个直到完成或遇到错误。
 *如果遇到错误的暂停请求,
 *返回所有的国家,他们是在以前的设备
 *挂起的请求。
 * /
廉政pm_send_all(pm_request_t rqst,无效*数据);
/ *
 *找到匹配的设备
 *
 *参数:
 *类型 - 设备类型(PCI设备,系统设备,或0到匹配的所有设备)
 *从 - 以前的匹配或NULL从头开始
 *
 *返回:匹配的设备或空,如果没有找到
 * /
结构pm_dev * pm_find(pm_dev_t类型,从结构pm_dev *);
阅读(1690) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~