Zasady dotyczące mocy

Aby zapewnić selektywne włączanie i wyłączanie komponentów sprzętowych i oprogramowania (takich jak wyświetlacz, dźwięk i interakcja głosowa) w razie potrzeby, AAOS udostępnia zasadę dotyczącą zasilania, która składa się z zestawu oczekiwanych stanów włączenia i wyłączenia komponentów sprzętowych i oprogramowania. VHAL lub usługi dostawcy z uprawnieniami systemowymi mogą zastosować nową zasadę dotyczącą zasilania, gdy zmieni się stan zasilania Androida lub gdy zostaną spełnione warunki, na które czekają.

Stosowanie zasady dotyczącej zasilania jest dozwolone w stanach Wait for VHAL i On (czasami z pewnymi ograniczeniami). W stanie Shutdown Prepare działa tryb garażowy, którego nie powinna zakłócać zmiana stanu zasilania. W stanie Shutdown Prepare nie można zastosować zwykłej zasady dotyczącej zasilania, ale można zastosować specjalną zasadę dotyczącą zasilania, czyli zasadę systemową o nazwie no user interaction.

Stan zasilania AAOS

Urządzenia AAOS działają zgodnie z tym diagramem stanu zasilania:

Schemat stanów zasilania AAOS

Rysunek 1. Diagram stanu zasilania AAOS.

Każdy stan zasilania jest opisany poniżej:

Wartość Opis
Wył.
  • Do procesora aplikacji (AP), pamięci i urządzeń peryferyjnych nie jest fizycznie dostarczane zasilanie.
Czekaj na VHAL
  • Gdy kierowca wejdzie w interakcję z pojazdem (np. otworzy drzwi), VMCU dostarczy zasilanie do procesora aplikacji, pamięci i urządzeń peryferyjnych.
  • AAOS przechodzi z jednego z 3 stanów (Off, Suspend-to-RAM (STR, Wait for VHAL to finish)) do stanu Wait for VHAL, w którym czeka na koordynację z VHAL.
Wł.
  • VHAL instruuje AAOS, aby przeszło do stanu On. W tym stanie AAOS działa w pełni i wchodzi w interakcję z kierowcą.
  • Wyświetlacz jest sterowany przez zasadę dotyczącą zasilania, a nie przez wywołania włączania i wyłączania wyświetlacza Androida w przypadku innych formatów.
Przygotowanie do wyłączenia
  • Gdy kierowca przestanie prowadzić, VHAL instruuje AAOS, aby przeszło do stanu Shutdown Prepare. W tym stanie wyświetlacz i dźwięk są wyłączone, a AAOS nie wchodzi w interakcję z kierowcą. System Android nadal działa i może aktualizować aplikacje oraz system Android. Po zakończeniu aktualizacji (jeśli są dostępne) system Android przechodzi do stanu Wait for VHAL Finish.
Czekaj na zakończenie VHAL
  • AAOS informuje VHAL, że można je wyłączyć. Oczekuje się, że Vehicle Microcontroller Unit (VMCU) jest przełączy System-on-Chip (SoC) w tryb głębokiego uśpienia i odłączy zasilanie od procesora aplikacji. AAOS jest wtedy w stanie STR, chociaż nie jest wykonywany żaden kod.
  • Jeśli VHAL nie zakończy działania, a kierowca wróci, jednostka główna powinna przejść bezpośrednio do stanu Wait for VHAL.
Suspend-to-RAM (STR)
  • Pojazd i procesor aplikacji są wyłączone, nie jest wykonywany żaden kod, a zasilanie jest utrzymywane do pamięci RAM procesora aplikacji.
Suspend-to-disk (STD)
  • Pojazd i procesor aplikacji są wyłączone, nie jest wykonywany żaden kod, a zasilanie nie jest utrzymywane w jednostce przetwarzania ani w pamięci RAM procesora aplikacji.

Jak definiuje się zasadę dotyczącą zasilania?

Implementatorzy definiują zasady dotyczące zasilania w pliku /vendor/etc/automotive/power_policy.xml, który:

  • definiuje zasadę dotyczącą zasilania,
  • definiuje grupy zasad dotyczących zasilania, które obejmują domyślną zasadę dotyczącą zasilania i są automatycznie stosowane, gdy zmienia się stan zasilania,
  • zastępuje zasadę systemową dotyczącą zasilania.

Zasada dotycząca zasilania

Zasada dotycząca zasilania składa się z zestawu oczekiwanych stanów zasilania komponentów sprzętowych i oprogramowania. AAOS obsługuje te komponenty w zasadzie dotyczącej zasilania:

AUDIO
MEDIA
DISPLAY
BLUETOOTH
WIFI
CELLULAR
ETHERNET
PROJECTION
NFC
INPUT
VOICE_INTERACTION
VISUAL_INTERACTION
TRUSTED_DEVICE_DETECTION
LOCATION
MICROPHONE
CPU

Dostawcy mogą też definiować własne niestandardowe komponenty zasilania do użycia z zasadami dotyczącymi zasilania. Zdefiniuj niestandardowe komponenty zasilania w tym samym pliku XML co zasady dotyczące zasilania, jak w tym przykładzie:

<customComponents>
  CUSTOM_COMPONENT_1000
  CUSTOM_COMPONENT_SPECIAL_SENSOR
  CUSTOM_COMPONENT_AUX_INPUT
</customComponents>

Grupa zasad dotyczących zasilania

Grupa zasad dotyczących zasilania określa domyślną zasadę dotyczącą zasilania, która ma być automatycznie stosowana podczas zmiany stanu zasilania. Dostawcy mogą zdefiniować domyślną zasadę dotyczącą zasilania dla stanów Wait For VHAL, On i Wait for VHAL Finish (Deep Sleep Entry lub Shutdown Start).

Zasady systemowe dotyczące zasilania

AAOS obsługuje 2 zasady systemowe dotyczące zasilania: no user interaction i suspend prep. Zasada systemowa dotycząca zasilania jest stosowana, gdy urządzenie przechodzi w tryb cichy, tryb garażowy, tryb Suspend-to-RAM lub tryb Suspend-to-disk.

W tabelach poniżej znajdziesz informacje o działaniu każdego komponentu w zasadzie systemowej dotyczącej zasilania. Implementatorzy mogą zastąpić Bluetooth, NFC i wykrywanie zaufanych urządzeń w zasadzie systemowej dotyczącej zasilania no user interaction. Zastąpienia są stosowane w /vendor/etc/power_policy.xml.

no user interaction

Działanie zasady systemowej dotyczącej zasilania no user interaction jest zdefiniowane w tej tabeli:

Komponenty Stan zasilania Można konfigurować
Audio Wył. Nie
Multimedia Wył. Nie
Wyświetlacz Wył. Nie
Bluetooth Wył. Tak
Wi-Fi Wł. Nie
Sieć komórkowa Wł. Nie
Ethernet Wł. Nie
Odwzorowanie Wył. Nie
NFC Wył. Tak
Dane wejściowe Wył. Nie
Asystent Wył. Nie
Interakcja Wył. Nie
Wykrywanie zaufanych urządzeń na potrzeby logowania użytkownika Wł. Tak
Lokalizacja Wył. Nie
Mikrofon Wył. Nie
CPU Wł. Nie

suspend prep

Działanie zasady systemowej dotyczącej zasilania suspend prep jest zdefiniowane w tej tabeli:

Komponenty Stan zasilania Można konfigurować
Audio Wył. Nie
Multimedia Nie dotyczy Nie
Wyświetlacz Nie dotyczy Nie
Bluetooth Wył. Nie
Wi-Fi Wył. Nie
Sieć komórkowa Nie dotyczy Nie
Ethernet Nie dotyczy Nie
Odwzorowanie Nie dotyczy Nie
NFC Nie dotyczy Nie
Dane wejściowe Nie dotyczy Nie
Asystent Nie dotyczy Nie
Interakcja Nie dotyczy Nie
Wykrywanie zaufanych urządzeń na potrzeby logowania użytkownika Nie dotyczy Nie
Lokalizacja Wył. Nie
Mikrofon Wył. Nie
CPU Wył. Nie

Interakcja z VHAL

Demon zasad dotyczących zasilania samochodu działający w warstwie systemowej subskrybuje 2 właściwości, aby nasłuchiwać żądań z VHAL:

  • POWER_POLICY_REQ – VHAL zapisuje identyfikator zasady dotyczącej zasilania w tej właściwości.
  • POWER_POLICY_GROUP_REQ – VHAL zapisuje identyfikator grupy zasad dotyczących zasilania w tej właściwości.

Bieżącą zasadę dotyczącą zasilania w systemie mogą zmieniać moduły inne niż VHAL. W takim przypadku, demon zasad dotyczących zasilania samochodu aktualizuje właściwość CURRENT_POWER_POLICY, aby powiadomić VHAL o zmianie.

Interakcja z procesami natywnymi

CarPowerManagementService (CPMS) deleguje zarządzanie zasadami dotyczącymi zasilania do demona zasad dotyczących zasilania samochodu. Demon jest jedynym źródłem wiarygodnych danych dotyczących zasad dotyczących zasilania w systemie. Demon zasad dotyczących zasilania samochodu zarządza stanem zasad dotyczących zasilania i powiadamia CPMS, VHAL oraz innych klientów natywnych o zmianach.

Demon zasad dotyczących zasilania samochodu eksportuje interfejsy AIDL do użytku przez HAL i inne procesy natywne. Mogą one otrzymywać powiadomienia o zmianie nowej zasady dotyczącej zasilania. Innymi słowy, gdy każdy z nich musi zmienić swój stan zasilania.

ICarPowerPolicyServer.aidl

  package android.frameworks.automotive.powerpolicy;

  import android.frameworks.automotive.powerpolicy.CarPowerPolicy;
  import android.frameworks.automotive.powerpolicy.CarPowerPolicyFilter;
  import android.frameworks.automotive.powerpolicy.ICarPowerPolicyChangeCallback;
  import android.frameworks.automotive.powerpolicy.PowerComponent;

  /**
   * ICarPowerPolicyServer is an interface implemented by the power policy daemon.
   * VHAL changes the power policy and the power policy daemon notifies the change to
   * registered subscribers. When subscribing to policy changes, a filter can be specified so
   * that the registered callbacks can listen only to a specific power component's change.
   */

  @VintfStability
  interface ICarPowerPolicyServer {
    /**
     * Gets the current power policy.
     * @throws IllegalStateException if the current policy is not set.
     */
    CarPowerPolicy getCurrentPowerPolicy();

    /**
     * Gets whether the power component is turned on or off.
     *
     * @param componentId Power component ID defined in PowerComponent.aidl to check power
     * state.
     * @return True if the component's power state is on.
     * @throws IllegalArgumentException if the componentId is invalid.
     */
    boolean getPowerComponentState(in PowerComponent componentId);

    /**
     * Subscribes to power policy change.
     * Notification is sent to the registered callback when the power policy changes and the
     * power state of the components which the callback is interested in changes.
     *
     * @param callback Callback that is invoked when the power policy changes.
     * @param filter The list of components which the callback is interested in.
     * @throws IllegalArgumentException if the callback is already registered.
     * @throws IllegalStateException if the callback is dead.
     */
    void registerPowerPolicyChangeCallback(in ICarPowerPolicyChangeCallback callback,
        in CarPowerPolicyFilter filter);

    /**
     * Unsubscribes from power policy change.
     *
     * @param callback Callback that doesn't want to receive power policy change.
     * @throws IllegalArgumentException if the callback is not registered.
     */
    void unregisterPowerPolicyChangeCallback(in ICarPowerPolicyChangeCallback callback);

    /**
     * Applies the power policy.
     *
     * 

{@code policyId} should be one of power policy IDs defined in * {@code /vendor/etc/automotive/power_policy.xml} or predefined system power policies. * * @param policyId ID of power policy. * @throws IllegalArgumentException if {@code policyId} is invalid. */ void applyPowerPolicy(in @utf8InCpp String policyId); /** * Sets the current power policy group. * *

{@code policyGroupId} should be one of power policy group IDs defined in * {@code /vendor/etc/automotive/power_policy.xml}. * * @param policyGroupId ID of power policy group. * @throws IllegalArgumentException if {@code policyGroupId} is invalid. */ void setPowerPolicyGroup(in @utf8InCpp String policyGroupId); }

ICarPowerPolicyChangeCallback.aidl

  package android.frameworks.automotive.powerpolicy;

  import android.frameworks.automotive.powerpolicy.CarPowerPolicy;

  /**
   * ICarPowerPolicyChangeCallback is notified when a power policy changes.
   */

  @VintfStability
  oneway interface ICarPowerPolicyChangeCallback {
    /**
     * Called when a power policy is fully changed.
     *
     * @param policy The current policy.
     */
    void onPolicyChanged(in CarPowerPolicy policy);
  }

Interakcja z modułami Java

CarPowerManager udostępnia metody umożliwiające zarządzanie zasadami dotyczącymi zasilania:

  • Pobieranie bieżącej zasady dotyczącej zasilania
  • Stosowanie nowej zasady dotyczącej zasilania
  • Ustawianie nowej grupy zasad dotyczących zasilania

Z tych metod mogą korzystać tylko moduły z uprawnieniami systemowymi. Moduły, które chcą otrzymywać informacje o zastosowaniu zasady dotyczącej zasilania, mogą zarejestrować odbiorcę zmian zasad dotyczących zasilania w CarPowerManager.