android power managerment 之sleep and wakeup
来源:互联网 发布:淘宝运营托管公司 编辑:程序博客网 时间:2024/05/16 12:43
一、sleep
1、在arch/arm/plat-samsung/pm.c中添加arch_initcall(s3c_pm_init);在内核中加载电源管理项。
2、在睡眠所经过的重要函数里全部插桩,发现,睡眠时停在了wake_unlock(),在kernel/kernel/power/wakelock.c里has_wake_lock_locked里添加打印信息如下
static long has_wake_lock_locked(int type)
{
struct wake_lock *lock, *n;
long max_timeout = 0;
BUG_ON(type >= WAKE_LOCK_TYPE_COUNT);
list_for_each_entry_safe(lock, n, &active_wake_locks[type], link) {
if (lock->flags & WAKE_LOCK_AUTO_EXPIRE) {
long timeout = lock->expires - jiffies;
if (timeout <= 0)
expire_wake_lock(lock);
else if (timeout > max_timeout)
max_timeout = timeout;
} else
{
printk("lockname = %s,lockflag = ox%x\n",lock->name,lock->flags); //添加的部分
return -1;
}
}
return max_timeout;
}
此函数的作用,检查活跃锁链表中是否还有类型为type的锁,在睡眠时type为WAKE_LOCK_SUSPEND,
此函数返回0,表示没有该类型的锁被持有,返回值大于0,表示有该类型的延时锁被持有,等到时候后会自动释放该锁,
此返回值为离解锁的时间。返回-1,表示有该类型的非延时锁被持有,不能进入睡眠。
3 、终端出现打印信息stop_drawing_early_suspend: timeout waiting for userspace to stop drawing,检查发现时由于配置的问题,应该配置
User-space screen access (Console switch on early-suspend) --->
| | ( ) None | |
| | (X) Console switch on early-suspend | |
| | ( ) Sysfs interface
其他配置:
CPU Power Management
| | [*] CPU Frequency scaling | |
| | [ ] Enable CPUfreq debugging | |
| | <*> CPU frequency translation statistics | |
| | [*] CPU frequency translation statistics details | |
| | Default CPUFreq governor (userspace) ---> | |
| | <*> 'performance' governor | |
| | < > 'powersave' governor | |
| | -*- 'userspace' governor for userspace frequency scaling | |
| | <*> 'ondemand' cpufreq policy governor | |
| | < > 'conservative' cpufreq governor | |
| | [*] CPUfreq support for Samsung S3C64XX CPUs | |
| | [ ] CPU idle PM support
[*] Power Management support | |
| | [*] Power Management Debug Support | |
| | [ ] Extra PM attributes in sysfs for low-level debugging/testing | |
| | [ ] Verbose Power Management debugging | |
| | [*] Suspend to RAM and standby | |
| | [ ] Test suspend/resume and wakealarm during bootup | |
| | [*] Wake lock | |
| | [*] Wake lock stats | |
| | [*] Userspace wake locks | |
| | [*] Early suspend | |
| | User-space screen access (Console switch on early-suspend) ---> | |
| | < > Advanced Power Management Emulation | |
| | [ ] Run-time PM core functionality
如果编译选中Run-time PM core functionality ,将出现USB连接不上电脑的问题
4、编译内核 ,烧写,在终端输入: echo mem > /sys/power/state,系统休眠。
要是打印了有关tty_ 的相关错误,可以修改drivers/char/下一个有关tty 的函数。参考网址http://zhengxianqing1986.blog.163.com/blog/static/180567261201261511424257/
5、Suspending console(s) (use no_console_suspend to debug)后无打印信息,
这是由于在suspend_devices_and_enter()函数里调用了suspend_console(),打印出的信息,睡眠进程在函数suspend_devices_and_enter()中将调用 dpm_suspend_start(PMSG_SUSPEND),这个函数将首先关闭串口设备,因此要用suspend_console()为睡眠进程申请一个虚拟终端,利用use no_console_suspend to debug来debug。
U-boot 启动参数:
init=/linuxrc rootfstype=ubifs root=ubi0:FriendlyARM-root ubi.mtd=2 console=ttySAC0,115200 no_console_suspend
二、wakeup
唤醒需要修改u-boot,在u-boot中添加对唤醒的支持,主要对应的文件为 lowlevel_init.S ,主要代码如下:
bl mem_ctrl_asm_init
#if 1
ldr r0, =(ELFIN_CLOCK_POWER_BASE+RST_STAT_OFFSET)
ldr r1, [r0]
bic r1, r1, #0xfffffff7
cmp r1, #0x08
beq wakeup_reset
//led1亮
ldr r2, =ELFIN_GPIO_BASE
ldr r3, =0x11110000
str r3, [r2, #GPKCON0_OFFSET]
ldr r3, =0x0000aa00
str r3, [r2, #GPKPUD_OFFSET]
ldr r3, =0x00e0
str r3, [r2, #GPKDAT_OFFSET]
#endif
1:
ldr r0, =ELFIN_UART_BASE
ldr r1, =0x4b4b4b4b
str r1, [r0, #UTXH_OFFSET]
mov lr, r12
mov pc, lr
//#if 1
wakeup_reset:
/*Clear wakeup status register*/
//led2亮
ldr r0, =ELFIN_GPIO_BASE
ldr r1, =0x11110000
str r1, [r0, #GPKCON0_OFFSET]
ldr r1, =0x00d0
str r1, [r0, #GPKDAT_OFFSET]
ldr r1, =0x0000aa00
str r1, [r0, #GPKPUD_OFFSET]
ldr r0, =(ELFIN_CLOCK_POWER_BASE+WAKEUP_STAT_OFFSET)
ldr r1, [r0]
str r1, [r0]
/*Load return address and jump to kernel*/
ldr r0, =(ELFIN_CLOCK_POWER_BASE+INF_REG0_OFFSET)
ldr r1, [r0] /* r1 = physical address of s3c6400_cpu_resume function*/
mov pc, r1 /*Jump to kernel (arch/arm/mach-s3c64xx/sleep.S)*/
nop
nop
lowlevel_init.S所实现的功能:
LED只亮-->关闭watch dog-->外部待处理中断清除-->屏蔽所有中断-->设置所有中断为中断请求模式-->
待处理中断清除-->跳转到system_clock_init,初始化ARM内核时钟和总线时钟,设置时钟频率FCLK、HCLK、
PCLK-->ifndef CONFIG_NAND_SPL,跳转到uart_asm_init,初始化串口引脚-->ifdef CONFIG_BOOT_NAND,
跳转到nand_asm_init,NAND接口初始化-->跳转到mem_ctrl_asm_init,执行/arch/arm/cpu/arm1176/s3c64xx/cpu_init.S,
配置 memory control-->唤醒支持,跳转到wakeup_reset,清除唤醒状态寄存器,LED测试,装载返回地址并且跳转到内核
- android power managerment 之sleep and wakeup
- android sleep and wakeup
- android power system wakeup source
- linux kernel ftrace 之wakeup tracer and wakeup_rt tracer
- Nanos-操作系统oslab1(2)---sleep和wakeup
- PowermanagerService的sleep和wakeup流程
- babyos2(16)—— sleep, wakeup
- linux powermanager 之 wakeup
- php对象serialize、unserialize时与sleep、wakeup的关系
- android移植之request_suspend_state: wakeup & init: untracked pid xx exited问题的解决
- Power off or sleep lock?
- 《power sleep》读后小结
- System Power Management Sleep States
- ArcToolbox使用之二——Data Managerment Tools
- log managerment
- android power manager 之 suspend resume过程
- android power manager 之 suspend resume过程
- George and Sleep
- linux shell 学习
- oracle 数据库日常维护_1
- 一个简单的选项卡的demo
- js获取gridview的值
- linux设备
- android power managerment 之sleep and wakeup
- java中晦涩的英文
- 关于IOS开发工具XCode工具出现 OS APPle LLVM 5.02 error问题
- oracle dataguard 数据库切换 python 脚本
- strlen,strcat,strcpy,strncpy,strcmp的具体实现
- jsp链接下载的3种方式
- 用代码控制Cube的运动
- sqlserver 中日期为‘ ’时
- 难道真的放弃后,大家彼此都能有个更轻松的开始吗