转载请标注原文地址: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;
-
-
- public static final int PARTIAL_WAKE_LOCK = WAKE_BIT_CPU_STRONG;
-
-
- public static final int FULL_WAKE_LOCK = WAKE_BIT_CPU_WEAK | WAKE_BIT_SCREEN_BRIGHT
- | WAKE_BIT_KEYBOARD_BRIGHT;
-
-
- public static final int SCREEN_DIM_WAKE_LOCK = WAKE_BIT_CPU_WEAK | WAKE_BIT_SCREEN_DIM;
-
-
- 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;
-
-
-
-
-
-
-
- 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流程
- <p>static void suspend(struct work_struct *work)
- {
- </p><p> entry_event_num = current_event_num;
- ret = pm_suspend(requested_suspend_state);
- </p><p> </p><p>if (ts_exit.tv_sec - ts_entry.tv_sec <= 1) {
- ++suspend_short_count;</p><p> if (suspend_short_count == SUSPEND_BACKOFF_THRESHOLD) {
- suspend_backoff();
- suspend_short_count = 0;
- }
- } else {
- suspend_short_count = 0;
- }</p><p> 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);
- }
- }</p>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,
- };
-
-
-
-
-
-
-
- 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,
- };
-
-
-
-
-
-
-
-
- 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)
- {
-
-
- 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;
- }
-
-
-
-
-
-
- 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;
- }
-
-
-
- s3c_pm_save_gpios();
- s3c_pm_saved_gpios();
- s3c_pm_save_uarts();
- s3c_pm_save_core();
-
-
-
- s3c_pm_configure_extint();
-
- S3C_PMDBG("sleep: irq wakeup masks: %08lx,%08lx\n",
- s3c_irqwake_intmask, s3c_irqwake_eintmask);
-
- s3c_pm_arch_prepare_irqs();
-
-
-
- pm_cpu_prep();
-
-
-
- flush_cache_all();
-
- s3c_pm_check_store();
-
-
-
- s3c_pm_arch_stop_clocks();
-
-
-
-
-
- s3c_cpu_save(0, PLAT_PHYS_OFFSET - PAGE_OFFSET);
-
-
-
- cpu_init();
-
- s3c_pm_restore_core();
- s3c_pm_restore_uarts();
- s3c_pm_restore_gpios();
- s3c_pm_restored_gpios();
-
- s3c_pm_debug_init();
-
-
-
- if (pm_cpu_restore)
- pm_cpu_restore();
-
-
-
- s3c_pm_arch_show_resume_irqs();
-
- S3C_PMDBG("%s: post sleep, preparing to return\n", __func__);
-
-
- s3c_pm_debug_smdkled(1 << 1, 0);
-
- s3c_pm_check_restore();
-
-
-
- S3C_PMDBG("S3C PM Resume (post-restore)\n");
- return 0;
- }
- static void exynos4_pm_prepare(void){ exynos4_sys_powerdown_conf(SYS_SLEEP); __raw_writel(S5P_CHECK_SLEEP, REG_INFORM1); __raw_writel(virt_to_phys(s3c_cpu_resume), REG_INFORM0); 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