Güç yönetimi

Android, araca özgü güç yönetimini desteklemek için bir CarPowerManagementService hizmeti ve CarPowerManager arayüzü sağlar.

Durum geçişleri, Araç Ana Kontrol Ünitesi (VMCU) tarafından tetiklenir. Entegratörlerin VMCU ile iletişim kurabilmesi için birkaç bileşeni uygulaması gerekir. Entegratörler, araç donanım soyutlama katmanı (VHAL) ve çekirdek uygulamasıyla entegrasyondan sorumludur. Entegratörler, uyanma kaynaklarını devre dışı bırakmaktan ve kapatma işlemlerinin süresiz olarak ertelenmediğinden de sorumludur.

Terminoloji

Bu belgede aşağıdaki terimler kullanılmaktadır:

uygulama işlemcisi (AP)
Çip üzerinde sistem (SoC)'in bir parçasıdır.
Kapsamlı Destek Paketi (BSP)
Yerleşik işletim sisteminin belirli bir donanım ortamında (anakart) çalışmasına olanak tanıyan donanıma özel önyükleme donanım yazılımını ve cihaz sürücülerini içeren, yerleşik işletim sistemiyle entegre edilmiş yazılım katmanı.
CarPowerManager (BGBM)
Uygulamaların güç durumu değişikliklerine kaydolması için bir API sağlar.
CarPowerManagementService (CPMS)
Araba güç durum makinesini uygular, VHAL ile arayüz oluşturur ve suspend() ile shutdown()'ye son çağrıları yapar.
CarPowerPolicyDaemon (CPPD)
Yerli süreçlerin güç politikası dinleyicisini kaydettirmesi için AIDL arayüzlerini gösterir.
genel amaçlı giriş veya çıkış (GPIO)
Genel amaçlı kullanım için dijital sinyal pini.
donanım soyutlama katmanı (HAL)
Donanım işlevlerine erişmek için diğer tüm üst düzey modüllerin etkileşimde bulunması gereken bir yazılım katmanı.
hazırda bekletme
Diske Askıya Alma (S2D/S4) olarak da bilinir. SoC, S4 güç moduna (hazırda bekleme) alınır, RAM içeriği kalıcı olmayan medyaya (ör. flash veya disk) yazılır ve sistemin tamamı kapatılır.
medya işlemcisi (MP)
Çip üzerinde sistem (SoC) konusuna bakın.
güç yönetimi entegre devresi (PMIC)
Ana makine sisteminin güç gereksinimlerini yönetmek için kullanılan çip.
çip üzerinde sistem (SoC)
AAOS'u çalıştıran ana işlemci. Genellikle Intel, MediaTek, Nvidia, Qualcomm, Renesas ve Texas Instruments gibi üreticiler tarafından sağlanır.
askıya alma
RAM'de Askıya Alma (S2R veya STR) olarak da adlandırılır. SoC, S3 güç moduna alınır ve RAM açık kalırken CPU kapatılır.
Araç HAL'si (VHAL)
Araç ağı ile arayüz oluşturmak için kullanılan Android API'si. Bu modülün yazılmasından 1. Katman iş ortağı veya OEM sorumludur. Araç ağı herhangi bir fiziksel katmanı (CAN, LIN, MOST ve Ethernet gibi) kullanabilir. VHAL, AAOS'un araçla etkileşim kurmasını sağlamak için bu araç ağını soyutlar.
Araç Arayüzü İşlemcisi (VIP)
Araç MCU'suna bakın.
Araç Ana Kontrol Ünitesi (VMCU)
Araç ağı ile SoC arasında arayüz sağlayan mikrodenetleyici. SoC, USB, UART, SPI ve GPIO sinyalleri aracılığıyla VMCU ile iletişim kurar.

Sistem tasarımı

Bu bölümde, AAOS'un uygulama işlemcisinin güç durumunu nasıl temsil ettiği ve güç yönetimi sistemini hangi modüllerin uyguladığı açıklanmaktadır. Bu materyalde, bu modüllerin birlikte nasıl çalıştığı ve durum geçişlerinin genellikle nasıl gerçekleştiği de açıklanmaktadır.

Araç güç durumu makinesi

AAOS, AP'nin güç durumunu temsil etmek için bir durum makinesi kullanır. Durum makinesi aşağıda gösterilen durumları sağlar:

Araç güç durumu makinesi

Şekil 1. Araba güç durumu makinesi.

En yaygın geçişler mavi renkle vurgulanır. Durumlar ve yaygın geçişler şunlardır:

  • RAM'e askıya alma Araç ve SoC kapalıdır. Hiçbir kod yürütülmez. SoC RAM'e güç sağlanmaya devam eder.
  • VHAL'ı bekleyin. Sürücü, araçla etkileşime geçtiğinde (ör. bir kapıyı açarak) VMCU, SoC'ye güç uygular. AAOS, RAM'de askıya alma durumundan devam eder ve VHAL ile koordinasyonu beklediği VHAL'i bekleme durumuna girer.
  • Açık. VHAL, AAOS'a Açık durumuna girmesini söyler. Bu durumda AAOS tamamen çalışır durumdadır ve sürücüyle etkileşim kurar.
  • Kapatma için hazırlanın. Sürücü sürüşünü tamamladığında VHAL, AAOS'a Kapatma Hazırlığı'na girmesini söyler. Bu durumda ekran ve ses kapalıdır ve AAOS sürücüyle etkileşimde bulunmaz. Android sistemi çalışmaya devam eder ve uygulamaları ve Android sistemini güncelleyebilirsiniz. Güncellemeler (varsa) tamamlandığında Android sistemi, VHAL'ın tamamlanmasını bekler.
  • VHAL'ın tamamlanmasını bekleyin. Bu noktada AAOS, VHAL'e kapanmaya hazır olduğunu bildirir. VMCU'nun SoC'yi derin uykuya geçirmesi ve uygulama işlemciden gücü kaldırması beklenir. Bu durumda, hiçbir kod yürütülmemesine rağmen AAOS RAM'e askıya alınmış durumdadır.

Güç yönetimi modülleri

Güç yönetimi sistemi aşağıdaki modüllerden oluşur:

Modül adı Açıklama
CarPowerManager Java veya C++ API'si.
CarPowerManagementService Güç durumu geçişlerini koordine eder.
CarPowerPolicyDaemon Yerel güç politikası istemcileriyle iletişim kurar.
Araç HAL'si VMCU arayüzü.
Patlayan mısır RAM veya diske askıya alma uygulaması.

Derin uyku/kış uykusu özelliği (Android'i RAM/diskte askıya alma), çekirdekte uygulanır. Bu özellik, /sys/power/state adresinde bulunan özel bir dosya olarak kullanıcı alanına sunulur. Bu dosyaya mem veya disk yazılarak AAOS askıya alınır.

CPMS, güç durumunu diğer hizmetler ve HAL'lerle koordine eder. CPMS, yukarıda açıklanan durum makinesini uygular ve güç durumu geçişi gerçekleştiğinde her gözlemciye bildirim gönderir. Bu hizmet, donanıma mesaj göndermek için VHAL'i de kullanır.

CPMS kontrolü devralana kadar güç politikasını CPPD yönetir. Ayrıca, yerel dinleyicilere güç politikası değişikliği bildirimleri gönderir.

Bazı özellikler VHAL'de tanımlanır. CPMS, VMCU ile iletişim kurmak için bu mülkleri okur ve yazar. Uygulamalar, güç durumu değişikliklerini izlemek için CPM'de tanımlanan arayüzü kullanabilir. Bu arayüz, uygulamaların güç politikası dinleyicileri kaydetmesine de olanak tanır. Bu API, Java'dan çağrılabilir ve @hide / @System API ile ek açıklamaya sahiptir. Bu, API'nin yalnızca ayrıcalıklı uygulamalar tarafından kullanılabileceği anlamına gelir. Bu modüller, uygulamalar ve hizmetler arasındaki ilişki aşağıda gösterilmiştir:

Güç bileşenleri referans şeması

Şekil 2. Güç bileşenleri referans şeması.

Mesaj sırası

Önceki bölümde, güç yönetimi sistemini oluşturan modüller açıklanmıştı. Bu bölümde, modüllerin ve uygulamaların nasıl iletişim kurduğu açıklanmak için derin uykuya girme ve derin uykudan çıkma örnekleri kullanılmaktadır:

Derin uykuya girme

Derin uyku modunu yalnızca VMCU başlatabilir. Derin uyku başlatıldıktan sonra VMCU, VHAL aracılığıyla CPMS'ye bir bildirim gönderir. CPMS, durumu KAPATMAYA HAZIR olarak değiştirir ve CPM tarafından sağlanan yeni bir durum kimliğiyle onStateChanged() yöntemini çağırarak bu durum geçişini tüm gözlemcilere (CPMS'yi izleyen uygulamalar ve hizmetler) yayınlar.

BGBM, uygulamalar/hizmetler ile BGBM'ler arasında aracılık eder. Uygulamalar/hizmetler için onStateChanged() yöntemi, BGBM'nin onStateChanged() yönteminde eşzamanlı olarak çağrılır. Çoğu uygulama ve hizmetin, bu görüşmeden dönmeden önce hazırlıklarını tamamlaması gerekir. Ayrıcalıklı hizmetlerin, PRE_SHUTDOWN_PREPARE, SUSPEND_ENTER, POST_SUSPEND_ENTER için döndükten sonra hazırlıklarına ayarsız olarak devam etmesine izin verilir. Bu durumda ayrıcalıklı hizmetin, hazırlık işlemini tamamladığında sağlanan CompletablePowerStateChangeFuture nesnesinde complete() işlevini çağırması gerekir. SHUTDOWN_PREPARE için asenkron hazırlığa izin verilmediğini unutmayın. DEEP_SLEEP_ENTRY VHAL'e gönderilmeden önce CPMS, VHAL'e düzenli olarak kapatma erteleme istekleri gönderir.

Tüm CPM nesneleri kapatma hazırlıklarını tamamladığında CPMS, AP_POWER_STATE_REPORT öğesini VHAL'e gönderir. VHAL de AP'nin askıya alınmaya hazır olduğunu VMCU'ya bildirir. CPMS, çekirdeği askıya alan askıya alma yöntemini de çağırır.

Yukarıda açıklanan sıra aşağıda gösterilmiştir:

Derin uykuya girme

Şekil 3. Derin uykuya girin.

CPM tarafından sağlanan programlama arayüzleri

Bu bölümde, CPM tarafından sistem uygulamaları ve hizmetleri için sağlanan Java API açıklanmaktadır. Bu API, sistem yazılımının şunları yapmasını sağlar:

  • AP'deki güç durumu değişikliklerini izleyin.
  • Güç politikaları uygulayabilirsiniz.

BGBM tarafından sağlanan API'leri çağırmak için aşağıdaki adımları uygulayın:

  1. BGBM örneğini almak için Car API'yi çağırın.
  2. 1. adımda oluşturulan nesnede uygun yöntemi çağırın.

CarPowerManager nesnesi oluşturma

Bir BGBM nesnesi oluşturmak için Araba nesnesinin getCarManager() yöntemini çağırın. Bu yöntem, BGBM nesneleri oluşturmak için kullanılan bir cephedir. BGBM nesnesi oluşturmak için bağımsız değişken olarak android.car.Car.POWER_SERVICE değerini belirtin.

Car car = Car.createCar(this);
CarPowerManager powerManager =
  (CarPowerManager) car.getCarManager(android.car.Car.POWER_SERVICE);

CarPowerStateListener ve kayıt

Sistem uygulamaları ve hizmetleri, CarPowerManager.CarPowerStateListener uygulayarak güç durumu değişikliği bildirimi alabilir. Bu arayüz, CPMS'nin güç durumu değiştiğinde çağrılan bir geri çağırma işlevi olan onStateChanged() yöntemini tanımlar. Aşağıdaki örnekte, arayüzü uygulayan yeni bir anonim sınıf tanımlanmaktadır:

private final CarPowerManager.CarPowerStateListener powerListener =
  new CarPowerManager.CarPowerStateListener () {
    @Override
     public void onStateChanged(int state) {
       Log.i(TAG, "onStateChanged() state = " + state);
     }
};

Bu dinleyici nesnesine güç durumu geçişini izleme talimatı vermek için yeni bir yürütme iş parçacığı oluşturun ve dinleyiciyi ve bu iş parçacığını BGBM nesnesine kaydedin:

executor = new ThreadPerTaskExecutor();
powerManager.setListener(powerListener, executor);

Güç durumu değiştiğinde, dinleyici nesnesinin onStateChanged() yöntemi yeni güç durumunu temsil eden bir değerle çağrılır. Gerçek değer ile güç durumu arasındaki ilişki CarPowerManager içinde tanımlanır ve aşağıdaki tabloda gösterilir:

Ad Açıklama
STATE_ON Açık durumu girin. Sistem tamamen çalışır durumdadır.
STATE_SHUTDOWN_CANCELLED Kapatma işlemi iptal edilir ve güç durumu normale döndürülür.
STATE_SHUTDOWN_ENTER uygulamaların temizlenmesi ve kapatılmaya hazır olması beklenir.
STATE_POST_SHUTDOWN_ENTER Kapatma hazırlıkları tamamlandı ve VMCU kapatılmaya hazır. Kapatma durumuna girin.
STATE_PRE_SHUTDOWN_PREPARE Kapatma işlemi istenir ancak CPMS henüz işlemi başlatmaz. Ekran ve ses hâlâ açık
STATE_SHUTDOWN_PREPARE Bu süre zarfında Garaj Modu çalışabilir.
STATE_SUSPEND_ENTER uygulamaların temizlenmesi ve RAM'de askıya alınmaya hazır olması beklenir.
STATE_POST_SUSPEND_ENTER RAM'e askıya alma hazırlıkları tamamlandı ve VMCU, RAM'e askıya almaya hazır. Askıya alma durumunu girin.
STATE_SUSPEND_EXIT Askıya alınan cihazı uyandırabilir veya iptal edilen askıya alma durumundan devam ettirebilirsiniz.
STATE_HIBERNATION_ENTER uygulamaların temizlenmesi ve hazırda bekleme moduna geçmeye hazır olması beklenir.
STATE_POST_HIBERNATION_ENTER Uyku moduna hazırlanma işlemleri tamamlandı ve VMCU uyku moduna hazır. Uyku moduna girin.
STATE_HIBERNATION_EXIT Uyku modundan uyanma veya iptal edilen uyku modundan devam etme.
STATE_WAIT_FOR_VHAL Sistem başlatılıyor ancak AÇIK duruma geçmeden önce VHAL ile iletişim kurmayı bekliyor.

CarPowerStateListener'ın kaydını silme

BGBM'ye kayıtlı tüm dinleyici nesnelerinin kaydını iptal etmek için clearListener yöntemini çağırın:

powerManager.clearListener();

Android uygulamanızda sistem entegrasyonu

Entegratörler aşağıdaki öğelerden sorumludur:

  • Android'i askıya almak için çekirdek arayüzünü uygulama.
  • VHAL işlevlerini uygulamak için:
    • Askıya alma veya kapatma işleminin başlatılmasını arabadan Android'e iletme.
    • Android'den araca kapatılmaya hazır mesajı gönderin.
    • Android'in kapatılmasını veya askıya alınmasını Linux çekirdek arayüzü üzerinden başlatma.
  • Cihaz beklemedeyken tüm uyanma kaynaklarının devre dışı olduğundan emin olun.
  • Kapatma işleminin süresiz olarak ertelenmemesini sağlamak için uygulamaların yeterince hızlı kapandığından emin olun.
  • Askıya alma veya hazırda bekleme modunu engellememek için BSP'nin cihaz bileşenlerini güç politikasına göre açtığından (veya kapattığından) emin olun

Çekirdek arayüzü: /sys/power/state

AAOS, bir uygulama veya hizmet /sys/power/state konumundaki bir dosyaya RAM'e askıya alma için mem veya diske askıya alma için disk yazdığında cihazı askıya alma moduna alır. Entegratör, bu dosyayı izleyen ve Linux'u askıya alma güç durumuna geçiren bir işlev sağlamalıdır. Bu işlev, VMCU'ya bir GPIO göndererek VMCU'yu cihazın tamamen kapandığı konusunda bilgilendirebilir. Entegratör, VHAL'ın VMCU'ya son mesajı göndermesi ile sistemin askıya alma veya kapatma moduna geçmesi arasındaki tüm yarış koşullarını kaldırmaktan da sorumludur.

VHAL sorumluluğu

VHAL, araç ağı ile Android arasında bir arayüz sağlar. VHAL:

  • Askıya alma veya kapatma işleminin başlatılmasını araçtan Android'e iletir.
  • Android'den araca kapatılmaya hazır mesajı gönderir.
  • Android'in Linux çekirdek arayüzü üzerinden kapatılmasını veya askıya alınmasını başlatır.

CPMS, VHAL'e kapanmaya hazır olduğunu bildirdiğinde VHAL, kapanmaya hazır mesajını VMCU'ya gönderir. Mesaj genellikle UART, SPI ve USB gibi çip üzerinde çevre birimleri tarafından iletilir. Mesaj gönderildikten sonra CPMS, cihazı askıya almak veya kapatmak için çekirdek komutunu çağırır. Bunu yapmadan önce VHAL veya BSP, VMCU'ya cihazdan gücü kaldırmanın güvenli olduğunu bildirmek için bir GPIO'yu değiştirebilir.

VHAL, VHAL aracılığıyla güç yönetimini kontrol eden aşağıdaki özellikleri desteklemelidir:

Ad Açıklama
AP_POWER_STATE_REPORT Android, VehicleApPowerStateReport enum değerlerini kullanarak bu mülkle VMCU'ya durum geçişlerini bildirir.
AP_POWER_STATE_REQ VMCU, VehicleApPowerStateReq enum değerlerini kullanarak Android'e farklı güç durumlarına geçme talimatı vermek için bu mülkü kullanır.

AP_POWER_STATE_REPORT

Android'in mevcut güç yönetimi durumunu bildirmek için bu özelliği kullanın. Bu mülk iki tam sayı içerir:

  • int32Values[0]: Mevcut durumun VehicleApPowerStateReport enum değeri.
  • int32Values[1]: Erteleme, uyku veya kapatma için milisaniye cinsinden süre. Bu değerin anlamı, ilk değere bağlıdır.

İlk değer aşağıdaki değerlerden biri olabilir. VehicleApPowerStateReport.aidl, hardware/interfaces/automotive/vehicle/aidl/android/hardware/automotive/vehicle içinde depolanan daha ayrıntılı açıklamalar içerir.

Değer adı Açıklama İkinci değer
WAIT_FOR_VHAL AP başlatılıyor ve VHAL ile iletişim kurması gerekiyor.
DEEP_SLEEP_ENTRY AP derin uyku durumuna giriyor. VMCU, ikinci değerde belirtilen zamandan sonra AP'yi tekrar açmalıdır. Ayarlanmalıdır
DEEP_SLEEP_EXIT AP, derin uyku durumundan çıkıyor.
HIBERNATION_ENTRY AP, uyku durumuna giriyor. VMCU, ikinci değerde belirtilen zamandan sonra AP'yi tekrar açmalıdır. Ayarlanmalıdır
HIBERNATION_EXIT AP, hazırda bekleme durumundan çıkıyor.
SHUTDOWN_POSTPONE Android kapanmaya hazır değil. VMCU, AP'yi kapatmadan önce ikinci değerde belirtilen süreyi beklemelidir. Android, ek SHUTDOWN_POSTPONE raporları yayınlayarak ek erteleme isteyebilir. Ayarlanmalıdır
SHUTDOWN_PREPARE Android kapanmaya hazırlanıyor. Ayarlanmalıdır
SHUTDOWN_START AP kapatılmaya hazır. VMCU, ikinci değerde belirtilen zamandan sonra AP'yi tekrar açmalıdır. (VMCU'nun zamanlı açma özelliğini desteklemesi gerekmez.) Ayarlanmalıdır
SHUTDOWN_CANCELLED Android, kapanmaya hazırlanmayı durduruyor ve WAIT_FOR_VHAL'a geçiyor.
AÇIK Android normal şekilde çalışıyor.

Durum, bağımsız olarak veya VMCU üzerinden bir isteğe yanıt olarak ayarlanabilir.

AP_POWER_STATE_REQ

Bu mülk, Android'i farklı bir güç durumuna geçirmek için VMCU tarafından gönderilir ve iki tam sayı içerir:

  • int32Values[0]: Geçiş yapılacak yeni durumu temsil eden VehicleApPowerStateReq enum değeri.
  • int32Values[1]: VehicleApPowerStateShutdownParam enum değeri. Bu değer yalnızca SHUTDOWN_PREPARE mesajı için gönderilir ve içerdiği seçenekleri Android'e iletir.

İlk tam sayı değeri, Android'in geçiş yapacağı yeni durumu temsil eder. Anlamlar VehicleApPowerStateReq.aidl'te tanımlanmıştır ve aşağıda verilmiştir:

Değer adı Açıklama
AÇIK AP tam çalışmaya başlayacaktır.
SHUTDOWN_PREPARE AP kapanmaya hazırlanır. İkinci değer, AP'nin kapanmayı ertelemesine izin verilip verilmediğini ve AP'nin kapanmasını veya derin uykuya geçmesini bekleyip beklemeyeceğini belirtir.
CANCEL_SHUTDOWN AP, kapanmaya hazırlanmayı bırakıp AÇILMAYA hazırlanmalıdır.
TAMAMLANDI AP şimdi kapatılacak veya askıya alınacak.

VehicleApPowerStateShutdownParam, VehicleApPowerStateShutdownParam.aidl içinde tanımlanmışsa. Bu enum aşağıdaki öğeleri içerir:

Değer adı Açıklama
CAN_SLEEP AP tamamen kapanmak yerine derin uykuya girebilir. Erteleme işlemine izin verilir.
CAN_HIBERNATE AP tamamen kapanmak yerine uyku moduna girebilir. Erteleme işlemine izin verilir.
SHUTDOWN_ONLY AP kapanır. Erteleme işlemine izin verilir. Derin uykuya izin verilmez.
SLEEP_IMMEDIATELY AP derin uykuya girebilir ancak hemen uykuya geçmeli veya kapanmalıdır. Erteleme yapılamaz.
HIBERNATE_IMMEDIATELY AP, diske askıya alma durumuna girebilir ancak hemen uyku moduna geçmeli veya kapanmalıdır. Erteleme yapılamaz.
SHUTDOWN_IMMEDIATELY AP hemen kapatılmalıdır. Erteleme yapılamaz. Derin uykuya izin verilmez.

Uyandırma kaynakları

Entegratör, cihaz askıya alma modundayken uygun uyanma kaynaklarını devre dışı bırakmalıdır. Kalp atışları, modem, kablosuz ağ ve Bluetooth, cihazı uyandıran yaygın kaynaklardır. SoC'yi uyandıran tek geçerli uyanma kaynağı, VMCU'dan gelen bir kesinti olmalıdır. Bu durumda, VMCU'nun uzaktan uyanma etkinlikleri (ör. uzaktan motor çalıştırma) için modemi dinleyebileceği varsayılır. Bu işlev AP'ye gönderilirse modemi servis edecek başka bir uyanma kaynağı eklenmelidir.

Uygulamalar

OEM'ler, uygulamaları hızlı bir şekilde kapatılabilmeleri ve sürecin süresiz olarak ertelenmemeleri için dikkatli bir şekilde yazmalıdır.

Ek

Kaynak kod ağacındaki dizinler

İçerik Dizin
CarPowerManager ile ilgili kod. packages/services/Car/car-lib/src/android/car/hardware/power
CarPowerManagementService vb. packages/services/Car/service/src/com/android/car/power
VHAL ile ilgilenen hizmetler (ör. VehicleHal ve HAlClient). packages/services/Car/service/src/com/android/car/hal
VHAL arayüzü ve mülk tanımları. hardware/interfaces/automotive/vehicle/aidl/android/hardware/automotive/vehicle/
CarPowerManager hakkında fikir vermek için örnek uygulama packages/services/Car/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink

Sınıf diyagramı

Bu sınıf şemasında, güç yönetimi sistemindeki Java sınıfları ve arayüzleri gösterilmektedir:

Güç sınıfı şeması

Şekil 4. Güç sınıfı şeması.

Nesne ilişkisi

Şekil 5'te, hangi nesnelerin diğer nesnelere referansı olduğu gösterilmektedir. Kenar, kaynak nesnenin hedef nesneye referans tuttuğu anlamına gelir. Örneğin, VehicleHAL bir PropertyHalService nesnesine referans verir.

Nesne referans şeması

Şekil 5. Nesne referans şeması.