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测试,装载返回地址并且跳转到内核


0 0