zoukankan      html  css  js  c++  java
  • 2、在uboot上实现电源管理

    tar xjf u-boot-1.1.6.tar.bz2

    cd u-boot-1.1.6

    patch -p1 < ../u-boot-1.1.6_jz2440.patch

    make 100ask24x0_config

    后面修改代码之后在从新制作补丁

    (2440的第七章介绍了各种工作模式,250页介绍了如何进入sleep模式)

    (2440的手册上251页详细的介绍了如何唤醒sleep模式)

    二. 给u-boot添加suspend命令(见cmd_suspend.c的do_suspend(),cmd_suspend.c在common目录下,其就是个指令,参看其他cmd写的,同时需要修改common下的makefile)

    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 */

    int do_suspend (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
    {
    /* 休眠: */

    /* 1. 配置GPIO: 比如想维持LED亮或灭, 用于唤醒CPU的引脚要设为中断功能 */
    /* 对于NAND启动: 要设置EINT23,22,21为输入引脚 */
    rGPGCON &= ~((3<<30) | (3<<28) | (3<<26));

    /* JZ2440只有S2/S3/S4可用作唤醒源,设置它们对应的GPIO用于中断模式 */
    rGPFCON &= ~((3<<0) | (3<<4));
    rGPFCON |= ((2<<0) | (2<<4));

    rGPGCON &= ~(3<<6);
    rGPGCON |= (2<<6);

    /* 2. 设置INTMSK屏蔽所有中断: 在sleep模式下,这些引脚只是用于唤醒系统,当CPU正常运行时可以重新设置INTMSK让这些引脚用于中断功能 */
    rINTMSK = ~0;

    /* 3. 配置唤醒源 */
    rEXTINT0 |= (6<<0) | (6<<8); /* EINT0,2双边沿触发 */
    rEXTINT1 |= (6<<12); /* EINT11双边沿触发 */

    /* 4. 设置MISCCR[13:12]=11b, 使得USB模块进入休眠 */
    rMISCCR |= (3<<12);

    /* 5. 在GSTATUS[4:3]保存某值, 它们可以在系统被唤醒时使用 */
    //rGSTATUS3 = ; /* 唤醒时首先执行的函数的地址 */
    //rGSTATUS4 = ; /* */

    /* 6. 设置 MISCCR[1:0] 使能数据总线的上拉电阻 */
    rMISCCR &= ~(3);

    /* 7. 清除 LCDCON1.ENVID 以停止LCD */
    rLCDCON1 &= ~1;

    /* 8~12使用汇编来实现,参考内核源码:
    * archarmmach-s3c2410sleep.S
    */把上面文件里面除头文件外的内容添加到u-boot-1.1.6/cpu/arm920t下,新建文件suspend.S,需要修改makefile

    /* 8. 读这2个寄存器: rREFRESH and rCLKCON, 以便填充TLB
    * 如果不使用MMU的话,这个目的可以忽略
    */uboot不使用MMU

    (CPU休眠之前,会先让SDRAM进入自刷新模式,进入自刷新模式后,在设置CLKCON进入休眠模式,但此时SDRAM已经不能访问,这段代码如何取得(第一点);如果启动了MMU,CPU还要取得页表,页表也在SDRAM中(第二点)。

    对于第二点,可以先访问所有这个过程中会用到的寄存器,访问之后CPU会把虚拟地址和物理地址对应的关系保存在内部的TLB中,下次访问的时候直接从TLB中取对应的物理地址;对应第一点,同样先执行休眠过程会使用的代码,当然通过teq PC #0  

                bl s3c2410_do_sleep 

                teq r0 r0.

                b s3c2410_do_sleep   

    的手段,在s3c2410_do_sleep中也有判断状态条件相等的时候才会执行,在第一次运行时并不执行,仅试运行取代码,CPU会把代码保存到ICaChe中,下次在次执行是就用ICaChe中直接去指令去执行)

    /* 9. 设置 REFRESH[22]=1b,让SDRAM进入self-refresh mode */(自刷新模式下,SDRAM可以保持数据不丢失,但这个时候CPU不能访问SDRAM了)

    /* 10. 等待SDRAM成功进入self-refresh mode */

    /* 11.设置 MISCCR[19:17]=111b以保护SDRAM信号(SCLK0,SCLK1 and SCKE) */

    /* 12. 设置CLKCON的SLEEP位让系统进入sleep mode */
    printf("suspend ...");
    delay(1000000);
    s3c2440_cpu_suspend(); /* 执行到这里就不会返回,直到CPU被唤醒,这个函数在suspend.S中,执行上面8/9/10/11/12步骤 */

    /* 恢复运行: 重新初始化硬件 */
    serial_init();
    printf("wake up ");

    return 0;
    }


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

    在start.S中添加

    A:

    在reset:标号下添加(大概在170行)

    #ifndef CONFIG_SKIP_LOWLEVEL_INIT
    /* 设置SP指向片内内存 */
    ldr sp, =4092
    ldr r0, =0x12345678   (下面四步是判断nor还是nand启动,设置不同的栈)
    str r0, [sp]
    ldr r1, [sp]
    cmp r0, r1
    ldrne sp, =0x40000000+4096
    bl clock_init
    #endif

    /* 2. 根据 GSTATUS2[1]判断是复位还是唤醒 */
    ldr r0, =GSTATUS2
    ldr r1, [r0]
    tst r1, #(1<<1) /*结果是 r1 & (1<<1) */
    bne wake_up  //如果是唤醒就执行wake_up

    B:

    在280行左右添加

    /* 1. 按下按键 */
    wake_up:
      str r1, [r0] /* clear GSTATUS2 *///清除标志位(reset是复位还是唤醒引起的)
    /* 3. 设置 MISCCR[19:17]=000b, 以释放SDRAM信号 */
      ldr r0, =MISCCR
      ldr r1, [r0]
      bic r1, r1, #(7<<17)
      str r1, [r0]

    /* 4. 配置s3c2440的memory controller */
      bl cpu_init_crit

    /* 5. 等待SDRAM退出self-refresh mode */
      mov r0, #1000
      1: subs r0, r0, #1
      cmp r0, #0
      bne 1b

    /* 6. 根据GSTATUS[3:4]的值来运行休眠前的函数 *///rGSTATUS4中会保存休眠前的栈,栈中保存进入休眠函数前的现场,在执行GSTATUS3所指地址的函数的时候会从休眠前的栈中取出现场来恢复
      ldr r0, =GSTATUS3
      ldr r1, [r0]
      mov pc, r1

      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  //烧到norflash上
    nfs 30000000 192.168.1.124:/work/nfs_root/u-boot.bin;nand erase bootloader; nand write.jffs2 30000000 bootloader //烧到nandflash上

    资料:
    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

  • 相关阅读:
    Mac下各种编程环境的配置问题(python java)
    hackintosh和windows时区问题
    CAN波特率计算公式
    Jetson nano 安装 TensorFlow
    python逻辑运算符优先级
    CSS知识点(一)
    HTML标签(二)
    python2与python3的区别
    HTML标签(一)
    IO多路复用和协程
  • 原文地址:https://www.cnblogs.com/liusiluandzhangkun/p/8974289.html
Copyright © 2011-2022 走看看