Güç yönetimi

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

Durum geçişleri Araç Ana Kontrol Ünitesi (VMCU) tarafından tetiklenir. VMCU ile iletişim kurmak için entegratörler çeşitli bileşenleri uygulamalıdır. Entegratörler, Araç donanımı soyutlama katmanı (VHAL) ve çekirdek uygulamasıyla entegrasyondan sorumludur. Entegratörler aynı zamanda uyanıklık kaynaklarını devre dışı bırakmaktan ve kapatmaların süresiz olarak ertelenmemesini sağlamaktan da sorumludur.

Terminoloji

Bu terimler bu belgenin tamamında kullanılmaktadır:

uygulama işlemcisi (AP)
Sistemin bir çip üzerindeki kısmı (SoC) .
Yönetim Kurulu Destek Paketi (BSP)
Gömülü bir işletim sisteminin belirli bir donanım ortamında (anakart) çalışmasına olanak tanıyan, yerleşik işletim sistemiyle tümleşik, donanıma özgü önyükleme ürün yazılımını ve aygıt sürücülerini içeren yazılım katmanı.
CarPowerManager (BGBM)
Uygulamaların güç durumu değişikliklerine kaydolması için bir API sunar.
CarPowerManagementService (CPMS)
Arabanın güç durumu makinesini uygular, VHAL ile arayüz oluşturur ve suspend() ve shutdown() için son çağrıları gerçekleştirir.
CarPowerPolicyDaemon (CPPD)
Güç politikası dinleyicisini kaydetmek için yerel işlemlere yönelik AIDL arayüzlerini kullanıma sunar.
genel amaçlı giriş veya çıkış (GPIO)
Genel amaçlı kullanıma yönelik bir dijital sinyal pimi.
donanım soyutlama katmanı (HAL)
Donanım işlevselliğine erişmek için diğer tüm üst düzey modüllerin etkileşimde bulunması gereken bir yazılım katmanı.
kış uykusuna yatmak
Ayrıca Diski Askıya Al (S2D/S4) olarak da anılır. SoC, S4 güç moduna (hazırda bekletme) yerleştirilir ve RAM içeriği kalıcı medyaya (flaş veya disk gibi) yazılır ve tüm sistem kapatılır.
medya işlemcisi (MP)
Çip üzerindeki sisteme bakın (SoC) .
güç yönetimi entegre devresi (PMIC)
Ana bilgisayar sisteminin güç gereksinimlerini yönetmek için kullanılan çip.
çip üzerindeki sistem (SoC)
Genellikle Intel, MediaTek, Nvidia, Qualcomm, Renesas ve Texas Instruments gibi üreticiler tarafından sağlanan, AAOS çalıştıran ana işlemci.
askıya almak
RAM'de Askıya Alma (S2R veya STR) olarak da anılır. SoC, S3 güç moduna yerleştirilir ve RAM açık kalırken CPU kapatılır.
Araç HAL'i (VHAL)
Araç ağıyla arayüz oluşturmak için kullanılan Android API'si. Bu modülün yazılmasından 1. Kademe iş ortağı veya OEM sorumludur. Araç ağı herhangi bir fiziksel katmanı (CAN, LIN, MOST ve Ethernet gibi) kullanabilir. VHAL, AAOS'un araçla etkileşime girmesini sağlamak için bu araç ağını soyutlar.
Araç Arayüzü İşlemcisi (VIP)
Bkz. Araç MCU'su.
Araç Ana Kontrol Ünitesi (VMCU)
Araç ağı ile SoC arasındaki arayüzü sağlayan mikro denetleyici. SoC, VMCU ile USB, UART, SPI ve GPIO sinyalleri aracılığıyla iletişim kurar.

Sistem tasarımı

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

Araba 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:

Araba güç durumu makinesi

Şekil 1. Araba güç durumu makinesi.

En yaygın geçişler mavi renkle vurgulanır. Bunlar durumlar ve ortak geçişlerdir:

  • RAM'i askıya al. Araç ve SoC kapalı. Hiçbir kod yürütülmüyor. Güç SoC RAM'de korunur.
  • VHAL'ı bekleyin. Sürücü, örneğin bir kapıyı açarak araçla etkileşime girdiğinde VMCU, SoC'ye güç uygular. AAOS, RAM'e Askıya Alma durumundan devam eder ve VHAL ile koordinasyonu beklediği VHAL'i Bekle moduna girer.
  • Açık. VHAL, AAOS'a Açık durumuna girmesini söyler. Bu durumda, AAOS tamamen çalışıyor ve sürücüyle etkileşimde bulunuyor.
  • Kapatma Hazırlığı. Sürücü sürüşü bitirdiğinde 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şime girmez. Android sistemi hala çalışıyor ve uygulamaları ve Android sistemini güncellemek ücretsizdir. Varsa güncellemeler tamamlandığında Android sistemi VHAL Bitirmeyi Bekle durumuna girer.
  • VHAL Finish'i bekleyin. Bu noktada AAOS, VHAL'e kapanmaya hazır olduğunu bildirir. VMCU'nun SoC'yi Derin Uyku'ya yerleştirmesi ve uygulama işlemcisinin gücünü kesmesi bekleniyor. AAOS, herhangi bir kod yürütülmemesine rağmen RAM'i Askıya Al durumundadır.

Güç yönetimi modülleri

Güç yönetim sistemi şu modüllerden oluşur:

Modül Adı Tanım
ArabaGüç Yöneticisi Java veya C++ API'si.
ArabaGüçYönetim Hizmeti Güç durumu geçişlerini koordine eder.
ArabaGüç PolitikasıDaemon Yerel güç politikası istemcileriyle iletişim kurar.
Araç HAL'i VMCU'ya arayüz.
Çekirdek RAM veya disk uygulamasını askıya alın.

Derin uyku/hazırda bekletme özelliği (Android'i RAM/diske askıya alma) çekirdekte uygulanır. Bu özellik, /sys/power/state konumunda 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 bir güç durumu geçişi meydana geldiğinde her gözlemciye bildirim gönderir. Bu hizmet aynı zamanda donanıma mesaj göndermek için VHAL'i kullanır.

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

Bazı özellikler VHAL'de tanımlanmıştır. VMCU ile iletişim kurmak için CPMS bu özellikleri okur ve yazar. uygulamalar, güç durumu değişikliklerini izlemek için CPM'de tanımlanan arayüzü kullanabilir. Bu arayüz aynı zamanda uygulamaların güç politikası dinleyicilerini kaydetmesine de olanak tanır. Bu API, Java'dan çağrılabilir ve @hide / @System API ile açıklanır; bu, 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österilmektedir:

Güç bileşenleri referans diyagramı

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

Mesaj sırası

Önceki bölümde güç yönetim sistemini oluşturan modüller anlatılmıştır. Bu bölümde modüllerin ve uygulamaların nasıl iletişim kurduğunu açıklamak için derin uykuya girme ve derin uykudan çıkma örnekleri kullanılır:

Derin uykuya girin

Yalnızca VMCU derin uykuyu başlatabilir. Derin uyku başlatıldığında VMCU, VHAL aracılığıyla CPMS'ye bir bildirim gönderir. CPMS, durumu SHUTDOWN PREPARE 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.

CPM, uygulamalar/hizmetler ile CPMS arasında aracılık eder. Uygulamalar/hizmetler için onStateChanged() yöntemi, CPM'nin onStateChanged() yönteminde eşzamanlı olarak çağrılır. Çoğu uygulama ve hizmetin bu çağrıdan geri dönmeden önce hazırlıklarını tamamlaması gerekir. Ayrıcalıklı servislerin PRE_SHUTDOWN_PREPARE , SUSPEND_ENTER , POST_SUSPEND_ENTER için dönüş yaptıktan sonra asenkron olarak hazırlıklarına devam etmelerine izin verilir. Bu durumda ayrıcalıklı hizmetin, hazırlığını tamamladığında sağlanan CompletablePowerStateChangeFuture nesnesindecomplete() öğesini çağırması gerekir. SHUTDOWN_PREPARE için eşzamansız hazırlığa izin verilmediğini unutmayın. DEEP_SLEEP_ENTRY , VHAL'e gönderilmeden önce CPMS, periyodik olarak kapatma erteleme isteklerini VHAL'e gönderir.

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

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

Derin uykuya girin

Şekil 3. Derin uykuya girin.

CPM tarafından sağlanan programlama arayüzleri

Bu bölümde sistem uygulamaları ve hizmetleri için CPM tarafından 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ını uygulayın.

CPM tarafından sağlanan API'leri çağırmak için şu adımları kullanın:

  1. BGBM örneğini edinmek için Araba API'sini çağırın.
  2. Adım 1'de oluşturulan nesnede uygun yöntemi çağırın.

CarPowerManager nesnesi oluşturma

Bir CPM nesnesi oluşturmak için Araba nesnesinin getCarManager() yöntemini çağırın. Bu yöntem CPM nesneleri oluşturmak için kullanılan bir cephedir. Bir CPM nesnesi oluşturmak için argüman olarak android.car.Car.POWER_SERVICE öğesini belirtin.

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

CarPowerStateDinleyici ve kayıt

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

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

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

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

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

İsim Tanım
STATE_ON Açık durumuna girin. Sistem tamamen çalışır durumdadır.
STATE_SHUTDOWN_CANCELLED Kapatma iptal edilir ve güç durumu normal duruma döndürülür.
STATE_SHUTDOWN_ENTER uygulamaların temizlenmesi ve kapatılmaya hazır olması bekleniyor.
STATE_POST_SHUTDOWN_ENTER Kapatma hazırlıkları tamamlandı ve VMCU kapatmaya hazır. Kapatma durumuna girin.
STATE_PRE_SHUTDOWN_PREPARE Kapatma işlemi isteniyor ancak CPMS işlemi henüz başlatmıyor. Ekran ve ses hala açık
STATE_SHUTDOWN_PREPARE Garaj Modu bu süre boyunca çalışabilir.
STATE_SUSPEND_ENTER uygulamaların temizlenmesi ve RAM'de askıya alınmaya hazır olması bekleniyor.
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 durumuna girin.
STATE_SUSPEND_EXIT Askıya alma durumundan uyanın veya iptal edilen bir askıya alma işleminden devam edin.
STATE_HIBERNATION_ENTER uygulamaların temizlenmesi ve hazırda bekletme moduna hazır olması bekleniyor.
STATE_POST_HIBERNATION_ENTER Hazırda bekleme hazırlıkları tamamlandı ve VMCU hazırda bekletme moduna hazır Hazırda bekletme durumuna girin.
STATE_HIBERNATION_EXIT Hazırda bekletme modundan uyanın veya iptal edilen bir hazırda bekletme modundan devam edin.
STATE_WAIT_FOR_VHAL Sistem başlatılıyor ancak AÇIK duruma geçmeden önce VHAL ile iletişim kurmayı bekliyor.

CarPowerStateListener kaydını silme

CPM'ye kayıtlı tüm dinleyici nesnelerinin kaydını silmek 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 şu amaçlarla uygulamak:
    • Askıya alma veya kapatma işleminin başlatılmasını arabadan Android'e yayın.
    • Kapatmaya hazır mesajını Android'den araca gönderin.
    • Linux çekirdek arayüzü aracılığıyla Android'in kapatılmasını veya askıya alınmasını başlatın.
  • Cihaz askıya alındığında tüm uyanık kalma kaynaklarının devre dışı bırakıldığından emin olun.
  • Kapatma işlemini süresiz olarak ertelememek için uygulamaların yeterince hızlı kapandığından emin olun.
  • Askıya alma veya hazırda bekletme 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, RAM'e askıya alma için mem veya disk askıya alma için diske /sys/power/state konumunda bulunan bir dosyaya yazdığında, cihazı askıya alma moduna geçirir. Entegratörün bu dosyayı izleyen ve Linux'u güç askıya alma durumuna sokan bir işlev sağlaması gerekir. Bu işlev, VMCU'ya cihazın tamamen kapandığını bildirmek için VMCU'ya bir GPIO gönderebilir. Entegratör ayrıca VHAL'in VMCU'ya son mesajı göndermesi ile sistemin askıya alma veya kapatma moduna geçmesi arasındaki yarış koşullarının ortadan kaldırılmasından 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ı arabadan Android'e yayar.
  • Kapatmaya hazır mesajını Android'den araca gönderir.
  • Linux çekirdek arayüzü aracılığıyla Android'in kapatılmasını veya askıya alınmasını başlatır.

CPMS, VHAL'e kapanmaya hazır olduğunu bildirdiğinde, VHAL, kapatmaya hazır mesajını VMCU'ya gönderir. Tipik olarak UART, SPI ve USB gibi çip üzerindeki çevre birimleri mesajı iletir. 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 cihazın gücünü kesmenin 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:

İsim Tanım
AP_POWER_STATE_REPORT Android, AraçApPowerStateReport numaralandırma değerlerini kullanarak bu özellik ile VMCU'ya durum geçişlerini raporlar.
AP_POWER_STATE_REQ VMCU, Android'e AraçApPowerStateReq numaralandırma değerlerini kullanarak farklı güç durumlarına geçiş yapma talimatını vermek için bu özelliği kullanır.

AP_POWER_STATE_REPORT

Android'in mevcut güç yönetimi durumunu raporlamak için bu özelliği kullanın. Bu özellik iki tamsayı içerir:

  • int32Values[0] : Geçerli durumun AraçApPowerStateReport numaralandırması.
  • int32Values[1] : Milisaniye cinsinden erteleme veya uyku veya kapatma süresi. Bu değerin anlamı ilk değere bağlıdır.

İlk değer aşağıdaki değerlerden birini alabilir. VehicleApPowerStateReport.aidl hardware/interfaces/automotive/vehicle/aidl/android/hardware/automotive/vehicle dosyasında saklanan daha spesifik açıklamalar içerir.

Değer adı Tanım İkinci değer
WAIT_FOR_VHAL AP başlıyor ve VHAL ile iletişim kurması gerekiyor.
DEEP_SLEEP_ENTRY AP derin uyku durumuna giriyor. VMCU, ikinci değerde belirtilen sürenin sonunda AP'yi tekrar açmalıdır. Ayarlanmalı
DEEP_SLEEP_EXIT AP derin uyku durumundan çıkıyor.
HIBERNATION_ENTRY AP hazırda bekletme durumuna giriyor. VMCU, ikinci değerde belirtilen sürenin sonunda AP'yi tekrar açmalıdır. Ayarlanmalı
HİBERNATION_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 talep edebilir. Ayarlanmalı
SHUTDOWN_PREPARE Android kapanmaya hazırlanıyor. Ayarlanmalı
SHUTDOWN_START AP kapanmaya hazır. VMCU, ikinci değerde belirtilen sürenin sonunda AP'yi tekrar açmalıdır. (VMCU'nun zamanlanmış açma özelliğini desteklemesi gerekli değildir.) Ayarlanmalı
SHUTDOWN_CANCELED Android kapanma hazırlığına son veriyor ve WAIT_FOR_VHAL'a geçecek.
AÇIK Android normal çalışıyor.

Durum bağımsız olarak veya VMCU aracılığıyla bir talebe yanıt olarak ayarlanabilir.

AP_POWER_STATE_REQ

Bu özellik, 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 numaralandırma değeri.
  • int32Values[1] : VehicleApPowerStateShutdownParam numaralandırma 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. Anlambilim, VehicleApPowerStateReq.aidl tanımlanmış ve aşağıda verilmiştir:

Değer adı Tanım
AÇIK AP tam çalışmaya başlamalıdır.
SHUTDOWN_PREPARE AP kapanmaya hazırlanmalı. İkinci değer, AP'nin kapatmayı ertelemesine izin verilip verilmediğini ve AP'nin kapanmayı mı yoksa derin uykuya mı girmeyi beklemesi gerektiğini gösterir.
CANCEL_SHUTDOWN AP kapanmaya hazırlanmayı bırakmalı ve AÇIK duruma geçmeye hazırlanmalı.
BİTİRİLDİ AP şimdi kapatılacak veya askıya alınacak.

VehicleApPowerStateShutdownParam , VehicleApPowerStateShutdownParam.aidl tanımlanmıştır. Bu numaralandırma şu öğelere sahiptir:

Değer adı Tanım
UYUYABİLİR AP tamamen kapanmak yerine derin uyku moduna geçebilir. Ertelemeye izin verilir.
CAN_HIBERNATE AP tamamen kapanmak yerine hazırda bekletme moduna girebilir. Ertelemeye izin verilir.
SADECE KAPATMA AP'nin kapatılması gerekiyor. Ertelemeye izin verilir. Derin uykuya izin verilmez.
SLEEP_HEMEN AP derin uykuya girebilir ancak ya uykuya dalmalı ya da hemen kapatılmalıdır. Ertelemeye izin verilmez.
HİBERNAT_HEMEN AP, diski askıya alma moduna geçebilir ancak ya hazırda bekletme moduna geçmeli ya da hemen kapatılmalıdır. Ertelemeye izin verilmez.
HEMEN KAPATILDI AP'nin acilen kapatılması gerekiyor. Ertelemeye izin verilmez. Derin uykuya izin verilmez.

Uyandırma kaynakları

Cihaz askıya alma modundayken entegratörün uygun uyandırma kaynaklarını devre dışı bırakması gerekir. Yaygın uyandırma kaynakları arasında kalp atışları, modem, Wi-Fi ve Bluetooth bulunur. Tek geçerli uyandırma kaynağı, SoC'yi uyandırmak için VMCU'dan gelen bir kesinti olmalıdır. Bu, VMCU'nun uzaktan uyandırma olayları (uzaktan motor çalıştırma gibi) için modemi dinleyebileceğini varsayar. Bu işlevsellik AP'ye gönderilirse modeme hizmet verecek başka bir uyandırma kaynağının eklenmesi gerekir.

Uygulamalar

OEM'lerin, uygulamaları hızla kapatabilmeleri ve süreci süresiz olarak ertelememeleri için yazarken dikkatli olmaları gerekir.

Ek

Kaynak kod ağacındaki dizinler

İçerik Rehber
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
VehicleHal ve HAlClient gibi VHAL ile ilgili hizmetler. packages/services/Car/service/src/com/android/car/hal
VHAL arayüzü ve özellik tanımları. hardware/interfaces/automotive/vehicle/aidl/android/hardware/automotive/vehicle/
CarPowerManager hakkında fikir veren örnek uygulama packages/services/Car/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink

Sınıf diyagramı

Bu sınıf şeması, güç yönetimi sistemindeki Java sınıflarını ve arayüzlerini görüntüler:

Güç sınıfı diyagramı

Şekil 4. Güç sınıfı diyagramı.

Nesne ilişkisi

Şekil 5, hangi nesnelerin diğer nesnelere referanslara sahip olduğunu göstermektedir. Kenar, kaynak nesnenin hedef nesneye bir referans tuttuğu anlamına gelir. Örneğin, AraçHAL'in bir PropertyHalService nesnesine referansı vardır.

Nesne referans diyagramı

Şekil 5. Nesne referans diyagramı.