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:
suspend()
i shutdown()
.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:
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:
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:
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:
- Aby uzyskać instancję CPM, wywołaj Car API.
- 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ść wyliczeniowaVehicleApPowerStateReq
, która reprezentuje nowy stan, do którego należy przejść. -
int32Values[1]
: Wartość wyliczeniowaVehicleApPowerStateShutdownParam
. Ta wartość jest wysyłana tylko w przypadku komunikatuSHUTDOWN_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ą:
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.
Rysunek 5. Schemat odniesienia obiektu.