2、在uboot上实现电源管理

二. 给u-boot添加suspend命令
u-boot全速运行,耗电83ma
u-boot suspend:耗电33ma ==>外设备没有完全关闭,比如声卡、网卡

进入休眠模式的方法:
/* 1. 配置GPIO: 比如想维持LED亮或灭, 用于唤醒CPU的引脚要设为中断功能 */
/* 2. 设置INTMSK屏蔽所有中断: 在sleep模式下,这些引脚只是用于唤醒系统,当CPU正常运行时可以重新设置INTMSK让这些引脚用于中断功能 */
/* 3. 配置唤醒源 */
/* 4. 设置MISCCR[13:12]=11b, 使得USB模块进入休眠 */
/* 5. 在GSTATUS[4:3]保存某值, 它们可以在系统被唤醒时使用 */
/* 6. 设置 MISCCR[1:0] 使能数据总线的上拉电阻 */
/* 7. 清除 LCDCON1.ENVID 以停止LCD */
/* 8. 读这2个寄存器: rREFRESH and rCLKCON, 以便填充TLB
* 如果不使用MMU的话,这个目的可以忽略
*/
/* 9. 设置 REFRESH[22]=1b,让SDRAM进入self-refresh mode */
/* 10. 等待SDRAM成功进入self-refresh mode */
/* 11.设置 MISCCR[19:17]=111b以保护SDRAM信号(SCLK0,SCLK1 and SCKE) */
/* 12. 设置CLKCON的SLEEP位让系统进入sleep mode */


唤醒系统的方法:
/* 1. 按下按键 */
/* 2. 根据 GSTATUS2[1]判断是复位还是唤醒 */
/* 3. 设置 MISCCR[19:17]=000b, 以释放SDRAM信号 */
/* 4. 配置s3c2440的memory controller */
/* 5. 等待SDRAM退出self-refresh mode */
/* 6. 根据GSTATUS[3:4]的值来运行休眠前的函数 */

u-boot-1.1.6_jz2440_suspend.patch


nfs 30000000 192.168.1.124:/work/nfs_root/u-boot.bin;protect off all;erase 0 3ffff;cp.b 30000000 0 40000
nfs 30000000 192.168.1.124:/work/nfs_root/u-boot.bin;nand erase bootloader; nand write.jffs2 30000000 bootloader

资料:
http://blog.csdn.net/bingqingsuimeng/article/category/1228414
http://os.chinaunix.net/a2006/0519/1002/000001002210.shtml
http://www.ednchina.com/ART_44010_29_0_TA_eeda337e_3.HTM?jumpto=view_welcomead_1408610592294

好文:
http://blog.csdn.net/bingqingsuimeng/article/details/7935414
http://blog.csdn.net/bingqingsuimeng/article/details/8197912
http://blog.sina.com.cn/s/blog_a6559d920101i52j.html

Linux电源管理(1)_整体架构
http://www.wowotech.net/linux_kenrel/pm_architecture.html

Linux电源管理(4)_Power Management Interface
http://www.wowotech.net/linux_kenrel/pm_interface.html

Linux电源管理(6)_Generic PM之Suspend功能
http://www.wowotech.net/linux_kenrel/suspend_and_resume.html


Linux运行时IO设备电源管理框架---PM (runtime power manager)
http://blog.sina.com.cn/s/blog_533074eb0101dnm2.html


Run-time PM 详解
http://blog.csdn.net/bingqingsuimeng/article/details/7935440

电源管理之regulator机制流程
http://blog.csdn.net/bingqingsuimeng/article/details/8216782


linux内核对S3C2410睡眠模式的支持 (讲得很好!)
http://blog.csdn.net/hongtao_liu/article/details/4208988

s3c2440 省电模式开发详解(讲得很好!)
http://blog.chinaunix.net/uid-517401-id-1641576.html

http://www.linuxforum.net/forum/showflat.php?Board=embedded&Number=725416

s3c2440 省电模式开发详解
http://blog.chinaunix.net/uid-517401-id-1641576.html


state_store
  pm_suspend
    enter_state
      error = suspend_prepare();
        pm_prepare_console();
        pm_notifier_call_chain(PM_SUSPEND_PREPARE);
        suspend_freeze_processes
      error = suspend_devices_and_enter(state);
        error = suspend_ops->begin(state);
        suspend_console();
        dpm_suspend_start(PMSG_SUSPEND);
          dpm_prepare
            device_prepare(dev, state);
              if (dev->pm_domain) {
                info = "preparing power domain ";
                callback = dev->pm_domain->ops.prepare;
              } else if (dev->type && dev->type->pm) {
                info = "preparing type ";
                callback = dev->type->pm->prepare;
              } else if (dev->class && dev->class->pm) {
                info = "preparing class ";
                callback = dev->class->pm->prepare;
              } else if (dev->bus && dev->bus->pm) {
                info = "preparing bus ";
                callback = dev->bus->pm->prepare;
              }

          dpm_suspend(state);
            device_suspend(dev);
              __device_suspend(dev, pm_transition, false);
    
        suspend_enter
          suspend_ops->prepare
          dpm_suspend_end(PMSG_SUSPEND);
          suspend_ops->prepare_late
          disable_nonboot_cpus();
          arch_suspend_disable_irqs();
          syscore_suspend();
          suspend_ops->enter(state);
            s3c_pm_enter


      suspend_finish();

所涉及的device:

int dpm_prepare(pm_message_t state)
{
  int error = 0;

  might_sleep();

  mutex_lock(&dpm_list_mtx);
  while (!list_empty(&dpm_list)) {
    struct device *dev = to_device(dpm_list.next);

    get_device(dev);
    mutex_unlock(&dpm_list_mtx);

    error = device_prepare(dev, state);

device_add
  device_pm_add
    list_add_tail(&dev->power.entry, &dpm_list);

猜你喜欢

转载自www.cnblogs.com/liusiluandzhangkun/p/8974289.html