SLEEP-20200414

https://blog.csdn.net/u013247461/article/details/85261027

http://blog.sina.com.cn/s/articlelist_2790628754_5_1.html

http://mini.eastday.com/mobile/191231024055844.html#

http://blog.sina.com.cn/s/blog_67d955460100xlyh.html

https://www.jianshu.com/p/cc553c9c75b0

https://blog.csdn.net/ic_soc_arm_robin/article/details/9701677

https://blog.csdn.net/jacobywu/article/details/78791640

https://blog.csdn.net/whut_fn/article/details/45669493

https://blog.csdn.net/qq_28779021/article/details/80046713

https://www.cnblogs.com/asreg/articles/7253337.html

================================================================================================

 1.Linux 描述的电源状态

 - On(on)                                                 S0 -  Working 正常工作状态 s0的状态应该是freeze

- Standby (standby)                              S1 -  CPU and RAM are powered but not executed

- Suspend to RAM(mem)                        S3 -  RAM is powered and the running content is saved to RAM

- Suspend to Disk,Hibernation(disk)    S4 -  All content is saved to Disk and power down

Standby也属于睡眠的一种方式,属于浅睡眠。该模式下CPU并未断电,依旧可以接收处理某些特定事件,视具体设备而定,恢复至正常工作状态的速度也比STR更快,但也更为耗电。举个例子来说,以该方式进入睡眠时,后续通过点击键盘也能将系统唤醒。而以mem进入的睡眠为深度睡眠,只能通过中断唤醒设备唤醒系统,如电源键(此时按电源键,不会经过正常的开机流程的BIOS、BOOTLOAD等),此时按键盘是无法唤醒系统的。

S1状态简称standby状态,此状态下CPU处于低功耗状态,并且没有数据保存到RAM或者disk中,此状态待机和恢复通常很快。

 

S3 aka STR(suspend to ram),挂起到内存,简称待机。计算机将目前的运行状态等数据存放在内存,关闭硬 盘、外设等设备,进入等待状态。此时内存仍然需要电力维持其数据,但整机耗电很少。恢复时计算机从内存读出数据,回到挂起前的状态,恢复速度较快。对 DDR的耗电情况进行优化是S3性能的关键,大多数手持设备都是用S3待机。此状态下计算机会冻结所有的活动并将当前工作状态保存到RAM中,然后关闭屏幕进入低功耗模式,通常睡眠和唤醒需要几秒

S3 aka STR(suspend to ram),挂起到内存,简称待机。计算机将目前的运行状态等数据存放在内存,关闭硬 盘、外设等设备,进入等待状态。此时内存仍然需要电力维持其数据,但整机耗电很少。恢复时计算机从内存读出数据,回到挂起前的状态,恢复速度较快。对 DDR的耗电情况进行优化是S3性能的关键,大多数手持设备都是用S3待机。

挂起到内存,俗称待机、睡眠(Sleep),进入该状态,系统的主要工作如下:

1、将系统当前的运行状态等数据保存在内存中,此时仍需要向RAM供电,以保证后续快速恢复至工作状态

2、冻结用户态的进程和内核态的任务(进入内核态的进程或内核自己的task)

3、关闭外围设备,如显示屏、鼠标等,中断唤醒外设不会关闭,如电源键

4、CPU停止工作

 

S4 aka STD(suspend to disk),挂起到硬盘,简称休眠。把运行状态等数据存放在硬盘上某个文件或者某个特定的区域,关闭硬盘、外设等设备,进入关机状态。此时计算机完全关闭,不耗电。恢复时计算机从休眠文件/分区中读出数据,回到休眠前的状态,恢复速度较慢。电子书项目中,见过一款索尼的电子书,没有定义关机状态,只定义了S4,从而提高开机速度。

STD(Suspend to Disk):

挂起到硬盘,俗称休眠(Hibernation)将系统当前的运行状态等数据保存到硬盘上,并自动关机。下次开机时便从硬盘上读取之前保存的数据,恢复到休眠关机之前的状态。

譬如在休眠关机时,桌面打开了一个应用,那么下一次开机启动时,该应用也处于打开状态。而正常的关机-开机流程,该应用是不会打开的。

 

实际上待机(standby)与睡眠(mem)属于不同模式,但现在大多操作系统都不支持待机模式了,我们也习惯将待机等同于睡眠,睡眠属于STR,休眠属于STD,Android手机不支持休眠!!!Android开发者官网当中提到“idle state”,该如何理解,这个状态会对设备及我们的程序造成何种影响

================================================================================================

Android 中定义了几种低功耗状态:earlysuspend,suspend,hibernation。
  earlysuspend 是一种低功耗的状态,某些设备可以选择进入某种功耗较低的状态,比如
LCD可以降低亮度或灭掉;
 suspend是指除电源管理以外的其他外围模块以及cpu均不工作,只有内存保持自刷新的
状态;   
  hibernation 是指所有内存镜像都被写入磁盘中,然后系统关机,恢复后系统将能恢复到
“关机”之前的状态。

main.c文件是整个框架的入口。用户可以通过读写 sys文件/sys/power/state 实现控制系统进
入低功耗状态。用户对于/sys/power/state 的读写会调用到 main.c中的 state_store(),用户可
以写入const char * const pm_states[] 中定义的字符串,  比如“on” , “mem” , “standby” ,
“disk”。

echo mem > /sys/power/state  是系统进入suspend to ram
或者
echo standby > /sys/power/state
命令系统进入earlysuspend 状态,那些注册了early suspend handler 的驱动将依次进入各自
的earlysuspend  状态。
 echo on > /sys/power/state  
 将退出early suspend状态
 echo disk > /sys/power/state
命令系统进入hibernation状态
 echo lockname > /sys/power/wake_lock
加锁“lockname”
 echo lockname > /sys/power/wake_unlock
解锁“lockname”
 上述是分别加锁和解锁的命令,一旦系统中所有 wakelock 被解锁,系统就会进入 suspend
状态,可见Android中原本使系统 suspend  的操作(echo mem > /sys/power/state  等)被替
换成使系统进入early suspend;而wake lock 机制成为用户命令系统进入suspend状态的唯

一途径。

echo mem > sys/power/state 会触发early suspend,

    echo on > sys/power/state 会触发late resume,

    cat sys/power/state 会显示当前支持的休眠状态,有mem, on, standby选项,但针对android 则只有mem, 同时无条件支持on

 

================================================================================================

2.运行以下adb命令使系统进入Doze模式:

$ adb shell dumpsys battery unplug

$ adb shell dumpsys deviceidle step
你可能需要多次执行第二条命令,直到设备处于idle 状态。注意,第一条命令的意思是,拔去电源,即使现在正在插着usb调试,也不会充电。建议运行$ adb shell dumpsys battery reset,否则会出现手机充不上电的情况。

 

echo freeze mem > sys/power/state

 

当然,也可以通过脚本自动打印中断的次数(每隔1s打印一次)

adb shell catproc/interrupts

test.sh

while true;echo -e "\n";do adb shell cat /proc/irq/中断号/spurious;sleep 1;done

 

所有的wakeup_sources均保存在sys节点/sys/kernel/debug/wakeup_sources里面。

active_since
active_since值可以用来确认wakelock是否正在阻止休眠。如果该值不是零,那么这个wakelock正在工作并且阻止休眠。

获取wakeup_sources的命令
adb root 67754400
adb remount
adb shell
cat /sys/kernel/debug/wakeup_sources > /data/wakeup_sources.txt
adb pull /data/wakeup_sources.txt
获得wakeup_sources.txt以后,通过Excel打开,active_since不为0的项为wakeup source。以表2为例,msm_dwc3对应的active-since值481756>0,这意味着msm_dwc3驱动在阻止系统睡眠,下一步需要检查msm_dwc3驱动代码及相关log。

 

 

 

 

 

 

 

 

验证:835

starlet8998:/ # echo mem > sys/power/state
[   78.362139] PM: suspend entry 1970-01-01 00:01:50.505048715 UTC
[   78.362290] PM: Syncing filesystems ... done.
[   78.403038] Freezing user space processes ... (elapsed 0.005 seconds) done.
[   78.410489] Freezing remaining freezable tasks ... (elapsed 0.002 seconds) done.
[   78.417840] Suspending console(s) (use no_console_suspend to debug)
[   78.422812] R0: wlan: [1366:F :WMA] wma_configure_dynamic_wake_events: Couldn't find vdev for vdev_id: 2
[   78.422818] R0: wlan: [1366:F :WMA] wma_configure_dynamic_wake_events: Couldn't find vdev for vdev_id: 3
[   78.422822] R0: wlan: [1366:F :WMA] wma_configure_dynamic_wake_events: Couldn't find vdev for vdev_id: 4
[   78.775090] PM: suspend of devices complete after 352.962 msecs
[   78.781049] PM: late suspend of devices complete after 5.948 msecs
[   78.787231] PM: noirq suspend of devices complete after 6.174 msecs
[   78.787267] Disabling non-boot CPUs ...
[   78.800011] CPU2: update max cpu_capacity 1024
[   78.802424] irq_migrate_all_off_this_cpu: 49 callbacks suppressed
[   78.802427] IRQ5 no longer affine to CPU2
[   78.802530] IRQ40 no longer affine to CPU2
[   78.802545] IRQ43 no longer affine to CPU2
[   78.802621] IRQ67 no longer affine to CPU2
[   78.802723] IRQ81 no longer affine to CPU2
[   78.803185] IRQ316 no longer affine to CPU2
[   78.810002] CPU0: update max cpu_capacity 1024
[   78.829995] CPU0: update max cpu_capacity 1024
[   78.859998] CPU0: update max cpu_capacity 1024
[   78.869989] CPU0: update max cpu_capacity 1024
[   78.889988] CPU0: update max cpu_capacity 1024
[   78.921027] suspend ns:      78921022426     suspend cycles:       2145981862
[   78.921022] resume cycles:       3298041782
[   78.921442] Enabling non-boot CPUs ...
[   78.922160] CPU1: update cpu_capacity 1024
[   78.922234] CPU1: Booted secondary processor [51af8014]
[   78.922905]  cache: parent cpu1 should not be sleeping
[   78.923240] CPU1 is up
[   78.923910] CPU2: update cpu_capacity 1024
[   78.923966] CPU2: Booted secondary processor [51af8014]
[   78.924483]  cache: parent cpu2 should not be sleeping
[   78.924800] CPU2 is up
[   78.925428] CPU3: update cpu_capacity 1024
[   78.925486] CPU3: Booted secondary processor [51af8014]
[   78.926026]  cache: parent cpu3 should not be sleeping
[   78.926343] CPU3 is up
[   78.927812] CPU4: update cpu_capacity 563
[   78.927979] CPU4: Booted secondary processor [51af8001]
[   78.928920]  cache: parent cpu4 should not be sleeping
[   78.929248] CPU4 is up
[   78.929907] CPU2: update max cpu_capacity 1024
[   78.930008] CPU5: update cpu_capacity 563
[   78.930134] CPU5: Booted secondary processor [51af8001]
[   78.931009]  cache: parent cpu5 should not be sleeping
[   78.931327] CPU5 is up
[   78.932098] CPU6: update cpu_capacity 563
[   78.932230] CPU6: Booted secondary processor [51af8001]
[   78.933148]  cache: parent cpu6 should not be sleeping
[   78.933468] CPU6 is up
[   78.934246] CPU7: update cpu_capacity 563
[   78.934380] CPU7: Booted secondary processor [51af8001]
[   78.935368]  cache: parent cpu7 should not be sleeping
[   78.935683] CPU7 is up
[   78.939221] PM: noirq resume of devices complete after 3.439 msecs
[   78.939898] CPU2: update max cpu_capacity 1024
[   78.945413] PM: early resume of devices complete after 3.920 msecs
[   78.964631] R0: wlan: [0:F :WMA] WOW wakeup host event received; reason: UNSPECIFIED(-1), vdev_id: 0, vdev_type: STA
[   79.292527] PM: resume of devices complete after 347.102 msecs
[   79.566873] Restarting tasks ... done.
[   79.580295] PM: suspend exit 1970-01-01 00:02:51.726337857 UTC

-----------------------------------------------------------------debug--------------------------------------------------------------------------------

 svc wifi disable

cat  /sys/power/wake_lock

echo lock > /sys/power/wake_unlock

cat /sys/power/wakeup_count

cat /sys/power/pm_wakeup_irq

starlet8998:/ # cat /sys/class/leds/lcd-backlight/brightness
127
starlet8998:/ # echo 0 > /sys/class/leds/lcd-backlight/brightness  //没有屏幕,应该是没有作用
starlet8998:/ # echo mem > sys/power/state                                     
[  521.283588] PM: suspend entry 1970-01-01 00:11:54.432641296 UTC
[  521.283741] PM: Syncing filesystems ... done.
[  521.322172] Freezing user space processes ... (elapsed 0.005 seconds) done.
[  521.329083] Freezing remaining freezable tasks ... (elapsed 0.003 seconds) done.
[  521.336465] Suspending console(s) (use no_console_suspend to debug)

系统处于suspend,【16:42~16:47】没有唤醒事件,不退出。应该是软件系统进去suspend没有问题。

一、目前,低电13、14ma跳。【svc wifi disable & echo mem > sys/power/state & 拔掉uart】

16.7ma[catty sleep &svc wifi disable & echo mem > sys/power/state]

13、14ma跳[catty shutdown & svc wifi disable & echo mem > sys/power/state]

https://blog.csdn.net/flyof1983/article/details/53164885

二、LDO:不能关 VREG_L1A_0P875、VREG_L2A_1P2、VREG_L4A_0P8、VREG_L12A_1P8、VREG_L20A_2P95、VREG_L24A_3P075(0)、VREG_L26A_1P2、VREG_L27A_0P75、

VREG_L5A_0P8、VREG_L17A_1P3、VREG_L23A_3P3、VREG_L25A_3P3:svc wifi disable 就关了

单独关:VREG_L3A_1P0(0)、VREG_L7A_1P8(0)、VREG_L8A_1P2(0)、VREG_L11A_1P0(0)、VREG_L13A_2P95(0)、VREG_L14A_1P88(1)、VREG_L16A_2P7(0)、VREG_L19A_3P0(0)、VREG_L21A_2P95(0)、VREG_L22A_2P85(0)、VREG_L28A_1P8(1)、

1.8V nRF52832:VREG_L28A_1P8 【Nordic_VDD、IMU/MAG_1V8、Prox_1V8、MIC_VDD】

以上,LOD。echo mem > sys/power/state,13、14ma跳。

三、GPIO:不使用、悬空,软件配置:输入、高阻

2|starlet8998:/sys/kernel/debug # cat gpio
GPIOs 0-152, platform/3400000.pinctrl, 3400000.pinctrl:
 gpio0   : in  2 2mA no pull
 gpio1   : in  2 2mA no pull
 gpio2   : in  2 2mA pull down
 gpio3   : in  2 2mA no pull
 gpio4   : in  0 2mA pull down
 gpio5   : in  0 2mA pull down
 gpio6   : in  0 2mA pull down
 gpio7   : in  0 2mA pull down
 gpio8   : out 0 8mA no pull
 gpio9   : out 0 8mA no pull
 gpio10  : in  0 2mA pull down
 gpio11  : in  0 2mA pull down
 gpio12  : in  0 2mA no pull
 gpio13  : in  0 2mA pull down
 gpio14  : in  0 2mA pull down
 gpio15  : in  1 6mA no pull
 gpio16  : in  1 6mA no pull
 gpio17  : in  0 2mA pull down
 gpio18  : in  0 2mA pull down
 gpio19  : in  0 2mA pull down
 gpio20  : in  0 2mA pull down
 gpio21  : in  0 2mA pull down
 gpio22  : in  0 2mA pull down
 gpio23  : in  0 2mA pull down
 gpio24  : in  0 2mA pull down
 gpio25  : out 0 2mA pull down
 gpio26  : in  0 2mA pull down
 gpio27  : out 0 2mA pull down
 gpio28  : in  0 2mA pull down
 gpio29  : in  0 2mA pull down
 gpio30  : in  0 2mA pull down
 gpio31  : in  0 2mA pull up
 gpio32  : in  0 2mA pull down
 gpio33  : in  0 2mA pull down
 gpio34  : in  0 2mA no pull
 gpio35  : out 0 2mA pull down
 gpio36  : out 0 2mA pull down
 gpio37  : in  0 2mA no pull
 gpio38  : in  0 2mA pull down
 gpio39  : in  0 2mA pull down
 gpio40  : in  0 2mA no pull
 gpio41  : in  0 2mA no pull
 gpio42  : out 0 2mA pull down
 gpio43  : in  0 2mA no pull
 gpio44  : in  0 2mA no pull
 gpio45  : in  0 2mA pull up
 gpio46  : in  0 2mA no pull
 gpio47  : in  0 2mA no pull
 gpio48  : in  0 2mA no pull
 gpio49  : in  0 2mA pull down
 gpio50  : in  0 2mA pull down
 gpio51  : out 0 2mA pull down
 gpio52  : in  0 2mA pull down
 gpio53  : out 0 2mA pull down
 gpio54  : out 0 2mA pull down
 gpio55  : out 3 2mA no pull
 gpio56  : out 3 2mA no pull
 gpio57  : in  0 2mA pull down
 gpio58  : in  0 6mA no pull
 gpio59  : in  0 6mA no pull
 gpio60  : in  0 2mA pull down
 gpio61  : in  0 2mA pull down
 gpio62  : in  0 2mA pull down
 gpio63  : in  0 2mA pull down
 gpio64  : out 0 2mA pull down
 gpio65  : out 1 8mA no pull
 gpio66  : out 1 8mA no pull
 gpio67  : in  1 8mA no pull
 gpio68  : in  1 8mA no pull
 gpio69  : in  0 2mA pull down
 gpio70  : in  0 2mA pull down
 gpio71  : in  0 2mA pull down
 gpio72  : in  0 2mA pull down
 gpio73  : in  1 4mA keeper
 gpio74  : in  1 2mA keeper
 gpio75  : in  0 2mA pull down
 gpio76  : in  0 2mA pull down
 gpio77  : in  0 2mA pull up
 gpio78  : in  0 6mA no pull
 gpio79  : in  0 2mA pull down
 gpio80  : in  0 2mA pull down
 gpio81  : in  2 6mA no pull
 gpio82  : in  2 6mA no pull
 gpio83  : in  2 6mA no pull
 gpio84  : in  1 6mA no pull
 gpio85  : in  0 2mA pull down
 gpio86  : in  0 2mA pull down
 gpio87  : in  0 2mA pull down
 gpio88  : in  0 2mA pull down
 gpio89  : in  0 2mA pull down
 gpio90  : in  0 2mA no pull
 gpio91  : in  0 2mA pull down
 gpio92  : in  0 2mA pull down
 gpio93  : in  0 2mA pull down
 gpio94  : in  0 2mA pull down
 gpio95  : in  0 2mA pull down
 gpio96  : in  0 2mA pull down
 gpio97  : in  0 2mA pull down
 gpio98  : in  0 2mA pull down
 gpio99  : in  0 2mA pull down
 gpio100 : in  0 2mA pull down
 gpio101 : in  0 2mA pull down
 gpio102 : in  0 2mA pull down
 gpio103 : in  0 2mA pull down
 gpio104 : in  0 2mA pull down
 gpio105 : in  0 2mA pull down
 gpio106 : in  0 2mA pull down
 gpio107 : in  0 2mA pull down
 gpio108 : in  0 2mA pull down
 gpio109 : in  0 2mA pull down
 gpio110 : in  0 2mA pull down
 gpio111 : in  0 2mA pull down
 gpio112 : in  0 2mA pull down
 gpio113 : in  0 2mA pull down
 gpio114 : in  0 2mA pull down
 gpio115 : in  0 2mA pull down
 gpio116 : in  0 2mA pull down
 gpio117 : in  0 2mA pull down
 gpio118 : in  0 2mA pull down
 gpio119 : in  0 2mA pull down
 gpio120 : in  0 2mA pull up
 gpio121 : in  0 2mA pull down
 gpio122 : in  0 2mA pull down
 gpio123 : in  0 2mA pull down
 gpio124 : in  0 2mA pull down
 gpio125 : in  0 2mA pull up
 gpio126 : out 0 6mA pull down
 gpio127 : in  0 2mA pull down
 gpio128 : in  0 2mA pull down
 gpio129 : in  0 2mA pull down
 gpio130 : in  0 2mA pull down
 gpio131 : in  0 2mA pull down
 gpio132 : in  0 2mA pull down
 gpio133 : in  0 2mA pull down
 gpio134 : in  0 2mA pull down
 gpio135 : in  0 2mA pull down
 gpio136 : in  0 2mA pull down
 gpio137 : in  0 2mA pull down
 gpio138 : in  0 2mA pull down
 gpio139 : in  0 2mA no pull
 gpio140 : in  0 2mA no pull
 gpio141 : in  0 2mA pull down
 gpio142 : in  0 2mA pull down
 gpio143 : in  0 2mA pull down
 gpio144 : in  0 2mA pull down
 gpio145 : in  0 2mA pull down
 gpio146 : in  0 2mA pull down
 gpio147 : in  0 2mA pull down
 gpio148 : in  0 2mA pull down
 gpio149 : in  0 2mA pull down
 sdc2_clk: in  0 16mA no pull
 sdc2_cmd: in  0 8mA pull down
 sdc2_data: in  0 8mA pull down
GPIOs 339-370, platform/soc:qcom,smp2pgpio-rdbg-1-out, rdbg:

GPIOs 371-402, platform/soc:qcom,smp2pgpio-rdbg-1-in, rdbg:

GPIOs 403-434, platform/soc:qcom,smp2pgpio-rdbg-2-out, rdbg:

GPIOs 435-466, platform/soc:qcom,smp2pgpio-rdbg-2-in, rdbg:

GPIOs 467-498, platform/soc:qcom,smp2pgpio-ipa-1-in, ipa:

GPIOs 499-530, platform/soc:qcom,smp2pgpio-ipa-1-out, ipa:

GPIOs 531-562, platform/soc:qcom,smp2pgpio-sleepstate-gpio-3-out, sleepstate:

GPIOs 563-594, platform/soc:qcom,smp2pgpio-ssr-smp2p-3-out, master-kernel:

GPIOs 595-626, platform/soc:qcom,smp2pgpio-ssr-smp2p-3-in, slave-kernel:

GPIOs 627-658, platform/soc:qcom,smp2pgpio-ssr-smp2p-2-out, master-kernel:

GPIOs 659-690, platform/soc:qcom,smp2pgpio-ssr-smp2p-2-in, slave-kernel:

GPIOs 691-722, platform/soc:qcom,smp2pgpio-ssr-smp2p-1-out, master-kernel:

GPIOs 723-754, platform/soc:qcom,smp2pgpio-ssr-smp2p-1-in, slave-kernel:

GPIOs 755-786, platform/soc:qcom,smp2pgpio-smp2p-3-out, smp2p:

GPIOs 787-818, platform/soc:qcom,smp2pgpio-smp2p-3-in, smp2p:

GPIOs 819-850, platform/soc:qcom,smp2pgpio-smp2p-2-out, smp2p:

GPIOs 851-882, platform/soc:qcom,smp2pgpio-smp2p-2-in, smp2p:

GPIOs 883-914, platform/soc:qcom,smp2pgpio-smp2p-1-out, smp2p:

GPIOs 915-946, platform/soc:qcom,smp2pgpio-smp2p-1-in, smp2p:

GPIOs 947-978, platform/soc:qcom,smp2pgpio-smp2p-15-out, smp2p:

GPIOs 979-1010, platform/soc:qcom,smp2pgpio-smp2p-15-in, smp2p:

GPIOs 1011-1014, platform/800f000.qcom,spmi:qcom,pmi8998@2:gpios, 800f000.qcom,spmi:qcom,pmi8998@2:gpios:
 gpio-1011 (                    |pmi_enable          ) out hi    

GPIOs 1015-1023, platform/800f000.qcom,spmi:qcom,pm8998@0:gpios, 800f000.qcom,spmi:qcom,pm8998@0:gpios:
 gpio-1016 (                    |volume_up           ) in  hi    
 gpio-1017 (                    |cam_snapshot        ) in  hi    
 gpio-1018 (                    |cam_focus           ) in  hi    
starlet8998:/sys/kernel/debug # 

 ======================================总结====================================

进suspend的方法

1、按power键

2、echo mem > sys/power/state

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章