Linux2.6.21之ARM2410电源管理分析

    由于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的状态转换。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值