linux驱动程序之电源管理之标准linux休眠与唤醒机制分析(一)

发布者:温柔之风最新更新时间:2023-06-19 来源: elecfans关键字:linux  驱动程序  电源管理  休眠 手机看文章 扫描二维码
随时随地手机看文章

1. Based on linux2.6.32,  only for mem(SDR)

2. 有兴趣请先参考阅读: 电源管理方案APM和ACPI比较.doc

Linux系统的休眠与唤醒简介.doc

3. 本文先研究标准linux的休眠与唤醒,android对这部分的增改在另一篇文章中讨论

4. 基于手上的一个项目来讨论,这里只讨论共性的地方

 

虽然linux支持三种省电模式:standby、suspend to ram、suspend to disk,但是在使用电池供电的手持设备上,几乎所有的方案都只支持STR模式(也有同时支持standby模式的),因为STD模式需要有交换分区的支持,但是像手机类的嵌入式设备,他们普遍使用nand来存储数据和代码,而且其上使用的文件系统yaffs一般都没有划分交换分区,所以手机类设备上的linux都没有支持STD省电模式。

 

一、项目power相关的配置

目前我手上的项目的linux电源管理方案配置如下,.config文件的截图,当然也可以通过make menuconfig使用图形化来配置:

#

# CPU Power Management

#

# CONFIG_CPU_IDLE is not set

 

#

# Power management options

#

CONFIG_PM=y

# CONFIG_PM_DEBUG is not set

CONFIG_PM_SLEEP=y

CONFIG_SUSPEND=y

CONFIG_SUSPEND_FREEZER=y

CONFIG_HAS_WAKELOCK=y

CONFIG_HAS_EARLYSUSPEND=y

CONFIG_WAKELOCK=y

CONFIG_WAKELOCK_STAT=y

CONFIG_USER_WAKELOCK=y

CONFIG_EARLYSUSPEND=y

# CONFIG_NO_USER_SPACE_SCREEN_ACCESS_CONTROL is not set

# CONFIG_CONSOLE_EARLYSUSPEND is not set

CONFIG_FB_EARLYSUSPEND=y

# CONFIG_APM_EMULATION is not set

# CONFIG_PM_RUNTIME is not set

CONFIG_ARCH_SUSPEND_POSSIBLE=y

CONFIG_NET=y

 

上面的配置对应下图中的下半部分图形化配置。。。,看来是直接在Kconfig文件中删除了配置STD模式的选项。

  

使用上面的配置编译出来的系统,跑起来之后,进入sys目录可以看到相关的接口:

# pwd

/sys/power

# ls

state  wake_lock   wake_unlock   wait_for_fb_sleep   wait_for_fb_wake

# cat state

mem

如果配置了宏CONFIG_PM_DEBUG,那么在power目录下会多出一个pm_test文件,cat pm_test后,列出的测试选项有:[none] core processors platform devices freezer。关于这个test模式的使用,可以参考kernel文档:/kernel/documentation/power/Basic-pm-debugging.txt

这个文档我也有详细的阅读和分析。

 

二、sys/power和相关属性文件创建

系统bootup时候在sys下新建power和相关属性文件,相关源码位置:

kernel/kernel/power/main.c

 

static int __init pm_init(void)

{

       int error = pm_start_workqueue();// CONFIG_PM_RUNTIME not set, so this fun is null

       if (error)

              return error;

       power_kobj = kobject_create_and_add("power", NULL);

// 建立power对应的kobject和sysfs_dirent对象,同时建立联系:kobject.sd =

//  &sysfs_dirent, sysfs_dirent.s_dir->kobj = &kobject。

       if (!power_kobj)

              return -ENOMEM;

       return sysfs_create_group(power_kobj, &attr_group);

// 建立一组属性文件,可以在power下建立一个子目录来存放这些属性文件,    // 不过需要在结构体attr_group中指定name,否则直接将这些属性文件放在     //  power_kobj对应的目录下。

}

core_initcall(pm_init);  // 看的出来,该函数是很早就被调用,initcall等级为1

 

static struct attribute_group attr_group = {

       .attrs = g,

};

 

struct attribute_group {

       const char             *name;

       mode_t                 (*is_visible)(struct kobject *,

                                         struct attribute *, int);

       struct attribute      **attrs;

};

// 属性文件都是以最基本得属性结构struct attribute来建立的

static struct attribute * g[] = {

       &state_attr.attr,

#ifdef CONFIG_PM_TRACE  // not set

       &pm_trace_attr.attr,

#endif

#if defined(CONFIG_PM_SLEEP) && defined(CONFIG_PM_DEBUG)     // not set

       &pm_test_attr.attr,

#endif

#ifdef CONFIG_USER_WAKELOCK       // set

       &wake_lock_attr.attr,

       &wake_unlock_attr.attr,

#endif

       NULL,

};

 

#ifdef CONFIG_PM_SLEEP

#ifdef CONFIG_PM_DEBUG

power_attr(pm_test);

#endif

#endif

power_attr(state);

#ifdef CONFIG_PM_TRACE

power_attr(pm_trace);

#endif

#ifdef CONFIG_USER_WAKELOCK

power_attr(wake_lock);

power_attr(wake_unlock);

#endif

 

#define power_attr(_name) /

static struct kobj_attribute  _name##_attr = { /

       .attr = {                       /

              .name = __stringify(_name),      /

              .mode = 0644,                     /

       },                                /

       .show     = _name##_show,               /

       .store      = _name##_store,        /

}

// 而这些被封装过的属性结构体,将来会使用kobject的ktype.sysfs_ops->show(store)这两个通用函数通过container_of()宏找到实际的属性结构体中的show和store函数来调用。

关于更多sysfs的内容,请查看其他关于这部分内容的详细解析文档。


关键字:linux  驱动程序  电源管理  休眠 引用地址:linux驱动程序之电源管理之标准linux休眠与唤醒机制分析(一)

上一篇:linux驱动程序之电源管理之标准linux休眠和唤醒机制分析(二)
下一篇:linux驱动程序之电源管理 之linux休眠与唤醒(2)

推荐阅读最新更新时间:2024-11-17 04:25

高集成度蓝牙耳机电源管理方案
引言:随着越来越多的手机支持蓝牙功能,蓝牙耳机已成为手机的必备选件。蓝牙耳机的电源管理设计要求外围组件少,集成度高,同时满足蓝牙芯片对负载响应和噪声抑制的要求。 图1:TC1303在蓝牙耳机上的应用电路。 无线立体声耳机成为2005年的热门产品。随着越来越多的手机支持蓝牙功能,蓝牙耳机已成为手机的必备选件。同时,随着支持MP3播放的立体声蓝牙耳机的推出,蓝牙耳机已能够同时连接到蓝牙移动电话和音乐播放器,这必将给蓝牙应用带来新的亮点。 蓝牙耳机的核心是射频和基带处理两部分,为适应功能的集成和设计的小型化,CSR、Broadcom等公司已将射频和基带处理功能集成在一起,如CSR BlueCore4高集成的蓝
[手机便携]
采用IGBT设计UPS的技术方案
在UPS 中使用的功率器件有双极型功率晶体管、功率MOSFET、可控硅和IGBT,IGBT 既有功率MOSFET易于驱动、控制简单、开关频率高的优点,又有功率晶体管的导通电压低,通态电流大的优点、使用IGBT 成为UPS 功率设计的首选,只有对IGBT的特性充分了解和对电路进行可靠性设计,才能发挥IGBT 的优点。本文介绍UPS中的IGBT 的应用情况和使用中的注意事项。IGBT在UPS中的应用情况         绝缘栅双极型晶体管IGBT是一种MOSFET 与双极晶体管复合的器件。它既有功率MOSFET易于驱动、控制简单、开关频率高的优点,又有功率晶体管的导通电压低,通态电流大,损耗小的显著优点。据东芝公司资料,1200V/
[嵌入式]
高低功率分开处理,射频电源管理你真的了解吗?
电源管理是一门科学艺术,它通过优化输入和输出信号来最大化 RF 设备的效率和性能,这不是一件容易的事。每台网络设备都有自己独特的功率需求。更高的数据速率通常意味着更高的功耗和复杂性,这可能会带来损失,进而降低可靠性和增加成本。低数据速率设备(例如支持物联网的那些设备)功率极小,以便节省宝贵的电池电源的每一毫秒。 除此以外,RF 工程师还面临静电放电的难题,它几乎可以炸毁一台设备的电路板。想象一下,在干燥的冬日走过地毯后,手碰触到门把手。咝!在您碰到门把手的那一刻,它只会让您的手臂汗毛竖起来,感到轻微不适,但是,却会让设备产生严重的性能问题,或者甚至损坏敏感的电子元件。每个人都能按下电源按钮,但要设计出电源管理和 RF 设备,则
[电源管理]
嵌入式NVM在电源管理中的应用
转向更为逻辑的NVM 尽管当今的设计工程师可以选择多种NVM,但是,具有低成本、高性能和应用灵活性的嵌入式NVM却很少。对于某些应用目标,排除了许多选择的可能性。例如,尽管传统的激光熔丝可能适合于单一数字位,但是它们由工厂一次性编程,不能重复精确模拟修整,不能现场升级,也不具备可靠性。多次熔丝的缺点很多,相关文献的介绍很详尽。 闪存是较好的选择,但是,成本不低,其需要增加的工艺使制造这种NVM架构的成本高达每晶圆几百美元。另一方面,EEPROM的应用已经有相当长的时间,正因为如此,它比较便宜;但是它并不是你的选择,当你考虑选择它的时候,发现它却受制于较老的工艺技术,性能也受制到无法接受的低水平。至于较新的嵌入式EEPR
[电源管理]
arm-linux-gcc和简单的makefile
gcc常用选项 gcc 的使用方法: gcc 文件名 -v:查看gcc编译器的版本,显示gcc执行时的详细过程 -o :指定输出文件名为file,不用与编译文件同名 -E: preprocess only; do not compile, assemble or link(只预处理,不会编译、汇编、链接) -S:Compile only; do not assemble or link(只编译需要有已经预处理完成的输出文件,不会汇编和链接) -c:Compile and assemble, but do not link(预处理 编译和汇编,不会链接) gcc编译文件 gcc hello.c :直接默认生成一个a.out文件 g
[单片机]
msp430g2553与串口通信的驱动程序
#include uart.h #include msp430g2553.h #include typedef.h rece_data uart_buf; //串口缓冲区 void init_uart_buf(void) { uart_buf.head = 0; uart_buf.tail = uart_buf.head; } //获取串口数据 u8 get_uart_data(u8* data) { if(uart_buf.tail == uart_buf.head) { return 0; } *data = uart_buf.buf ; uart
[单片机]
OK6410A 开发板 (八) 11 linux-5.11 OK6410A start_kernel 打印角度 第一阶段 mem
该阶段完成了 1. 根据 memblock 的 reserved 成员 reserve 不需要填充的页表 // reserve_bootmem_region 2. 通过 在 全物理内存内 互补 memblock 的 reserved,得到未使用的物理内存,填充需要填充的页表 // __free_memory_core 3. 至此 , buddy 初始化完成 4. 用(内存地址,内存大小,申请块大小)填充 kmalloc_caches )] )] 5. 至此 , slab 初始化完成 6. 将 在vmalloc区间的 已经使用的虚拟内存地址A(主要是io设备) 注册到 vmap_area_root 7. 通过
[单片机]
电源管理:便携产品电源芯片的设计技巧
随着便携产品日趋小巧轻薄,对电源管理芯片也提出更高的要求,诸如高集成度、高可靠性、低噪声、抗干扰、低功耗等。本文探讨了在便携产品电源设计的实际应用中需要注意的各方面问题。 便携产品的电源设计需要系统级思维,在开发手机、MP3、PDA、PMP、DSC等由电池供电的低功耗产品时,如果电源系统设计不合理,会影响到整个系统的架构、产品的特性组合、元件的选择、软件的设计以及功率分配架构等。同样,在系统设计中,也要从节省电池能量的角度出发多加考虑。例如,现在便携产品的处理器一般都设有几种不同的工作状态,通过一系列不同的节能模式(空闲、睡眠、深度睡眠等)可减少对电池容量的消耗。当用户的系统不需要最大处理能力时,处理器就会进入电源消耗较少的低功
[单片机]
<font color='red'>电源管理</font>:便携产品电源芯片的设计技巧
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved