برای پشتیبانی از مدیریت انرژی خاص خودرو، Android یک سرویس CarPowerManagementService
و یک رابط CarPowerManager
ارائه میکند.
انتقال حالت توسط واحد کنترل اصلی خودرو (VMCU) آغاز می شود. برای برقراری ارتباط با VMCU، یکپارچه سازها باید چندین مؤلفه را پیاده سازی کنند. یکپارچه سازها مسئول ادغام با لایه انتزاعی سخت افزار خودرو (VHAL) و اجرای هسته هستند. یکپارچهکنندهها همچنین مسئول غیرفعال کردن منابع بیداری و اطمینان از عدم به تعویق افتادن خاموشها هستند.
واژه شناسی
این اصطلاحات در سراسر این سند استفاده می شود:
suspend()
و shutdown()
انجام می دهد.طراحی سیستم
این بخش توضیح میدهد که چگونه AAOS وضعیت قدرت پردازنده برنامه را نشان میدهد و کدام ماژولها سیستم مدیریت انرژی را پیادهسازی میکنند. این ماده همچنین نحوه کار این ماژول ها با هم و نحوه انتقال حالت به طور معمول را توضیح می دهد.
ماشین حالت قدرت ماشین
AAOS از یک ماشین حالت برای نشان دادن وضعیت توان AP استفاده می کند. ماشین حالت حالت های نشان داده شده در زیر را ارائه می دهد:
شکل 1. ماشین حالت قدرت خودرو.
رایج ترین انتقال ها با رنگ آبی مشخص شده اند. حالات و انتقال های رایج عبارتند از:
- تعلیق به رم. خودرو و SoC خاموش هستند. هیچ کدی در حال اجرا نیست. برق به رم SoC حفظ می شود.
- منتظر VHAL باشید. هنگامی که راننده با وسیله نقلیه تعامل می کند، برای مثال، با باز کردن یک در، VMCU برق را به SoC اعمال می کند. AAOS از Suspend-to-RAM از سر گرفته می شود و وارد Wait for VHAL می شود، جایی که منتظر هماهنگی با VHAL است.
- بر. VHAL به AAOS می گوید که به حالت روشن وارد شود. در این حالت، AAOS به طور کامل در حال اجرا است و با راننده در تعامل است.
- خاموش شدن را آماده کنید. هنگامی که راننده کار خود را به پایان رساند، VHAL به AAOS میگوید که وارد Shutdown Prepare شود. در این حالت، صفحه نمایش و صدا خاموش هستند و AAOS با درایور تعامل ندارد. سیستم اندروید هنوز در حال اجرا است و برای به روز رسانی برنامه ها و سیستم اندروید رایگان است. هنگامی که بهروزرسانیها، در صورت وجود، تکمیل میشوند، سیستم Android وارد Wait for VHAL Finish میشود.
- منتظر VHAL Finish باشید. در این مرحله، AAOS به VHAL اطلاع می دهد که آماده خاموش شدن است. انتظار می رود VMCU SoC را در Deep Sleep قرار دهد و انرژی را از پردازنده برنامه حذف کند. سپس AAOS در حالت Suspend-to-RAM قرار دارد، اگرچه هیچ کدی اجرا نمی شود.
ماژول های مدیریت انرژی
سیستم مدیریت انرژی از این ماژول ها تشکیل شده است:
نام ماژول | شرح |
---|---|
CarPowerManager | Java یا C++ API. |
CarPowerManagement Service | انتقال حالت قدرت را هماهنگ می کند. |
CarPowerPolicyDaemon | با مشتریان خط مشی قدرت بومی ارتباط برقرار می کند. |
HAL وسیله نقلیه | رابط به VMCU. |
هسته | تعلیق در اجرای رم یا دیسک. |
ویژگی خواب عمیق/هبرناسیون (تعلیق اندروید به رم/دیسک) در هسته پیاده سازی شده است. این ویژگی به عنوان یک فایل خاص در /sys/power/state
در معرض فضای کاربر قرار می گیرد. AAOS با نوشتن mem
یا disk
در این فایل به حالت تعلیق در می آید.
CPMS وضعیت قدرت را با سایر سرویس ها و HAL ها هماهنگ می کند. CPMS ماشین حالتی را که در بالا توضیح داده شد پیادهسازی میکند و هنگامی که یک انتقال حالت قدرت اتفاق میافتد، اعلانهایی را برای هر ناظری ارسال میکند. این سرویس همچنین از VHAL برای ارسال پیام به سخت افزار استفاده می کند.
CPPD سیاست قدرت را تا زمانی که CPMS کنترل کند مدیریت می کند. همچنین اعلانهای تغییر خطمشی قدرت را به شنوندگان بومی ارسال میکند.
برخی از ویژگی ها در VHAL تعریف شده اند. برای برقراری ارتباط با VMCU، CPMS این ویژگی ها را می خواند و می نویسد. برنامه ها می توانند از رابط تعریف شده در CPM برای نظارت بر تغییرات وضعیت برق استفاده کنند. این رابط همچنین برنامه ها را قادر می سازد تا شنوندگان سیاست قدرت را ثبت کنند. این API را می توان از جاوا فراخوانی کرد و با @hide / @System API حاشیه نویسی شده است، به این معنی که فقط برای برنامه های دارای امتیاز در دسترس است. رابطه بین این ماژول ها، برنامه ها و سرویس ها در زیر نشان داده شده است:
شکل 2. نمودار مرجع اجزای قدرت.
دنباله پیام
بخش قبلی ماژول هایی را که سیستم مدیریت توان را تشکیل می دهند توضیح داد. این بخش از مثالهای خواب عمیق و خروج از خواب عمیق برای توضیح نحوه ارتباط ماژولها و برنامهها استفاده میکند:
وارد خواب عمیق شوید
فقط VMCU می تواند خواب عمیق را آغاز کند. هنگامی که خواب عمیق شروع می شود، VMCU یک اعلان از طریق VHAL به CPMS ارسال می کند. CPMS وضعیت را به SHUTDOWN PREPARE تغییر میدهد و با فراخوانی متد onStateChanged()
با شناسه وضعیت جدید ارائهشده توسط CPM، این انتقال حالت را برای همه ناظران (برنامهها و سرویسهایی که CPMS را نظارت میکنند) پخش میکند.
CPM بین برنامهها/سرویسها و CPMS واسطه میشود. متد onStateChanged()
برای برنامه ها/سرویس ها به طور همزمان در روش onStateChanged()
CPM فراخوانی می شود. بیشتر برنامهها و سرویسها باید آمادهسازی خود را قبل از بازگشت از این تماس تکمیل کنند. سرویسهای ممتاز اجازه دارند پس از بازگشت به PRE_SHUTDOWN_PREPARE
، SUSPEND_ENTER
، POST_SUSPEND_ENTER
آمادهسازی خود را به صورت ناهمزمان ادامه دهند. در این مورد، سرویس ممتاز قرار است پس از اتمام آماده سازی، () () را در شیء ارائه شده CompletablePowerStateChangeFuture
فراخوانی کند. توجه داشته باشید که آماده سازی ناهمزمان برای SHUTDOWN_PREPARE
مجاز نیست. قبل از اینکه DEEP_SLEEP_ENTRY
به VHAL ارسال شود، CPMS به طور دورهای درخواستهای تعویق خاموش شدن را به VHAL ارسال میکند.
هنگامی که تمام اشیاء CPM آماده سازی خاموش شدن را کامل کردند، CPMS AP_POWER_STATE_REPORT
به VHAL ارسال می کند، که سپس به VMCU اطلاع می دهد که AP آماده تعلیق است. CPMS روش suspend خود را نیز نامیده میشود که هسته را معلق میکند.
توالی شرح داده شده در بالا در زیر نشان داده شده است:
شکل 3. وارد خواب عمیق شوید.
رابط های برنامه نویسی ارائه شده توسط CPM
این بخش جاوا API ارائه شده توسط CPM برای برنامه ها و سرویس های سیستم را شرح می دهد. این API نرم افزار سیستم را قادر می سازد تا:
- نظارت بر تغییرات وضعیت قدرت در AP.
- سیاست های قدرت را اعمال کنید.
از این مراحل برای فراخوانی API های ارائه شده توسط CPM استفاده کنید:
- برای به دست آوردن نمونه CPM، با Car API تماس بگیرید.
- متد مناسب را روی شی ایجاد شده در مرحله 1 فراخوانی کنید.
یک شی CarPowerManager ایجاد کنید
برای ایجاد یک شی CPM، متد getCarManager()
شی Car را فراخوانی کنید. این روش یک نما است که برای ایجاد اشیاء CPM استفاده می شود. android.car.Car.POWER_SERVICE
به عنوان آرگومان برای ایجاد یک شی CPM مشخص کنید.
Car car = Car.createCar(this); CarPowerManager powerManager = (CarPowerManager) car.getCarManager(android.car.Car.POWER_SERVICE);
CarPowerStateListener و ثبت نام
برنامهها و سرویسهای سیستم میتوانند اعلانهای تغییر وضعیت انرژی را با پیادهسازی CarPowerManager.CarPowerStateListener
دریافت کنند. این رابط یک متد onStateChanged()
را تعریف می کند که یک تابع فراخوانی است که هنگام تغییر حالت قدرت CPMS فراخوانی می شود. مثال زیر یک کلاس ناشناس جدید را تعریف می کند که رابط را پیاده سازی می کند:
private final CarPowerManager.CarPowerStateListener powerListener = new CarPowerManager.CarPowerStateListener () { @Override public void onStateChanged(int state) { Log.i(TAG, "onStateChanged() state = " + state); } };
برای دستور دادن به این شی شنونده برای نظارت بر انتقال حالت قدرت، یک رشته اجرایی جدید ایجاد کنید و شنونده و این رشته را در شی CPM ثبت کنید:
executor = new ThreadPerTaskExecutor(); powerManager.setListener(powerListener, executor);
هنگامی که حالت قدرت تغییر می کند، متد onStateChanged()
شی شنونده با مقداری برای نشان دادن حالت قدرت جدید فراخوانی می شود. ارتباط بین مقدار واقعی و حالت توان در CarPowerManager
تعریف شده است و در جدول زیر نشان داده شده است:
نام | شرح |
---|---|
STATE_ON | حالت روشن را وارد کنید. سیستم کاملاً فعال است. |
STATE_SHUTDOWN_CANCELLED | خاموش شدن لغو شده و حالت برق به حالت عادی برمی گردد. |
STATE_SHUTDOWN_ENTER | انتظار می رود برنامه ها پاک شوند و آماده خاموش شدن باشند. |
STATE_POST_SHUTDOWN_ENTER | آماده سازی برای خاموش شدن کامل شده است و VMCU آماده خاموش شدن است. حالت خاموش شدن را وارد کنید. |
STATE_PRE_SHUTDOWN_PREPARE | فرآیند خاموش کردن درخواست شده است اما CPMS هنوز این فرآیند را شروع نمیکند. صفحه نمایش و صدا هنوز روشن هستند |
STATE_SHUTDOWN_PREPARE | حالت گاراژ ممکن است در طول دوره اجرا شود. |
STATE_SUSPEND_ENTER | انتظار می رود برنامه ها پاک شوند و برای تعلیق در RAM آماده شوند. |
STATE_POST_SUSPEND_ENTER | آماده سازی برای تعلیق به رم به پایان رسیده است و VMCU برای تعلیق به رم آماده است. حالت تعلیق را وارد کنید. |
STATE_SUSPEND_EXIT | از تعلیق بیدار شوید یا از تعلیق لغو شده از سر بگیرید. |
STATE_HIBERNATION_ENTER | انتظار می رود برنامه ها پاک شوند و برای خواب زمستانی آماده شوند. |
STATE_POST_HIBERNATION_ENTER | آماده سازی برای خواب زمستانی به پایان رسیده است و VMCU برای خواب زمستانی آماده است وارد حالت خواب زمستانی شوید. |
STATE_HIBERNATION_EXIT | از خواب زمستانی بیدار شوید یا از خواب زمستانی لغو شده از سر بگیرید. |
STATE_WAIT_FOR_VHAL | سیستم در حال راه اندازی است، اما در انتظار برقراری ارتباط با VHAL قبل از رفتن به حالت ON است. |
لغو ثبت نام CarPowerStateListener
برای لغو ثبت همه اشیاء شنونده ثبت شده در CPM، متد clearListener
را فراخوانی کنید:
powerManager.clearListener();
یکپارچه سازی سیستم در پیاده سازی اندروید شما
یکپارچه سازها مسئول موارد زیر هستند:
- پیاده سازی رابط هسته برای تعلیق اندروید.
- پیاده سازی توابع VHAL برای:
- انتشار شروع تعلیق یا خاموش شدن از خودرو به اندروید.
- پیام خاموش شدن آماده از اندروید را به ماشین ارسال کنید.
- خاموش کردن یا تعلیق اندروید را از طریق رابط هسته لینوکس آغاز کنید.
- وقتی دستگاه در حالت تعلیق است، اطمینان حاصل کنید که همه منابع بیداری غیرفعال هستند.
- اطمینان حاصل کنید که برنامه ها به اندازه کافی سریع خاموش می شوند تا به طور نامحدود روند خاموش شدن را به تعویق نیندازید.
- اطمینان حاصل کنید که BSP اجزای دستگاه را مطابق با خط مشی برق روشن (یا خاموش) می کند تا مانع از تعلیق یا خواب زمستانی نشود.
رابط هسته: /sys/power/state
هنگامی که یک برنامه یا سرویس، mem
برای suspend-to-RAM یا disk
برای suspend-to-disk در فایلی که در /sys/power/state
قرار دارد، می نویسد، AAOS دستگاه را در حالت تعلیق قرار می دهد. ادغام کننده باید تابعی را ارائه دهد که این فایل را نظارت کند و لینوکس را در حالت تعلیق برق قرار دهد. این عملکرد ممکن است یک GPIO به VMCU بفرستد تا به VMCU اطلاع دهد که دستگاه کاملاً خاموش شده است. یکپارچه کننده همچنین مسئول حذف هر گونه شرایط مسابقه بین VHAL ارسال پیام نهایی به VMCU و رفتن سیستم به حالت تعلیق یا خاموش شدن است.
مسئولیت VHAL
VHAL یک رابط بین شبکه خودرو و اندروید فراهم می کند. VHAL:
- شروع تعلیق یا خاموش شدن خودرو را به اندروید منتشر می کند.
- پیام آماده خاموش شدن را از اندروید به ماشین می فرستد.
- خاموش کردن یا تعلیق اندروید را از طریق رابط هسته لینوکس آغاز می کند.
هنگامی که CPMS به VHAL اطلاع می دهد که آماده خاموش شدن است، VHAL پیغام آماده شدن خاموش شدن را به VMCU می فرستد. به طور معمول، تجهیزات جانبی روی تراشه مانند UART، SPI و USB پیام را منتقل می کنند. پس از ارسال پیام، CPMS فرمان هسته را برای تعلیق یا خاموش کردن دستگاه فراخوانی می کند. قبل از انجام این کار، VHAL یا BSP ممکن است یک GPIO را تغییر دهد تا به VMCU دستور دهد که حذف برق از دستگاه بی خطر است.
VHAL باید از ویژگی های زیر پشتیبانی کند که مدیریت توان را از طریق VHAL کنترل می کند:
نام | شرح |
---|---|
AP_POWER_STATE_REPORT | Android با استفاده از مقادیر enum VehicleApPowerStateReport، انتقال وضعیت به VMCU را گزارش میکند. |
AP_POWER_STATE_REQ | VMCU از این ویژگی برای دستور دادن به Android برای انتقال به حالت های مختلف قدرت با استفاده از مقادیر enum VehicleApPowerStateReq استفاده می کند. |
AP_POWER_STATE_REPORT
از این ویژگی برای گزارش وضعیت فعلی مدیریت انرژی اندروید استفاده کنید. این ویژگی شامل دو عدد صحیح است:
-
int32Values[0]
: VehicleApPowerStateNum وضعیت فعلی را گزارش کنید. -
int32Values[1]
: زمان به تعویق انداختن یا خوابیدن یا خاموش شدن بر حسب میلی ثانیه. معنای این مقدار به مقدار اول بستگی دارد.
مقدار اول می تواند یکی از مقادیر زیر را بگیرد. VehicleApPowerStateReport.aidl
حاوی توضیحات خاص تری است که در hardware/interfaces/automotive/vehicle/aidl/android/hardware/automotive/vehicle
ذخیره می شود.
نام ارزش | شرح | مقدار دوم |
---|---|---|
WAIT_FOR_VHAL | AP در حال شروع است و نیاز به برقراری ارتباط با VHAL دارد. | |
DEEP_SLEEP_ENTRY | AP در حال ورود به حالت خواب عمیق است. VMCU باید AP را پس از زمان مشخص شده در مقدار دوم دوباره روشن کند. | باید تنظیم شود |
DEEP_SLEEP_EXIT | AP در حال خروج از حالت خواب عمیق است. | |
HIBERNATION_ENTRY | AP در حال ورود به حالت خواب زمستانی است. VMCU باید AP را پس از زمان مشخص شده در مقدار دوم دوباره روشن کند. | باید تنظیم شود |
HIBERNATION_EXIT | AP در حال خروج از حالت خواب زمستانی است. | |
SHUTDOWN_POSTPONE | اندروید آماده خاموش شدن نیست. VMCU باید قبل از خاموش کردن AP منتظر زمان مشخص شده در مقدار دوم باشد. Android ممکن است با ارائه گزارش های SHUTDOWN_POSTPONE اضافی درخواست تعویق بیشتر کند. | باید تنظیم شود |
SHUTDOWN_PREPARE | اندروید در حال آماده شدن برای خاموش شدن است. | باید تنظیم شود |
SHUTDOWN_START | AP آماده خاموش شدن است. VMCU باید AP را پس از زمان مشخص شده در مقدار دوم دوباره روشن کند. (VMCU برای پشتیبانی از ویژگی روشن کردن زمانبندی شده لازم نیست.) | باید تنظیم شود |
SHUTDOWN_CANCELLED | Android آماده شدن برای خاموش شدن را متوقف می کند و به WAIT_FOR_VHAL ادامه می دهد. | |
بر | اندروید به طور معمول در حال اجرا است. |
حالت را می توان به صورت مستقل یا در پاسخ به درخواست از طریق VMCU تنظیم کرد.
AP_POWER_STATE_REQ
این ویژگی توسط VMCU برای انتقال اندروید به حالت قدرت متفاوت ارسال می شود و شامل دو عدد صحیح است:
-
int32Values[0]
: مقدار enumVehicleApPowerStateReq
، که وضعیت جدیدی را نشان می دهد که باید به آن انتقال داده شود. -
int32Values[1]
:VehicleApPowerStateShutdownParam
مقدار enum. این مقدار فقط برای یک پیامSHUTDOWN_PREPARE
ارسال می شود و گزینه های موجود در آن را به Android منتقل می کند.
اولین مقدار صحیح نشان دهنده وضعیت جدیدی است که اندروید قرار است به آن منتقل شود. معناشناسی در VehicleApPowerStateReq.aidl
تعریف شده و در زیر ارائه شده است:
نام ارزش | شرح |
---|---|
بر | AP باید عملیات کامل را آغاز کند. |
SHUTDOWN_PREPARE | AP باید برای خاموش شدن آماده شود. مقدار دوم نشان می دهد که آیا AP مجاز است خاموش شدن را به تعویق بیندازد و آیا AP باید منتظر خاموش شدن یا ورود به خواب عمیق باشد. |
CANCEL_SHUTDOWN | AP باید آماده شدن برای خاموش شدن را متوقف کند و برای روشن شدن آماده شود. |
تمام شده | AP اکنون تعطیل یا تعلیق خواهد شد. |
VehicleApPowerStateShutdownParam
در VehicleApPowerStateShutdownParam.aidl
تعریف شده است. این فهرست دارای این عناصر است:
نام ارزش | شرح |
---|---|
CAN_SLEEP | AP می تواند به جای خاموش شدن کامل، وارد خواب عمیق شود. تعویق مجاز است. |
CAN_HIBERNATE | AP می تواند به جای خاموش شدن کامل، وارد حالت خواب زمستانی شود. تعویق مجاز است. |
SHUTDOWN_ONLY | AP باید خاموش شود. تعویق مجاز است. خواب عمیق مجاز نیست |
SLEEP_IMMEDIATELY | AP ممکن است وارد خواب عمیق شود، اما باید یا بخوابد یا فورا خاموش شود. به تعویق انداختن جایز نیست. |
HIBERNATE_IMMEDIATELY | AP ممکن است وارد suspend-to-disk شود، اما باید یا Hibernate شود یا فوراً خاموش شود. به تعویق انداختن جایز نیست. |
SHUTDOWN_IMMEDIATELY | AP باید فوراً خاموش شود. به تعویق انداختن مجاز نیست خواب عمیق مجاز نیست |
منابع بیدار
هنگامی که دستگاه در حالت تعلیق است، یکپارچه ساز باید منابع بیدار مناسب را غیرفعال کند. منابع بیداری متداول عبارتند از ضربان قلب، مودم، وای فای و بلوتوث. تنها منبع بیدار معتبر باید یک وقفه از VMCU باشد تا SoC را بیدار کند. این فرض را بر این میگذارد که VMCU میتواند برای رویدادهای بیداری از راه دور (مانند راهاندازی موتور از راه دور) به مودم گوش دهد. اگر این عملکرد به AP فشار داده شود، باید منبع بیدار دیگری برای سرویس مودم اضافه شود.
برنامه ها
OEM ها باید مراقب باشند که برنامه ها را بنویسند تا به سرعت خاموش شوند و این روند برای مدت نامحدود به تعویق نیفتد.
ضمیمه
دایرکتوری ها در درخت کد منبع
محتوا | فهرست راهنما |
---|---|
کدهای مرتبط با CarPowerManager. | packages/services/Car/car-lib/src/android/car/hardware/power |
CarPowerManagementService و غیره. | packages/services/Car/service/src/com/android/car/power |
خدماتی که با VHAL سروکار دارند، مانند VehicleHal و HAlClient . | packages/services/Car/service/src/com/android/car/hal |
تعاریف رابط VHAL و ویژگی. | hardware/interfaces/automotive/vehicle/aidl/android/hardware/automotive/vehicle/ |
نمونه برنامه برای ارائه ایده ای در مورد CarPowerManager | packages/services/Car/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink |
نمودار کلاس
این نمودار کلاس کلاس ها و رابط های جاوا را در سیستم مدیریت انرژی نمایش می دهد:
شکل 4. نمودار کلاس قدرت.
رابطه شی
شکل 5 نشان می دهد که کدام اشیا به اشیاء دیگر ارجاع دارند. لبه به این معنی است که شی مبدأ یک ارجاع به شی مورد نظر دارد. به عنوان مثال، VehicleHAL به یک شی PropertyHalService اشاره دارد.
شکل 5. نمودار مرجع شی.