Zarządzanie zasilaniem

Aby obsługiwać zarządzanie energią w poszczególnych pojazdach, Android udostępnia usługę CarPowerManagementService i interfejs CarPowerManager.

Przejścia między stanami są wywoływane przez główny moduł sterujący pojazdu (VMCU). Aby komunikować się z VMCU, integratorzy muszą zaimplementować kilka komponentów. Integratorzy są odpowiedzialni za integrację z poziomem abstrakcji sprzętowej pojazdu (VHAL) i implementacją jądra. Integratorzy są też odpowiedzialni za wyłączenie źródeł aktywacji i zadbanie o to, aby wyłączenia nie były odkładane w nieskończoność.

Terminologia

W tym dokumencie używamy tych terminów:

procesor aplikacji (AP)
Należy do układu SOC.
Pakiet pomocy platformy (BSP)
Warstwa oprogramowania zawierająca firmware rozruchowy i sterowniki urządzeń przeznaczone do konkretnego sprzętu, które umożliwiają działanie wbudowanego systemu operacyjnego w danym środowisku sprzętowym (płycie głównej), zintegrowane z wbudowanym systemem operacyjnym.
CarPowerManager (CPM)
Wyświetla interfejs API, który pozwala aplikacjom rejestrować zmiany stanu zasilania.
CarPowerManagementService (CPMS)
Wdraża maszynę stanu zasilania samochodu, interfejs VHAL i wykonuje ostatnie wywołania do suspend()shutdown().
CarPowerPolicyDaemon (CPPD)
Wyświetla interfejsy AIDL dla procesów natywnych, aby zarejestrować odbiornik zasad zasilania.
wejście lub wyjście ogólnego przeznaczenia (GPIO)
Przycisk sygnału cyfrowego do ogólnego użytku.
warstwa abstrakcji sprzętowej (HAL);
Warstwa oprogramowania, z którą muszą współpracować wszystkie moduły wyższego poziomu, aby uzyskać dostęp do funkcji sprzętowych.
hibernacja
Nazywana też zawieszeniem na dysku (S2D/S4). SoC przechodzi w tryb zasilania S4 (hibernacja), a zawartość pamięci RAM jest zapisywana na nośnikach nieulotnych (np. na dysku flash lub dysku twardym). Cały system jest wyłączony.
procesor multimediów (MP)
 Zobacz układ SOC.
układ scalony do zarządzania zasilaniem (PMIC)
Układ scalony służący do zarządzania wymaganiami dotyczącymi zasilania systemu hosta.
układ SOC
Główny procesor, na którym działa system AAOS, zwykle dostarczany przez producentów takich jak Intel, MediaTek, Nvidia, Qualcomm, Renesas i Texas Instruments.
zawiesić
Nazywana też zawieszeniem do pamięci RAM (S2R lub STR). Układ SoC przechodzi w tryb zasilania S3, a procesor jest wyłączany, podczas gdy pamięć RAM pozostaje włączona.
Interfejs HAL pojazdu (VHAL)
Interfejs API Androida używany do komunikacji z siecią pojazdu. Za tworzenie tego modułu odpowiada partner poziomu 1 lub OEM. Sieć pojazdu może używać dowolnej warstwy fizycznej (np. CAN, LIN, MOST i Ethernet). VHAL abstrakcyjnie opisuje tę sieć pojazdu, aby umożliwić AAOS interakcję z pojazdem.
Procesor interfejsu pojazdu (VIP)
Zobacz MCU pojazdu.
Główny moduł sterujący pojazdu (VMCU)
Mikrokontroler, który zapewnia interfejs między siecią pojazdu a procesorem SoC. Procesor SoC komunikuje się z mikrokontrolerem VMCU za pomocą sygnałów USB, UART, SPI i GPIO.

Projekt systemu

Z tej sekcji dowiesz się, jak AAOS reprezentuje stan zasilania procesora aplikacji i które moduły implementują system zarządzania zasilaniem. Materiał ten opisuje też, jak te moduły współpracują ze sobą i jak zazwyczaj przebiegają przejścia między stanami.

Automatyczny stan zasilania samochodu

AAOS używa maszyny stanów do reprezentowania stanu zasilania punktu dostępu. Maszyna stanów udostępnia stany przedstawione poniżej:

Automatyczny stan zasilania samochodu

Rysunek 1. Automatyczny stan zasilania samochodu.

Najczęstsze przejścia są wyróżnione na niebiesko. Oto stany i typowe przejścia:

  • Zawieszanie w pamięci RAM. Samochód i system SoC są wyłączone. Nie jest wykonywany żaden kod. Zasilanie pamięci SoC jest utrzymywane.
  • Poczekaj na VHAL. Gdy kierowca wejdzie w interakcję z pojazdem, na przykład otwierając drzwi, VMCU zasila SoC. AAOS wznawia działanie z trybu zawieszenia do pamięci RAM i przechodzi w tryb oczekiwania na VHAL, gdzie oczekuje na koordynację z VHAL.
  • Włączone VHAL informuje AAOS, aby przeszedł w stan włączony. W tym stanie AAOS działa w pełni i współdziała z kierowcą.
  • Przygotowanie do wyłączenia. Gdy kierowca skończy jazdę, VHAL każe AAOS przejść w tryb przygotowania do wyłączenia. W tym stanie wyświetlacz i dźwięk są wyłączone, a AAOS nie wchodzi w interakcje z kierowcą. System Android nadal działa i możesz aktualizować aplikacje oraz system Android. Po zakończeniu aktualizacji (jeśli były dostępne) system Android przechodzi w stan oczekiwania na zakończenie VHAL.
  • Zaczekaj na zakończenie procesu VHAL. W tym momencie AAOS informuje VHAL, że jest gotowy do wyłączenia. VMCU ma przełączyć SoC w tryb głębokiego uśpienia i odłączyć zasilanie od procesora aplikacji. AAOS jest wtedy w stanie zawieszenia w pamięci RAM, ale żaden kod nie jest wykonywany.

Moduły zarządzania zasilaniem

System zarządzania zasilaniem składa się z tych modułów:

Nazwa modułu Opis
CarPowerManager Java lub C++ API.
CarPowerManagementService Koordynuje przejścia między stanami zasilania.
CarPowerPolicyDaemon Komunikacja z klientami wbudowanych zasad dotyczących zasilania.
Interfejs HAL pojazdu Interfejs VMCU.
Bąbelki Zawieszanie do pamięci RAM lub dysku.

Funkcja głębokiego uśpienia/uśpienia (zawieszanie Androida w pamięci RAM lub na dysku) jest implementowana w jądrze. Ta funkcja jest dostępna w przestrzeni użytkownika jako specjalny plik znajdujący się w /sys/power/state. AAOS jest zawieszony przez zapisanie mem lub diskdo tego pliku.

CPMS koordynuje stan zasilania z innymi usługami i HAL. CPMS implementuje opisaną powyżej maszynę stanów i wysyła powiadomienia do każdego obserwatora, gdy nastąpi przejście do stanu zasilania. Ta usługa używa też VHAL do wysyłania wiadomości do sprzętu.

CPPD zarządza zasadą dotyczącą zasilania, dopóki nie przejmie kontroli CPMS. Wysyła też powiadomienia o zmianach zasad dotyczących zasilania do natywnych odbiorców.

Niektóre właściwości są definiowane w VHAL. Aby komunikować się z VMCU, CPMS odczytuje i zapisuje te właściwości. Aplikacje mogą używać interfejsu zdefiniowanego w CPMS do monitorowania zmian stanu zasilania. Interfejs ten umożliwia też aplikacjom rejestrowanie odbiorwców zasad zasilania. Interfejs API może być wywoływany z języka Java i jest opatrzony adnotacją @hide / @System API, co oznacza, że jest dostępny tylko dla aplikacji uprzywilejowanych. Powiązania między tymi modułami, aplikacjami i usługami przedstawia poniższy rysunek:

Schemat elementów zasilania

Rysunek 2. Schemat przedstawiający komponenty zasilania.

Sekwencja wiadomości

W poprzedniej sekcji opisano moduły, z których składa się system zarządzania zasilaniem. W tej sekcji na przykładzie wejścia w stan głębokiego uśpieniawyjścia z tego stanu wyjaśniamy, jak komunikują się moduły i aplikacje:

Wejście w sen głęboki

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

CPM pośredniczy między aplikacjami/usługami a CPMS. Metoda onStateChanged() aplikacji lub usług jest wywoływana synchronicznie w metodzie onStateChanged() CPM. Większość aplikacji i usług musi zakończyć proces przygotowywania przed powrotem z tej rozmowy. Usługi z przywilejami mogą kontynuować asynchroniczne przygotowywanie się po powrocie do PRE_SHUTDOWN_PREPARE, SUSPEND_ENTERPOST_SUSPEND_ENTER. W tym przypadku usługa uprzywilejowana powinna wywołać complete() na przekazanym obiekcie CompletablePowerStateChangeFuture, gdy zakończy przygotowanie. Pamiętaj, że asynchroniczne przygotowywanie nie jest dozwolone w przypadku SHUTDOWN_PREPARE. Zanim DEEP_SLEEP_ENTRY zostanie wysłany do VHAL, CPMS okresowo wysyła do niego prośby o opóźnienie wyłączenia.

Gdy wszystkie obiekty CPM zakończą przygotowania do wyłączenia, CPMS wyśle AP_POWER_STATE_REPORT do VHAL, który powiadomi VMCU, że AP jest gotowy do zawieszenia. CPMS wywołuje też metodę zawieszania, która zawiesza jądro.

Powyższą sekwencję ilustruje poniższy obrazek:

Wejście w sen głęboki

Rysunek 3. wejść w stan snu głębokiego.

Interfejsy programowania udostępniane przez CPM

W tej sekcji opisano interfejs Java API udostępniany przez CPM na potrzeby aplikacji i usług systemowych. Ten interfejs API umożliwia oprogramowaniu systemowemu:

  • Monitorowanie zmian stanu zasilania w przełączniku.
  • Stosowanie zasad dotyczących zasilania.

Aby wywołać interfejsy API udostępniane przez CPM:

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

Tworzenie obiektu CarPowerManager

Aby utworzyć obiekt CPM, wywołaj metodę getCarManager() obiektu Car. Ta metoda to fasada służąca do tworzenia obiektów CPM. Aby utworzyć obiekt CPM, jako argument podaj wartość android.car.Car.POWER_SERVICE.

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

CarPowerStateListener i rejestracja

Aplikacje i usługi systemowe mogą otrzymywać powiadomienia o zmianie stanu zasilania, jeśli wdrożą CarPowerManager.CarPowerStateListener. Ten interfejs definiuje jedną metodę onStateChanged(), która jest funkcją wywołania zwrotnego wywoływaną po zmianie stanu zasilania CPMS. W tym przykładzie definiujemy 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 polecić obiektowi listener monitorowanie przejścia do stanu zasilania, utwórz nowy wątek wykonania i zarejestruj obiekt listener oraz ten wątek w obiekcie CPM:

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

Gdy stan zasilania się zmieni, metoda onStateChanged() obiektu listener zostanie wywołana z wartością reprezentującą nowy stan zasilania. Powiązanie między rzeczywistą wartością a stanem zasilania jest zdefiniowane w elementach CarPowerManager i wyświetlane w tej tabeli:

Nazwa Opis
STATE_ON Wpisz stan włączenia. System jest w pełni sprawny.
STATE_SHUTDOWN_CANCELLED Wyłączenie jest anulowane, a stan zasilania wraca do normalnego.
STATE_SHUTDOWN_ENTER Aplikacje powinny się porządkować i być gotowe do wyłączenia.
STATE_POST_SHUTDOWN_ENTER Przygotowania do wyłączenia zostały zakończone, a VMCU jest gotowy do wyłączenia. Wpisz stan wyłączenia.
STATE_PRE_SHUTDOWN_PREPARE Proces zamykania został żądany, ale CPMS nie rozpoczął jeszcze tego procesu. Wyświetlacz i dźwięk są nadal włączone
STATE_SHUTDOWN_PREPARE W tym czasie może działać tryb garażu.
STATE_SUSPEND_ENTER Aplikacje powinny być gotowe do zawieszenia w pamięci RAM.
STATE_POST_SUSPEND_ENTER Przygotowania do zawieszenia do pamięci RAM zostały zakończone, a VMCU jest gotowy do zawieszenia do pamięci RAM. Wpisz stan zawieszenia.
STATE_SUSPEND_EXIT Wznawianie pracy po zawieszeniu lub wznowienie zawieszenia anulowanego.
STATE_HIBERNATION_ENTER Aplikacje powinny się wyczyścić i być gotowe do hibernacji.
STATE_POST_HIBERNATION_ENTER Przygotowania do hibernacji zostały zakończone, a VMCU jest gotowy do hibernacji. Wchodzenie w stan hibernacji.
STATE_HIBERNATION_EXIT Wybudzanie z hibernacji lub wznawianie po anulowaniu hibernacji.
STATE_WAIT_FOR_VHAL System uruchamia się, ale czeka na nawiązanie komunikacji z VHAL, zanim przejdzie do stanu włączenia.

Odrejestrowanie CarPowerStateListener

Aby anulować rejestrację wszystkich obiektów listenera zarejestrowanych w CPM, wywołaj metodę clearListener:

powerManager.clearListener();

Integracja z systemem w implementacji na Androida

Integratorzy są odpowiedzialni za:

  • Wdrożenie interfejsu jądra do zawieszania Androida.
  • Wdrażanie funkcji VHAL:
    • Przekazywanie informacji o wprowadzeniu w stan zawieszenia lub wyłączeniu z samochodu do urządzenia z Androidem.
    • Wyślij wiadomość o gotowości do wyłączenia z Androida do samochodu.
    • Rozpoczęcie wyłączania lub zawieszania Androida przez interfejs jądra Linuksa.
  • Upewnij się, że wszystkie źródła aktywacji są wyłączone, gdy urządzenie jest w trybie zawieszenia.
  • Upewnij się, że aplikacje są zamykane na tyle szybko, aby nie odkładać procesu zamykania na czas nieokreślony.
  • Upewnij się, że BSP włącza (lub wyłącza) komponenty urządzenia zgodnie z zasadami dotyczącymi zasilania, aby nie blokować zawieszania ani hibernacji.

Interfejs jądra: /sys/power/state

AAOS przełącza urządzenie w tryb zawieszenia, gdy aplikacja lub usługa zapisuje mem (zawieszanie do pamięci RAM) lub disk (zawieszanie do dysku) do pliku znajdującego się w /sys/power/state. Integrator musi udostępnić funkcję, która monitoruje ten plik i przełącza system Linux w stan zawieszenia zasilania. Ta funkcja może wysłać sygnał GPIO do VMCU, aby powiadomić VMCU, że urządzenie zostało całkowicie wyłączone. Integrator jest też odpowiedzialny za usunięcie wszelkich warunków wyścigu między wysłaniem przez VHAL ostatniej wiadomości do VMCU a przejściem systemu w tryb zawieszenia lub wyłączenia.

Odpowiedzialność VHAL

VHAL zapewnia interfejs między siecią pojazdu a Androidem. VHAL:

  • Przekazuje informacje o włączeniu zawieszenia lub wyłączenia z samochodu do urządzenia z Androidem.
  • Wysyła wiadomość o gotowości do wyłączenia z Androida do samochodu.
  • Uruchamia wyłączenie lub zawieszenie Androida za pomocą interfejsu jądra Linuksa.

Gdy CPMS informuje VHAL, że jest gotowy do wyłączenia, wysyła do VMCU wiadomość o gotowości do wyłączenia. Zwykle wiadomości przesyłają urządzenia peryferyjne na chipie, takie jak UART, SPI i USB. Po wysłaniu wiadomości CPMS wywołuje polecenie jądra, aby zawiesić lub wyłączyć urządzenie. Zanim to zrobi, VHAL lub BSP może przełączyć GPIO, aby poinformować VMCU, że można bezpiecznie odłączyć zasilanie od urządzenia.

VHAL musi obsługiwać te właściwości, które kontrolują zarządzanie zasilaniem za pomocą VHAL:

Nazwa Opis
AP_POWER_STATE_REPORT Android zgłasza przejścia stanu do VMCU za pomocą tej właściwości, używając wartości wyliczonych VehicleApPowerStateReport.
AP_POWER_STATE_REQ VMCU używa tej właściwości, aby wydawać Androidowi polecenia przejścia do różnych stanów zasilania za pomocą wartości wyliczeniowych VehicleApPowerStateReq.

AP_POWER_STATE_REPORT

Użyj tej właściwości, aby zgłaszać bieżący stan zarządzania energią w Androidzie. Ta usługa zawiera 2 liczby całkowite:

  • int32Values[0]: wyliczenie VehicleApPowerStateReport bieżącego stanu.
  • int32Values[1]: czas w milisekundach, przez który ma być opóźnione uśpienie lub wyłączenie. Jej znaczenie zależy od pierwszej wartości.

Pierwsza wartość może mieć jedną z tych wartości. VehicleApPowerStateReport.aidlzawiera 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 przechodzi w stan snu głębokiego. VMCU powinien włączyć AP po upływie czasu określonego w drugiej wartości. Musi być ustawiony
DEEP_SLEEP_EXIT AP wychodzi ze stanu snu głębokiego.
HIBERNATION_ENTRY AP przechodzi w stan hibernacji. VMCU powinien włączyć AP po upływie czasu określonego w drugiej wartości. Musi być ustawiony
HIBERNATION_EXIT AP wychodzi ze stanu hibernacji.
SHUTDOWN_POSTPONE Android nie jest gotowy do wyłączenia. Przed wyłączeniem AP VMCU powinien odczekać czas określony w drugiej wartości. Android może poprosić o dodatkowe przesunięcie, przesyłając dodatkowe raporty SHUTDOWN_POSTPONE. Musi być ustawiony
SHUTDOWN_PREPARE Android przygotowuje się do wyłączenia. Musi być ustawiony
SHUTDOWN_START AP jest gotowy do wyłączenia. VMCU powinien włączyć AP po upływie czasu określonego w drugiej wartości. (VMCU nie jest wymagany do obsługi funkcji włączania z opóźnieniem). Musi być ustawiony
SHUTDOWN_CANCELLED Android przestaje przygotowywać się do wyłączenia i przechodzi do WAIT_FOR_VHAL.
WŁ. Android działa normalnie.

Stan może być ustawiany autonomicznie lub w odpowiedzi na żądanie za pomocą VMCU.

AP_POWER_STATE_REQ

Ta właściwość jest wysyłana przez VMCU, aby przełączyć Androida w inny stan zasilania. Zawiera ona 2 liczby całkowite:

  • int32Values[0]: VehicleApPowerStateReq wartość typu wyliczonego, która reprezentuje nowy stan, do którego ma nastąpić przejście.
  • int32Values[1]: wartość wyliczeniowa VehicleApPowerStateShutdownParam. Ta wartość jest wysyłana tylko w przypadku wiadomości SHUTDOWN_PREPARE i przekazuje do Androida opcje, które zawiera.

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

Nazwa wartości Opis
WŁ. AP powinien zacząć działać w pełni.
SHUTDOWN_PREPARE Punkt dostępu powinien się przygotować do wyłączenia. Druga wartość wskazuje, czy AP może opóźnić wyłączenie i czy AP ma się wyłączyć czy przejść w stan głębokiego uśpienia.
CANCEL_SHUTDOWN Punkt dostępu powinien przestać się przygotowywać do wyłączenia i przygotować się do włączenia.
ZAKOŃCZ Punkt dostępu zostanie teraz wyłączony lub zawieszony.

Wartość VehicleApPowerStateShutdownParam jest zdefiniowana w VehicleApPowerStateShutdownParam.aidl. Ta enumeracja zawiera te elementy:

Nazwa wartości Opis
CAN_SLEEP AP może przejść w stan głębokiego uśpienia zamiast całkowicie się wyłączyć. Przesunięcie jest dozwolone.
CAN_HIBERNATE AP może przejść w tryb hibernacji zamiast całkowicie się wyłączyć. Przesunięcie jest dozwolone.
SHUTDOWN_ONLY Punkt dostępu powinien się wyłączyć. Przesunięcie jest dozwolone. Sen głęboki jest niedozwolony.
SLEEP_IMMEDIATELY AP może przejść w stan głębokiego uśpienia, ale musi natychmiast przejść w stan uśpienia lub wyłączyć się. Przesuwanie terminu jest niedozwolone.
HIBERNATE_IMMEDIATELY AP może przejść w tryb zawieszenia na dysku, ale musi natychmiast przejść w tryb hibernacji lub wyłączyć się. Przesuwanie terminu jest niedozwolone.
SHUTDOWN_IMMEDIATELY Punkt dostępu musi zostać natychmiast wyłączony. Przesuwanie terminu jest niedozwolone. Sen głęboki jest niedozwolony.

Źródła pobudki

Gdy urządzenie jest w trybie zawieszenia, integrator musi wyłączyć odpowiednie źródła wybudzania. Typowe źródła pobudki to m.in. bicie serca, modem, Wi-Fi i Bluetooth. Jedynym prawidłowym źródłem przebudzenia musi być przerwanie z VMCU, aby obudzić SoC. Zakłada się, że VMCU może odbierać sygnały z modemu na potrzeby zdalnego przebudzenia (np. zdalnego uruchamiania silnika). Jeśli ta funkcja zostanie przesłana do AP, należy dodać inny źródło aktywacji, aby obsługiwać modem.

Aplikacje

Producenci OEM muszą napisać aplikacje w taki sposób, aby można je było szybko wyłączyć, a nie odkładać tego procesu na czas nieokreślony.

Dodatek

Katalogi w drzewie kodu źródłowego

Treść Katalog
Kod związany z CarPowerManager. packages/services/Car/car-lib/src/android/car/hardware/power
CarPowerManagementService itd. packages/services/Car/service/src/com/android/car/power
Usługi związane z VHAL, takie jak VehicleHalHAlClient. 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, która może być dla Ciebie inspiracją CarPowerManager packages/services/Car/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink

Diagram klasy

Ten diagram klas pokazuje klasy i interfejsy Java w systemie zarządzania zasilaniem:

Schemat klasy mocy

Rysunek 4. Schemat klasy mocy

Relacje obiektów

Rysunek 5 pokazuje, które obiekty zawierają odwołania do innych obiektów. Krawędzia oznacza, że obiekt źródłowy zawiera odwołanie do obiektu docelowego. Na przykład interfejs VehicleHAL zawiera odwołanie do obiektu PropertyHalService.

Schemat odniesienia obiektu

Rysunek 5. Schemat odniesienia obiektu