android power manager 之 suspend resume过程

转载请标注原文地址:http://blog.csdn.net/uranus_wm/article/details/11569913

 

平台:android4.0 + samsung exynos4412

 

android power manager主要包括:wake_lock -> setScreenState(off)  -> request_suspend_state -> early_suspend -> wake_unlock -> suspend -> late suspend -> sleep -> wakeup -> early resume -> resume -> late resume 这样一个过程

应为resume和suspend基本是一个逆过程,所以本文章重点介绍的都是suspend过程

除了sleep -> wakeup 是和平台相关的,其他部分是平台无关的,本文主要介绍平台无关部分,下面一篇文章将主要介绍sleep -> wakeup部分

文章地址:http://blog.csdn.net/uranus_wm/article/details/11635381

 

大致过程如下:

android framework部分:

1. wakelock:framework和kernel都可以对WAKE_LOCK进行加锁,解锁;

申请了WAKE_LOCK则系统不会进入休眠状态,系统运行时很多app都会使用WAKE_LOCK加锁,以阻止系统休眠

因此app必须确保退出之后使用wake_unlock解锁,否则系统功耗会很有问题,关于WAKE_LOCK本文不做详细介绍

framework文件位置:/frameworks/base/core/java/android/os/PowerManager.java

    private static final int WAKE_BIT_CPU_STRONG = 1;
    private static final int WAKE_BIT_CPU_WEAK = 2;
    private static final int WAKE_BIT_SCREEN_DIM = 4;
    private static final int WAKE_BIT_SCREEN_BRIGHT = 8;
    private static final int WAKE_BIT_KEYBOARD_BRIGHT = 16;
    private static final int WAKE_BIT_PROXIMITY_SCREEN_OFF = 32;

    /* 确保CPU为运行状态,lcd屏幕有可能是关闭状态*/
    public static final int PARTIAL_WAKE_LOCK = WAKE_BIT_CPU_STRONG;

    /* 确保lcd背光和键盘灯处于全亮状态*/
    public static final int FULL_WAKE_LOCK = WAKE_BIT_CPU_WEAK | WAKE_BIT_SCREEN_BRIGHT 
                                            | WAKE_BIT_KEYBOARD_BRIGHT;

    /* 确保lcd背光亮,但可能是半亮,键盘灯允许熄灭*/
    public static final int SCREEN_DIM_WAKE_LOCK = WAKE_BIT_CPU_WEAK | WAKE_BIT_SCREEN_DIM;

    /* 由近距离感应器决定lcd背光灭*/
    public static final int PROXIMITY_SCREEN_OFF_WAKE_LOCK = WAKE_BIT_PROXIMITY_SCREEN_OFF;

 2. setScreenState(off) ;  //lcd关闭,背光熄灭后,设置"/sys/power/state" 为"mem"
文件位置:/frameworks/base/services/java/com/android/server/PowerManagerService.java

private int setScreenStateLocked(boolean on) {

        int err = Power.setScreenState(on);
}

public static native int setScreenState(boolean on);

 3. native部分:直接使用write函数对sys文件系统进行写操作
文件位置:/hardware/libhardware_legacy/power/power.c

const char * const NEW_PATHS[] = {
    "/sys/power/wake_lock",
    "/sys/power/wake_unlock",
    "/sys/power/state"
};

static const char *off_state = "mem";
static const char *on_state = "on";

int set_screen_state(int on)
{
    if(on)
        len = snprintf(buf, sizeof(buf), "%s", on_state);
    else
        len = snprintf(buf, sizeof(buf), "%s", off_state);

    buf[sizeof(buf) - 1] = '\0';
    len = write(g_fds[REQUEST_STATE], buf, len);
}

kernel部分:power manager相关文件基本都在 /kernel/power/ 目录下
4. "/sys/power/state"被写入"mem"后,state_store函数被调用
这个调用机制需要了解linux的sysfs和kobject,以后再详细介绍
文件位置:/kernel/power/main.c

static int __init pm_init(void){ 
 power_kobj = kobject_create_and_add("power", NULL);
 return sysfs_create_group(power_kobj, &attr_group);
}

core_initcall(pm_init);

power_attr(state);

#define power_attr(_name) \
static struct kobj_attribute _name##_attr = {	\
	.attr	= {				\
		.name = __stringify(_name),	\
		.mode = 0644,			\
	},					\
	.show	= _name##_show,			\
	.store	= _name##_store,		\
}

static ssize_t state_store(struct kobject *kobj, struct kobj_attribute *attr,
      const char *buf, size_t n)
{
#ifdef CONFIG_SUSPEND
#ifdef CONFIG_EARLYSUSPEND
 suspend_state_t state = PM_SUSPEND_ON;
#else
 suspend_state_t state = PM_SUSPEND_STANDBY;
#endif
 const char * const *s;
#endif


#ifdef CONFIG_SUSPEND
 for (s = &pm_states[state]; state < PM_SUSPEND_MAX; s++, state++) {
  if (*s && len == strlen(*s) && !strncmp(buf, *s, len))
   break;
 }
 if (state < PM_SUSPEND_MAX && *s)
#ifdef CONFIG_EARLYSUSPEND
  if (state == PM_SUSPEND_ON || valid_state(state)) {
   error = 0;
   request_suspend_state(state);
  }
#else
  error = enter_state(state);
#endif
#endif
}

 5. 上一步request_suspend_state(PM_SUSPEND_ON)请求进入early_suspend

early_suspend是google在标准linux上增加的特性

typedef int __bitwise suspend_state_t;

#define PM_SUSPEND_ON  ((__force suspend_state_t) 0)
#define PM_SUSPEND_STANDBY ((__force suspend_state_t) 1)
#define PM_SUSPEND_MEM  ((__force suspend_state_t) 3)
#define PM_SUSPEND_MAX  ((__force suspend_state_t) 4)

void request_suspend_state(suspend_state_t new_state)
{
 unsigned long irqflags;
 int old_sleep;

/* 如果old状态为PM_SUSPEND_ON,即唤醒状态,请求状态不为PM_SUSPEND_ON 则进入early_suspend过程  */

/* 不论old状态,只要请求状态为PM_SUSPEND_ON,即唤醒状态,则进入late_resume过程  */

/* 这块if else判断语句有点别扭,要好好理解下*/

 if (!old_sleep && new_state != PM_SUSPEND_ON) {
  state |= SUSPEND_REQUESTED;
  queue_work(suspend_work_queue, &early_suspend_work);
 } else if (old_sleep && new_state == PM_SUSPEND_ON) {
  state &= ~SUSPEND_REQUESTED;
  wake_lock(&main_wake_lock);
  queue_work(suspend_work_queue, &late_resume_work);
 }
 requested_suspend_state = new_state;
 spin_unlock_irqrestore(&state_lock, irqflags);
}

注册early_suspend的一般是lcd,tvout,TP等提供给用户输入输出的设备;

最早休眠,最后唤醒,这样做是为了防止设备没有彻底resume,而用户已经有输入动作

这类设备可以在probe函数中注册early_syspend相关ops函数

#ifdef CONFIG_HAS_EARLYSUSPEND
 ft5x0x_ts->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 1;
 ft5x0x_ts->early_suspend.suspend = ft5x0x_ts_suspend;
 ft5x0x_ts->early_suspend.resume = ft5x0x_ts_resume;
 register_early_suspend(&ft5x0x_ts->early_suspend);
#endif

文件位置:/kernel/linux/earlysuspend.h

enum {
 EARLY_SUSPEND_LEVEL_BLANK_SCREEN = 50,
 EARLY_SUSPEND_LEVEL_STOP_DRAWING = 100,
 EARLY_SUSPEND_LEVEL_DISABLE_FB = 150,
};


上面有一个level值的定义,注册suspend回调函数的设备按照level值由低到高的顺序被回调进入睡眠,可以看到最后执行的是操作framebuffer设备被disable。

在函数early_suspend最后wake_unlock(&main_wake_lock),这是android专门为early suspend加的一个wakelock锁

在所有注册early_suspend的设备正确返回后才放开,否则系统无法进入下一步suspend。

static void early_suspend(struct work_struct *work)
{
 sys_sync();
abort:
 spin_lock_irqsave(&state_lock, irqflags);
 if (state == SUSPEND_REQUESTED_AND_SUSPENDED)
  wake_unlock(&main_wake_lock);
 spin_unlock_irqrestore(&state_lock, irqflags);
}

 回到wakelock:判断是否还有wakeup存在,如果有退出等待锁释放,如果没有则进入suspend状态

一般来说main_wake_lock释放,基本其他wakelock也应该释放了。

文件位置:/kernel/power/wakelock.c

void wake_unlock(struct wake_lock *lock)
{
 if (type == WAKE_LOCK_SUSPEND) {
  long has_lock = has_wake_lock_locked(type);
  if (has_lock > 0) {
   if (debug_mask & DEBUG_EXPIRE)
    pr_info("wake_unlock: %s, start expire timer, "
     "%ld\n", lock->name, has_lock);
   mod_timer(&expire_timer, jiffies + has_lock);
  } else {
   if (del_timer(&expire_timer))
    if (debug_mask & DEBUG_EXPIRE)
     pr_info("wake_unlock: %s, stop expire "
      "timer\n", lock->name);
   if (has_lock == 0)
    queue_work(suspend_work_queue, &suspend_work);
  }
  if (lock == &main_wake_lock) {
   if (debug_mask & DEBUG_SUSPEND)
    print_active_locks(WAKE_LOCK_SUSPEND);
#ifdef CONFIG_WAKELOCK_STAT
   update_sleep_wait_stats_locked(0);
#endif
  }
 }
}
EXPORT_SYMBOL(wake_unlock);

6. 走到suspend这直到系统睡眠和后面唤醒直到resume这两个过程基本是成对反向的过程,一旦进入suspend程序不能随意跳出,

必须按照逆向操作返回,否则可能出现系统不稳定或者功耗问题

基本就是按部就班,我把主要的代码贴一下,后面再贴一份4412在休眠前后的log,suspend主要就是回调外设驱动注册的两个pm_ops函数,例如:

static const struct dev_pm_ops gpio_switch_pm_ops = {
    .suspend    = gpio_switch_suspend,
    .resume     = gpio_switch_resume,
};

具体suspend过程代码如下:
这里有两个全局变量:suspend_short_count和current_event_num

suspend_short_count的作用:如果系统进入suspend执行时间很短就退出,而后又重新进入suspend操作10次,

则系统认为存在某外部时间,则延长进入suspend的时间间隔

current_event_num是个自增变量,只增不减,在启动不带定时器的wake_lock时加一,作用是在suspend失败返回时

如果没有产生其他的wake_lock,则启动一个带定时器HZ / 2周期的wake_lock,保证能快速重新进行suspend流程

static void suspend(struct work_struct *work) {

 entry_event_num = current_event_num;  ret = pm_suspend(requested_suspend_state);

 

if (ts_exit.tv_sec - ts_entry.tv_sec <= 1) {   ++suspend_short_count;

  if (suspend_short_count == SUSPEND_BACKOFF_THRESHOLD) {    suspend_backoff();    suspend_short_count = 0;   }  } else {   suspend_short_count = 0;  }

 if (current_event_num == entry_event_num) {   if (debug_mask & DEBUG_SUSPEND)    pr_info("suspend: pm_suspend returned with no event\n");   wake_lock_timeout(&unknown_wakeup, HZ / 2);  } }

int pm_suspend(suspend_state_t state) { if (state > PM_SUSPEND_ON && state < PM_SUSPEND_MAX) return enter_state(state); return -EINVAL; } int enter_state(suspend_state_t state) { pr_debug("PM: Preparing system for %s sleep\n", pm_states[state]); error = suspend_prepare(); pr_debug("PM: Entering %s sleep\n", pm_states[state]); error = suspend_devices_and_enter(state); Finish: pr_debug("PM: Finishing wakeup.\n"); suspend_finish(); }

在prepare时freeze用户空间进程*/

static int suspend_prepare(void)
{
 pm_prepare_console();

 error = pm_notifier_call_chain(PM_SUSPEND_PREPARE);


 error = usermodehelper_disable();


 error = suspend_freeze_processes();
 }

dpm_suspend_start这就是回调所有非系统设备的suspend函数

而suspend_enter之后就是进入late_suspend过程

int suspend_devices_and_enter(suspend_state_t state)
{
 suspend_console();
 suspend_test_start();
 error = dpm_suspend_start(PMSG_SUSPEND);


 error = suspend_enter(state);

 Resume_devices:
 suspend_test_start();
 dpm_resume_end(PMSG_RESUME);
 suspend_test_finish("resume devices");
 resume_console();
 Close:
 if (suspend_ops->end)
  suspend_ops->end();
 trace_machine_suspend(PWR_EVENT_EXIT);
 return error;

 Recover_platform:
 if (suspend_ops->recover)
  suspend_ops->recover();
 goto Resume_devices;
}

7. late_suspend主要是完成系统级设备的休眠准备工作,这部分和平台相关性大

下面是进入late_suspend的相关调用,late_suspend前后还有芯片相关的平台级电源管理函数prepare和prepare_late的调用

static int suspend_enter(suspend_state_t state)
{
	int error;

	if (suspend_ops->prepare) {
		error = suspend_ops->prepare();
	}

	error = dpm_suspend_noirq(PMSG_SUSPEND);
	if (error) {
		printk(KERN_ERR "PM: Some devices failed to power down\n");
		goto Platform_finish;
	}

	if (suspend_ops->prepare_late) {
		error = suspend_ops->prepare_late();
	}

	error = disable_nonboot_cpus();
	if (error || suspend_test(TEST_CPUS))
		goto Enable_cpus;

	arch_suspend_disable_irqs();
	BUG_ON(!irqs_disabled());

	error = syscore_suspend();
	if (!error) {
		if (!(suspend_test(TEST_CORE) || pm_wakeup_pending())) {
			error = suspend_ops->enter(state);
			events_check_enabled = false;
		}
		syscore_resume();
	}

	arch_suspend_enable_irqs();
	BUG_ON(irqs_disabled());

 Enable_cpus:
	enable_nonboot_cpus();

 Platform_wake:
	if (suspend_ops->wake)
		suspend_ops->wake();

	dpm_resume_noirq(PMSG_RESUME);

 Platform_finish:
	if (suspend_ops->finish)
		suspend_ops->finish();

	return error;
}

 注册late_suspend回调函数的一般是总线或者系统级别的设备,需要在外设关闭之后才能调用

例如:wake_lock虚拟设备,i2c,pci等系统总线,回调函数hook为:.suspend_noirq

static struct dev_pm_ops power_driver_pm_ops = {
	.suspend_noirq = power_suspend_late,
};
/**
 * dpm_suspend_noirq - Execute "late suspend" callbacks for non-sysdev devices.
 * @state: PM transition of the system being carried out.
 *
 * Prevent device drivers from receiving interrupts and call the "noirq" suspend
 * handlers for all non-sysdev devices.
 */
int dpm_suspend_noirq(pm_message_t state)
{
	suspend_device_irqs();
	mutex_lock(&dpm_list_mtx);
	while (!list_empty(&dpm_suspended_list)) {
		struct device *dev = to_device(dpm_suspended_list.prev);
		get_device(dev);
		mutex_unlock(&dpm_list_mtx);
		error = device_suspend_noirq(dev, state);
		mutex_lock(&dpm_list_mtx);
	}
	mutex_unlock(&dpm_list_mtx);
}
EXPORT_SYMBOL_GPL(dpm_suspend_noirq);

 suspend_ops->prepare和suspend_ops->prepare_late这几个是samsung平台的平台级电源管理函数

初始化时通过initcall注册,在late_suspend时被调用

static const struct platform_suspend_ops s3c_pm_ops = {
	.enter		= s3c_pm_enter,
	.prepare	= s3c_pm_prepare,
	.finish		= s3c_pm_finish,
	.valid		= suspend_valid_only_mem,
};

/* s3c_pm_init
 *
 * Attach the power management functions. This should be called
 * from the board specific initialisation if the board supports
 * it.
*/

int __init s3c_pm_init(void)
{
	suspend_set_ops(&s3c_pm_ops);
	return 0;
}


8. 最后贴一段芯片睡眠前最后执行的代码,保存所有gpio状态,配置gpio为input low确保不漏电,设置唤醒中断,关闭其他中断等

cpu最终停止在s3c_cpu_save(0, PLAT_PHYS_OFFSET - PAGE_OFFSET);这句

当然这只是针对s3c_pm_enter这个函数来说,该函数里面还要回调cpu的suspend函数,保存pc指针和睡眠状态

后面有一篇文章将重点介绍sleep前后系统需要做的事情和sleep后系统所处状态,以及如何保证系统resume过来

static int s3c_pm_enter(suspend_state_t state)
{
	/* ensure the debug is initialised (if enabled) */

	s3c_pm_debug_init();

	S3C_PMDBG("%s(%d)\n", __func__, state);

	if (pm_cpu_prep == NULL || pm_cpu_sleep == NULL) {
		printk(KERN_ERR "%s: error: no cpu sleep function\n", __func__);
		return -EINVAL;
	}

	/* check if we have anything to wake-up with... bad things seem
	 * to happen if you suspend with no wakeup (system will often
	 * require a full power-cycle)
	*/

	if (!any_allowed(s3c_irqwake_intmask, s3c_irqwake_intallow) &&
	    !any_allowed(s3c_irqwake_eintmask, s3c_irqwake_eintallow)) {
		printk(KERN_ERR "%s: No wake-up sources!\n", __func__);
		printk(KERN_ERR "%s: Aborting sleep\n", __func__);
		return -EINVAL;
	}

	/* save all necessary core registers not covered by the drivers */

	s3c_pm_save_gpios();
	s3c_pm_saved_gpios();
	s3c_pm_save_uarts();
	s3c_pm_save_core();

	/* set the irq configuration for wake */

	s3c_pm_configure_extint();

	S3C_PMDBG("sleep: irq wakeup masks: %08lx,%08lx\n",
	    s3c_irqwake_intmask, s3c_irqwake_eintmask);

	s3c_pm_arch_prepare_irqs();

	/* call cpu specific preparation */

	pm_cpu_prep();

	/* flush cache back to ram */

	flush_cache_all();

	s3c_pm_check_store();

	/* send the cpu to sleep... */

	s3c_pm_arch_stop_clocks();

	/* s3c_cpu_save will also act as our return point from when
	 * we resume as it saves its own register state and restores it
	 * during the resume.  */

	s3c_cpu_save(0, PLAT_PHYS_OFFSET - PAGE_OFFSET);

	/* restore the cpu state using the kernel's cpu init code. */

	cpu_init();

	s3c_pm_restore_core();
	s3c_pm_restore_uarts();
	s3c_pm_restore_gpios();
	s3c_pm_restored_gpios();

	s3c_pm_debug_init();

        /* restore the system state */

	if (pm_cpu_restore)
		pm_cpu_restore();

	/* check what irq (if any) restored the system */

	s3c_pm_arch_show_resume_irqs();

	S3C_PMDBG("%s: post sleep, preparing to return\n", __func__);

	/* LEDs should now be 1110 */
	s3c_pm_debug_smdkled(1 << 1, 0);

	s3c_pm_check_restore();

	/* ok, let's return from sleep */

	S3C_PMDBG("S3C PM Resume (post-restore)\n");
	return 0;
}
static void exynos4_pm_prepare(void){	/* Set value of power down register for sleep mode */	exynos4_sys_powerdown_conf(SYS_SLEEP);	__raw_writel(S5P_CHECK_SLEEP, REG_INFORM1);	/* ensure at least INFORM0 has the resume address */	__raw_writel(virt_to_phys(s3c_cpu_resume), REG_INFORM0);	/* Before enter central sequence mode, clock src register have to set */	s3c_pm_do_restore_core(exynos4_set_clksrc, ARRAY_SIZE(exynos4_set_clksrc));	if (soc_is_exynos4210())		s3c_pm_do_restore_core(exynos4210_set_clksrc, ARRAY_SIZE(exynos4210_set_clksrc));}

 最后黏贴一份suspend到resume的log,有助于代码分析:

[   24.737997] has_wake_lock_locked: main

[   24.740287] wake_unlock: has_lock -1, tyep 0 

[   26.089081] CPU2: shutdown

[   26.557543] CPU3: shutdown

[   27.368084] wake_lock: alarm, type 0, timeout 5.000

[   27.368245] has_wake_lock_locked: main

[   27.371112] wake_unlock: alarm_rtc

[   27.374464] has_wake_lock_locked: main

[   27.378199] wake_unlock: has_lock -1, tyep 0 

[   27.392930] wake_lock: PowerManagerService, type 0

[   27.393956] wake_unlock: alarm

[   27.395151] has_wake_lock_locked: PowerManagerService

[   27.400186] wake_unlock: has_lock -1, tyep 0 

[   27.411910] wake_lock: PowerManagerService, type 0

[   27.501326] wake_unlock: PowerManagerService

[   27.501486] has_wake_lock_locked: main

[   27.503730] wake_unlock: has_lock -1, tyep 0 

[   29.256685] CPU3: Booted secondary processor

[   29.260032] Switched to NOHz mode on CPU #3

[   37.367993] request_suspend_state: sleep (0->3) at 37367977812 (2000-01-01 00:00:34.101229642 UTC)

[   37.371350] early_suspend: call handlers

[   37.375256] wake_lock: PowerManagerService, type 0

[   37.380051] early_suspend: calling stop_drawing_early_suspend

[   37.381648] wake_lock: PowerManagerService, type 0

[   37.415122] early_suspend: calling s5p_tvout_early_suspend

[   37.415227] early_suspend: calling s3cfb_early_suspend

[   37.425030] s3cfb_early_suspend is called

[   37.425180] early_suspend: sync

[   37.440326] wake_unlock: main

[   37.440386] has_wake_lock_locked: PowerManagerService

[   37.442688] wake_unlock: has_lock -1, tyep 0 

[   37.447026] active wake lock PowerManagerService

[   37.451627] wake lock mmc0_detect, expired

[   37.455720] wake lock mmc1_detect, expired

[   37.459796] wake lock mmc2_detect, expired

[   37.570189] wake_lock: PowerManagerService, type 0

[   37.578657] wake_unlock: PowerManagerService

[   37.578737] expired wake lock mmc0_detect

[   37.581285] expired wake lock mmc1_detect

[   37.585271] expired wake lock mmc2_detect

[   37.589263] wake_unlock: has_lock 0, tyep 0 

[   37.596502] suspend: enter suspend

[   37.596905] enter_state ... 

[   37.599618] PM: Syncing filesystems ... done.

[   37.628488] PM: Preparing system for mem sleep

[   37.629053] Freezing user space processes ... (elapsed 0.01 seconds) done.

[   37.650108] Freezing remaining freezable tasks ... (elapsed 0.01 seconds) done.

[   37.665185] PM: Entering mem sleep

[   37.670152] [zsb] wm8994_set_bias_level: 0

[   37.680752] gpio_switch_suspend dev 0xc06b7848,data 0xe008dd80 

[   37.681104] ====================================kevin:Powering off wifi

[   37.692562] s5p-ohci s5p-ohci: still being used

func s3c_irq_wake line 43 bit 6c state 1

[   37.701327] PM: suspend of devices complete after 35.431 msecs

[   37.701592] PM: suspend devices took 0.035 seconds

[   37.706577] power_suspend_late return 0

[   37.710202] PM: late suspend of devices complete after 3.821 msecs

[   37.716358] Disabling non-boot CPUs ...

[   37.720521] CPU3: shutdown

exynos4_pm_suspend 

saved f8810000 value 00000001

saved f8810004 value 000000f0

saved f8810008 value 00000000

saved f8820000 value 00000001

saved f8820004 value 0000fc64

saved f8820100 value 1000ffff

saved f8820104 value ffffffff

saved f8820108 value 5ef31bfd

saved f8820300 value 00000000

saved f8820304 value 00000000

saved f8820308 value 00000000

saved f8820400 value a0a0a0a0

saved f8820404 value a0a0a0a0

saved f8820408 value a0a0a0a0

saved f882040c value a0a0a0a0

saved f8820410 value a0a0a0a0

saved f8820414 value a0a0a0a0

saved f8820418 value a0a0a0a0

saved f882041c value a0a0a0a0

saved f8820420 value a0a0a0a0

saved f8820424 value a0a0a0a0

saved f8820428 value a0a0a0a0

saved f882042c value a0a0a0a0

saved f8820430 value a0a0a0a0

saved f8820434 value a0a0a0a0

saved f8820438 value a0a0a0a0

saved f882043c value a0a0a0a0

saved f8820440 value a0a0a0a0

saved f8820444 value a0a0a0a0

saved f8820448 value a0a0a0a0

saved f882044c value a0a0a0a0

saved f8820450 value a0a0a0a0

saved f8820454 value a0a0a0a0

saved f8820458 value a0a0a0a0

saved f882045c value a0a0a0a0

saved f8820460 value a0a0a0a0

saved f8820464 value a0a0a0a0

saved f8820468 value a0a0a0a0

saved f882046c value a0a0a0a0

saved f8820470 value a0a0a0a0

saved f8820474 value a0a0a0a0

saved f8820478 value a0a0a0a0

saved f882047c value a0a0a0a0

saved f8820480 value a0a0a0a0

saved f8820484 value a0a0a0a0

saved f8820488 value a0a0a0a0

saved f882048c value a0a0a0a0

saved f8820490 value a0a0a0a0

saved f8820494 value a0a0a0a0

saved f8820498 value a0a0a0a0

saved f882049c value a0a0a0a0

saved f8820800 value 01010101

saved f8820804 value 01010101

saved f8820808 value 01010101

saved f882080c value 01010101

saved f8820810 value 01010101

saved f8820814 value 01010101

saved f8820818 value 01010101

saved f882081c value 01010101

saved f8820820 value 01010101

saved f8820824 value 01010101

saved f8820828 value 01010101

saved f882082c value 01010101

saved f8820830 value 01010101

saved f8820834 value 01010101

saved f8820838 value 01010101

saved f882083c value 01010101

saved f8820840 value 01010101

saved f8820844 value 01010101

saved f8820848 value 01010101

saved f882084c value 01010101

saved f8820850 value 01010101

saved f8820854 value 01010101

saved f8820858 value 01010101

saved f882085c value 01010101

saved f8820860 value 01010101

saved f8820864 value 01010101

saved f8820868 value 01010101

saved f882086c value 01010101

saved f8820870 value 01010101

saved f8820874 value 01010101

saved f8820878 value 01010101

saved f882087c value 01010101

saved f8820880 value 01010101

saved f8820884 value 01010101

saved f8820888 value 01010101

saved f882088c value 01010101

saved f8820890 value 01010101

saved f8820894 value 01010101

saved f8820898 value 01010101

saved f882089c value 01010101

saved f8820c00 value aaaaaaaa

saved f8820c04 value 7dd55fff

saved f8820c08 value 55555555

saved f8820c0c value 55555555

saved f8820c10 value 55555555

saved f8820c14 value 55555555

saved f8820c18 value 55555555

saved f8820c1c value 55555555

saved f8820c20 value 55555555

saved f8820c24 value 55555555

saved f8700000 value 00100000

saved f8700010 value 000070fc

saved f8700020 value 02080000

saved f8700030 value 00000000

saved f8600108 value 00000110

saved f860010c value 00000120

saved f8600f60 value 71000007

saved f8600f80 value 00000003

saved f8600104 value 7e470001

saved f810c320 value 11111111

saved f810c324 value 00000010

saved f810c334 value 00001110

saved f810c33c value 00000001

saved f810c340 value 01011111

saved f810c350 value 00011111

saved f810c354 value 01110111

saved f8110300 value 00010000

saved f8104800 value ffffffff

saved f8108800 value ffffffff

saved f810c820 value ffffffff

saved f810c920 value fff8f000

saved f810c924 value ffffffc4

saved f810c928 value ffffffe0

saved f810c92c value fffffffd

saved f810c934 value ffffffc6

saved f810c940 value fffc4b8c

saved f810c94c value ffffffff

saved f810c950 value f0088032

saved f810c970 value ffffffff

saved f8110900 value fe7fefff

saved f8114800 value ffffffff

saved f8114900 value ffffffff

saved f8104500 value 00000013

saved f8108500 value 00000013

saved f810c520 value ffff4444

saved f810c524 value 00000000

saved f810c528 value 00000003

saved f810c52c value 00000000

saved f810c534 value 00fffff0

saved f810c53c value 00000000

saved f810c540 value 00f00000

saved f810c544 value 00070007

saved f810c548 value 01070107

saved f810c54c value 00000100

saved f810c550 value 00077777

saved f810c554 value 09010907

saved f810c558 value 00000907

saved f810c55c value 000000f0

saved f810c560 value 00000000

saved f810c564 value 00000000

saved f810c510 value 01215474

saved f810c210 value 00000110

saved f810c214 value 00011000

saved f810c220 value 11116666

saved f810c228 value 00000000

saved f810c234 value 00001116

saved f810c23c value 00000007

saved f810c240 value 00066666

saved f810c250 value 00066666

saved f810c254 value 01610077

saved f8110200 value 00011000

saved f8114200 value 01000001

saved f810c110 value a0400203

saved f810c114 value 66010000

saved f810c120 value a0850302

saved f810c124 value 66010000

saved f8111094 value 00000001

saved f810c938 value fffffff0

saved f8110904 value ffffffff

saved f8104930 value fffffecb

saved f8108960 value fffef7ff

saved f8104700 value ffffffff

saved f8104730 value ffffffff

saved f8108700 value ffffffff

saved f8108760 value ffffffff

saved f810c750 value ffffffff

saved f8110700 value ffffffff

saved f8110704 value ffffffff

saved f8110800 value ffffffff

saved f810c568 value 00000003

saved f810c538 value f0ff0fff

saved f810c530 value 00000000

saved f810c338 value 00001111

saved f810c238 value 00001111

saved f810c258 value 00000000

saved f810c128 value 00000080

saved f810c118 value 00000080

s3c_pm_enter(3)

GPA0: save 00000000,33222122,000000fa,0000f555

GPA1: save 00000000,00222222,0000003f,00000555

GPB: save 00000000,00000033,0000000f,0000555f

GPC0: save 00000000,00001101,0000000d,000001f4

GPC1: save 00000000,00000000,00000000,00000155

GPD0: save 00000000,00003300,0000000c,000000f5

GPD1: save 00000000,00002222,0000000f,000000ff

GPF0: save 00000000,22222222,00000000,00000000

GPF1: save 00000000,22222222,00000000,00000000

GPF2: save 00000000,22222222,00000000,00000000

GPF3: save 00000000,00112222,00000030,00000500

GPK0: save 00000000,03333333,0000007e,00003ffc

GPK1: save 00000000,04444000,0000007b,00003fc0

GPK2: save 00000000,02222222,0000007a,00003ff0

GPK3: save 00000000,02222122,0000007e,00003fc0

GPL0: save 00000000,00000000,00000000,00001555

GPL1: save 00000000,00000000,00000000,00000005

GPL2: save 00000000,00001100,0000000c,00005545

GPY0: save 00000000,00220020,0000003f,00000fff

GPY1: save 00000000,00002222,00000007,000000ff

GPY2: save 00000000,00000000,0000003f,00000fff

GPY3: save 00000000,22222222,00000000,0000ffff

GPY4: save 00000000,00000000,00000003,00005555

GPY5: save 00000000,22222222,000000ff,0000ffff

GPY6: save 00000000,22222222,000000ff,0000ffff

GPX0: save 00000000,00f0000f,00000084,00005555

GPX1: save 00000000,00003333,000000f0,00005500

GPX2: save 00000000,00333333,000000ff,00005fff

GPX3: save 00000000,f30f1f10,0000005d,00004435

GPZ: save 00000000,02222222,00000005,00001555

GPJ0: save 00000000,22222222,000000ff,00000000

GPJ1: save 00000000,00022222,00000017,00000000

GPM0: save 00000000,33333333,000000ff,00000000

GPM1: save 00000000,00100033,00000023,00001150

GPM2: save 00000000,00000333,00000003,00000140

GPM3: save 00000000,00010002,00000010,00005555

GPM4: save 00000000,00000000,0000000f,00005555

UART[0]: ULCON=0003, UCON=03c5, UFCON=0111, UBRDIV=0000

UART[1]: ULCON=0003, UCON=03c5, UFCON=0111, UBRDIV=0035

UART[2]: ULCON=0003, UCON=03c5, UFCON=0111, UBRDIV=0000

UART[3]: ULCON=0003, UCON=03c5, UFCON=0111, UBRDIV=0000

s3c_pm_check_resume_pin 352 (pin 190) 

s3c_pm_check_resume_pin 352 (pin 190) irqstate 00000001 pinstate ffffffff

Disabling IRQ 352 (pin 190)

s3c_pm_check_resume_pin 352 (pin 190) 

s3c_pm_check_resume_pin 353 (pin 191) 

s3c_pm_check_resume_pin 353 (pin 191) irqstate 00000002 pinstate ffffffff

Disabling IRQ 353 (pin 191)

s3c_pm_check_resume_pin 353 (pin 191) 

s3c_pm_check_resume_pin 354 (pin 192) 

s3c_pm_check_resume_pin 354 (pin 192) irqstate 00000004 pinstate ffffffff

Disabling IRQ 354 (pin 192)

s3c_pm_check_resume_pin 354 (pin 192) 

s3c_pm_check_resume_pin 355 (pin 193) 

s3c_pm_check_resume_pin 355 (pin 193) irqstate 00000008 pinstate ffffffff

Disabling IRQ 355 (pin 193)

s3c_pm_check_resume_pin 355 (pin 193) 

s3c_pm_check_resume_pin 356 (pin 194) 

s3c_pm_check_resume_pin 356 (pin 194) irqstate 00000010 pinstate ffffffff

Disabling IRQ 356 (pin 194)

s3c_pm_check_resume_pin 356 (pin 194) 

s3c_pm_check_resume_pin 357 (pin 195) 

s3c_pm_check_resume_pin 357 (pin 195) irqstate 00000020 pinstate ffffffff

Disabling IRQ 357 (pin 195)

s3c_pm_check_resume_pin 357 (pin 195) 

s3c_pm_check_resume_pin 358 (pin 196) 

s3c_pm_check_resume_pin 358 (pin 196) irqstate 00000040 pinstate ffffffff

Disabling IRQ 358 (pin 196)

s3c_pm_check_resume_pin 358 (pin 196) 

s3c_pm_check_resume_pin 359 (pin 197) 

s3c_pm_check_resume_pin 359 (pin 197) irqstate 00000080 pinstate ffffffff

Disabling IRQ 359 (pin 197)

s3c_pm_check_resume_pin 359 (pin 197) 

s3c_pm_check_resume_pin 360 (pin 199) 

s3c_pm_check_resume_pin 360 (pin 199) irqstate 00000100 pinstate ffffffff

Disabling IRQ 360 (pin 199)

s3c_pm_check_resume_pin 360 (pin 199) 

s3c_pm_check_resume_pin 361 (pin 200) 

s3c_pm_check_resume_pin 361 (pin 200) irqstate 00000200 pinstate ffffffff

Disabling IRQ 361 (pin 200)

s3c_pm_check_resume_pin 361 (pin 200) 

s3c_pm_check_resume_pin 362 (pin 201) 

s3c_pm_check_resume_pin 362 (pin 201) irqstate 00000400 pinstate ffffffff

Disabling IRQ 362 (pin 201)

s3c_pm_check_resume_pin 362 (pin 201) 

s3c_pm_check_resume_pin 363 (pin 202) 

s3c_pm_check_resume_pin 363 (pin 202) irqstate 00000800 pinstate ffffffff

Disabling IRQ 363 (pin 202)

s3c_pm_check_resume_pin 363 (pin 202) 

s3c_pm_check_resume_pin 364 (pin 203) 

s3c_pm_check_resume_pin 364 (pin 203) irqstate 00000000 pinstate ffffffff

Leaving IRQ 364 (pin 203) as is

func s3c_irqext_wake line 147 bit 1000 state 1 

[   38.620024] wake enabled for irq 364

s3c_pm_check_resume_pin 364 (pin 203) 

s3c_pm_check_resume_pin 365 (pin 204) 

s3c_pm_check_resume_pin 365 (pin 204) irqstate 00002000 pinstate ffffffff

Disabling IRQ 365 (pin 204)

s3c_pm_check_resume_pin 365 (pin 204) 

s3c_pm_check_resume_pin 366 (pin 205) 

s3c_pm_check_resume_pin 366 (pin 205) irqstate 00004000 pinstate ffffffff

Disabling IRQ 366 (pin 205)

s3c_pm_check_resume_pin 366 (pin 205) 

s3c_pm_check_resume_pin 367 (pin 206) 

s3c_pm_check_resume_pin 367 (pin 206) irqstate 00008000 pinstate ffffffff

Disabling IRQ 367 (pin 206)

s3c_pm_check_resume_pin 367 (pin 206) 

s3c_pm_check_resume_pin 368 (pin 208) 

s3c_pm_check_resume_pin 368 (pin 208) irqstate 00010000 pinstate ffffffff

Disabling IRQ 368 (pin 208)

s3c_pm_check_resume_pin 368 (pin 208) 

s3c_pm_check_resume_pin 369 (pin 209) 

s3c_pm_check_resume_pin 369 (pin 209) irqstate 00020000 pinstate ffffffff

Disabling IRQ 369 (pin 209)

s3c_pm_check_resume_pin 369 (pin 209) 

s3c_pm_check_resume_pin 370 (pin 210) 

s3c_pm_check_resume_pin 370 (pin 210) irqstate 00040000 pinstate ffffffff

Disabling IRQ 370 (pin 210)

s3c_pm_check_resume_pin 370 (pin 210) 

s3c_pm_check_resume_pin 371 (pin 211) 

s3c_pm_check_resume_pin 371 (pin 211) irqstate 00080000 pinstate ffffffff

Disabling IRQ 371 (pin 211)

s3c_pm_check_resume_pin 371 (pin 211) 

s3c_pm_check_resume_pin 372 (pin 212) 

s3c_pm_check_resume_pin 372 (pin 212) irqstate 00100000 pinstate ffffffff

Disabling IRQ 372 (pin 212)

s3c_pm_check_resume_pin 372 (pin 212) 

s3c_pm_check_resume_pin 373 (pin 213) 

s3c_pm_check_resume_pin 373 (pin 213) irqstate 00200000 pinstate ffffffff

Disabling IRQ 373 (pin 213)

s3c_pm_check_resume_pin 373 (pin 213) 

s3c_pm_check_resume_pin 374 (pin 214) 

s3c_pm_check_resume_pin 374 (pin 214) irqstate 00400000 pinstate ffffffff

Disabling IRQ 374 (pin 214)

s3c_pm_check_resume_pin 374 (pin 214) 

s3c_pm_check_resume_pin 375 (pin 215) 

s3c_pm_check_resume_pin 375 (pin 215) irqstate 00800000 pinstate ffffffff

Disabling IRQ 375 (pin 215)

s3c_pm_check_resume_pin 375 (pin 215) 

s3c_pm_check_resume_pin 376 (pin 217) 

s3c_pm_check_resume_pin 376 (pin 217) irqstate 01000000 pinstate ffffffff

Disabling IRQ 376 (pin 217)

s3c_pm_check_resume_pin 376 (pin 217) 

s3c_pm_check_resume_pin 377 (pin 218) 

s3c_pm_check_resume_pin 377 (pin 218) irqstate 02000000 pinstate ffffffff

Disabling IRQ 377 (pin 218)

s3c_pm_check_resume_pin 377 (pin 218) 

s3c_pm_check_resume_pin 378 (pin 219) 

s3c_pm_check_resume_pin 378 (pin 219) irqstate 04000000 pinstate ffffffff

Disabling IRQ 378 (pin 219)

s3c_pm_check_resume_pin 378 (pin 219) 

s3c_pm_check_resume_pin 379 (pin 220) 

s3c_pm_check_resume_pin 379 (pin 220) irqstate 08000000 pinstate ffffffff

Disabling IRQ 379 (pin 220)

s3c_pm_check_resume_pin 379 (pin 220) 

s3c_pm_check_resume_pin 380 (pin 221) 

s3c_pm_check_resume_pin 380 (pin 221) irqstate 00000000 pinstate ffffffff

Leaving IRQ 380 (pin 221) as is

s3c_pm_check_resume_pin 380 (pin 221) 

s3c_pm_check_resume_pin 381 (pin 222) 

s3c_pm_check_resume_pin 381 (pin 222) irqstate 20000000 pinstate ffffffff

Disabling IRQ 381 (pin 222)

s3c_pm_check_resume_pin 381 (pin 222) 

s3c_pm_check_resume_pin 382 (pin 223) 

s3c_pm_check_resume_pin 382 (pin 223) irqstate 40000000 pinstate ffffffff

Disabling IRQ 382 (pin 223)

s3c_pm_check_resume_pin 382 (pin 223) 

s3c_pm_check_resume_pin 383 (pin 224) 

s3c_pm_check_resume_pin 383 (pin 224) irqstate 80000000 pinstate ffffffff

Disabling IRQ 383 (pin 224)

s3c_pm_check_resume_pin 383 (pin 224) 

sleep: irq wakeup masks: ffffffc0,efffefff

func s3c_pm_enter line 295

[   38.937146] exynos4_pm_prepare 

REG_INFORM0 0xf8180800, value 0x4005b718 

REG_INFORM1 0xf8180804, value 0xabad0000 

REG_INFORM2 0xf8180808, value 0xabad0000 

REG_INFORM3 0xf818080c, value 0x00000007 

func s3c_pm_enter line 300

func s3c_pm_enter line 304

func s3c_pm_enter line 307

SWRESET = 0x00000000 

RST_STAT = 0x00010000 

CLK_DIV_G3D = 0x00000000 

EINT_WAKEUP_MASK = 0xefffefff 

WAKEUP_MASK = 0x0000ff00 

WAKEUP_STAT = 0x00000000 

GPX0CON = 0x00000000 0x00000084 0x00005555 0x00000000 

CENTRAL_SEQ_CONFIGURATION = 0x00000000 

CENTRAL_SEQ_OPTION = 0x01010000 

CENTRAL_SEQ_CONFIGURATION_COREBLK = 0x00010000 

C2C_CTRL = 0x00000000 

func s3c_pm_enter line 328



 s3c_cpu_save5 

exynos4_cpu_suspend 



c0534ac8 

[   37.724089] Enabling non-boot CPUs ...

[   37.735537] CPU3: Booted secondary processor

[   37.736038] CPU3 is up

[   37.737172] PM: early resume of devices complete after 0.165 msecs

[   37.740026] Switched to NOHz mode on CPU #3

[   37.747360] SysRq : HELP : loglevel(0-9) reBoot Crash terminate-all-tasks(E) memory-full-oom-kill(F) kill-all-tasks(I) thaw-filesystems(J) show-backtrace-all-active-cpus(L) show-memory-usage(M) nice-all-RT-tasks(N) powerOff show-registers(P) show-all-timers(Q) Sync show-task-states(T) Unmount show-blocked-tasks(W) 

[   37.775200] SysRq : HELP : loglevel(0-9) reBoot Crash terminate-all-tasks(E) memory-full-oom-kill(F) kill-all-tasks(I) thaw-filesystems(J) show-backtrace-all-active-cpus(L) show-memory-usage(M) nice-all-RT-tasks(N) powerOff show-registers(P) show-all-timers(Q) Sync show-task-states(T) Unmount show-blocked-tasks(W) 

[   37.803351] s3c2410-wdt: watchdog disabled
f[   37.807175] s3c-rtc s3c64xx-rtc: rtc disabled, re-enabling

unc s3c_irq_wake line 43 bit 6c state 0

[   37.821907] usb_hub_gpio_init()**************/n


 

 

 

 

你可能感兴趣的:(android,power)