מדיניות צריכת חשמל

כדי לוודא שרכיבי החומרה והתוכנה (כמו המסך, האודיו והאינטראקציה הקולית) מופעלים ומושבתים באופן סלקטיבי לפי הצורך, מערכת AAOS מספקת מדיניות צריכת חשמל, שמכילה קבוצה של מצבי הפעלה וכיבוי צפויים של רכיבי החומרה והתוכנה. VHAL, או שירותי ספקים עם הרשאות מערכת, יכולים להחיל מדיניות צריכת אנרגיה חדשה כשמצב צריכת האנרגיה של Android עובר שינוי או כשהתנאים שהם ממתינים להם מתקיימים.

מותר להחיל מדיניות צריכת חשמל בסטטוסים 'המתנה ל-VHAL' ו'מופעל' (לפעמים עם הגבלות מסוימות). בשלב 'הכנה לטעינה', מצב המוסך פועל ולא אמור להיות מופרע על ידי שינוי במצב החשמל. אי אפשר להחיל מדיניות צריכת חשמל רגילה, אבל ב-Shutdown Prepare חלה מדיניות צריכת חשמל מיוחדת, שהיא מדיניות צריכת החשמל של המערכת שנקראת 'אין אינטראקציה של משתמש'.

מצב הטעינה של AAOS

במכשירי AAOS חל התרשים הבא של מצבי צריכת החשמל:

תרשים של מצב הטעינה ב-AAOS

איור 1. תרשים של מצב הטעינה ב-AAOS.

אלה שלושת מצבי ההפעלה:

ערך תיאור
מושבתת
  • אין אספקת חשמל פיזית למעבד האפליקציות (AP), לזיכרון ולציוד ההיקפי.
המתנה ל-VHAL
  • כשהנהג מבצע פעולה ברכב (למשל, פותח דלת), ה-VMCU מעביר חשמל לנקודת הגישה (AP), לזיכרון ולציוד ההיקפי.
  • AAOS עובר מאחד משלושת המצבים (מושבת, השהיה ב-RAM (STR, Wait for VHAL to finish)) ואז עובר למצב Wait for VHAL, שבו הוא ממתין לתיאום עם ה-VHAL.
הפעלה
  • ה-VHAL מורה ל-AAOS לעבור למצב מופעל. במצב הזה, מערכת AAOS פועלת במלואה ומקיימת אינטראקציה עם הנהג.
  • המסך נשלט על ידי מדיניות צריכת החשמל ולא על ידי קריאות להפעלה או להשבתה של מסך Android בגורמי צורה אחרים.
הכנה לביטול
  • כשהנהג מפסיק לנהוג, ה-VHAL מורה ל-AAOS להיכנס למצב 'הכנה לטעינה'. במצב הזה, המסך והאודיו מושבתים ומערכת AAOS לא מתקשרת עם הנהג. מערכת Android עדיין פועלת ואפשר לעדכן בה אפליקציות וגם את מערכת Android. כשהעדכונים (אם יש כאלה) מסתיימים, מערכת Android עוברת למצב Wait for VHAL Finish.
ממתינים לסיום ה-VHAL
  • מערכת AAOS מעדכנת את VHAL שאפשר לכבות אותו. יחידת המיקרו-בקר של הרכב (VMCU) אמורה להעביר את המערכת על שבב (SoC) למצב שינה עמוקה ולהפסיק את אספקת החשמל לנקודת הגישה. לאחר מכן, AAOS נמצא במצב STR, למרות שלא מתבצע ביצוע של קוד.
  • אם תהליך VHAL לא מסתיים והנהג חוזר, יחידת הראש (HU) אמורה לעבור ישירות למצב 'המתנה ל-VHAL'.
השהיה ב-RAM (STR)
  • הרכב וה-AP מושבתים, לא מתבצע הרצת קוד והחשמל נשמר ב-RAM של ה-AP.
השהיה בדיסק (STD)
  • הרכב וה-AP כבויים, לא מתבצע הרצת קוד ואין אספקת חשמל ליחידת העיבוד ולזיכרון ה-RAM של ה-AP.

איך מוגדרת מדיניות צריכת החשמל?

המטמיעים מגדירים את כללי מדיניות צריכת החשמל ב-/vendor/etc/automotive/power_policy.xml, שמאפשרים:

  • הגדרת מדיניות צריכת החשמל.
  • הגדרת קבוצות של מדיניות צריכת חשמל, שכוללות את מדיניות צריכת החשמל שמוגדרת כברירת מחדל, ומיושמות באופן אוטומטי כשמתרחשים מעברים במצבי צריכת החשמל.
  • מבטלת את מדיניות אספקת החשמל למערכת.

מדיניות צריכת חשמל

מדיניות צריכת החשמל מורכבת מקבוצה של מצבי צריכת חשמל צפויים של רכיבי חומרה ותוכנה. אלה הרכיבים שנתמכים ב-AAOS במדיניות צריכת החשמל:

AUDIO
MEDIA
DISPLAY
BLUETOOTH
Wi-Fi
סלולר
ETHERNET
PROJECTION
NFC
INPUT
VOICE_INTERACTION
VISUAL_INTERACTION
TRUSTED_DEVICE_DETECTION
LOCATION
MICROPHONE
CPU

ספקים יכולים גם להגדיר רכיבי צריכת חשמל מותאמים אישית לשימוש עם מדיניות צריכת חשמל. מגדירים רכיבי צריכת חשמל בהתאמה אישית באותו קובץ XML שבו מוגדרות כללי מדיניות צריכת החשמל, כמו בדוגמה הבאה:

<customComponents>
  CUSTOM_COMPONENT_1000
  CUSTOM_COMPONENT_SPECIAL_SENSOR
  CUSTOM_COMPONENT_AUX_INPUT
</customComponents>

קבוצת מדיניות צריכת חשמל

מדיניות צריכת החשמל שמוגדרת כברירת מחדל חלה באופן אוטומטי במעבר בין מצבי צריכת החשמל שמפורטים בקבוצת מדיניות צריכת החשמל. ספקים יכולים להגדיר את מדיניות החשמל שמוגדרת כברירת מחדל ל-Wait For VHAL,‏ On ו-Wait for VHAL Finish (כניסה למצב שינה עמוקה או התחלת כיבוי).

כללי מדיניות לשימוש בחשמל במערכת

ב-AAOS יש תמיכה בשתי מדיניות צריכת אנרגיה של המערכת: no user interaction ו-suspend prep. מדיניות צריכת החשמל של המערכת חלה כשהמכשיר עובר למצב שקט, למצב 'חניה', להשהיה ב-RAM או להשהיה בדיסק.

בטבלאות הבאות מפורט ההתנהגות של כל רכיב במדיניות צריכת האנרגיה של המערכת. מי שמטמיע את המדיניות יכול לשנות את הגדרות החשמל של המערכת ל-no user interaction כדי לשנות את המדיניות של זיהוי Bluetooth,‏ NFC ומכשירים מהימנים. החלפות חלות ב-/vendor/etc/power_policy.xml.

ללא אינטראקציה של משתמשים

ההתנהגות של מדיניות צריכת החשמל של המערכת ללא אינטראקציה של משתמשים מוגדרת בטבלה הבאה:

רכיבים מצב הסוללה ניתן להגדרה
אודיו מושבתת לא
מדיה מושבתת לא
תצוגה מושבתת לא
Bluetooth מושבתת כן
Wi-Fi הפעלה לא
רשת סלולרית הפעלה לא
אתרנט הפעלה לא
תחזית מושבתת לא
NFC מושבתת כן
קלט מושבתת לא
Assistant מושבתת לא
אינטראקציה של משתמשים מושבתת לא
זיהוי מכשיר מהימן לצורך התחברות של משתמשים הפעלה כן
מיקום מושבתת לא
מיקרופון מושבתת לא
CPU הפעלה לא

השעיית הכנה

ההתנהגות של מדיניות צריכת החשמל של המערכת suspend prep מוגדרת בטבלה הבאה:

רכיבים מצב הסוללה הגדרה על ידי יצרן ציוד מקורי (OEM)
אודיו מושבתת לא
מדיה לא רלוונטי לא
תצוגה לא רלוונטי לא
Bluetooth מושבתת לא
Wi-Fi מושבתת לא
רשת סלולרית לא רלוונטי לא
אתרנט לא רלוונטי לא
תחזית לא רלוונטי לא
NFC לא רלוונטי לא
קלט לא רלוונטי לא
Assistant לא רלוונטי לא
אינטראקציה של משתמשים לא רלוונטי לא
זיהוי מכשיר מהימן לצורך התחברות של משתמשים לא רלוונטי לא
מיקום מושבתת לא
מיקרופון מושבתת לא
CPU מושבתת לא

אינטראקציה עם VHAL

הדימון של מדיניות צריכת החשמל ברכב שפועל בשכבת המערכת מנוי לשני נכסים כדי להאזין לבקשות מ-VHAL:

  • POWER_POLICY_REQ ה-VHAL כותב את מזהה מדיניות ההפעלה לנכס הזה.
  • POWER_POLICY_GROUP_REQ ה-VHAL כותב את מזהה הקבוצה של מדיניות צריכת החשמל לנכס הזה.

מודולים אחרים מלבד VHAL יכולים לשנות את מדיניות האנרגיה הנוכחית במערכת. במקרה כזה, הדימון של מדיניות צריכת החשמל ברכב מעדכן את המאפיין CURRENT_POWER_POLICY כדי להודיע על השינוי ל-VHAL.

אינטראקציה עם תהליכים מקומיים

כפי שצוין למעלה, הדימון של מדיניות צריכת החשמל ברכב פועל בשכבת המערכת, ומבחינת ניהול מדיניות צריכת החשמל הוא מספק כמעט את אותה פונקציונליות כמו CPMS שפועל בשכבת המסגרת. בנוסף, נניח שהדמיון (daemon) של מדיניות הזנת המתח ברכב ו-CPMS מסונכרנים באופן מלא.

הדימון של מדיניות צריכת החשמל ברכב מייצא ממשקי AIDL לשימוש ב-HAL ובתהליכים מקומיים אחרים. הם יכולים לקבל התראה כשמדיניות צריכת החשמל משתנה. במילים אחרות, מתי כל אחד מהם צריך לשנות את מצב ההפעלה שלו.

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);
  }

אינטראקציה עם מודולים של Java

CarPowerManager מספק שיטות להפעלת ניהול מדיניות צריכת החשמל:

  • אחזור של מדיניות המתח הנוכחית
  • החלת מדיניות צריכת חשמל חדשה
  • הגדרת קבוצה חדשה של מדיניות צריכת חשמל

רק מודולים עם הרשאות מערכת יכולים להשתמש בשיטות האלה. מודולים שרוצים לקבל הודעה כשמדיניות צריכת החשמל חלה עליהם יכולים לרשום CarPowerManager כמאזין לשינויים במדיניות צריכת החשמל.