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-06 14:37

Timesys为Tensilica处理器提供嵌入式Linux
Tensilica 和 Timesys 日前宣布 ,针对 Tensilica 钻石标准 232L 处理器提供 LinuxLink 订阅服务。 LinuxLink 订阅服务为开发者提供专为 Tensilica 232L 钻石标准处理器测试和集成的全套嵌入式 Linux 平台,包括 Linux 2.625Kernel 、 232L 专用设备驱动、基于 GNU uClibc 的工具链及数百个预先汇编的软件包。通过 Timesys 的 TimeStorm 开发环境及技术支持, LinuxLink 订阅者能快速定制和测试基于针对应用优化的 Tensilica 232L 处理器的嵌入式 Linux 平台。 Tensi
[工业控制]
2021 TI Live! TECH EXCHANGE举行,围绕汽车、工业及电源
日前,德州仪器(TI)举办了2021 TI Live! TECH EXCHANGE在线研讨会,围绕汽车、实时控制、视觉传感以及电源管理四大技术领域,通过TI创新的产品与方案,详细阐述了TI的愿景——借助半导体让产品变得更便宜,从而创造更美好的世界。 TI全球市场高级副总裁Keith Ogboenyiya,嵌入式处理及DLP高级副总裁Amichai Ron以及汽车电源设计服务总经理Pradeep Shenoy通过视频演讲,分别介绍了TI在这三大领域的具体布局与创新。 迎合汽车电气化浪潮下客户的选择 Keith表示,随着汽车电气化浪潮的到来,汽车内部架构正在进行着变革,复杂性与苛刻性的要求,需要更多科技元素。 目
[半导体设计/制造]
2021 TI Live! TECH EXCHANGE举行,围绕汽车、工业及电源
linux下avr单片机开发:中断服务程序
不管是什么单片机程序,中断总是非常重要的一部分 ,linux 下的avr开发,主要是依靠avr-gcc,以及avr-libc,它们对中断程序的格式要求,与window下的icc-avr以及win-avr有所差异,这里对linux下中断服务程序编写做个简要介绍。 首先是要引入的库: #include avr/io.h #include avr/interrupt.h 这两个是中断程序所要用到的,中断程序的编写位置,只要是在工程里的某个c文件里面就可以了。 具体格式: ISR(INT1_vect) { //...................................// } 其中的INT1
[单片机]
飞兆推出TinyBuckTM DC-DC稳压器FAN2108
飞兆半导体公司推出TinyBuckTM DC-DC稳压器,能够协助电源设计人员在小的PCB空间里实现较高的输出电流和高效率。FAN2108 是完全集成的8A同步降压转换器,可在宽泛的输入电压范围 (3V至24V) 提高效率,适用于机顶盒、图形卡、负载点 (POL) 和工业电源网络设备等应用。同类的解决方案如要达到高效率,需要使用附加的分立元件或大量电路板空间 — 因而延长了设计时间和增加了终端应用的体积。TinyBuck器件在纤细的5mm x 6mm模塑无引脚封装 (MLP) 中集成了控制器、MOSFET和启动二极管,构成业界最小的8A解决方案。FAN2108采用飞兆半导体的PowerTrench MOSFET工艺设计,具有
[电源管理]
Linux 6.5内核增加对高通开源GPU Adreno 690的支持
即将推出的Linux 6.5内核将把对高通Adreno 690 GPU的支持添加到开源的MSM内核图形/显示驱动程序中。A690主要用于骁龙8cx第三代(SC8280XP)平台,而联想ThinkPad X13s笔记本电脑和其他硬件也采用了该平台。 MSM Adreno Direct Rendering Manager (DRM)驱动程序已经排队支持Adreno A690,包含近200行代码,超过了对现有Adreno 600系列硬件的支持。该支持是通过Linaro提供的。 本周,Adreno A690支持作为drm-msm-next的一部分被送入,DRM-next的MSM驱动变化将在即将到来的Linux 6.5内核合并窗口排
[嵌入式]
利用自主电源管理器简化锂离子电池充电过程
消费者对 电池 供电手持设备的小型化、低成本化以及通过接受多种输入 电源 来实现易用性的需求对系统设计工程师带来了诸多的挑战。利用PowerPath 电池 管理器系列可以有效解决这些挑战,它具有独立的自主操作特性,能够对多种 电源 (如汽车适配器、FireWire输入、交流电适配器、USB端口和电池本身)之间的无缝切换实施高效管理。 对于如今的电池供电手持设备的系统设计工程师来说,他们所面临的一些主要挑战包括最大限度地降低功耗、最大限度地提高效率、简化设计以及降低成本。 现今的许多便携式电池供电 电子 产品可从交流电适配器、汽车适配器、USB端口或锂离子/聚合物电池获得电源。然而,对这些不同电源之间的电源路径 控制 进行自主管
[电源管理]
基于ARM2410的WLAN电子邮件移动终端
  电子邮件是Internet上使用最广泛的一种服务。随着无线通信技术的迅速发展,实现电子邮件的无线传输与转发已是大势所趋。同时为了适应不同的场合,对无线电子邮件终端的便携性提出了更高的要求。基于ARM内核的嵌入式系统具有高性能、低功耗、便携性等特点,并支持多种操作系统,因而应用广泛。   传统的无线数据终端一般是采用“单片机+无线网卡”的系统结构,这种结构硬件成本略低,但功能有限,在协议开发和支持上都有一定难度。以ARM为代表的32位微处理器技术得到飞速发展,无线数据终端系统以“高性能嵌入式微处理器+无线网卡”的系统架构取代了传统的无线数据终端设计方案,虽然该方案硬件成本稍高,需要高性能嵌入式微处理器来支持嵌入式操作系统,但可
[单片机]
Uncompressing Linux... done, booting the kernel
今天用主线Linux内核移植到MINI6410,主线内核2.6.37.1基本已经支持了MINI6410的板子,所以移植到能够启动起来的阶段很简单,但是在移植的时候还是出现了一个比较常见的问题: MINI6410 # bootm 0x50008000 ## Booting kernel from Legacy Image at 50008000 ... Image Name: Linux-2.6.37.1 Image Type: ARM Linux Kernel Image (uncompressed) Data Size: 3800644 Bytes = 3.6 MiB Load Address: 50008000
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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