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:
suspend()
i shutdown()
.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:
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 disk
do 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:
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śpienia i wyjś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_ENTER
i POST_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:
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:
- Aby uzyskać instancję CPM, wywołaj interfejs Car API.
- 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.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 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ść wyliczeniowaVehicleApPowerStateShutdownParam
. Ta wartość jest wysyłana tylko w przypadku wiadomościSHUTDOWN_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 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, 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:
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.
Rysunek 5. Schemat odniesienia obiektu