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使用汇编来实现,参考内核源码:
* arch\arm\mach-s3c2410\sleep.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\n");
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
2、在uboot上实现电源管理的更多相关文章
- 第一次实验: CC2530平台上电源管理与休眠
实验一 CC2530平台上电源管理与休眠 实验目的: 加深和巩固学生对于TinyOS编程方法的理解和掌握 让学生初步的认识TinyOS编程的基础和简单的程序编写 学生通过本实验能够初步的了解和掌握Ti ...
- exynos 4412 电源管理芯片PMIC 的配置及使用方法
/** ****************************************************************************** * @author Maox ...
- ARM linux电源管理——Cortex A系列CPU(32位)睡眠和唤醒的底层汇编实现
ARM linux电源管理——Cortex A系列CPU(32位)睡眠和唤醒的底层汇编实现 承接 http://www.wowotech.net/pm_subsystem/suspend_and_re ...
- [专业名词·硬件] 2、DC\DC、LDO电源稳压基本常识(包含基本原理、高效率模块设计、常见问题、基于nRF51822电源管理模块分析等)·长文
综述先看这里 第一节的1.1简单介绍了DC/DC是什么: 第二节是关于DC/DC的常见的疑问答疑,非常实用: 第三节是针对nRF51822这款芯片电源管理部分的DC/DC.LDO.1.8的详细分析,对 ...
- Linux电源管理(11)_Runtime PM之功能描述
转自:http://www.wowotech.net/pm_subsystem/rpm_overview.html 1. 前言 终于可以写Runtime PM(后面简称RPM)了,说实话,蜗蜗有点小激 ...
- USB电源管理
在USB总线接口协议中,由于涉及电源供电,因此协议中规定了完整的电源管理方案.通过USB电源管理可以实现USB设备的激活.挂起.空闲和睡眠等,从而降低无效的功率消耗,实现系统电源的有效使用和合理分配. ...
- Android电源管理-休眠简要分析
一.开篇 1.Linux 描述的电源状态 - On(on) S0 - Working - Standb ...
- linux电源管理系列(一)
本系列将逐步介绍linux电源管理相关的知识,涉及到常见电源管理机制.linux电源管理机制.linux驱动中有关电源管理的相关接口.内核文档中关于Linux电源管理架构文档的分析.以下将以此来介绍相 ...
- linux驱动程序之电源管理之Run-time PM 详解(4)
Run-time PM. 每个device或者bus都会向run-time PM core注册3个callback struct dev_pm_ops { ... int (*runtime_su ...
随机推荐
- SpringBoot与Dubbo整合-项目搭建
本章节建立生产者和消费者来演示dubbo的demo 生产者:springboot-dubbo-provider 和 消费者:springboot-dubbo-consumer 工程配置详解 Apach ...
- 分享一段css代码学到的js知识
[].forEach.call($$('*'),function(val){ val.style.outline = '1px solid #'+(~~(Math.random()*(1<< ...
- Regularization —— linear regression
本节主要是练习regularization项的使用原则.因为在机器学习的一些模型中,如果模型的参数太多,而训练样本又太少的话,这样训练出来的模型很容易产生过拟合现象.因此在模型的损失函数中,需要对模型 ...
- LuoguP2765 魔术球问题(最大流)
题目描述 «问题描述: 假设有n根柱子,现要按下述规则在这n根柱子中依次放入编号为1,2,3,...的球. (1)每次只能在某根柱子的最上面放球. (2)在同一根柱子中,任何2个相邻球的编号之和为完全 ...
- MyBatis学习总结(11)——MyBatis动态Sql语句
MyBatis中对数据库的操作,有时要带一些条件,因此动态SQL语句非常有必要,下面就主要来讲讲几个常用的动态SQL语句的语法 MyBatis中用于实现动态SQL的元素主要有: if choose(w ...
- 基于 Cookie 的 SSO 中间件 kisso
kisso = cookie sso 基于 Cookie 的 SSO 中间件,它是一把快速开发 java Web 登录系统(SSO)的瑞士军刀.欢迎大家使用 kisso !! kisso 帮助文档 ...
- 洛谷——P3384 【模板】树链剖分
https://www.luogu.org/problem/show?pid=3384#sub 题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作 ...
- BZOJ 1507 NOI2003 Editor Splay
题目大意: 1.将光标移动到某一位置 2.在光标后插入一段字符串 3.删除光标后的一段字符 4.输出光标后的一段字符 5.光标-- 6.光标++ 和1269非常像的一道题,只是弱多了 几个问题须要注意 ...
- 记号(notation)的学习
数学的记号(notation) 记号具体代表什么含义,取决于你的定义: 比如这样的 d⃗ 一个向量,每个分量 d(i) 表示的是从初始结点 v 到当前节点 vi 的最短路径:也即这样的一个向量的每一 ...
- Objective-C基础笔记(4)Category
OC中提供了一种与众不同的方式--Category,可以动态的为已经存在的类添加新的行为(方法),这样可以保证类的原始设计规模较小,功能增加时再逐步扩展. 在使用Category对类进行扩展时,不需要 ...