Manajemen daya

Untuk mendukung pengelolaan daya khusus kendaraan, Android menyediakan layanan CarPowerManagementService dan antarmuka CarPowerManager.

Transisi status dipicu oleh Unit Kontrol Utama Kendaraan (VMCU). Untuk berkomunikasi dengan VMCU, integrator harus menerapkan beberapa komponen. Integrator bertanggung jawab untuk berintegrasi dengan lapisan abstraksi hardware kendaraan (VHAL) dan implementasi kernel. Integrator juga bertanggung jawab untuk menonaktifkan sumber aktif dan memastikan bahwa penonaktifan tidak ditunda tanpa batas waktu.

Terminologi

Istilah berikut digunakan di seluruh dokumen ini:

prosesor aplikasi (AP)
Bagian dari sistem di chip (SoC).
Board Support Package (BSP)
Lapisan software yang berisi firmware booting khusus hardware dan driver perangkat yang memungkinkan sistem operasi tersemat berfungsi di lingkungan hardware tertentu (motherboard), yang terintegrasi dengan sistem operasi tersemat.
CarPowerManager (CPM)
Mengekspos API agar aplikasi dapat mendaftar untuk menerima perubahan status daya.
CarPowerManagementService (CPMS)
Mengoordinasikan transisi status daya, berinteraksi dengan VHAL untuk kontrol status daya, dan melakukan panggilan terakhir untuk menangguhkan dan mematikan.
CarPowerPolicyDaemon (CPPD)
Mengelola kebijakan daya dan mengekspos antarmuka AIDL agar proses native dapat mendaftarkan pemroses kebijakan daya.
input atau output tujuan umum (GPIO)
Pin sinyal digital untuk penggunaan umum.
Hardware Abstraction Layer (HAL)
Lapisan software yang harus berinteraksi dengan semua modul tingkat yang lebih tinggi lainnya untuk mengakses fungsionalitas hardware.
hibernasi
Juga disebut sebagai Suspend-to-Disk (S2D/S4). SoC ditempatkan ke mode daya S4 (hibernasi) dan konten RAM ditulis ke media non-volatile (seperti flash atau disk) dan seluruh sistem dimatikan.
prosesor media (MP)
Lihat sistem di chip (SoC).
sirkuit terpadu pengelolaan daya (PMIC)
Chip yang digunakan untuk mengelola persyaratan daya untuk sistem host.
sistem di chip (SoC)
Prosesor utama yang menjalankan AAOS, biasanya disediakan oleh produsen seperti Intel, MediaTek, Nvidia, Qualcomm, Renesas, dan Texas Instruments.
menangguhkan
Juga disebut sebagai Suspend-to-RAM (S2R atau STR). SoC ditempatkan ke mode daya S3 dan CPU dimatikan sementara RAM tetap diaktifkan.
HAL Kendaraan (VHAL)
Android API yang digunakan untuk berinteraksi dengan jaringan kendaraan. Partner atau OEM Tingkat 1 bertanggung jawab untuk menulis modul ini. Jaringan kendaraan dapat menggunakan lapisan fisik apa pun (seperti CAN, LIN, MOST, dan Ethernet). VHAL mengabstraksi jaringan kendaraan ini untuk memungkinkan AAOS berinteraksi dengan kendaraan.
Vehicle Interface Processor (VIP)
Lihat MCU Kendaraan.
Unit Kontrol Utama Kendaraan (VMCU)
Mikrokontroler yang menyediakan antarmuka antara jaringan kendaraan dan SoC. SoC berkomunikasi dengan VMCU melalui sinyal USB, UART, SPI, dan GPIO.

Desain sistem

Bagian ini menjelaskan cara AAOS merepresentasikan status daya prosesor aplikasi dan modul yang menerapkan sistem pengelolaan daya. Materi ini juga menjelaskan cara kerja modul ini bersama-sama dan cara transisi status biasanya terjadi.

Mesin status daya mobil

AAOS menggunakan mesin status untuk merepresentasikan status daya AP. Mesin status menyediakan status yang diilustrasikan di bawah:

Mesin status daya mobil

Gambar 1. Mesin status daya mobil.

Transisi yang paling umum ditandai dengan warna biru. Berikut adalah status dan transisi umum:

  • Tidur ke RAM. Kendaraan dan SoC nonaktif. Tidak ada kode yang sedang dieksekusi. Daya dipertahankan ke RAM SoC.
  • Tunggu VHAL. Saat pengemudi berinteraksi dengan kendaraan, misalnya, dengan membuka pintu, VMCU akan menerapkan daya ke SoC. AAOS dilanjutkan dari Suspend-to-RAM dan memasuki Wait for VHAL, tempatnya menunggu koordinasi dengan VHAL.
  • Aktif. VHAL memberi tahu AAOS untuk memasuki status Aktif. Dalam status ini, AAOS berjalan sepenuhnya dan berinteraksi dengan pengemudi.
  • Persiapan Penutupan. Setelah pengemudi selesai mengemudi, VHAL akan memberi tahu AAOS untuk memasuki Shutdown Prepare. Dalam status ini, layar dan audio nonaktif dan AAOS tidak berinteraksi dengan pengemudi. Sistem Android masih berjalan dan bebas mengupdate aplikasi dan sistem Android. Setelah update selesai, sistem Android akan memasuki status Wait for VHAL Finish.
  • Tunggu hingga VHAL Selesai. Pada tahap ini, AAOS memberi tahu VHAL bahwa sistem siap dimatikan. VMCU diharapkan menempatkan SoC dalam Deep Sleep dan menghilangkan daya dari prosesor aplikasi. AAOS kemudian berada dalam status Suspend-to-RAM, meskipun tidak ada kode yang sedang dieksekusi.

Modul pengelolaan daya

Sistem pengelolaan daya terdiri dari modul berikut:

Nama modul Deskripsi
CarPowerManager Java atau C++ API.
CarPowerManagementService Mengoordinasikan transisi status daya dan mendelegasikan pengelolaan kebijakan daya ke CarPowerPolicyDaemon.
CarPowerPolicyDaemon Mengelola kebijakan daya dan berkomunikasi dengan klien kebijakan daya native.
HAL Kendaraan Antarmuka ke VMCU.
Kernel Implementasi penangguhan ke RAM atau disk.

Fitur tidur nyenyak/hibernasi (menangguhkan Android ke RAM/disk) diimplementasikan di kernel. Fitur ini diekspos ke ruang pengguna sebagai file khusus yang terletak di /sys/power/state. AAOS ditangguhkan dengan menulis mem atau disk ke file ini.

CPMS mengoordinasikan status daya dengan layanan dan HAL lainnya. CPMS mengimplementasikan mesin status yang dijelaskan di atas dan mengirimkan notifikasi ke setiap pengamat saat transisi status daya terjadi. Layanan ini juga menggunakan VHAL untuk mengirim pesan ke hardware.

CPPD adalah sumber tepercaya untuk kebijakan daya. Layanan ini mengelola kebijakan daya di seluruh siklus proses perangkat dan memberi tahu CPMS, VHAL, dan pendengar native lainnya tentang perubahan kebijakan daya. CPMS mendelegasikan permintaan perubahan kebijakan daya ke CPPD.

CPMS berkomunikasi dengan VMCU dengan membaca dan menulis properti VHAL yang terkait dengan status daya, seperti AP_POWER_STATE_REQ dan AP_POWER_STATE_REPORT. Aplikasi dapat menggunakan antarmuka yang ditentukan dalam CPM untuk memantau perubahan status daya. Antarmuka ini juga memungkinkan aplikasi mendaftarkan pemroses kebijakan daya. Java API ini diberi anotasi dengan @SystemApi dan @hide, sehingga hanya tersedia untuk aplikasi dengan hak istimewa. Hubungan antara modul, aplikasi, dan layanan ini diilustrasikan di bawah:

Diagram referensi komponen daya

Gambar 2. Diagram referensi komponen daya.

Urutan pesan

Bagian sebelumnya menjelaskan modul yang membentuk sistem pengelolaan daya. Bagian ini menggunakan contoh masuk ke fase tidur dalam dan keluar dari fase tidur dalam untuk menjelaskan cara modul dan aplikasi berkomunikasi:

Masuk ke fase tidur dalam

Hanya VMCU yang dapat memulai fase tidur dalam. Setelah fase tidur dalam dimulai, VMCU mengirimkan notifikasi ke CPMS melalui VHAL. CPMS mengubah status menjadi SHUTDOWN PREPARE dan menyiarkan transisi status ini ke semua pengamat (aplikasi dan layanan yang memantau CPMS) dengan memanggil metode onStateChanged() dengan ID status baru yang disediakan oleh CPM.

CPM memediasi antara aplikasi/layanan dan CPMS. Metode onStateChanged() untuk aplikasi/layanan dipanggil secara sinkron dalam metode onStateChanged() CPM. Sebagian besar aplikasi dan layanan harus menyelesaikan persiapan sebelum kembali dari panggilan ini. Layanan istimewa diizinkan untuk melanjutkan persiapan secara asinkron setelah kembali untuk PRE_SHUTDOWN_PREPARE, SUSPEND_ENTER, POST_SUSPEND_ENTER. Dalam hal ini, layanan istimewa seharusnya memanggil complete() pada objek CompletablePowerStateChangeFuture yang disediakan saat selesai melakukan persiapannya. Perhatikan bahwa persiapan asinkron tidak diizinkan untuk SHUTDOWN_PREPARE. Sebelum DEEP_SLEEP_ENTRY dikirim ke VHAL, CPMS secara berkala mengirim permintaan penundaan penonaktifan ke VHAL.

Setelah semua objek CPM menyelesaikan persiapan penonaktifan, CPMS akan mengirimkan AP_POWER_STATE_REPORT ke VHAL, yang kemudian memberi tahu VMCU bahwa AP siap ditangguhkan. CPMS juga memanggil metode penangguhannya, yang menangguhkan kernel.

Urutan yang dijelaskan di atas diilustrasikan di bawah ini:

Masuk ke fase tidur dalam

Gambar 3. Masuk ke mode tidur nyenyak.

Antarmuka pemrograman yang disediakan oleh CPM

Bagian ini menjelaskan Java API yang disediakan oleh CPM untuk aplikasi dan layanan sistem. API ini memungkinkan software sistem untuk:

  • Memantau perubahan status daya di AP.
  • Menerapkan kebijakan daya.

Gunakan langkah-langkah berikut untuk memanggil API yang disediakan oleh CPM:

  1. Untuk mendapatkan instance CPM, panggil Car API.
  2. Panggil metode yang sesuai pada objek yang dibuat di Langkah 1.

Buat objek CarPowerManager

Untuk membuat objek CPM, panggil metode getCarManager() objek Car. Metode ini adalah fasad yang digunakan untuk membuat objek CPM. Tentukan android.car.Car.POWER_SERVICE sebagai argumen untuk membuat objek CPM.

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

CarPowerStateListener dan pendaftaran

Aplikasi dan layanan sistem dapat menerima notifikasi perubahan status daya dengan menerapkan CarPowerManager.CarPowerStateListener. Antarmuka ini menentukan satu metode onStateChanged(), yang merupakan fungsi callback yang dipanggil saat status daya CPMS berubah. Contoh berikut menentukan class anonim baru yang mengimplementasikan antarmuka:

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

Untuk menginstruksikan objek pemroses ini agar memantau transisi status daya, buat thread eksekusi baru dan daftarkan pemroses dan thread ini ke objek CPM:

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

Saat status daya diubah, metode onStateChanged() objek pendengar dipanggil dengan nilai untuk merepresentasikan status daya baru. Asosiasi antara nilai sebenarnya dan status daya ditentukan dalam CarPowerManager dan ditampilkan dalam tabel berikut:

Nama Deskripsi
STATE_ON Memasuki status aktif. Sistem beroperasi sepenuhnya.
STATE_SHUTDOWN_CANCELLED Penonaktifan dibatalkan dan status daya dikembalikan ke status normal.
STATE_SHUTDOWN_ENTER Aplikasi diharapkan dibersihkan dan siap untuk dimatikan.
STATE_POST_SHUTDOWN_ENTER Persiapan untuk mematikan telah selesai dan VMCU siap untuk dimatikan. Masuk ke status dimatikan.
STATE_PRE_SHUTDOWN_PREPARE Proses penonaktifan diminta, tetapi CPMS belum memulai prosesnya. Layar dan audio masih aktif
STATE_SHUTDOWN_PREPARE Mode Garasi dapat berjalan selama periode tersebut.
STATE_SUSPEND_ENTER Aplikasi diharapkan membersihkan dan siap untuk penangguhan ke RAM.
STATE_POST_SUSPEND_ENTER Persiapan untuk suspend-to-RAM telah selesai dan VMCU siap untuk suspend-to-RAM. Memasuki status ditangguhkan.
STATE_SUSPEND_EXIT Membangunkan dari penangguhan atau melanjutkan dari penangguhan yang dibatalkan.
STATE_HIBERNATION_ENTER Aplikasi diharapkan dibersihkan dan siap untuk hibernasi.
STATE_POST_HIBERNATION_ENTER Persiapan untuk hibernasi telah selesai dan VMCU siap untuk memasuki status hibernasi.
STATE_HIBERNATION_EXIT Membangunkan perangkat dari hibernasi atau melanjutkan dari hibernasi yang dibatalkan.
STATE_WAIT_FOR_VHAL Sistem sedang dimulai, tetapi menunggu untuk menjalin komunikasi dengan VHAL sebelum beralih ke status AKTIF.

Pembatalan pendaftaran CarPowerStateListener

Untuk membatalkan pendaftaran semua objek pemroses yang terdaftar ke CPM, panggil metode clearListener:

powerManager.clearListener();

Integrasi sistem pada penerapan Android Anda

Integrator bertanggung jawab atas item berikut:

  • Menerapkan antarmuka kernel untuk menangguhkan Android.
  • Menerapkan fungsi VHAL untuk:
    • Menyebarkan inisiasi penangguhan atau penonaktifan dari mobil ke Android.
    • Kirim pesan siap dimatikan dari Android ke mobil.
    • Memulai penonaktifan atau penangguhan Android melalui antarmuka kernel Linux.
  • Pastikan semua sumber aktif dinonaktifkan saat perangkat dalam mode ditangguhkan.
  • Pastikan aplikasi dimatikan dengan cukup cepat agar tidak menunda proses penonaktifan tanpa batas waktu.
  • Pastikan BSP mengaktifkan (atau menonaktifkan) komponen perangkat sesuai dengan kebijakan daya agar tidak memblokir penangguhan atau hibernasi

Antarmuka kernel: /sys/power/state

AAOS menempatkan perangkat ke mode ditangguhkan saat aplikasi atau layanan menulis mem untuk tunda ke RAM atau disk untuk tunda ke disk ke dalam file yang terletak di /sys/power/state. Integrator harus menyediakan fungsi yang memantau file ini dan menempatkan Linux ke status daya ditangguhkan. Fungsi ini dapat mengirim GPIO ke VMCU untuk memberi tahu VMCU bahwa perangkat telah dimatikan sepenuhnya. Integrator juga bertanggung jawab untuk menghilangkan kondisi persaingan (race condition) antara VHAL yang mengirimkan pesan akhir ke VMCU dan sistem yang masuk ke mode ditangguhkan atau dimatikan.

Tanggung jawab VHAL

VHAL menyediakan antarmuka antara jaringan kendaraan dan Android. VHAL:

  • Menyebarkan inisiasi penangguhan atau penonaktifan dari mobil ke Android.
  • Mengirim pesan siap mematikan sistem dari Android ke mobil.
  • Memulai shutdown atau penangguhan Android melalui antarmuka kernel Linux.

Saat CPMS memberi tahu VHAL bahwa CPMS siap dimatikan, VHAL akan mengirimkan pesan siap dimatikan ke VMCU. Biasanya, periferal on-chip seperti UART, SPI, dan USB mengirimkan pesan. Setelah pesan dikirim, CPMS memanggil perintah kernel untuk menangguhkan atau mematikan perangkat. Sebelum melakukannya, VHAL atau BSP dapat mengalihkan GPIO untuk menginstruksikan VMCU bahwa perangkat aman untuk dicabut dayanya.

VHAL harus mendukung properti berikut, yang mengontrol pengelolaan daya melalui VHAL:

Nama Deskripsi
AP_POWER_STATE_REPORT Android melaporkan transisi status ke VMCU dengan properti ini, menggunakan nilai enum VehicleApPowerStateReport.
AP_POWER_STATE_REQ VMCU menggunakan properti ini untuk menginstruksikan Android bertransisi ke status daya yang berbeda, menggunakan nilai enum VehicleApPowerStateReq.

AP_POWER_STATE_REPORT

Gunakan properti ini untuk melaporkan status pengelolaan daya Android saat ini. Properti ini berisi dua bilangan bulat:

  • int32Values[0]: enum VehicleApPowerStateReport dari status saat ini.
  • int32Values[1]: Waktu dalam milidetik untuk menunda, menidurkan, atau mematikan. Arti nilai ini bergantung pada nilai pertama.

Nilai pertama dapat menggunakan salah satu nilai berikut. VehicleApPowerStateReport.aidl berisi deskripsi yang lebih spesifik, yang disimpan di hardware/interfaces/automotive/vehicle/aidl/android/hardware/automotive/vehicle.

Nama nilai Deskripsi Nilai kedua
WAIT_FOR_VHAL AP dimulai dan perlu menjalin komunikasi dengan VHAL.
DEEP_SLEEP_ENTRY AP memasuki status tidur total. VMCU harus mengaktifkan kembali AP setelah waktu yang ditentukan dalam nilai kedua. Harus ditetapkan
DEEP_SLEEP_EXIT AP keluar dari status tidur total.
HIBERNATION_ENTRY AP memasuki status hibernasi. VMCU harus mengaktifkan kembali AP setelah waktu yang ditentukan dalam nilai kedua. Harus ditetapkan
HIBERNATION_EXIT AP keluar dari status hibernasi.
SHUTDOWN_POSTPONE Android belum siap dimatikan. VMCU harus menunggu waktu yang ditentukan dalam nilai kedua sebelum mematikan AP. Android dapat meminta penundaan tambahan dengan mengeluarkan laporan SHUTDOWN_POSTPONE tambahan. Harus ditetapkan
SHUTDOWN_PREPARE Android sedang bersiap untuk dimatikan. Harus ditetapkan
SHUTDOWN_START AP siap dimatikan. VMCU harus mengaktifkan kembali AP setelah waktu yang ditentukan dalam nilai kedua. (VMCU tidak diperlukan untuk mendukung fitur pengaktifan terjadwal.) Harus ditetapkan
SHUTDOWN_CANCELLED Android berhenti bersiap untuk dimatikan dan akan melanjutkan ke WAIT_FOR_VHAL.
AKTIF Android berjalan normal.

Status dapat ditetapkan secara mandiri atau sebagai respons terhadap permintaan melalui VMCU.

AP_POWER_STATE_REQ

Properti ini dikirim oleh VMCU untuk mentransisikan Android ke status daya yang berbeda dan berisi dua bilangan bulat:

  • int32Values[0]: Nilai enum VehicleApPowerStateReq, yang merepresentasikan status baru yang akan ditransisikan.
  • int32Values[1]: Nilai enum VehicleApPowerStateShutdownParam. Nilai ini dikirim hanya untuk pesan SHUTDOWN_PREPARE dan mengirimkan opsi yang dikandungnya ke Android.

Nilai bilangan bulat pertama mewakili status baru yang akan ditransisikan Android. Semantik ditentukan dalam VehicleApPowerStateReq.aidl dan disediakan di bawah:

Nama nilai Deskripsi
AKTIF AP harus memulai operasi penuh.
SHUTDOWN_PREPARE AP harus bersiap untuk dimatikan. Nilai kedua menunjukkan apakah AP diizinkan untuk menunda penonaktifan dan apakah AP harus bersiap untuk dimatikan atau memasuki mode tidur lelap.
CANCEL_SHUTDOWN AP akan berhenti bersiap untuk dimatikan dan bersiap untuk AKTIF.
SELESAI AP akan dimatikan atau ditangguhkan.

VehicleApPowerStateShutdownParam ditentukan di VehicleApPowerStateShutdownParam.aidl. Enum ini memiliki elemen berikut:

Nama nilai Deskripsi
CAN_SLEEP AP dapat memasuki mode tidur nyenyak, bukan dimatikan sepenuhnya. Penundaan diizinkan.
CAN_HIBERNATE AP dapat memasuki hibernasi, bukan dimatikan sepenuhnya. Penundaan diizinkan.
SHUTDOWN_ONLY AP harus dimatikan. Penundaan diizinkan. Fase tidur dalam tidak diizinkan.
SLEEP_IMMEDIATELY AP dapat memasuki tidur nyenyak, tetapi harus segera tidur atau dimatikan. Penundaan tidak diizinkan.
HIBERNATE_IMMEDIATELY AP dapat memasuki suspend-to-disk, tetapi harus segera dihibernasi atau dimatikan. Penundaan tidak diizinkan.
SHUTDOWN_IMMEDIATELY AP harus segera dimatikan. Penundaan tidak diizinkan. Fase tidur dalam tidak diizinkan.

Sumber wake

Integrator harus menonaktifkan sumber aktif yang sesuai saat perangkat dalam mode ditangguhkan. Sumber aktif umum mencakup detak jantung, modem, Wi-Fi, dan Bluetooth. Satu-satunya sumber aktif yang valid harus berupa interupsi dari VMCU untuk mengaktifkan SoC. Hal ini mengasumsikan bahwa VMCU dapat memantau modem untuk peristiwa aktif jarak jauh (seperti menghidupkan mesin dari jarak jauh). Jika fungsi ini didorong ke AP, maka sumber aktif lainnya untuk melayani modem harus ditambahkan.

Aplikasi

OEM harus berhati-hati dalam menulis aplikasi agar dapat dimatikan dengan cepat dan tidak menunda proses tanpa batas waktu.

Lampiran

Direktori di pohon kode sumber

Konten Direktori
Kode terkait CarPowerManager. packages/services/Car/car-lib/src/android/car/hardware/power
CarPowerManagementService, dan sebagainya. packages/services/Car/service/src/com/android/car/power
Layanan yang menangani VHAL, seperti VehicleHal dan HAlClient. packages/services/Car/service/src/com/android/car/hal
Definisi properti dan antarmuka VHAL. hardware/interfaces/automotive/vehicle/aidl/android/hardware/automotive/vehicle/
Aplikasi contoh untuk memberikan beberapa ide tentang CarPowerManager packages/services/Car/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink

Diagram class

Diagram class ini menampilkan class dan antarmuka Java dalam sistem pengelolaan daya:

Diagram class daya

Gambar 4. Diagram class daya.

Hubungan objek

Gambar 5 mengilustrasikan objek mana yang memiliki referensi ke objek lain. Edge berarti bahwa objek sumber menyimpan referensi ke objek target. Misalnya, VehicleHAL memiliki referensi ke objek PropertyHalService.

Diagram referensi objek

Gambar 5. Diagram referensi objek.