전원 관리

차량별 전원 관리를 지원하기 위해 Android는 CarPowerManagementService 서비스와 CarPowerManager 인터페이스를 제공합니다.

상태 전환은 VMCU(Vehicle Master Control Unit)가 트리거합니다. VMCU와 통신하기 위해 통합자는 여러 구성요소를 구현해야 합니다. 또한 통합자는 VHAL(차량 하드웨어 추상화 계층) 및 커널 구현과의 통합 작업을 진행해야 합니다. 그 외에도 절전 모드 해제 소스를 사용 중지하고 시스템 종료가 무기한으로 연기되지 않도록 해야 합니다.

용어

다음 용어는 이 문서 전체에서 사용됩니다.

용어 설명
AP(애플리케이션 프로세서) SoC(단일 칩 시스템)의 일부
BSP(Board Support Processor) 제품이 작동하는 데 필요한 모든 하드웨어 관련 코드입니다. 일반적으로 SoC 공급업체 및 하드웨어 제조업체에서 제공하며 여기에는 기기 드라이버, PMIC 시퀀싱 코드, SoC bringup 등의 항목이 포함됩니다.
CPM(CarPowerManager) 애플리케이션이 전원 상태 변경을 등록하도록 API를 노출합니다.
CPMS(CarPowerManagementService) 자동차 전원 상태 시스템을 구현하고, VHAL과 접속하며, 마지막에 suspend()shutdown()을 호출합니다.
CPPD(CarPowerPolicyDaemon) 네이티브 프로세스의 AIDL 인터페이스를 노출하여 전원 정책 리스너를 등록합니다.
GPIO(범용 입력/출력) 범용 디지털 신호 핀입니다.
하드웨어 추상화 계층(HAL) 하드웨어 기능에 액세스하기 위해 다른 모든 상위 수준의 모듈에서 상호작용해야 하는 소프트웨어 레이어입니다.
최대 절전 모드 Suspend to Disk(S2D/S4)라고도 합니다. SoC는 S4 전원 모드(최대 절전 모드)로 설정되고 RAM 콘텐츠는 플래시나 디스크와 같은 비휘발성 미디어에 기록되며 전체 시스템의 전원이 꺼집니다.
MP(Media Processor) SoC(단일 칩 시스템)를 참고하세요.
PMIC(Power Management Integrated Circuit) 호스트 시스템의 전원 요구사항을 관리하는 데 사용되는 칩입니다.
SoC(단일 칩 시스템) 일반적으로 Intel, MediaTek, Nvidia, Qualcomm, Renesas, Texas Instruments 등의 제조업체에서 제공하는 AAOS를 실행하는 메인 프로세서.
정지 Suspend-to-RAM(S2R 또는 STR)이라고도 합니다. SoC는 S3 전원 모드에 들어가고 CPU의 전원은 꺼지지만 RAM 전원이 켜져 있는 상태입니다.
VHAL(차량 HAL) 차량 네트워크와의 상호작용에 사용되는 Android API입니다. Tier 1 파트너 또는 OEM에서 이 모듈을 작성합니다. 차량 네트워크는 CAN, LIN, MOST, 이더넷 등 모든 물리적 레이어를 사용할 수 있습니다. VHAL은 차량 네트워크를 추상화하여 AAOS가 차량과 상호작용할 수 있도록 합니다.
VIP(차량 인터페이스 프로세서) 차량 MCU를 참조하세요.
VMCU(Vehicle Master Control Unit) 차량 네트워크와 SoC 간의 인터페이스를 제공하는 마이크로 컨트롤러입니다. SoC는 USB, UART, SPI 및 GPIO 신호를 통해 VMCU와 통신합니다.

시스템 설계

이 섹션에서는 AAOS가 애플리케이션 프로세서의 전원 상태를 나타내는 방식과 전원 관리 시스템을 구현하는 모듈에 관해 설명합니다. 또한 이 자료에서는 이러한 모듈이 함께 작동하는 방식과 일반적으로 상태 전환이 발생하는 방식을 설명합니다.

자동차 전원 상태 시스템

AAOS는 상태 시스템을 사용하여 AP의 전원 상태를 나타냅니다. 상태 시스템은 다음과 같은 상태를 제공합니다.

자동차 전원 상태 시스템

그림 1. 자동차 전원 상태 시스템

가장 일반적인 전환은 파란색으로 강조표시됩니다. 상태 및 일반적인 전환은 다음과 같습니다.

  • Suspend-to-RAM. 차량과 SoC가 꺼져 있고 실행되는 코드는 없습니다. 전원이 SoC RAM에 유지됩니다.
  • Wait for VHAL. 운전자가 문을 여는 등의 행동을 통해 차량과 상호작용하면 VMCU는 SoC에 전원을 공급합니다. AAOS는 Suspend-to-RAM에서 다시 작동을 시작하고 Wait for VHAL로 전환합니다. 전환된 이 모드에서 AAOS는 VHAL과의 조정을 기다립니다.
  • On. VHAL은 AAOS에 On 상태로 전환하도록 지시합니다. 이 상태에서 AAOS는 완전히 실행 중이며 운전자와 상호작용합니다.
  • Shutdown Prepare. 운전자의 운전이 끝나면 VHAL은 AAOS에 Shutdown Prepare로 전환하라고 지시합니다. 이 상태에서는 디스플레이와 오디오가 꺼지고 AAOS는 운전자와 상호작용하지 않습니다. Android 시스템은 여전히 실행 중이며 앱과 Android 시스템을 자유롭게 업데이트합니다. 업데이트가 완료되면 Android 시스템은 Wait for VHAL Finish로 전환합니다.
  • Wait for VHAL Finish. 이 시점에서 AAOS는 VHAL에 종료할 준비가 되었음을 알립니다. VMCU는 SoC를 완전 절전으로 설정하고 애플리케이션 프로세서에서 전원을 차단해야 합니다. 그러면 실행 중인 코드는 없지만 AAOS가 Suspend-to-RAM 상태가 됩니다.

전원 관리 모듈

전원 관리 시스템은 다음 모듈로 구성됩니다.

모듈 이름 설명
CarPowerManager Java/C++ API.
CarPowerManagementService 전원 상태 전환을 조정합니다.
CarPowerPolicyDaemon 기본 전원 정책 클라이언트와 통신합니다.
차량 HAL VMCU에 접속합니다.
커널 Suspend to RAM/disk의 구현입니다.

완전 절전/최대 절전 모드 기능(Android를 RAM/디스크로 정지)은 커널에 구현됩니다. 이 기능은 /sys/power/state에 있는 특수 파일로 사용자 공간에 노출됩니다. 이 파일에 mem 또는 disk를 작성하면 AAOS가 정지됩니다.

CPMS는 다른 서비스 및 HAL과 함께 전원 상태를 조정합니다. CPMS는 위에 설명된 상태 시스템을 구현하고 전원 상태 전환이 발생할 때 모든 관찰자에게 알림을 보냅니다. 또한 이 서비스는 VHAL을 사용하여 하드웨어로 메시지를 전송합니다.

CPPD는 CPMS가 제어할 때까지 전원 정책을 관리합니다. 또한 기본 리스너에 전원 정책 변경 알림을 전송합니다.

일부 속성은 VHAL에 정의되어 있습니다. VMCU와 통신하기 위해 CPMS는 이러한 속성을 읽거나 씁니다. 애플리케이션은 CPM에 정의된 인터페이스를 사용하여 전원 상태 변경사항을 모니터링할 수 있습니다. 또한, 이 인터페이스를 통해 애플리케이션은 전원 정책 리스너를 등록할 수 있습니다. 이 API는 자바에서 호출할 수 있고 @hide/@System API로 주석을 달 수 있습니다. 즉, 권한이 있는 애플리케이션 사용할 수 있습니다. 이러한 모듈, 애플리케이션, 서비스 간의 관계는 다음과 같습니다.

전원 구성요소 참조 다이어그램

그림 2. 전원 구성요소 참조 다이어그램

메시지 시퀀스

이전 섹션에서는 전원 관리 시스템을 구성하는 모듈에 관해 설명했습니다. 이 섹션에서는 완전 절전으로 전환완전 절전 종료에 관한 예를 기반으로 모듈과 애플리케이션 간의 통신 방법을 설명합니다.

완전 절전으로 전환

VMCU만 완전 절전을 시작할 수 있습니다. 완전 절전이 시작되면 VMCU는 VHAL을 통해 CPMS로 알림을 전송합니다. CPMS는 상태를 SHUTDOWN PREPARE로 변경한 다음, CPM에서 제공한 새 상태 ID와 함께 onStateChanged() 메서드를 호출하여 모든 관찰자(CPMS를 모니터링하는 애플리케이션 및 서비스)에 이 상태 전환을 브로드캐스트합니다.

CPM은 애플리케이션/서비스와 CPMS 사이에서 중재 역할을 합니다. 애플리케이션/서비스의 onStateChanged() 메서드는 CPM의 onStateChanged() 메서드에서 동기식으로 호출됩니다. 대부분의 애플리케이션과 서비스는 이 호출의 응답이 반환되기 전에 준비를 마쳐야 합니다. 권한 있는 서비스는 PRE_SHUTDOWN_PREPARE, SUSPEND_ENTER, POST_SUSPEND_ENTER의 응답이 반환된 후에도 비동기식으로 준비를 계속할 수 있습니다. 이 경우 권한 있는 서비스는 준비가 끝나면 제공된 CompletablePowerStateChangeFuture 객체에서 complete()를 호출합니다. SHUTDOWN_PREPARE에는 비동기식 준비가 허용되지 않습니다. DEEP_SLEEP_ENTRY가 VHAL에 전송되기 전에 CPMS는 주기적으로 VHAL에 종료 연기 요청을 전송합니다.

모든 CPM 객체의 종료 준비가 완료되면 CPMS는 AP_POWER_STATE_REPORT를 VHAL로 전송합니다. 그러면 VHAL이 VMCU에 AP가 정지될 준비가 되었음을 알립니다. CPMS는 커널을 정지하는 정지 메서드도 호출합니다.

위에서 설명한 시퀀스는 다음과 같습니다.

완전 절전으로 전환

그림 3. 완전 절전으로 전환

CPM에서 제공하는 프로그래밍 인터페이스

이 섹션에서는 시스템 애플리케이션 및 서비스를 위해 CPM이 제공하는 Java API를 설명합니다. 시스템 소프트웨어는 이 API를 사용하여 다음과 같은 작업을 할 수 있습니다.

  • AP의 전원 상태 변경사항을 모니터링할 수 있습니다.
  • 전원 정책을 적용할 수 있습니다.

다음 단계에 따라 CPM에서 제공하는 API를 호출합니다.

  1. CPM 인스턴스를 획득하려면 Car API를 호출합니다.
  2. 1단계에서 만든 객체에 대해 적절한 메서드를 호출합니다.

CarPowerManager 객체 만들기

CPM 객체를 만들려면 자동차 객체의 getCarManager() 메서드를 호출합니다. 이 메서드는 CPM 객체를 만드는 데 사용되는 퍼사드입니다. android.car.Car.POWER_SERVICE를 인수로 지정하여 CPM 객체를 만듭니다.

Car car = Car.createCar(this);
CarPowerManager powerManager =
  (CarPowerManager) car.getCarManager(android.car.Car.POWER_SERVICE);

CarPowerStateListener 및 등록

시스템 애플리케이션과 서비스는 CarPowerManager.CarPowerStateListener를 구현하여 전력 상태 변경 알림을 수신할 수 있습니다. 이 인터페이스는 CPMS의 전원 상태가 변경될 때 호출되는 콜백 함수인 onStateChanged() 메서드 하나를 정의합니다. 다음 예제에서는 인터페이스를 구현하는 새로운 익명 클래스를 정의합니다.

private final CarPowerManager.CarPowerStateListener powerListener =
  new CarPowerManager.CarPowerStateListener () {
    @Override
     public void onStateChanged(int state) {
       Log.i(TAG, "onStateChanged() state = " + state);
     }
};

이 리스너 객체에 전원 상태 변환을 모니터링하도록 지시하려면 새 실행 스레드를 만들고 CPM 객체에 리스너와 이 스레드를 등록합니다.

executor = new ThreadPerTaskExecutor();
powerManager.setListener(powerListener, executor);

전원 상태가 변경되면 리스너 객체의 onStateChanged() 메서드가 새 전원 상태를 나타내는 값을 사용하여 호출됩니다. 실제 값과 전원 상태 간의 연관 관계는 CarPowerManager에 정의되어 있으며 다음 표에 나와 있습니다.

이름 설명
STATE_ON 전원이 켜진 상태에 진입합니다. 시스템이 완전히 작동합니다.
STATE_SHUTDOWN_CANCELLED 종료가 취소되고 전원 상태가 정상 상태로 돌아갑니다.
STATE_SHUTDOWN_ENTER 애플리케이션은 정리되고 종료될 준비가 됩니다.
STATE_POST_SHUTDOWN_ENTER 종료 준비가 완료되었으며 VMCU도 종료될 준비가 됩니다. 종료 상태로 전환됩니다.
STATE_PRE_SHUTDOWN_PREPARE 종료 프로세스가 요청되었지만 CPMS에서 아직 프로세스를 시작하지 않았습니다. 디스플레이와 오디오는 계속 작동합니다.
STATE_SHUTDOWN_PREPARE 이 상태인 동안 차고 모드가 실행될 수 있습니다.
STATE_SUSPEND_ENTER 애플리케이션이 정리되고 suspend-to-RAM을 사용할 준비가 됩니다.
STATE_POST_SUSPEND_ENTER Suspend-to-RAM 준비가 완료되었으며 VMCU가 suspend-to-RAM으로 전환할 준비가 됩니다. 정지 상태로 전환됩니다.
STATE_SUSPEND_EXIT 정지 상태에서 해제되거나 취소된 정지 상태에서 다시 시작됩니다.
STATE_HIBERNATION_ENTER 애플리케이션이 정리되고 최대 절전 모드로 전환될 준비가 됩니다.
STATE_POST_HIBERNATION_ENTER 최대 절전 모드 준비가 완료되었으며 VMCU가 최대 절전 모드로 전환될 준비가 됩니다. 최대 절전 모드 상태로 전환합니다.
STATE_HIBERNATION_EXIT 최대 절전 모드에서 해제되거나 취소된 최대 절전 모드에서 다시 시작합니다.
STATE_WAIT_FOR_VHAL 시스템은 시작된 상태이지만 켜진 상태로 전환되기 전에 VHAL과의 통신 설정을 대기하는 중입니다.

CarPowerStateListener 등록 취소

CPM에 등록된 모든 리스너 객체를 등록 취소하려면 clearListener 메서드를 호출합니다.

powerManager.clearListener();

Android 구현 시 시스템 통합

통합자는 다음 항목을 진행해야 합니다.

  • Android 정지를 위한 커널 인터페이스를 구현해야 합니다.
  • 다음 용도의 VHAL 함수를 구현해야 합니다.
    • 자동차에서 Android로 정지 또는 종료의 시작 전파.
    • Android에서 자동차로 종료 준비 메시지 전송.
    • Linux 커널 인터페이스를 통해 Android의 종료 또는 정지 시작.
  • 기기가 정지 상태일 때 모든 절전 모드 해제 소스가 중지되었는지 확인해야 합니다.
  • 종료 프로세스를 무기한 연기하지 않도록 애플리케이션이 빠르게 종료되어야 합니다.
  • 정지/최대 절전 모드를 차단하지 않도록 전원 정책에 따라 BSP가 기기 구성요소를 켜거나 꺼야 합니다.

커널 인터페이스: /sys/power/state

AAOS는 애플리케이션이나 서비스가 suspend-to-RAM용 mem 또는 suspend-to-disk용 disk/sys/power/state에 위치한 파일에 기록할 때 기기를 정지 모드로 전환합니다. 통합자는 이 파일을 모니터링하고 Linux를 정지 전원 상태로 만드는 기능을 제공해야 합니다. 이 기능은 GPIO를 VMCU로 전송해 기기가 완전히 종료되었음을 VMCU에 알릴 수 있습니다. 또한 통합자는 최종 메시지를 VMCU로 전송하는 VHAL과 정지 또는 종료 모드로 전환되는 시스템 간의 모든 경합 상태도 삭제해야 합니다.

VHAL의 책임

VHAL은 차량 네트워크와 Android 간의 인터페이스를 제공합니다. VHAL은 다음 작업을 수행합니다.

  • 자동차에서 Android로 정지 또는 종료 시작을 전파합니다.
  • Android에서 자동차로 종료 준비 완료 메시지를 보냅니다.
  • Linux 커널 인터페이스를 통해 Android 종료 또는 정지를 시작합니다.

CPMS가 VHAL에 종료 준비가 되었음을 알리면 VHAL은 VMCU에 종료 준비 완료 메시지를 보냅니다. 일반적으로 UART, SPI, USB와 같은 온칩 주변장치가 메시지를 전송합니다. 메시지가 전송되면 CPMS는 커널 명령어를 호출하여 기기를 정지하거나 종료합니다. 그렇게 하기 전에 VHAL 또는 BSP가 GPIO를 전환하여 VMCU에 기기에서 전원을 차단하는 것이 안전하다고 알릴 수 있습니다.

VHAL은 VHAL을 통해 전원 관리를 제어하는 다음 속성을 지원해야 합니다.

이름 설명
AP_POWER_STATE_REPORT Android는 VehicleApPowerStateReport 열거형 값을 사용하여 이 속성과 함께 VMCU에 상태 전환을 보고합니다.
AP_POWER_STATE_REQ VMCU는 VehicleApPowerStateReq 열거형 값과 이 속성을 사용하여 Android를 다른 전원 상태로 전환하도록 지시합니다.

AP_POWER_STATE_REPORT

이 속성을 사용하여 Android의 현재 전원 관리 상태를 보고합니다. 이 속성에는 다음 두 개의 정수가 포함됩니다.

  • int32Values[0]: 현재 상태의 VehicleApPowerStateReport 열거형입니다.
  • int32Values[1]: 연기하거나 절전/종료할 시간을 밀리초 단위로 표시합니다. 이 값의 의미는 첫 번째 값에 따라 달라집니다.

첫 번째 값은 다음 값 중 하나를 사용할 수 있습니다. VehicleApPowerStateReport.aidl에는 보다 구체적인 설명이 포함되어 있으며, 이러한 설명은 hardware/interfaces/automotive/vehicle/aidl/android/hardware/automotive/vehicle에 저장되어 있습니다.

값 이름 설명 두 번째 값
WAIT_FOR_VHAL AP가 시작된 상태이며 VHAL과의 통신을 설정해야 합니다.
DEEP_SLEEP_ENTRY AP가 완전 절전 상태로 전환됩니다. 두 번째 값에 지정된 시간이 지나면 VMCU는 AP를 다시 켜야 합니다. 설정해야 함
DEEP_SLEEP_EXIT AP가 완전 절전 상태를 종료 중입니다.
HIBERNATION_ENTRY AP가 최대 절전 모드로 전환 중입니다. 두 번째 값에 지정된 시간이 지나면 VMCU는 AP를 다시 켜야 합니다. 설정해야 함
HIBERNATION_EXIT AP가 최대 절전 모드를 종료 중입니다.
SHUTDOWN_POSTPONE Android는 아직 종료할 준비가 되지 않았습니다. VMCU는 AP를 종료하기 전에 두 번째 값에 지정된 시간을 기다려야 합니다. Android는 추가 SHUTDOWN_POSTPONE 보고서를 발행하여 추가 연기를 요청할 수 있습니다. 설정해야 함
SHUTDOWN_PREPARE Android가 종료 준비를 하고 있습니다. 설정해야 함
SHUTDOWN_START AP가 종료 준비가 되었습니다. 두 번째 값에 지정된 시간이 지나면 VMCU는 AP를 다시 켜야 합니다. VMCU는 시간에 따른 켜기 기능을 지원하는 데 반드시 필요하지는 않습니다. 설정해야 함
SHUTDOWN_CANCELLED Android가 종료 준비를 중단하는 중이며 곧 WAIT_FOR_VHAL로 진행합니다.
ON Android가 정상적으로 실행 중입니다.

상태는 자체적으로 설정하거나 VMCU를 통해 요청에 대한 응답으로 설정할 수 있습니다.

AP_POWER_STATE_REQ

이 속성은 VMCU에서 Android를 다른 전원 상태로 전환하기 위해 전송되며, 다음 두 개의 정수를 포함합니다.

  • int32Values[0]: VehicleApPowerStateReq 열거형 값. 전환할 새 상태를 나타냅니다.
  • int32Values[1]: VehicleApPowerStateShutdownParam 열거형 값. 이 값은 SHUTDOWN_PREPARE 메시지와 관련해서만 전송되며 Android에 이 값이 포함된 옵션을 전송합니다.

첫 번째 정수 값은 Android가 전환할 새 상태를 나타냅니다. 아래에 제공된 시맨틱은 VehicleApPowerStateReq.aidl에 정의되어 있습니다.

값 이름 설명
ON AP가 전체 작업을 시작해야 합니다.
SHUTDOWN_PREPARE AP가 종료 준비를 해야 합니다. 두 번째 값은 AP가 종료 연기를 할 수 있는지와 AP가 전원을 끄거나 완전 절전 모드로 전환해야 하는지를 나타냅니다.
CANCEL_SHUTDOWN AP는 종료 준비를 중지하고 ON 상태로 전환할 준비를 해야 합니다.
FINISHED 이제 AP가 종료되거나 정지됩니다.

VehicleApPowerStateShutdownParamVehicleApPowerStateShutdownParam.aidl에 정의되어 있습니다. 이 enum에는 다음 요소가 들어 있습니다.

값 이름 설명
CAN_SLEEP AP가 완전히 종료되는 대신 완전 절전 모드로 전환할 수 있습니다. 연기가 허용됩니다.
CAN_HIBERNATE AP는 완전히 종료하는 대신 최대 절전 모드로 전환될 수 있습니다. 연기가 허용됩니다.
SHUTDOWN_ONLY AP는 종료되어야 합니다. 연기가 허용됩니다. 완전 절전이 허용되지 않습니다.
SLEEP_IMMEDIATELY AP는 완전 절전 모드로 전환될 수 있지만 즉시 절전 모드로 전환되거나 종료되어야 합니다. 연기는 허용되지 않습니다.
HIBERNATE_IMMEDIATELY AP는 suspend-to-disk 모드로 전환될 수 있지만, 즉시 최대 절전 모드로 전환되거나 종료되어야 합니다. 연기는 허용되지 않습니다.
SHUTDOWN_IMMEDIATELY AP는 즉시 종료되어야 합니다. 연기는 허용되지 않습니다. 완전 절전이 허용되지 않습니다.

절전 모드 해제 소스

기기가 정지 모드일 경우 통합자는 관련 절전 모드 해제 소스를 사용 중지해야 합니다. 일반적인 절전 모드 해제 소스에는 하트비트, 모뎀, Wi-Fi, 블루투스 등이 있습니다. 유일하게 유효한 절전 모드 해제 소스는 SoC의 절전 모드를 해제하기 위한 VMCU의 인터럽트입니다. 이 경우에는 VMCU가 원격 엔진 시작과 같은 원격 절전 모드 해제 이벤트에 대해 모뎀을 수신할 수 있다고 가정합니다. 이 기능이 AP에 푸시되면 모뎀을 서비스하는 또 다른 절전 모드 해제 소스를 추가해야 합니다.

애플리케이션

OEM은 애플리케이션이 신속하게 종료되고 프로세스를 무기한 연기할 수 없도록 애플리케이션을 주의 깊게 작성해야 합니다.

부록

소스 코드 트리의 디렉터리

콘텐츠 디렉터리
CarPowerManager 관련 코드 packages/services/Car/car-lib/src/android/car/hardware/power
CarPowerManagementService 등 packages/services/Car/service/src/com/android/car/power
VehicleHal, HAlClient 같은 VHAL을 처리하는 서비스 packages/services/Car/service/src/com/android/car/hal
VHAL 인터페이스 및 속성 정의 hardware/interfaces/automotive/vehicle/aidl/android/hardware/automotive/vehicle/
CarPowerManager에 관한 몇 가지 아이디어를 제공하는 샘플 앱 packages/services/Car/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink

클래스 다이어그램

다음 클래스 다이어그램은 전원 관리 시스템의 자바 클래스와 인터페이스를 보여줍니다.

전원 클래스 다이어그램

그림 5. 전원 클래스 다이어그램

객체 관계

다음 그래프는 다른 객체에 관한 참조가 있는 객체를 보여줍니다. 에지는 소스 객체가 타겟 객체에 관한 참조를 보유한다는 것을 의미합니다. 예를 들어 VehicleHAL에는 PropertyHalService 객체에 관한 참조가 있습니다.

객체 참조 다이어그램

그림 6. 객체 참조 다이어그램