ACPI包括很多功能,电源管理是其功能之一,具体的ACPI的介绍可以参考ACPI的技术文档。

Linux中利用模块机制,实现ACPI对电源的管理:

static struct cpufreq_driver acpi_cpufreq_driver = {

.verify= acpi_cpufreq_verify,

.target= acpi_cpufreq_target,

.bios_limit= acpi_processor_get_bios_limit,

.init= acpi_cpufreq_cpu_init,

.exit= acpi_cpufreq_cpu_exit,

.resume= acpi_cpufreq_resume,

.name= "acpi-cpufreq",

.owner= THIS_MODULE,

.attr= acpi_cpufreq_attr,

};

模块的初始化工作由以下代码完成:

static int __init acpi_cpufreq_init(void)

{

int ret;

if (acpi_disabled)

return 0;

pr_debug("acpi_cpufreq_init\n");

ret = acpi_cpufreq_early_init();

if (ret)

return ret;

ret = cpufreq_register_driver(&acpi_cpufreq_driver);//核心

if (ret)

free_acpi_perf_data();

return ret;

}

主要是cpufreq_register_driver:

/*********************************************************************

* REGISTER / UNREGISTER CPUFREQ DRIVER *

*********************************************************************/

/**

* cpufreq_register_driver - register a CPU Frequency driver

* @driver_data: A struct cpufreq_driver containing the values#

* submitted by the CPU Frequency driver.

*

* Registers a CPU Frequency driver to this core code. This code

* returns zero on success, -EBUSY when another driver got here first

* (and isn't unregistered in the meantime).

*

*/

int cpufreq_register_driver(struct cpufreq_driver *driver_data)

{

unsigned long flags;

int ret;

if (!driver_data || !driver_data->verify || !driver_data->init ||

((!driver_data->setpolicy) && (!driver_data->target)))

return -EINVAL;

pr_debug("trying to register driver %s\n", driver_data->name);

if (driver_data->setpolicy)

driver_data->flags |= CPUFREQ_CONST_LOOPS;

spin_lock_irqsave(&cpufreq_driver_lock, flags);

if (cpufreq_driver) {

spin_unlock_irqrestore(&cpufreq_driver_lock, flags);

return -EBUSY;

}

cpufreq_driver = driver_data;

spin_unlock_irqrestore(&cpufreq_driver_lock, flags);

ret = sysdev_driver_register(&cpu_sysdev_class,

&cpufreq_sysdev_driver);

if (ret)

goto err_null_driver;

if (!(cpufreq_driver->flags & CPUFREQ_STICKY)) {

int i;

ret = -ENODEV;

/* check for at least one working CPU */

for (i = 0; i < nr_cpu_ids; i++)

if (cpu_possible(i) && per_cpu(cpufreq_cpu_data, i)) {

ret = 0;

break;

}

/* if all ->init() calls failed, unregister */

if (ret) {

pr_debug("no CPU initialized for driver %s\n",

driver_data->name);

goto err_sysdev_unreg;

}

}

register_hotcpu_notifier(&cpufreq_cpu_notifier);

pr_debug("driver %s up and running\n", driver_data->name);

return 0;

err_sysdev_unreg:

sysdev_driver_unregister(&cpu_sysdev_class,

&cpufreq_sysdev_driver);

err_null_driver:

spin_lock_irqsave(&cpufreq_driver_lock, flags);

cpufreq_driver = NULL;

spin_unlock_irqrestore(&cpufreq_driver_lock, flags);

return ret;

}

为什么不直接引用acpi_cpufreq_driver呢?

由于传递过来的参数是acpi_cpufreq_driver,因此以后引用cpufreq_driver就相当于引用acpi_cpufreq_driver了。为什么这么做呢?因为,还有一种叫做pcc_cpufreq_driver的东西,和acpi_cpufreq_driver一样,是电源管理的一种方式,它的初始化也是用这个函数,因为这两种方式你只能选择一种,因此,cpufreq_driver要么是acpi_cpufreq_driver,要么是pcc_cpufreq_driver。这样的实现方式,避免了代码的重复!

有这样一行代码

cpufreq_driver = driver_data;

linux内核acpi,Linux内核中ACPI电源管理部分解析相关推荐

  1. 7.嵌入式控制器EC实战 ACPI规范中的电源管理通道PMC(Power Management Channel)

    文章目录 前言 一.电源管理通道PMC概述 二.通过电源管理通道PMC完成EC和BIOS或操作系统通信 操作系统或BIOS通过PMC通道与EC通信 如果PMSTS的BIT2为1时,代表发送过来的信息是 ...

  2. 巧用Powercfg命令 - 玩转Windows 7中的电源管理

    使用 Thinkpad 笔电的朋友们知道,其 Power Manager 的功能非常强大,除了能定制电源管理方案意外,还能监控电池的使用情况以及控制电池的充电阀值,所以即使到了 Windows 7,很 ...

  3. 【STM32】初识STM32(型号+封装+内核+储存器+时钟、复位和电源管理+工作模式+ADC)

    折腾着折腾着终于开始了 目录 ■STM32型号的说明: ■几种封装样式: ■ 内核:ARM 32位的Cortex™-M3 CPU ■ 存储器 ■ 时钟.复位和电源管理 ■内嵌RC振荡器和外接晶振: ■ ...

  4. Windows驱动中的电源管理

    想来想去,今天还是更新一章,虽然回来点晚!因为,可能以后的时间会越来越少,一方面,是案子马上会非常忙,还有更重要的是,宝宝要会回来了! 不知道,为什么,今天一直在想,怎么去准备创业,哪个方向,才是适合 ...

  5. 嵌入式系统中的电源管理

    电源管理一直是一个热门话题,是近年来的嵌入式开发人员遇到的"一个很酷的话题".其重要性在很大程度上取决于延长手持设备电池寿命的要求,但环境危害,散热等引起了人们的关注. 嵌入式软件 ...

  6. c语言中的线程管理,深入解析C++编程中线程池的使用

    为什么需要线程池目前的大多数网络服务器,包括Web服务器.Email服务器以及数据库服务器等都具有一个共同点,就是单位时间内必须处理数目巨大的连接请求,但处理时间却相对较短. 传 统多线程方案中我们采 ...

  7. Mac OS电源管理大解析

    睡眠模式-hibernatemode-也就是Mac在睡眠模式下面的工作方式,目前主要有3种. hibernatemode 0:睡眠时内存保持供电,其他部件断电,内存数据不写入硬盘.优点是可以快速唤醒. ...

  8. 关闭linux服务器电源,linux关闭ACPI电源管理模块

    一.运行环境 # cat /etc/redhat-release CentOS release 6.2 (Final) # uname -a Linux web-server- 2.6.-.el6.x ...

  9. linux acpi 电源管理,ACPI电源管理

    S1,S2:待机.只关闭CPU.S1是完全加电:S2是如果CPU不活动就进入待机状态. S3:挂起到内存,关闭硬盘,其它设备处于加电等待状态. S4:休眠,内存写入硬盘后,关闭所有设备. S5:关机: ...

最新文章

  1. Linux系统上怎么安装服务器管理软件Cockpit?
  2. 天池大赛通用目标检测的对抗攻击方法一览
  3. Delphi Math里的基本函数,以及浮点数比较函数(转)
  4. 【渝粤教育】 国家开放大学2020年春季 1325妇产科学与儿科护理学 参考试题
  5. 如何得到长整数逆序后的整数
  6. linux的基础知识——本地套接字
  7. hive内部表和外部表的区别_走近大数据之Hive进阶(四、Hive的表连接)
  8. 16个常用的Linux服务器监控命令
  9. tomcat内存溢出的解决方法
  10. Core Audio APIs 技术笔记二(麦克风音量和增强设置)
  11. 不是美工,如何使用ps快速更换图标icon的颜色?
  12. 为什么uninapp制作微信小程序中uni.getUserInfo获取的微信名称是“微信用户“?
  13. 大数据应用型产品设计方法及行业案例介绍(附110页PPT)
  14. matlab 两个txt文件的合并。。
  15. pycharm查找替换快捷键
  16. 年薪6万美元/应届医学博士赴加州大学圣迭戈分校博士后就职
  17. 集成seata到springboot,cloud项目,找不到事务分组
  18. ORA-600 Lookup Error Categories
  19. 注册制掀起的激荡风云
  20. 文件10:文件路径-信息查询方法

热门文章

  1. 一文让你彻底弄懂【Python中的where函数】
  2. Unity面试】 2022年Unity面试题分享
  3. Web大学生网页作业成品 基于HTML+CSS+JavaScript减肥健身俱乐部
  4. 网易校招java笔试题_网易笔试题详细解答(Java)
  5. 微信小程序开通腾讯云开发环境
  6. 快来使用Portainer让测试环境搭建飞起来吧
  7. 三菱FX3U系列PLC运动控制_伺服回原点的3种方法示例
  8. Ultimate Rope Editor 柔性绳子编辑器插件
  9. 【ChatGPT高端玩法】ChatGPT生成Excel提取字符公式
  10. html href 字体颜色,html超链接文字颜色