본문 바로가기

Linux/Android

android early suspend 간략하게 정리

출처 :  http://notackle.blogspot.com/2011/11/android-linux-power-management-early.html 

android에는 linux의 power management에 early suspend와 late resume이 추가되어 있다.

굳이 early suspend / late resume을 추가한 이유는 아무래도 power consumption에 취약한 mobile device를 지원하기 위해서라고 생각된다. (다른 이유가 있을까? 알고 계신 분은 좀 알려주세요!!.)

early suspend와 late resume을 간략하게 정리해 본다. kernel level source까지 정리하려니 귀차니즘이 발동되어서 이해할 수 있는 수준에서 정리하고자 한다.

 

  • early suspend

1. Android phone의 화면이 off 되면 early suspend를 kernel에 요청하게 된다.

- 화면이 off될 때 Power Manager Service는 early suspend를 요청한다.

- Android system에서 PARTIAL_WAKE_LOCK을 제외한 wake lock이 잡혔을 때는 early suspend를 요청하지 않는다.

- Power Manager Service에서 setScreenStateLocked(false) 호출하면 early suspend가 요청된다.

setScreenStateLocked(false) : java function - PowerManagerService.java

-> setScreenState : native

-> set_screen_state : native

-> write "mem" to "/sys/power/state" : sysfs 내의 power object의 state attribute에 "mem"을 write한다.

-> suspend 요청인지 확인하고 suspend일 경우에 early suspend를 수행하는 early_suspend work를 work queue에 넣는다.

2. early_suspend 가 수행되면 early suspend handler에 등록된 모든 handler를 찾아서 suspend 함수를 호출한다.

-  kernel 내에서 early_suspend work가 수행이 되면 early suspend handler list의 모든 handler의 suspend함수를 호출한다.

- early suspend handler는 register_early_suspend 함수로 등록할 수 있다. 어떤 device driver에서 early suspend일 때 무엇인가를 처리하고자 한다면, handler를 구현하고 등록하면 된다. (이것은 kernel level이다.)

* early suspend는 화면(LCD)가 off 되었을 때  요청된다(위에서 언급함) . 화면이 off 될 경우에 touch, key backlight, lcd backlight, display device(framebuffer), wifi device(필요에 따라서),  gyro sensor, accelerometer(가속센서)등은 필요하지 않을 것이다.

* early suspend는 화면이 off 되었을 때 불필요한 device나 기능을 off 하거나 중지시키면서 power consumption(소모전류)를 줄이고자 하는 것이다.

* early suspend는 kernel suspend가 아니다! 하지만, early suspend 후에 kernel suspend로 진입할 수 있다! 왜냐하면, early suspend module은 wake lock을 하나 잡고 있는데 이것을 unlock하기 때문이다. wake lock이 unlock이 될 때, 어떠한 wake lock도 존재하지 않는다면 kernel은 suspend로 진입할 수 있게 된다.

 

  • late resume

1. Android phone의 화면이 on 되면 late resume를 kernel에 요청하게 된다.

- early suspend를 요청할 때와 동일한 순서를 따른다.

- 다른 것은 "/sys/power/state" 에 "on"을 writing한다.

- suspend가 아니고 on 일 경우에는 late resume을 수행하는 late_resume work를 work queue에 넣는다.

- late_resume work를 work queue에 넣기전에 wake lock을 lock 한다. (이 wake lock은 early suspend에서 unlock하는 wake lock이다.)

2. late resume이 수행되면 early suspend handler에 등록된 모든 handler를 찾아서 resume 함수를 호출한다.

- early suspend handler에 등록되는 handler는 suspend와 resume, 2개의 함수를 구현해야 한다. (상황에 따라서 suspend나 resume이 empty function일 수 있지만... ...)

- late resume 시에는 early suspend handler에서 모든 handler를 찾아서 resume함수를 호출한다. early suspend 와 별 차이가 없다. 다만, 호출하는 함수가 resume일 뿐!

- early suspend시에 off한 device가 on이 되거나 중지된 기능이 다시 시작된다.

3. 화면이 off 된 상태에서 사용자가 power key를 눌러 화면을 on 시킬려고 하면 Power Manager Service에서 late resume을 요청하게 된다.

- late resume은 kernel 내부에서 수행되지 않는다.

- 결국, early suspend / late resume은 모두 Power Manager Service에서 요청하게 된다.

- kernel이 suspend된 상태(물론 화면은 off)에서 power key로 화면을 on 시킬려고 하면 아래와 같이 흐름을 따를 것 이다.

push power key

-> kernel wake up -> kernel resume -> power key를 Android Input Service로 전달 -> Android framework에서 power key 처리

-> Power Manager Service에서 setScreenState 변경 -> kernel late resume 요청 -> touch 및 여러 device들이 정상동작

 

Android에서는 early suspend / late resume 기능을 추가함으로써 소모전류를 줄이고자 한 것 같다.

Android phone의 device driver 구현할 때, early suspend 기능을 이해하는 것이 많은 도움이 될 것이다. (Android phone은 캐조루라고 엄청 욕 먹고 있음 ㅠㅠ)