Untuk mendukung pengelolaan daya khusus kendaraan, Android menyediakan layanan CarPowerManagementService
dan antarmuka CarPowerManager
.
Transisi keadaan dipicu oleh Vehicle Master Control Unit (VMCU). Untuk berkomunikasi dengan VMCU, integrator harus mengimplementasikan beberapa komponen. Integrator bertanggung jawab untuk berintegrasi dengan lapisan abstraksi perangkat keras Kendaraan (VHAL) dan implementasi kernel. Integrator juga bertanggung jawab untuk menonaktifkan sumber bangun dan memastikan bahwa penghentian tidak ditunda tanpa batas waktu.
Terminologi
Istilah-istilah berikut digunakan di seluruh dokumen ini:
suspend()
dan shutdown()
.Desain sistem
Bagian ini menjelaskan bagaimana AAOS mewakili status daya prosesor aplikasi dan modul mana yang mengimplementasikan sistem manajemen daya. Materi ini juga menjelaskan bagaimana modul-modul ini bekerja sama dan bagaimana transisi keadaan biasanya terjadi.
Mesin negara tenaga mobil
AAOS menggunakan mesin negara untuk mewakili keadaan daya AP. Mesin negara menyediakan keadaan yang diilustrasikan di bawah ini:
Gambar 1. Mesin keadaan tenaga mobil.
Transisi yang paling umum disorot dengan warna biru. Ini adalah negara bagian dan transisi yang umum:
- Penangguhan ke RAM. Kendaraan dan SoC mati. Tidak ada kode yang dieksekusi. Daya dipertahankan ke SoC RAM.
- Tunggu VHAL. Saat pengemudi berinteraksi dengan kendaraan, misalnya dengan membuka pintu, VMCU menyalurkan daya ke SoC. AAOS melanjutkan dari Suspend-to-RAM dan memasuki Wait for VHAL, di mana AAOS menunggu koordinasi dengan VHAL.
- Pada. VHAL memberitahu AAOS untuk memasuki keadaan Aktif. Dalam keadaan ini, AAOS sepenuhnya berjalan dan berinteraksi dengan pengemudi.
- Persiapan Shutdown. Ketika pengemudi selesai mengemudi, VHAL memberitahu AAOS untuk masuk ke Shutdown Prepare. Dalam keadaan ini, tampilan dan audio mati dan AAOS tidak berinteraksi dengan driver. Sistem Android masih berjalan dan bebas mengupdate aplikasi dan sistem Android. Ketika pembaruan, jika ada, selesai, sistem Android memasuki Tunggu VHAL Selesai.
- Tunggu VHAL Selesai. Pada titik ini, AAOS menginformasikan VHAL bahwa ia siap untuk dimatikan. VMCU diharapkan menempatkan SoC dalam kondisi Tidur Nyenyak dan menghilangkan daya dari prosesor aplikasi. AAOS kemudian berada dalam status Suspend-to-RAM, meskipun tidak ada kode yang dieksekusi.
Modul manajemen daya
Sistem manajemen daya terdiri dari modul-modul berikut:
Nama modul | Keterangan |
---|---|
Manajer Tenaga Mobil | Java atau C++ API. |
Layanan Manajemen Tenaga Mobil | Mengkoordinasikan transisi negara kekuasaan. |
CarPowerPolicyDaemon | Berkomunikasi dengan klien kebijakan kekuatan asli. |
Kendaraan HAL | Antarmuka ke VMCU. |
Inti | Tangguhkan implementasi 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 mengkoordinasikan kekuasaan negara dengan layanan lain dan HAL. CPMS mengimplementasikan mesin negara yang dijelaskan di atas dan mengirimkan pemberitahuan ke setiap pengamat ketika terjadi transisi keadaan daya. Layanan ini juga menggunakan VHAL untuk mengirim pesan ke perangkat keras.
CPPD mengelola kebijakan kekuasaan sampai CPMS mengambil kendali. Ini juga mengirimkan pemberitahuan perubahan kebijakan daya ke pendengar asli.
Beberapa properti didefinisikan dalam VHAL. Untuk berkomunikasi dengan VMCU, CPMS membaca dan menulis properti ini. aplikasi dapat menggunakan antarmuka yang ditentukan dalam CPM untuk memantau perubahan status daya. Antarmuka ini juga memungkinkan aplikasi mendaftarkan pemroses kebijakan daya . API ini dapat dipanggil dari Java dan dianotasi dengan @hide / @System API, yang artinya hanya tersedia untuk aplikasi yang memiliki hak istimewa. Hubungan antara modul, aplikasi, dan layanan ini diilustrasikan di bawah:
Gambar 2. Diagram referensi komponen daya.
Urutan pesan
Bagian sebelumnya menjelaskan modul-modul yang membentuk sistem manajemen daya. Bagian ini menggunakan contoh masuk ke mode tidur nyenyak dan keluar dari mode tidur nyenyak untuk menjelaskan cara modul dan aplikasi berkomunikasi:
Masuki tidur nyenyak
Hanya VMCU yang dapat memulai tidur nyenyak. Setelah tidur nyenyak dimulai, VMCU mengirimkan pemberitahuan 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 diharuskan menyelesaikan persiapannya sebelum kembali dari panggilan ini. Layanan dengan hak istimewa diizinkan untuk melanjutkan persiapannya secara asinkron setelah kembali untuk PRE_SHUTDOWN_PREPARE
, SUSPEND_ENTER
, POST_SUSPEND_ENTER
. Dalam hal ini, layanan dengan hak istimewa seharusnya memanggil complete() pada objek CompletablePowerStateChangeFuture
yang disediakan setelah persiapannya selesai. Perhatikan bahwa persiapan asinkron tidak diperbolehkan untuk SHUTDOWN_PREPARE
. Sebelum DEEP_SLEEP_ENTRY
dikirim ke VHAL, CPMS secara berkala mengirimkan permintaan penundaan shutdown ke VHAL.
Ketika semua objek CPM telah menyelesaikan persiapan pematian, CPMS mengirimkan AP_POWER_STATE_REPORT
ke VHAL, yang kemudian memberitahukan VMCU bahwa AP siap untuk ditangguhkan. CPMS juga memanggil metode penangguhannya, yang menangguhkan kernel.
Urutan yang dijelaskan di atas diilustrasikan di bawah ini:
Gambar 3. Memasuki tidur nyenyak.
Antarmuka pemrograman disediakan oleh CPM
Bagian ini menjelaskan Java API yang disediakan oleh CPM untuk aplikasi dan layanan sistem. API ini memungkinkan perangkat lunak sistem untuk:
- Pantau perubahan status daya di Titik Akses.
- Terapkan kebijakan kekuasaan.
Gunakan langkah-langkah berikut untuk memanggil API yang disediakan oleh CPM:
- Untuk memperoleh instance CPM, panggil Car API.
- Panggil metode yang sesuai pada objek yang dibuat pada Langkah 1.
Buat objek CarPowerManager
Untuk membuat objek CPM, panggil metode getCarManager()
objek Mobil. Metode ini merupakan 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 pemberitahuan perubahan status daya dengan menerapkan CarPowerManager.CarPowerStateListener
. Antarmuka ini mendefinisikan satu metode onStateChanged()
, yang merupakan fungsi panggilan balik yang dipanggil ketika status daya CPMS diubah. Contoh berikut mendefinisikan kelas 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 pendengar ini agar memantau transisi status daya, buat thread eksekusi baru dan daftarkan pendengar 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 mewakili status daya baru. Hubungan antara nilai aktual dan status daya ditentukan di CarPowerManager
dan ditunjukkan dalam tabel berikut:
Nama | Keterangan |
---|---|
STATE_ON | Masukkan keadaan aktif. Sistem beroperasi penuh. |
STATE_SHUTDOWN_CANCELLED | Shutdown dibatalkan dan kondisi daya dikembalikan ke kondisi normal. |
STATE_SHUTDOWN_ENTER | aplikasi diharapkan bersih dan siap untuk dimatikan. |
STATE_POST_SHUTDOWN_ENTER | Persiapan untuk mematikan telah selesai dan VMCU siap untuk dimatikan. Masuk ke status mati. |
STATE_PRE_SHUTDOWN_PREPARE | Proses shutdown diminta tetapi CPMS belum memulai prosesnya. Tampilan dan audio masih menyala |
STATE_SHUTDOWN_PREPARE | Mode Garasi dapat berjalan selama periode tersebut. |
STATE_SUSPEND_ENTER | aplikasi diharapkan bersih dan siap untuk ditangguhkan ke RAM. |
STATE_POST_SUSPEND_ENTER | Persiapan untuk penangguhan ke RAM telah selesai dan VMCU siap untuk penangguhan ke RAM. Masuk ke status penangguhan. |
STATE_SUSPEND_EXIT | Bangun dari penangguhan atau melanjutkan dari penangguhan yang dibatalkan. |
STATE_HIBERNATION_ENTER | aplikasi diharapkan bersih dan siap untuk hibernasi. |
STATE_POST_HIBERNATION_ENTER | Persiapan untuk hibernasi telah selesai dan VMCU siap untuk hibernasi. Masuk ke kondisi hibernasi. |
STATE_HIBERNATION_EXIT | Bangun dari hibernasi atau melanjutkan dari hibernasi yang dibatalkan. |
STATE_WAIT_FOR_VHAL | Sistem sedang memulai, tetapi menunggu untuk menjalin komunikasi dengan VHAL sebelum masuk ke status ON. |
Pembatalan registrasi CarPowerStateListener
Untuk membatalkan pendaftaran semua objek pendengar yang terdaftar ke CPM, panggil metode clearListener
:
powerManager.clearListener();
Integrasi sistem pada implementasi Android Anda
Integrator bertanggung jawab atas hal-hal berikut:
- Menerapkan antarmuka kernel untuk menangguhkan Android.
- Melaksanakan fungsi VHAL untuk:
- Menyebarkan inisiasi penangguhan atau pematian dari mobil ke Android.
- Kirim pesan siap mati dari Android ke mobil.
- Mulai mematikan atau menangguhkan Android melalui antarmuka kernel Linux.
- Pastikan semua sumber bangun dinonaktifkan saat perangkat dalam keadaan ditangguhkan.
- Pastikan aplikasi dimatikan dengan cukup cepat agar tidak menunda proses mematikan tanpa batas waktu.
- Pastikan BSP menghidupkan (atau mematikan) komponen perangkat sesuai dengan kebijakan daya agar tidak memblokir penundaan atau hibernasi
Antarmuka kernel: /sys/power/state
AAOS menempatkan perangkat ke mode penangguhan ketika aplikasi atau layanan menulis mem
untuk penangguhan ke RAM atau disk
untuk penangguhan 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 tunda. Fungsi ini dapat mengirimkan GPIO ke VMCU untuk memberi tahu VMCU bahwa perangkat telah dimatikan sepenuhnya. Integrator juga bertanggung jawab untuk menghilangkan kondisi balapan apa pun antara VHAL yang mengirimkan pesan terakhir ke VMCU dan sistem masuk ke mode penangguhan atau pematian.
tanggung jawab VHAL
VHAL menyediakan antarmuka antara jaringan kendaraan dan Android. VHAL:
- Menyebarkan inisiasi penangguhan atau pematian dari mobil ke Android.
- Mengirim pesan siap mematikan dari Android ke mobil.
- Memulai penutupan atau penangguhan Android melalui antarmuka kernel Linux.
Ketika CPMS menginformasikan VHAL bahwa ia siap untuk dimatikan, VHAL mengirimkan pesan siap mematikan ke VMCU. Biasanya, periferal on-chip seperti UART, SPI, dan USB mengirimkan pesan. Setelah pesan terkirim, CPMS memanggil perintah kernel untuk menangguhkan atau mematikan perangkat. Sebelum melakukannya, VHAL atau BSP dapat mengaktifkan GPIO untuk menginstruksikan VMCU bahwa aman untuk melepas daya dari perangkat.
VHAL harus mendukung properti berikut, yang mengontrol manajemen daya melalui VHAL:
Nama | Keterangan |
---|---|
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 melakukan transisi 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]
: VehicleApPowerStateReport enum dari keadaan saat ini. -
int32Values[1]
: Waktu dalam milidetik untuk menunda atau tidur atau mematikan. Arti dari nilai ini tergantung pada nilai pertama.
Nilai pertama dapat mengambil salah satu dari nilai berikut. VehicleApPowerStateReport.aidl
berisi deskripsi yang lebih spesifik, yang disimpan di hardware/interfaces/automotive/vehicle/aidl/android/hardware/automotive/vehicle
.
Nama nilai | Keterangan | Nilai kedua |
---|---|---|
TUNGGU_FOR_VHAL | AP mulai dan perlu menjalin komunikasi dengan VHAL. | |
DEEP_SLEEP_ENTRY | AP memasuki kondisi tidur nyenyak. VMCU harus menghidupkan kembali AP setelah waktu yang ditentukan dalam nilai kedua. | Harus diatur |
DEEP_SLEEP_EXIT | AP keluar dari kondisi tidur nyenyak. | |
HIBERNATION_ENTRY | AP memasuki kondisi hibernasi. VMCU harus menghidupkan kembali AP setelah waktu yang ditentukan dalam nilai kedua. | Harus diatur |
HIBERNATION_EXIT | AP keluar dari kondisi hibernasi. | |
SHUTDOWN_POSTPONE | Android belum siap untuk dimatikan. VMCU harus menunggu waktu yang ditentukan dalam nilai kedua sebelum mematikan AP. Android dapat meminta penundaan tambahan dengan menerbitkan laporan SHUTDOWN_POSTPONE tambahan. | Harus diatur |
SHUTDOWN_PERSIAPKAN | Android sedang bersiap untuk dimatikan. | Harus diatur |
SHUTDOWN_START | AP siap dimatikan. VMCU harus menghidupkan kembali AP setelah waktu yang ditentukan dalam nilai kedua. (VMCU tidak diperlukan untuk mendukung fitur pengaktifan berwaktu.) | Harus diatur |
SHUTDOWN_CANCELLED | Android berhenti bersiap untuk dimatikan dan akan melanjutkan ke WAIT_FOR_VHAL. | |
PADA | Android berjalan normal. |
Status dapat diatur secara mandiri atau sebagai respons terhadap permintaan melalui VMCU.
AP_POWER_STATE_REQ
Properti ini dikirim oleh VMCU untuk mentransisikan Android ke status daya berbeda dan berisi dua bilangan bulat:
-
int32Values[0]
: Nilai enumVehicleApPowerStateReq
, yang mewakili keadaan baru untuk melakukan transisi. -
int32Values[1]
: Nilai enumVehicleApPowerStateShutdownParam
. Nilai ini dikirim hanya untuk pesanSHUTDOWN_PREPARE
dan mengirimkan ke Android opsi yang ada di dalamnya.
Nilai bilangan bulat pertama mewakili keadaan baru yang menjadi tujuan transit Android. Semantik didefinisikan dalam VehicleApPowerStateReq.aidl
dan disediakan di bawah ini:
Nama nilai | Keterangan |
---|---|
PADA | AP harus mulai beroperasi penuh. |
SHUTDOWN_PERSIAPKAN | AP harus bersiap untuk mematikan. Nilai kedua menunjukkan apakah Titik Akses diperbolehkan untuk menunda pemadaman dan apakah Titik Akses akan mati atau memasuki mode tidur nyenyak. |
BATAL_SHUTDOWN | AP harus berhenti bersiap untuk mematikan dan bersiap untuk AKTIF. |
SELESAI | AP sekarang akan dimatikan atau ditangguhkan. |
VehicleApPowerStateShutdownParam
didefinisikan dalam VehicleApPowerStateShutdownParam.aidl
. Enum ini memiliki elemen berikut:
Nama nilai | Keterangan |
---|---|
BISA TIDUR | AP bisa memasuki kondisi tidur nyenyak alih-alih mati sepenuhnya. Penundaan diperbolehkan. |
CAN_HIBERNATE | AP dapat memasuki hibernasi alih-alih mati sepenuhnya. Penundaan diperbolehkan. |
SHUTDOWN_ONLY | AP harus dimatikan. Penundaan diperbolehkan. Tidur nyenyak tidak diperbolehkan. |
TIDUR_SEGERA | AP mungkin memasuki kondisi tidur nyenyak, namun harus segera tidur atau dimatikan. Menunda tidak diperbolehkan. |
HIBERNATE_SEGERA | AP dapat masuk ke suspend-to-disk, tetapi harus segera hibernasi atau dimatikan. Menunda tidak diperbolehkan. |
SHUTDOWN_SEGERA | AP harus segera dimatikan. Menunda tidak diperbolehkan. Tidur nyenyak tidak diperbolehkan. |
Sumber bangun
Integrator harus menonaktifkan sumber bangun yang sesuai ketika perangkat berada dalam mode penangguhan. Sumber bangun yang umum termasuk detak jantung, modem, Wi-Fi, dan Bluetooth. Satu-satunya sumber bangun yang valid harus berupa interupsi dari VMCU untuk membangunkan SoC. Hal ini mengasumsikan bahwa VMCU dapat mendengarkan modem untuk kejadian bangun jarak jauh (seperti start mesin jarak jauh). Jika fungsi ini didorong ke AP, maka sumber bangun lain untuk melayani modem harus ditambahkan.
Aplikasi
OEM harus berhati-hati dalam menulis aplikasi agar dapat dimatikan dengan cepat dan tidak menunda prosesnya tanpa batas waktu.
Lampiran
Direktori di pohon kode sumber
Isi | 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 berhubungan dengan VHAL, seperti VehicleHal dan HAlClient . | packages/services/Car/service/src/com/android/car/hal |
Antarmuka VHAL dan definisi properti. | hardware/interfaces/automotive/vehicle/aidl/android/hardware/automotive/vehicle/ |
Contoh aplikasi untuk memberikan gambaran tentang CarPowerManager | packages/services/Car/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink |
Diagram kelas
Diagram kelas ini menampilkan kelas dan antarmuka Java dalam sistem manajemen daya:
Gambar 4. Diagram kelas daya.
Hubungan objek
Gambar 5 mengilustrasikan objek mana yang memiliki referensi ke objek lain. Edge berarti objek sumber mempunyai referensi ke objek target. Misalnya, VehicleHAL memiliki referensi ke objek PropertyHalService.
Gambar 5. Diagram referensi objek.