Zarządzanie zasilaniem

Aby wspierać zarządzanie energią dla konkretnego pojazdu, Android udostępnia usługę CarPowerManagementService i interfejs CarPowerManager .

Zmiany stanów są wyzwalane przez główną jednostkę sterującą pojazdu (VMCU). Aby komunikować się z VMCU, integratorzy muszą wdrożyć kilka komponentów. Integratorzy są odpowiedzialni za integrację z warstwą abstrakcji sprzętu pojazdu (VHAL) i implementacją jądra. Integratorzy są również odpowiedzialni za wyłączanie źródeł wybudzania i dbanie o to, aby wyłączenia nie były odkładane na czas nieokreślony.

Terminologia

W całym dokumencie stosowane są następujące terminy:

procesor aplikacji (AP)
Część systemu na chipie (SoC) .
Pakiet wsparcia płyty głównej (BSP)
Warstwa oprogramowania zawierająca specyficzne dla sprzętu oprogramowanie rozruchowe i sterowniki urządzeń, które umożliwiają wbudowanemu systemowi operacyjnemu działanie w danym środowisku sprzętowym (płycie głównej), zintegrowane z wbudowanym systemem operacyjnym.
CarPowerManager (CPM)
Udostępnia interfejs API dla aplikacji umożliwiający rejestrację zmian stanu zasilania.
Usługa CarPowerManagementService (CPMS)
Implementuje maszynę stanu zasilania samochodu, łączy się z VHAL i wykonuje końcowe wywołania funkcji suspend() i shutdown() .
Daemon CarPowerPolicy (CPPD)
Udostępnia interfejsy AIDL dla procesów natywnych w celu zarejestrowania odbiornika zasad zasilania.
wejście lub wyjście ogólnego przeznaczenia (GPIO)
Cyfrowy pin sygnałowy do ogólnego użytku.
warstwa abstrakcji sprzętu (HAL)
Warstwa oprogramowania, z którą muszą współdziałać wszystkie pozostałe moduły wyższego poziomu, aby uzyskać dostęp do funkcjonalności sprzętu.
hibernować
Nazywany także zawieszeniem na dysku (S2D/S4). SoC przechodzi w tryb zasilania S4 (hibernacja), zawartość pamięci RAM jest zapisywana na nieulotnym nośniku (takim jak pamięć flash lub dysk), a cały system zostaje wyłączony.
procesor multimediów (MP)
Zobacz system na chipie (SoC) .
układ scalony zarządzania energią (PMIC)
Układ używany do zarządzania wymaganiami dotyczącymi zasilania systemu hosta.
system na chipie (SoC)
Główny procesor z systemem AAOS, zwykle dostarczany przez producentów takich jak Intel, MediaTek, Nvidia, Qualcomm, Renesas i Texas Instruments.
wstrzymać
Nazywany także zawieszeniem w pamięci RAM (S2R lub STR). SoC jest przełączany w tryb zasilania S3, a procesor jest wyłączany, podczas gdy pamięć RAM pozostaje włączona.
Pojazd HAL (VHAL)
Interfejs API systemu Android używany do łączenia się z siecią pojazdu. Za napisanie tego modułu odpowiada partner poziomu 1 lub producent OEM. Sieć pojazdu może wykorzystywać dowolną warstwę fizyczną (taką jak CAN, LIN, MOST i Ethernet). VHAL wyodrębnia tę sieć pojazdu, aby umożliwić AAOS interakcję z pojazdem.
Procesor interfejsu pojazdu (VIP)
Zobacz MCU pojazdu.
Główna jednostka sterująca pojazdu (VMCU)
Mikrokontroler zapewniający interfejs pomiędzy siecią pojazdu a układem SoC. SoC komunikuje się z VMCU za pośrednictwem sygnałów USB, UART, SPI i GPIO.

Projekt systemu

W tej sekcji opisano, w jaki sposób AAOS reprezentuje stan zasilania procesora aplikacji i które moduły implementują system zarządzania energią. W tym materiale opisano również, w jaki sposób te moduły współpracują ze sobą i jak zwykle zachodzą zmiany stanu.

Maszyna stanu mocy samochodu

AAOS wykorzystuje maszynę stanów do reprezentowania stanu zasilania punktu dostępowego. Maszyna stanów udostępnia stany zilustrowane poniżej:

Maszyna stanu mocy samochodu

Rysunek 1. Maszyna stanu mocy samochodu.

Najczęstsze przejścia są podświetlone na niebiesko. Oto stany i typowe przejścia:

  • Zawieszenie do pamięci RAM. Pojazd i SoC są wyłączone. Żaden kod nie jest wykonywany. Zasilanie jest utrzymywane w pamięci RAM SoC.
  • Poczekaj na VHAL. Kiedy kierowca wchodzi w interakcję z pojazdem, na przykład otwierając drzwi, VMCU zasila SoC. AAOS wznawia działanie ze stanu Suspend to RAM i przechodzi do trybu oczekiwania na VHAL, gdzie oczekuje na koordynację z VHAL.
  • NA. VHAL nakazuje AAOS przejście w stan włączenia. W tym stanie AAOS jest w pełni uruchomiony i współpracuje ze sterownikiem.
  • Przygotowanie do zamknięcia. Kiedy kierowca zakończy jazdę, VHAL informuje system AAOS o przejściu w tryb przygotowania do wyłączenia. W tym stanie wyświetlacz i dźwięk są wyłączone, a AAOS nie współpracuje ze sterownikiem. System Android nadal działa i można bezpłatnie aktualizować aplikacje i system Android. Po zakończeniu aktualizacji, jeśli takie istnieją, system Android przejdzie w tryb oczekiwania na zakończenie VHAL.
  • Poczekaj na zakończenie VHAL. W tym momencie AAOS informuje VHAL, że jest gotowy do wyłączenia. Oczekuje się, że VMCU przełączy SoC w tryb głębokiego uśpienia i odetnie zasilanie procesora aplikacji. AAOS znajduje się wówczas w stanie wstrzymania do pamięci RAM, chociaż nie jest wykonywany żaden kod.

Moduły zarządzania energią

System zarządzania energią składa się z następujących modułów:

Nazwa modułu Opis
CarPowerManager API Java lub C++.
Usługa CarPowerManagement Koordynuje przejścia stanu zasilania.
Demon CarPowerPolicy Komunikuje się z natywnymi klientami polityki zasilania.
Pojazd HAL Interfejs do VMCU.
Jądro Wstrzymaj implementację pamięci RAM lub dysku.

Funkcja głębokiego uśpienia/hibernacji (zawieszanie Androida na RAM/dysk) jest zaimplementowana w jądrze. Ta funkcja jest dostępna w przestrzeni użytkownika w postaci specjalnego pliku znajdującego się w /sys/power/state . AAOS zostaje zawieszony poprzez zapisanie mem lub disk w tym pliku.

CPMS koordynuje stan zasilania z innymi usługami i warstwami HAL. CPMS implementuje opisaną powyżej maszynę stanów i wysyła powiadomienia do każdego obserwatora, gdy nastąpi zmiana stanu zasilania. Usługa ta wykorzystuje również VHAL do wysyłania komunikatów do sprzętu.

CPPD zarządza polityką energetyczną do czasu przejęcia kontroli przez CPMS. Wysyła także powiadomienia o zmianach zasad zasilania do natywnych słuchaczy.

Niektóre właściwości są zdefiniowane w VHAL. Aby komunikować się z VMCU, CPMS odczytuje i zapisuje te właściwości. aplikacje mogą korzystać z interfejsu zdefiniowanego w CPM do monitorowania zmian stanu zasilania. Interfejs ten umożliwia także aplikacjom rejestrowanie odbiorników zasad zasilania . Ten interfejs API można wywołać z języka Java i jest oznaczony @hide / @System API, co oznacza, że ​​jest dostępny tylko dla uprzywilejowanych aplikacji. Poniżej przedstawiono relacje między tymi modułami, aplikacjami i usługami:

Schemat referencyjny komponentów mocy

Rysunek 2. Schemat referencyjny komponentów mocy.

Sekwencja wiadomości

W poprzedniej części opisano moduły składające się na system zarządzania energią. W tej sekcji wykorzystano przykłady wejść w głęboki sen i wyjść z głębokiego uśpienia, aby wyjaśnić, w jaki sposób moduły i aplikacje komunikują się:

Wejdź w głęboki sen

Tylko VMCU może zainicjować głęboki sen. Po zainicjowaniu głębokiego uśpienia VMCU wysyła powiadomienie do CPMS za pośrednictwem VHAL. CPMS zmienia stan na SHUTDOWN PREPARE i rozgłasza tę zmianę stanu wszystkim obserwatorom (aplikacjom i usługom monitorującym CPMS), wywołując metodę onStateChanged() z nowym identyfikatorem stanu dostarczonym przez CPM.

CPM pośredniczy pomiędzy aplikacjami/usługami a CPMS. Metoda onStateChanged() dla aplikacji/usług jest wywoływana synchronicznie w metodzie onStateChanged() modułu CPM. Większość aplikacji i usług musi zakończyć przygotowania przed powrotem z tej rozmowy. Usługi uprzywilejowane mogą asynchronicznie kontynuować przygotowania po powrocie na PRE_SHUTDOWN_PREPARE , SUSPEND_ENTER , POST_SUSPEND_ENTER . W tym przypadku usługa uprzywilejowana powinna wywołać funkcję Complete() na dostarczonym obiekcie CompletablePowerStateChangeFuture po zakończeniu przygotowywania. Należy pamiętać, że przygotowanie asynchroniczne nie jest dozwolone w przypadku SHUTDOWN_PREPARE . Zanim DEEP_SLEEP_ENTRY zostanie wysłany do VHAL, CPMS okresowo wysyła do VHAL żądania odroczenia wyłączenia.

Kiedy wszystkie obiekty CPM zakończą przygotowania do zamknięcia, CPMS wysyła AP_POWER_STATE_REPORT do VHAL, który następnie powiadamia VMCU, że punkt dostępowy jest gotowy do zawieszenia. CPMS wywołuje również swoją metodę zawieszenia, która zawiesza jądro.

Opisaną powyżej sekwencję zilustrowano poniżej:

Wejdź w głęboki sen

Rysunek 3. Wejdź w głęboki sen.

Interfejsy programistyczne dostarczane przez CPM

W tej sekcji opisano interfejs API języka Java udostępniany przez moduł CPM dla aplikacji i usług systemowych. Dzięki temu interfejsowi API oprogramowanie systemowe może:

  • Monitoruj zmiany stanu zasilania w punkcie dostępowym.
  • Zastosuj zasady zasilania.

Wykonaj poniższe kroki, aby wywołać interfejsy API udostępniane przez CPM:

  1. Aby uzyskać instancję CPM, wywołaj Car API.
  2. Wywołaj odpowiednią metodę na obiekcie utworzonym w kroku 1.

Utwórz obiekt CarPowerManager

Aby utworzyć obiekt CPM, wywołaj metodę getCarManager() obiektu Car. Metoda ta jest fasadą służącą do tworzenia obiektów CPM. Podaj android.car.Car.POWER_SERVICE jako argument, aby utworzyć obiekt CPM.

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

CarPowerStateListener i rejestracja

Aplikacje i usługi systemowe mogą odbierać powiadomienia o zmianie stanu zasilania poprzez implementację CarPowerManager.CarPowerStateListener . Interfejs ten definiuje jedną metodę onStateChanged() , która jest funkcją wywołania zwrotnego wywoływaną w przypadku zmiany stanu zasilania CPMS. Poniższy przykład definiuje nową anonimową klasę, która implementuje interfejs:

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

Aby poinstruować ten obiekt nasłuchiwania, aby monitorował zmianę stanu zasilania, utwórz nowy wątek wykonawczy i zarejestruj słuchacz i ten wątek w obiekcie CPM:

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

Po zmianie stanu zasilania wywoływana jest metoda onStateChanged() obiektu nasłuchującego z wartością reprezentującą nowy stan zasilania. Związek między wartością rzeczywistą a stanem zasilania jest zdefiniowany w CarPowerManager i pokazany w poniższej tabeli:

Nazwa Opis
STATE_ON Wprowadź stan włączenia. System jest w pełni sprawny.
STATE_SHUTDOWN_CANCELLED Wyłączenie zostaje anulowane, a stan zasilania powraca do normalnego stanu.
STATE_SHUTDOWN_ENTER oczekuje się, że aplikacje zostaną oczyszczone i będą gotowe do zamknięcia.
STATE_POST_SHUTDOWN_ENTER Przygotowania do zamknięcia zostały zakończone i VMCU jest gotowe do zamknięcia. Wejdź w stan wyłączenia.
STATE_PRE_SHUTDOWN_PREPARE Zażądano procesu zamykania, ale CPMS jeszcze go nie rozpoczyna. Wyświetlacz i dźwięk są nadal włączone
STATE_SHUTDOWN_PREPARE W tym okresie może działać tryb garażowy.
STATE_SUSPEND_ENTER oczekuje się, że aplikacje zostaną wyczyszczone i będą gotowe do zawieszenia w pamięci RAM.
STATE_POST_SUSPEND_ENTER Przygotowania do zawieszenia w pamięci RAM zostały zakończone i VMCU jest gotowe do zawieszenia w pamięci RAM. Wejdź w stan zawieszenia.
STATE_SUSPEND_EXIT Obudź się po zawieszeniu lub wznów po anulowanym zawieszeniu.
STATE_HIBERNATION_ENTER oczekuje się, że aplikacje wyczyszczą się i będą gotowe do hibernacji.
STATE_POST_HIBERNATION_ENTER Przygotowania do hibernacji zostały zakończone i VMCU jest gotowe do hibernacji. Przejdź do stanu hibernacji.
STATE_HIBERNATION_EXIT Wybudź się ze stanu hibernacji lub wznów po anulowanej hibernacji.
STATE_WAIT_FOR_VHAL System uruchamia się, ale czeka na nawiązanie komunikacji z VHAL przed przejściem do stanu WŁĄCZONEGO.

Wyrejestrowanie CarPowerStateListener

Aby wyrejestrować wszystkie obiekty słuchacza zarejestrowane w CPM, wywołaj metodę clearListener :

powerManager.clearListener();

Integracja systemu na Twoim wdrożeniu Android

Integratorzy są odpowiedzialni za następujące elementy:

  • Implementacja interfejsu jądra do zawieszania systemu Android.
  • Implementacja funkcji VHAL w celu:
    • Propaguj inicjację zawieszenia lub wyłączenia z samochodu na Androida.
    • Wyślij wiadomość o gotowości do wyłączenia z Androida do samochodu.
    • Zainicjuj zamykanie lub zawieszanie systemu Android poprzez interfejs jądra Linuksa.
  • Upewnij się, że wszystkie źródła aktywacji są wyłączone, gdy urządzenie znajduje się w stanie zawieszenia.
  • Upewnij się, że aplikacje zamykają się wystarczająco szybko, aby nie opóźniać procesu zamykania w nieskończoność.
  • Upewnij się, że BSP włącza (lub wyłącza) komponenty urządzenia zgodnie z polityką zasilania, aby nie blokować zawieszenia lub hibernacji

Interfejs jądra: /sys/power/state

AAOS przełącza urządzenie w tryb wstrzymania, gdy aplikacja lub usługa zapisuje mem w celu zawieszenia w pamięci RAM lub disk w celu zawieszenia na dysku w pliku znajdującym się w /sys/power/state . Integrator musi udostępnić funkcję monitorującą ten plik i wprowadzającą Linuksa w stan zawieszenia zasilania. Ta funkcja może wysłać GPIO do VMCU, aby powiadomić VMCU, że urządzenie zostało całkowicie wyłączone. Integrator jest także odpowiedzialny za usuwanie wszelkich sytuacji wyścigowych pomiędzy wysłaniem przez VHAL końcowego komunikatu do VMCU a przejściem systemu w tryb zawieszenia lub zamknięcia.

Odpowiedzialność VHAL

VHAL zapewnia interfejs pomiędzy siecią pojazdu a systemem Android. VHAL:

  • Propaguje inicjację zawieszenia lub wyłączenia z samochodu na Androida.
  • Wysyła wiadomość o gotowości do wyłączenia z systemu Android do samochodu.
  • Inicjuje zamknięcie lub zawieszenie systemu Android poprzez interfejs jądra Linuksa.

Kiedy CPMS informuje VHAL, że jest gotowy do wyłączenia, VHAL wysyła komunikat o gotowości do wyłączenia do VMCU. Zazwyczaj wbudowane w układ urządzenia peryferyjne, takie jak UART, SPI i USB, przesyłają komunikat. Po wysłaniu wiadomości CPMS wywołuje polecenie jądra, aby zawiesić lub wyłączyć urządzenie. Przed wykonaniem tej czynności VHAL lub BSP może przełączyć GPIO, aby poinstruować VMCU, że można bezpiecznie odłączyć zasilanie od urządzenia.

VHAL musi obsługiwać następujące właściwości, które kontrolują zarządzanie energią poprzez VHAL:

Nazwa Opis
AP_POWER_STATE_REPORT Raporty systemu Android dotyczące stanu przejść do VMCU z tą właściwością przy użyciu wartości wyliczeniowych VehicleApPowerStateReport.
AP_POWER_STATE_REQ VMCU używa tej właściwości, aby instruować system Android, aby przeszedł do różnych stanów zasilania, używając wartości wyliczeniowych VehicleApPowerStateReq.

AP_POWER_STATE_REPORT

Użyj tej właściwości, aby zgłosić bieżący stan zarządzania energią systemu Android. Właściwość ta zawiera dwie liczby całkowite:

  • int32Values[0] : VehicleApPowerStateReport wyliczenie bieżącego stanu.
  • int32Values[1] : Czas w milisekundach do odroczenia, uśpienia lub zamknięcia. Znaczenie tej wartości zależy od pierwszej wartości.

Pierwsza wartość może przyjmować jedną z następujących wartości. VehicleApPowerStateReport.aidl zawiera bardziej szczegółowe opisy, które są przechowywane w pliku hardware/interfaces/automotive/vehicle/aidl/android/hardware/automotive/vehicle .

Nazwa wartości Opis Druga wartość
WAIT_FOR_VHAL AP uruchamia się i musi nawiązać komunikację z VHAL.
DEEP_SLEEP_ENTRY AP wchodzi w stan głębokiego uśpienia. VMCU powinno ponownie włączyć AP po czasie określonym w drugiej wartości. Należy ustawić
DEEP_SLEEP_EXIT AP wychodzi ze stanu głębokiego uśpienia.
HIBERNATION_ENTRY AP wchodzi w stan hibernacji. VMCU powinno ponownie włączyć AP po czasie określonym w drugiej wartości. Należy ustawić
HIBERNATION_EXIT AP wychodzi ze stanu hibernacji.
WYŁĄCZENIE_POSTPONE Android nie jest gotowy do wyłączenia. VMCU powinno odczekać czas określony w drugiej wartości przed wyłączeniem punktu dostępowego. Android może poprosić o dodatkowe odroczenie, wydając dodatkowe raporty SHUTDOWN_POSTPONE. Należy ustawić
WYŁĄCZENIE_PREPARE Android przygotowuje się do wyłączenia. Należy ustawić
WYŁĄCZ_START AP jest gotowy do zamknięcia. VMCU powinno ponownie włączyć AP po czasie określonym w drugiej wartości. (VMCU nie jest wymagane do obsługi funkcji włączania czasowego.) Należy ustawić
WYŁĄCZENIE_ANULOWANE Android przestaje przygotowywać się do zamknięcia i przejdzie do WAIT_FOR_VHAL.
NA Android działa normalnie.

Stan można ustawić autonomicznie lub w odpowiedzi na żądanie za pośrednictwem VMCU.

AP_POWER_STATE_REQ

Ta właściwość jest wysyłana przez VMCU w celu przejścia systemu Android do innego stanu zasilania i zawiera dwie liczby całkowite:

  • int32Values[0] : wartość wyliczeniowa VehicleApPowerStateReq , która reprezentuje nowy stan, do którego należy przejść.
  • int32Values[1] : Wartość wyliczeniowa VehicleApPowerStateShutdownParam . Ta wartość jest wysyłana tylko w przypadku komunikatu SHUTDOWN_PREPARE i przesyła do systemu Android zawarte w nim opcje.

Pierwsza wartość całkowita reprezentuje nowy stan, do którego ma przejść Android. Semantyka jest zdefiniowana w VehicleApPowerStateReq.aidl i podana poniżej:

Nazwa wartości Opis
NA AP powinien rozpocząć pełną pracę.
WYŁĄCZENIE_PREPARE Punkt dostępowy powinien przygotować się do zamknięcia. Druga wartość wskazuje, czy punkt dostępowy może odłożyć zamknięcie i czy powinien spodziewać się wyłączenia lub przejścia w tryb głębokiego uśpienia.
ANULUJ_ZAMYKANIE Punkt dostępowy powinien przestać przygotowywać się do zamknięcia i przygotować się do włączenia.
SKOŃCZONE Punkt dostępowy zostanie teraz wyłączony lub zawieszony.

VehicleApPowerStateShutdownParam jest zdefiniowany w VehicleApPowerStateShutdownParam.aidl . To wyliczenie zawiera następujące elementy:

Nazwa wartości Opis
MÓC SPAĆ Punkt dostępowy może przejść w tryb głębokiego uśpienia, zamiast całkowicie się wyłączać. Opóźnienie jest dozwolone.
CAN_HIBERNATE Punkt dostępowy może przejść w stan hibernacji zamiast całkowicie się wyłączyć. Opóźnienie jest dozwolone.
TYLKO WYŁĄCZENIE AP powinien się wyłączyć. Opóźnienie jest dozwolone. Głęboki sen nie jest dozwolony.
SPAĆ_NATYCHMIAST Punkt dostępowy może przejść w stan głębokiego uśpienia, ale musi albo zostać uśpiony, albo natychmiast się wyłączyć. Opóźnianie jest niedopuszczalne.
Hibernacja_natychmiast Punkt dostępowy może przejść w tryb wstrzymania na dysk, ale musi albo przejść w stan hibernacji, albo natychmiast się wyłączyć. Opóźnianie jest niedopuszczalne.
NATYCHMIAST WYŁĄCZ AP musi zostać natychmiast wyłączony. Opóźnianie jest niedozwolone. Głęboki sen nie jest dozwolony.

Źródła obudzenia

Integrator musi wyłączyć odpowiednie źródła wybudzenia, gdy urządzenie znajduje się w trybie zawieszenia. Typowe źródła wybudzenia obejmują uderzenia serca, modem, Wi-Fi i Bluetooth. Jedynym prawidłowym źródłem wybudzenia musi być przerwanie z VMCU, aby obudzić SoC. Zakłada się, że VMCU może nasłuchiwać modemu w poszukiwaniu zdarzeń zdalnego wybudzenia (takich jak zdalne uruchomienie silnika). Jeśli ta funkcja zostanie przekazana do punktu dostępowego, należy dodać kolejne źródło wybudzenia do obsługi modemu.

Aplikacje

Producenci OEM muszą uważać przy pisaniu aplikacji, aby można je było szybko zamknąć i nie odkładać procesu na czas nieokreślony.

Załącznik

Katalogi w drzewie kodu źródłowego

Treść Informator
Kod związany z CarPowerManager. packages/services/Car/car-lib/src/android/car/hardware/power
CarPowerManagementService i tak dalej. packages/services/Car/service/src/com/android/car/power
Usługi zajmujące się VHAL, takie jak VehicleHal i HAlClient . packages/services/Car/service/src/com/android/car/hal
Interfejs VHAL i definicje właściwości. hardware/interfaces/automotive/vehicle/aidl/android/hardware/automotive/vehicle/
Przykładowa aplikacja dająca pewne wyobrażenie o CarPowerManager packages/services/Car/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink

Schemat klas

Ten diagram klas przedstawia klasy i interfejsy Java w systemie zarządzania energią:

Schemat klas mocy

Rysunek 4. Schemat klas mocy.

Relacja przedmiotowa

Rysunek 5 pokazuje, które obiekty mają odniesienia do innych obiektów. Krawędź oznacza, że ​​obiekt źródłowy zawiera odniesienie do obiektu docelowego. Na przykład VehicleHAL ma odniesienie do obiektu PropertyHalService.

Schemat odniesienia obiektu

Rysunek 5. Schemat odniesienia obiektu.