Zarządzanie zasilaniem

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:

procesor aplikacji (AP)
Część systemu układu SOC.
pakiet pomocy dla początkujących (BSP)
Warstwa oprogramowania, która zawiera sprzętowe oprogramowanie rozruchowe i sterowniki urządzeń które umożliwia działanie wbudowanego systemu operacyjnego w danym środowisku sprzętowym (płyta główna), zintegrowany z wbudowanym systemem operacyjnym.
CarPowerManager (CPM)
Udostępnia interfejs API pozwalający aplikacjom rejestrować się w przypadku zmian stanu zasilania.
Usługa CarPowerManagementService (CPMS)
Implementuje maszynę stanu zasilania samochodu, łączy się z VHAL i wykonuje ostatnie wywołania suspend() i shutdown().
CarPowerPolicyDaemon (CPPD).
Udostępnia interfejsy AIDL dla procesów natywnych w celu zarejestrowania detektora zasad zasilania.
dane wejściowe lub wyjściowe do ogólnego przeznaczenia (GPIO)
Kod PIN sygnału cyfrowego do zwykłych obciążeń.
warstwa abstrakcji sprzętowej (HAL)
Warstwa oprogramowania, z którą muszą współpracować wszystkie pozostałe moduły wyższego poziomu, aby uzyskać dostęp. i wydajności sprzętowej.
hibernacja
Nazywane również zawieszeniem na dysku (S2D/S4). Układ SOC jest w trybie zasilania S4 zawartości pamięci RAM (przejście do hibernacji) i pamięci RAM jest zapisywana na nośniku nieulotnym (takim jak pamięć flash czy dysk) oraz jest wyłączony.
procesor multimediów (MP)
Zobacz układ SOC.
zintegrowany obwód zarządzania energią (PMIC)
Układ używany do zarządzania wymaganiami systemu hosta.
układ SOC
Główny procesor z systemem AAOS, zwykle dostarczany przez producentów takich jak Intel, MediaTek, Nvidia, Qualcomm, Renesas i Texas Instruments.
zawiesić
Nazywane również zawieszeniem w pamięci RAM (S2R lub STR). Układ SOC jest w trybie zasilania S3 a procesor jest wyłączony, a pamięć RAM pozostaje włączona.
HAL pojazdu (VHAL)
Interfejs API Androida używany do łączenia się z siecią pojazdu. Partner poziomu 1 lub OEM to odpowiedzialnym za napisanie tego modułu. Sieć w pojeździe może korzystać z dowolnej warstwy fizycznej (takiej jak CAN, LIN, Most i Ethernet). VHAL wyodrębnia sieć pojazdu, aby umożliwić AAOS interakcję w pojeździe.
Procesor interfejsu pojazdu (VIP)
Zobacz MCU pojazdu.
Nadrzędna jednostka sterująca pojazdu (VMCU)
Mikrokontroler łączący sieć pojazdu z układem SOC. SOC komunikuje się z VMCU za pomocą sygnałów USB, UART, SPI i GPIO.

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:

Urządzenie stanu zasilania samochodu

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:

Schemat odniesienia komponentów zasilania

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:

Przejdź do snu głębokiego

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:

  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 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ść wyliczeniowa VehicleApPowerStateReq, która reprezentuje nowy stan, w który ma nastąpić przejście.
  • int32Values[1]: wartość wyliczeniowa VehicleApPowerStateShutdownParam. Ten jest wysyłana tylko dla komunikatu SHUTDOWN_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ą:

Schemat klasy mocy

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.

Diagram referencyjny obiektu

Rysunek 5. Diagram referencyjny obiektu.