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