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