Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2165366
  • 博文数量: 374
  • 博客积分: 7276
  • 博客等级: 少将
  • 技术积分: 5669
  • 用 户 组: 普通用户
  • 注册时间: 2011-10-06 16:35
文章分类

全部博文(374)

文章存档

2013年(23)

2012年(153)

2011年(198)

分类: LINUX

2012-03-26 13:17:08

由于arm系统中没有bios设备, 所以要使用APM(Advanced Power Management),只能为arm系统创建一个虚拟的字符设备来模拟APM与用户空间进行通讯. 这就是drivers/char/apm-emulation.c文件。

drivers/char/apm-emulation.c:
    此文件实现了一个misc设备apm_bios,实质上也是一个字符设备, 主设备号是10, 次设备号是134。这个apm_bios设备通过ioctl系统调用和用户空间进行通讯。当用户进程通过ioctl发来APM_IOC_SUSPEND命 令时,它就会调用apm_suspend函数,从而将系统转入suspend状态。
    apm_suspend函数最终会调用"pm_suspend(PM_SUSPEND_MEM);"语句。
    
kernel/power/main.c:
    pm_suspend函数在kernel/power/main.c文件中定义,它会调用enter_state函数。
    enter_state函数分为3个阶段:
1. prepare阶段:
    调用suspend_prepare函数,suspend_prepare将调用体系结构相关的函数pm_ops->prepare。
2.  进入suspend阶段:
    调用suspend_enter函数,suspend_enter将调用体系结构相关的函数pm_ops->enter。
3. finish阶段:
    调用suspend_finish函数,suspend_enter将调用体系结构相关的函数pm_ops->finish。
    pm_ops->prepare,pm_ops->enter,pm_ops->finish三个函数都是pm_ops的成员,pm_ops在arch/arm/plat-s3c2410/pm.c中定义,并在体系结构初始化的时候被注册。

arch/arm/plat-s3c2410/pm.c:
    s3c2410_pm_ops定义如下:
    static struct pm_ops s3c2410_pm_ops = {
    .pm_disk_mode    = PM_DISK_FIRMWARE,
    .prepare    = s3c2410_pm_prepare,
    .enter        = s3c2410_pm_enter,
    .finish        = s3c2410_pm_finish,
    };
    模块初始化函数s3c2410_pm_init调用"suspend_set_ops(&s3c2410_pm_ops);"语句注册s3c2410_pm_ops。
    核心就是s3c2410_pm_enter, 它真正实现suspend/resume的状态转换。
阅读(1831) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chumojing2012-03-26 17:30:54

从别处转载的  :-)