Aby zarządzać zasilaniem w pojeździe, Android udostępnia
CarPowerManagementService
i
interfejsu CarPowerManager
.
Przełączenia stanu są aktywowane przez główną jednostkę sterującą pojazdu (VMCU). Aby komunikować się z w VMCU, integratorzy muszą wdrożyć kilka komponentów. Integrator jest odpowiedzialny za integrację z użyciem warstwy abstrakcji sprzętu w pojazdach (VHAL) i implementacji jądra systemu operacyjnego. Integratorzy są odpowiada także za wyłączanie źródeł wybudzania i zagwarantowanie, że wyłączenie będzie opóźnione. bez ograniczeń czasowych.
Terminologia
W tym dokumencie są używane następujące terminy:
suspend()
i shutdown()
.Projekt systemu
W tej sekcji opisano, jak AAOS reprezentuje stan zasilania procesora aplikacji i które moduły implementują system zarządzania energią. W tym materiale opisano również sposób działania tych modułów oraz jak zwykle zachodzą przemiany stanów.
Urządzenie stanu zasilania samochodu
AAOS używa maszyny stanowej do reprezentowania stanu zasilania punktu dostępu. Stan maszyna udostępnia stany pokazane poniżej:
Rysunek 1. Urządzenie stanu zasilania samochodu.
Najczęściej używane przejścia są zaznaczone na niebiesko. Oto stany i wspólne przejścia:
- Zawieś w pamięci RAM. Pojazd i układ SOC są wyłączone. Żaden kod nie jest wykonywany. Zasilanie jest przechowywane w ramach pamięci RAM SoC.
- Poczekaj na VHAL. Gdy kierowca wejdzie w interakcję z pojazdem, na przykład przez jeśli otworzy się drzwi, VMCU podłącza zasilanie do układu SoC. Uruchamianie AAOS z zawieszenia w pamięci RAM i przechodzi do oczekiwania na VHAL, gdzie oczekuje na koordynację z VHAL.
- Włączony. VHAL informuje AAOS o konieczności przejścia w stan włączenia. W tym stanie System AAOS jest w pełni uruchomiony i współpracuje ze sterownikiem.
- Przygotuj się do wyłączenia. Gdy kierowca zakończy jazdę, VHAL poinformuje AAOS, aby otworzyć przygotowania do wyłączenia. W tym stanie ekran i dźwięk są wyłączone, a AAOS nie jest interakcji z kierowcą. System Android nadal działa i może aktualizować aplikacje oraz system Android. Po zakończeniu aktualizacji system Android wyświetla komunikat Poczekaj na VHAL. Zakończ.
- Poczekaj na zakończenie VHAL. W tym momencie AAOS informuje VHAL, że jest gotowy do wyłączenia. Oczekiwana jest sytuacja, w której VMCU będzie włączać SOC w fazę snu głębokiego i odłączać zasilanie. z procesora aplikacji. System AAOS przejdzie wtedy w stan zawieszenia na pamięć RAM, żaden kod nie jest wykonywany.
Moduły do zarządzania zasilaniem
System zarządzania energią składa się z tych modułów:
Nazwa modułu | Opis |
---|---|
Usługa CarPowerManager | Interfejs API Java lub C++. |
Usługa zarządzania zasilaniem samochodu | Koordynuje zmiany stanu zasilania. |
CarPowerPolicyDaemon | Komunikuje się z natywnymi klientami zasad zasilania. |
HAL pojazdu | Interfejs VMCU. |
Jądro | Zawieś wdrożenie w pamięci RAM lub dysku. |
Funkcja głębokiego snu/hibernacji (zawieszanie Androida w pamięci RAM/dysk) jest wdrożona w jądrze.
Ta funkcja jest udostępniana dla przestrzeni użytkownika jako specjalny plik znajdujący się pod adresem
/sys/power/state
Konto AAOS zostało zawieszone w wyniku mem
lub disk
do tego pliku.
CPMS koordynuje stan zasilania z innymi usługami i kontami HAL. CPMS wdraża stan maszynie opisanej powyżej i wysyła powiadomienia do każdego obserwatora po zmianie stanu zasilania ma miejsce. Usługa wykorzystuje także VHAL do wysyłania wiadomości do sprzętu.
CPPD zarządza zasadami zasilania do momentu przejęcia kontroli przez CPMS. Wysyła też informację o zmianie zasad zasilania powiadomienia przeznaczone dla natywnych detektorów.
Niektóre właściwości są zdefiniowane w VHAL. Aby komunikować się z VMCU, CPMS odczytuje i zapisuje tych właściwościach. aplikacje mogą używać interfejsu zdefiniowanego w CPM do monitorowania stanu zasilania zmian. Ten interfejs umożliwia też aplikacjom detektorów power policy. Ten interfejs API może być jest wywoływana w Javie i ma adnotację @hide / @System API, co oznacza, że jest dostępna tylko w aplikacjach z podwyższonymi uprawnieniami. Relacja między tymi modułami, aplikacjami i usługami na ilustracji poniżej:
Rysunek 2. Schemat odniesienia komponentów zasilania.
Sekwencja wiadomości
W poprzedniej sekcji opisano moduły, które składają się na system zarządzania energią. Ten korzysta z przykładów Wejście w fazę snu głębokiego i Zakończ fazę snu głębokiego, aby wyjaśnić, jak moduły i aplikacje komunikują się:
Przejdź do snu głębokiego
Tylko VMCU może zainicjować sen głęboki. Po zainicjowaniu snu głębokiego VMCU wysyła
do CPMS za pośrednictwem VHAL. CPMS zmienia stan na „PRZYGOTOWANIE DO SHUTDOWN” i
emituje komunikat o zmianie stanu na wszystkich obserwatorów (aplikacje i usługi monitorujące,
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()
dla aplikacji/usług jest synchronicznie wywoływana w sekcji
Metoda onStateChanged()
CPM. Dokończenie działania wymaga większości aplikacji i usług
jak przygotować się do powrotu z rozmowy. Usługi z podwyższonymi uprawnieniami mogą kontynuować
asynchronicznie po zwróceniu na PRE_SHUTDOWN_PREPARE
,
SUSPEND_ENTER
(POST_SUSPEND_ENTER
). W tym przypadku uprzywilejowana usługa jest
powinno wywoływać funkcję complete() na podanym obiekcie CompletablePowerStateChangeFuture
po zakończeniu przygotowań. Pamiętaj, że przygotowanie asynchroniczne jest niedozwolone w przypadku
SHUTDOWN_PREPARE
Przed wysłaniem danych DEEP_SLEEP_ENTRY
do VHAL CPM
okresowo wysyła do VHAL prośby o przesunięcie wyłączenia.
Gdy wszystkie obiekty CPM zakończą przygotowania do wyłączenia, CPMS wysyła
AP_POWER_STATE_REPORT
do VHAL, co spowoduje powiadomienie VMCU, że punkt dostępu jest gotowy
zawiesić. CPMS wywołuje również swoją metodę zawieszania, która powoduje zawieszenie jądra.
Oto sekwencja opisana powyżej:
Rysunek 3. Wprowadź sen głęboki.
Interfejsy programowania dostarczane przez CPM
W tej sekcji opisano interfejs API języka Java udostępniany w ramach modelu CPM w przypadku aplikacji i usług systemowych. Ten interfejs API umożliwia oprogramowaniu systemowem:
- Monitorowanie zmian stanu zasilania punktu dostępu.
- Zastosuj zasady dotyczące zasilania.
Aby wywołać interfejsy API udostępniane w ramach 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 jest
fasada służąca do tworzenia obiektów CPM. Określ android.car.Car.POWER_SERVICE
jako
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ą otrzymywać powiadomienia o zmianie stanu zasilania przez wdrożenie
CarPowerManager.CarPowerStateListener
Ten interfejs określa jedną metodę
onStateChanged()
, czyli funkcję wywołania zwrotnego wywoływaną po stanie zasilania CPMS
została zmieniona. Ten 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 polecić ten obiekt detektora monitorowania zmiany stanu zasilania, utwórz nowe wykonanie i zarejestruj detektor oraz ten wątek w obiekcie CPM:
executor = new ThreadPerTaskExecutor(); powerManager.setListener(powerListener, executor);
Metoda onStateChanged()
obiektu odbiornika po zmianie stanu zasilania
jest wywoływana z wartością reprezentującą nowy stan zasilania. Związek między wartością rzeczywistą a
stan zasilania jest zdefiniowany w CarPowerManager
i jest wyświetlany w
ta tabela:
Nazwa | Opis |
---|---|
STATE_ON | Wpisz stan włączenia. System jest w pełni sprawny. |
STATE_SHUTDOWN_ANULOWANO | Wyłączenie zostanie anulowane, a stan zasilania wróci do normalnego stanu. |
STATE_SHUTDOWN_ENTER | i aplikacje są gotowe do wyłączenia. |
STATE_POST_SHUTDOWN_ENTER | Przygotowania do wyłączenia zostały ukończone i VMCU jest gotowe do wyłączenia. Wpisz wartość stanie wyłączenia. |
STATE_PRE_SHUTDOWN_PREPARE (STAN_PRE_SHUTDOWN_PREPARE) | Przesłano prośbę o wyłączenie, ale CPMS jeszcze go nie uruchamia. Wyświetlacz i dźwięk są Nadal włączone |
STAN_SHUTDOWN_PREPARE | W tym czasie może działać tryb garażowy. |
STATE_SUSPEND_ENTER | aplikacje zostaną wyczyszczone i będą gotowe do przejścia do pamięci RAM. |
STATE_POST_SUSPEND_ENTER | Przygotowania do przejścia do pamięci RAM zostały zakończone i maszyna wirtualna jest gotowa do wdrożenia tego trybu w pamięci RAM. Wpisz wartość w stanie zawieszenia. |
STATE_SUSPEND_WYJŚCIE | Wybudzanie z zawieszenia lub wznowienia po anulowaniu zawieszenia. |
STAN_HIBERNATION_ENTER | aplikacje zostaną oczyszczone i będą gotowe do hibernacji. |
STATE_POST_HIBERNATION_ENTER | Przygotowania do hibernacji zostały zakończone i VMCU jest gotowy do hibernacji. stanu hibernacji. |
STAN_HIBERNATION_WYJŚCIE | Wybudź się ze hibernacji lub wznów odwołaną hibernację. |
STATE_WAIT_FOR_VHAL | System się uruchamia, ale czeka na nawiązanie komunikacji z VHAL przed przejściem do stan WŁĄCZONE. |
Wyrejestrowanie z CarPowerStateListener
Aby wyrejestrować wszystkie obiekty detektora zarejestrowane w CPM, wywołaj clearListener
:
powerManager.clearListener();
Integracja systemu w implementacji na Androida
Integrator jest odpowiedzialny za:
- Wdrożenie interfejsu jądra w celu zawieszenia Androida.
- Implementacja funkcji VHAL w celu:
- Propaguj rozpoczęcie zawieszania lub wyłączania w samochodzie na Androida.
- Wyślij z Androida komunikat o gotowości do wyłączenia do samochodu.
- Zainicjuj wyłączenie lub zawieszenie Androida, korzystając z interfejsu jądra Linuksa.
- Upewnij się, że wszystkie źródła uśpienia są wyłączone, gdy urządzenie jest w trybie uśpienia.
- Aplikacje powinny zamykać się na tyle szybko, aby nie opóźniać w nieskończoność procesu wyłączania.
- Upewnij się, że dostawca BSP włącza (lub wyłącza) komponenty urządzenia zgodnie z zasadami zasilania 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
na
funkcji zawieszenia w pamięci RAM lub disk
w przypadku wykonywania operacji zawieszenia na dysku do pliku znajdującego się w
/sys/power/state
Integrator musi udostępnić funkcję do monitorowania tego pliku oraz
powoduje przejście Linuksa w stan zawieszenia zasilania. Ta funkcja może wysłać GPIO do VMCU w celu powiadomienia
VMCU, że urządzenie zostało całkowicie wyłączone. Integrator jest również odpowiedzialny za usunięcie
w warunkach wyścigu między VHAL wysyłanie ostatecznej wiadomości do VMCU a systemem
w trybie zawieszenia lub wyłączenia.
Odpowiedzialność VHAL
VHAL zapewnia interfejs między siecią pojazdu a Androidem. VHAL:
- Przenosi rozpoczęcie zawieszania lub wyłączania z samochodu na Androida.
- Wysyła z Androida komunikat o gotowości do wyłączenia do samochodu.
- Inicjuje wyłączanie lub zawieszanie Androida za pomocą interfejsu jądra systemu Linux.
Gdy CPMS informuje VHAL, że jest gotowy do wyłączenia, VHAL wysyła wyłączenie do VMCU. Zazwyczaj urządzenia peryferyjne wbudowane w układ scalony, takie jak UART, SPI i USB, przesyłają . Po wysłaniu wiadomości CPMS wywołuje polecenie jądra, aby zawiesić lub wyłączyć. urządzenia. Przedtem VHAL lub BSP może przełączyć GPIO, aby poinformować VMCU, że jest on bezpieczny , aby odłączyć zasilanie.
VHAL musi obsługiwać następujące właściwości, które kontrolują zarządzanie energią przez VHAL:
Nazwa | Opis |
---|---|
RAPORT_STAN_AP_POTĘGA | Android zgłasza przejścia stanów do VMCU z tą właściwością przy użyciu Wartości wyliczeniowe VehicleApPowerStateReport. |
REQA_POTĘGA_AP_POTĘGA | VMCU wykorzystuje tę właściwość do instruowania Androida, aby przeszedł na różne stany zasilania, wykorzystując Wartości wyliczeniowe VehicleApPowerStateReq. |
RAPORT_STAN_AP_POTĘGA
Ta właściwość służy do zgłaszania bieżącego stanu zarządzania energią w Androidzie. Ta właściwość zawiera 2 elementy: liczby całkowite:
int32Values[0]
: wyliczenie bieżącego stanu w polu VehicleApPowerStateReport.int32Values[1]
: czas w milisekundach do odłożenia, uśpienia lub wyłączenia. Znaczenie tej wartości zależy od pierwszej wartości.
Pierwsza wartość może przyjmować jedną z tych wartości. VehicleApPowerStateReport.aidl
zawiera bardziej szczegółowe opisy, które są przechowywane w
hardware/interfaces/automotive/vehicle/aidl/android/hardware/automotive/vehicle
Nazwa wartości | Opis | Druga wartość |
---|---|---|
OCZEKIWANIE_NA_VHAL | AP zaczyna działać i musi się z nim skontaktować. | |
WPROWADZENIE GŁĘBOKO_SEN | AP przechodzi w fazę snu głębokiego. VMCU powinien ponownie włączyć punkt dostępu po upływie określonego czasu określony w drugiej wartości. | Wartość musi być ustawiona |
GŁĘBOKI_WYJŚCIE | AP przestaje być w fazie snu głębokiego. | |
WPIS_HIBERN | AP przechodzi w stan hibernacji. VMCU powinien ponownie włączyć punkt dostępu po upływie określonego czasu określony w drugiej wartości. | Wartość musi być ustawiona |
WYJŚCIE_HIBERNATION | Punkt dostępu przeszedł w stan hibernacji. | |
WYŁĄCZENIE_OPÓŹNIONE | Android nie jest gotowy do wyłączenia. VMCU powinien czekać przez czas określony w drugiej wartości przed wyłączeniem punktu dostępu. Android może poprosić o dodatkowe opóźnienie, przesyłając dodatkowe Raporty SHUTDOWN_POSTPONE. | Wartość musi być ustawiona |
SHUTDOWN_PRZYGOTOWANIE | Android przygotowuje się do wyłączenia. | Wartość musi być ustawiona |
SHUTDOWN_START | Punkt dostępu jest gotowy do wyłączenia. VMCU powinien ponownie włączyć punkt dostępu po upływie czasu podanego w drugą wartość. VMCU nie jest wymagane do obsługi funkcji włączania z opóźnieniem. | Wartość musi być ustawiona |
SHUTDOWN_ANULOWANO | Android nie będzie już przygotowywać się do wyłączenia i przejdzie do WAIT_FOR_VHAL. | |
WŁ. | Android działa normalnie. |
Stan można ustawiać samodzielnie lub w odpowiedzi na żądanie przez VMCU.
REQA_POTĘGA_AP_POTĘGA
Ta właściwość jest wysyłana przez VMCU w celu przejścia Androida w inny stan zasilania i zawiera dwie liczby całkowite:
int32Values[0]
: wartość wyliczeniowaVehicleApPowerStateReq
, która reprezentuje nowy stan, w który ma nastąpić przejście.int32Values[1]
: wartość wyliczeniowaVehicleApPowerStateShutdownParam
. Ten jest wysyłana tylko dla komunikatuSHUTDOWN_PREPARE
i przesyła do Androida zawartych w nim opcji.
Pierwsza liczba całkowita wskazuje nowy stan, do którego Android ma być przesyłany. Semantyka
są zdefiniowane w VehicleApPowerStateReq.aidl
i podane poniżej:
Nazwa wartości | Opis |
---|---|
WŁ. | Punkt dostępu powinien rozpocząć pełne działanie. |
SHUTDOWN_PRZYGOTOWANIE | Punkt dostępu powinien przygotować się do wyłączenia. Druga wartość wskazuje, czy punkt dostępu może opóźnić po wyłączeniu i o tym, czy punkt dostępu powinien się wyłączyć czy przejść w sen głęboki. |
ANULUJ_WYŁĄCZENIE | Punkt dostępu powinien przestać przygotowywać się do wyłączenia i włączenia. |
ZAKOŃCZ | Punkt dostępu zostanie wyłączony lub zawieszony. |
Element VehicleApPowerStateShutdownParam
jest zdefiniowany w:
VehicleApPowerStateShutdownParam.aidl
Ta lista wyliczeniowa zawiera te elementy:
Nazwa wartości | Opis |
---|---|
CAN_SLEEP | AP może przejść w fazę snu głębokiego zamiast całkowicie się wyłączać. Odkładanie terminu jest dozwolone. |
CAN_HIBERNATE | Punkt dostępu może przejść w tryb hibernacji zamiast całkowicie się wyłączać. Odkładanie terminu jest dozwolone. |
WYŁĄCZNIE_SHUTDOWN | Punkt dostępu powinien się wyłączyć. Odkładanie terminu jest dozwolone. Sen głęboki jest niedozwolony. |
SEN_NASTĘPNIE | AP może przejść w fazę snu głębokiego, ale musi od razu się wysypiać lub się wyłączyć. Odłożenie jest niedozwolone. |
HIBERNATYWNA_BEZPOŚREDNIA | Punkt dostępu może przejść do trybu zawieszenia na dysku, ale musi przejść w stan hibernacji lub się natychmiast wyłączyć. Odłożenie jest niedozwolone. |
WYŁĄCZNIE_NASTĘPNIE | Punkt dostępu musi się natychmiast wyłączyć. Odkładanie terminu jest niedozwolone. Sen głęboki jest niedozwolony. |
Źródła wybudzania
Integrator musi wyłączyć odpowiednie źródła wybudzania, gdy urządzenie jest w trybie zawieszenia. Typowe źródła wybudzenia to uderzenia serca, modem, Wi-Fi i Bluetooth. Jedyne prawidłowe źródło wybudzenia musi może być przerwą dla VMCU w celu wybudzenia układu SOC. Zakładamy, że VMCU może nasłuchiwać modemu w przypadku zdarzeń zdalnego wybudzania (takich jak zdalne uruchamianie silnika). Po przekazaniu tej funkcji do punktu dostępu, należy dodać inne źródło wybudzania obsługujące modem.
Aplikacje
OEM musi pamiętać o tworzeniu aplikacji, aby można było je szybko wyłączyć bez przestoju. cały proces.
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 z prośbą o poznanie: CarPowerManager |
packages/services/Car/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink |
Diagram klasy
Ten diagram klas przedstawia klasy i interfejsy Javy w systemie zarządzania energią:
Rysunek 4. Schemat klasy mocy.
Relacja obiektu
Rysunek 5 pokazuje, które obiekty mają odwołania do innych. Krawędź oznacza, że obiekt źródłowy zawiera odwołanie do obiektu docelowego. Na przykład VehicleHAL ma odniesienie do obiektu PropertyHalService.
Rysunek 5. Diagram referencyjny obiektu.