전원 관리

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

상태 전환은 VMCU(Vehicle Master Control Unit)에 의해 트리거됩니다. VMCU와 통신하려면 통합자는 여러 구성 요소를 구현해야 합니다. 통합자는 차량 하드웨어 추상화 계층(VHAL) 및 커널 구현과의 통합을 담당합니다. 통합자는 또한 웨이크 소스를 비활성화하고 종료가 무기한 연기되지 않도록 할 책임이 있습니다.

술어

이 문서 전체에서 사용되는 용어는 다음과 같습니다.

앱 프로세서(AP)
SoC(시스템 온 칩) 의 일부입니다.
보드 지원 패키지(BSP)
임베디드 운영 체제와 통합되어 특정 하드웨어 환경(마더보드)에서 임베디드 운영 체제가 작동할 수 있도록 하는 하드웨어별 부팅 펌웨어 및 장치 드라이버가 포함된 소프트웨어 계층입니다.
카파워매니저(CPM)
앱이 전원 상태 변경을 등록할 수 있는 API를 노출합니다.
CarPowerManagementService(CPMS)
자동차 전원 상태 시스템을 구현하고, VHAL과 인터페이스하고, suspend()shutdown() 에 대한 최종 호출을 수행합니다.
CarPowerPolicyDaemon(CPPD)
전원 정책 리스너를 등록하기 위해 기본 프로세스에 대한 AIDL 인터페이스를 노출합니다.
범용 입력 또는 출력(GPIO)
범용으로 사용되는 디지털 신호 핀입니다.
하드웨어 추상화 계층(HAL)
하드웨어 기능에 액세스하기 위해 다른 모든 상위 모듈이 상호 작용해야 하는 소프트웨어 계층입니다.
동면하다
디스크 일시 중지 (S2D/S4)라고도 합니다. SoC는 S4 전원 모드(최대 절전 모드)로 전환되고 RAM 콘텐츠는 비휘발성 미디어(예: 플래시 또는 디스크)에 기록되고 전체 시스템의 전원이 꺼집니다.
미디어 프로세서(MP)
SoC(시스템 온 칩)를 참조하세요.
전력 관리 집적 회로(PMIC)
호스트 시스템의 전원 요구 사항을 관리하는 데 사용되는 칩입니다.
SoC(시스템 온 칩)
일반적으로 Intel, MediaTek, Nvidia, Qualcomm, Renesas 및 Texas Instruments와 같은 제조업체에서 제공하는 AAOS를 실행하는 메인 프로세서입니다.
유예하다
Suspend-to-RAM (S2R 또는 STR)이라고도 합니다. SoC는 S3 전원 모드로 전환되고 RAM의 전원은 켜져 있는 동안 CPU의 전원은 꺼집니다.
차량 HAL(VHAL)
차량 네트워크와 인터페이스하는 데 사용되는 Android API입니다. Tier 1 파트너 또는 OEM이 이 모듈 작성을 담당합니다. 차량 네트워크는 CAN, LIN, MOST, 이더넷 등 모든 물리적 계층을 사용할 수 있습니다. VHAL은 AAOS가 차량과 상호작용할 수 있도록 이 차량 네트워크를 추상화합니다.
VIP(차량 인터페이스 프로세서)
차량 MCU를 참조하세요.
차량 마스터 제어 장치(VMCU)
차량 네트워크와 SoC 간의 인터페이스를 제공하는 마이크로컨트롤러입니다. SoC는 USB, UART, SPI 및 GPIO 신호를 통해 VMCU와 통신합니다.

시스템 디자인

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

자동차 전원 상태 머신

AAOS는 상태 머신을 사용하여 AP의 전원 상태를 나타냅니다. 상태 머신은 아래와 같은 상태를 제공합니다.

자동차 전원 상태 머신

그림 1. 자동차 전원 상태 머신.

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

  • RAM에 일시 중단. 차량과 SoC가 꺼져 있습니다. 코드가 실행되고 있지 않습니다. 전원은 SoC RAM으로 유지됩니다.
  • VHAL을 기다리세요. 예를 들어 운전자가 도어를 여는 등 차량과 상호 작용하면 VMCU는 SoC에 전원을 공급합니다. AAOS는 Suspend-to-RAM에서 재개되고 VHAL 대기 모드로 전환되어 VHAL과의 조정을 기다립니다.
  • 에. VHAL은 AAOS에 On 상태로 전환하라고 지시합니다. 이 상태에서는 AAOS가 완전히 실행되고 드라이버와 상호작용합니다.
  • 종료 준비. 운전자가 운전을 마치면 VHAL은 AAOS에 종료 준비를 시작하라고 지시합니다. 이 상태에서는 디스플레이와 오디오가 꺼지고 AAOS가 운전자와 상호작용하지 않습니다. Android 시스템은 여전히 ​​실행 중이며 앱과 Android 시스템을 무료로 업데이트할 수 있습니다. 업데이트가 완료되면 Android 시스템은 VHAL 완료 대기 상태로 전환됩니다.
  • VHAL 완료를 기다립니다. 이 시점에서 AAOS는 VHAL에 종료할 준비가 되었음을 알립니다. VMCU는 SoC를 최대 절전 모드로 전환하고 앱 프로세서에서 전원을 제거할 것으로 예상됩니다. 그러면 코드가 실행되지 않지만 AAOS는 Suspend-to-RAM 상태가 됩니다.

전원 관리 모듈

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

모듈 이름 설명
자동차파워매니저 자바 또는 C++ API.
자동차전력관리서비스 전원 상태 전환을 조정합니다.
자동차전력정책데몬 기본 전원 정책 클라이언트와 통신합니다.
차량 HAL VMCU에 대한 인터페이스입니다.
핵심 RAM 또는 디스크 구현을 일시중단합니다.

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

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

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

일부 속성은 VHAL에 정의되어 있습니다. VMCU와 통신하기 위해 CPMS는 이러한 속성을 읽고 씁니다. 앱은 CPM에 정의된 인터페이스를 사용하여 전원 상태 변경을 모니터링할 수 있습니다. 또한 이 인터페이스를 사용하면 앱이 전원 정책 수신기를 등록할 수 있습니다. 이 API는 Java에서 호출할 수 있으며 @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에 보낸 다음 VMCU에 AP가 일시 중지할 준비가 되었음을 알립니다. CPMS는 커널을 일시 중단하는 일시 중단 메서드도 호출합니다.

위에서 설명한 순서는 다음과 같습니다.

깊은 잠에 들어가세요

그림 3. 깊은 잠에 들어갑니다.

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

이 섹션에서는 시스템 앱 및 서비스를 위해 CPM에서 제공하는 Java API에 대해 설명합니다. 이 API를 사용하면 시스템 소프트웨어에서 다음을 수행할 수 있습니다.

  • AP의 전원 상태 변경을 모니터링합니다.
  • 전원 정책을 적용합니다.

CPM에서 제공하는 API를 호출하려면 다음 단계를 사용하세요.

  1. CPM 인스턴스를 획득하려면 Car API를 호출하세요.
  2. 1단계에서 생성된 개체에 대해 적절한 메서드를 호출합니다.

CarPowerManager 개체 만들기

CPM 객체를 생성하려면 Car 객체의 getCarManager() 메서드를 호출하세요. 이 메소드는 CPM 객체를 생성하는 데 사용되는 Facade입니다. CPM 객체를 생성하려면 android.car.Car.POWER_SERVICE 인수로 지정하세요.

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 앱은 정리되어 RAM 일시 중지 준비가 되어 있어야 합니다.
STATE_POST_SUSPEND_ENTER RAM 일시 중지 준비가 완료되었으며 VMCU가 RAM 일시 중지 준비가 되었습니다. 일시 중지 상태로 들어갑니다.
STATE_SUSPEND_EXIT 일시 중지 상태에서 깨어나거나 취소된 일시 중지 상태에서 재개합니다.
STATE_HIBERNATION_ENTER 앱은 정리되고 최대 절전 모드로 전환될 준비가 되어 있어야 합니다.
STATE_POST_HIBERNATION_ENTER 최대 절전 모드 준비가 완료되었으며 VMCU가 최대 절전 모드를 시작할 준비가 되었습니다. 최대 절전 모드 상태로 들어갑니다.
STATE_HIBERNATION_EXIT 최대 절전 모드에서 깨어나거나 취소된 최대 절전 모드에서 다시 시작합니다.
STATE_WAIT_FOR_VHAL 시스템이 시작 중이지만 ON 상태로 전환되기 전에 VHAL과의 통신 설정을 기다리고 있습니다.

CarPowerStateListener 등록 취소

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

powerManager.clearListener();

Android 구현에 대한 시스템 통합

통합자는 다음 항목을 담당합니다.

  • Android를 정지하기 위한 커널 인터페이스 구현
  • 다음을 위해 VHAL 기능을 구현합니다.
    • 자동차에서 Android로 정지 또는 종료 시작을 전파합니다.
    • Android에서 자동차로 종료 준비 메시지를 보냅니다.
    • Linux 커널 인터페이스를 통해 Android 종료 또는 정지를 시작합니다.
  • 기기가 정지 상태일 때 모든 웨이크 소스가 비활성화되어 있는지 확인하세요.
  • 종료 프로세스가 무기한 연기되지 않도록 앱이 충분히 빨리 종료되는지 확인하세요.
  • 일시 중지 또는 최대 절전 모드를 차단하지 않도록 BSP가 전원 정책에 따라 장치 구성 요소를 켜거나 끄는지 확인하십시오.

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

AAOS는 앱이나 서비스가 RAM 일시 중지를 위한 mem 또는 disk 일시 중지를 위한 디스크를 /sys/power/state 에 있는 파일에 기록할 때 기기를 일시 중지 모드로 전환합니다. 통합자는 이 파일을 모니터링하고 Linux를 전원 일시 중지 상태로 전환하는 기능을 제공해야 합니다. 이 기능은 GPIO를 VMCU로 보내 장치가 완전히 종료되었음을 VMCU에 알릴 수 있습니다. 또한 통합자는 VHAL이 VMCU에 최종 메시지를 보내는 것과 시스템이 일시 중지 또는 종료 모드로 전환되는 사이의 경합 조건을 제거하는 역할도 담당합니다.

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가 최대 절전 상태를 종료하고 있습니다.
하이버네이션_엔트리 AP가 최대 절전 모드 상태로 전환 중입니다. VMCU는 두 번째 값에 지정된 시간 이후에 AP를 다시 켜야 합니다. 설정해야 함
최대 절전 모드_EXIT AP가 최대 절전 모드 상태를 종료하고 있습니다.
SHUTDOWN_POSTPONE Android를 종료할 준비가 되지 않았습니다. VMCU는 AP를 종료하기 전에 두 번째 값에 지정된 시간을 기다려야 합니다. Android는 추가 SHUTDOWN_POSTPONE 보고서를 발행하여 추가 연기를 요청할 수 있습니다. 설정해야 함
종료_준비 안드로이드가 종료될 준비를 하고 있습니다. 설정해야 함
SHUTDOWN_START AP를 종료할 준비가 되었습니다. VMCU는 두 번째 값에 지정된 시간 이후에 AP를 다시 켜야 합니다. (VMCU는 시간 설정 기능을 지원하는 데 필요하지 않습니다.) 설정해야 함
종료_취소됨 Android는 종료 준비를 중단하고 WAIT_FOR_VHAL로 진행됩니다.
안드로이드는 정상적으로 실행되고 있습니다.

상태는 자율적으로 설정되거나 VMCU를 통한 요청에 따라 설정될 수 있습니다.

AP_POWER_STATE_REQ

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

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

첫 번째 정수 값은 Android가 전환할 새로운 상태를 나타냅니다. 의미 체계는 VehicleApPowerStateReq.aidl 에 정의되어 있으며 아래에 제공됩니다.

값 이름 설명
AP는 전체 작동을 시작해야 합니다.
종료_준비 AP는 종료 준비를 해야 합니다. 두 번째 값은 AP가 종료를 연기할 수 있는지 여부와 AP가 전원을 끄거나 깊은 절전 모드로 전환해야 하는지 여부를 나타냅니다.
취소_종료 AP는 종료 준비를 중단하고 ON 준비를 해야 합니다.
완성된 이제 AP가 종료되거나 일시 중지됩니다.

VehicleApPowerStateShutdownParam VehicleApPowerStateShutdownParam.aidl 에 정의되어 있습니다. 이 열거형에는 다음 요소가 있습니다.

값 이름 설명
CAN_SLEEP AP는 완전히 종료되는 대신 깊은 절전 모드로 전환될 수 있습니다. 연기가 허용됩니다.
CAN_HIBERNATE AP가 완전히 종료되는 대신 최대 절전 모드로 들어갈 수 있습니다. 연기가 허용됩니다.
SHUTDOWN_ONLY AP를 종료해야 합니다. 연기가 허용됩니다. 깊은 잠은 허용되지 않습니다.
즉시 수면 AP는 깊은 절전 모드로 들어갈 수 있지만 즉시 절전 모드로 들어가거나 종료되어야 합니다. 연기하는 것은 허용되지 않습니다.
최대 절전 모드_IMMEDIATELY AP는 디스크 일시 중지 상태로 들어갈 수 있지만 즉시 최대 절전 모드로 전환하거나 종료해야 합니다. 연기하는 것은 허용되지 않습니다.
즉시 종료 AP는 즉시 종료되어야 합니다. 연기하는 것은 허용되지 않습니다. 깊은 잠은 허용되지 않습니다.

웨이크 소스

통합자는 장치가 일시 중지 모드에 있을 때 적절한 깨우기 소스를 비활성화해야 합니다. 일반적인 깨우기 소스에는 하트비트, 모뎀, Wi-Fi 및 Bluetooth가 포함됩니다. 유일한 유효한 깨우기 소스는 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
VehicleHalHAlClient 와 같이 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

클래스 다이어그램

이 클래스 다이어그램은 전원 관리 시스템의 Java 클래스와 인터페이스를 표시합니다.

전력 등급 다이어그램

그림 4. 전력 등급 다이어그램

객체 관계

그림 5에서는 어떤 개체가 다른 개체에 대한 참조를 가지고 있는지 보여줍니다. 가장자리는 소스 객체가 대상 객체에 대한 참조를 보유하고 있음을 의미합니다. 예를 들어 VehicleHAL에는 PropertyHalService 객체에 대한 참조가 있습니다.

객체 참조 다이어그램

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