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

 

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