Để hỗ trợ quản lý năng lượng dành riêng cho xe, Android cung cấp dịch vụ CarPowerManagementService
và giao diện CarPowerManager
.
Việc chuyển đổi trạng thái được kích hoạt bởi Bộ điều khiển chính phương tiện (VMCU). Để giao tiếp với VMCU, các nhà tích hợp phải triển khai một số thành phần. Các nhà tích hợp chịu trách nhiệm tích hợp với lớp trừu tượng phần cứng Xe (VHAL) và triển khai kernel. Các nhà tích hợp cũng chịu trách nhiệm vô hiệu hóa các nguồn đánh thức và đảm bảo rằng việc tắt máy không bị trì hoãn vô thời hạn.
Thuật ngữ
Các thuật ngữ này được sử dụng xuyên suốt tài liệu này:
suspend()
và shutdown()
.Thiết kế hệ thống
Phần này mô tả cách AAOS thể hiện trạng thái nguồn của bộ xử lý ứng dụng và mô-đun nào triển khai hệ thống quản lý nguồn. Tài liệu này cũng mô tả cách các mô-đun này hoạt động cùng nhau và cách chuyển đổi trạng thái thường xảy ra.
Máy trạng thái điện ô tô
AAOS sử dụng máy trạng thái để thể hiện trạng thái nguồn của AP. Máy trạng thái cung cấp các trạng thái được minh họa dưới đây:
Hình 1. Máy trạng thái điện ô tô.
Các hiệu ứng chuyển tiếp phổ biến nhất được đánh dấu bằng màu xanh lam. Đây là các trạng thái và chuyển tiếp phổ biến:
- Tạm dừng RAM. Chiếc xe và SoC đã tắt. Không có mã nào đang được thực thi. Nguồn được duy trì cho RAM SoC.
- Đợi VHAL. Ví dụ: khi người lái tương tác với phương tiện bằng cách mở cửa, VMCU sẽ cấp nguồn cho SoC. AAOS tiếp tục hoạt động từ Tạm dừng RAM và chuyển sang Chờ VHAL, nơi nó chờ phối hợp với VHAL.
- TRÊN. VHAL yêu cầu AAOS chuyển sang trạng thái Bật. Ở trạng thái này, AAOS đang chạy và tương tác hoàn toàn với trình điều khiển.
- Tắt máy Chuẩn bị. Khi người lái xe lái xe xong, VHAL yêu cầu AAOS vào Chuẩn bị tắt máy. Ở trạng thái này, màn hình và âm thanh tắt và AAOS không tương tác với trình điều khiển. Hệ thống Android vẫn đang chạy và được cập nhật ứng dụng cũng như hệ thống Android miễn phí. Khi các bản cập nhật, nếu có, hoàn tất, hệ thống Android sẽ chuyển sang Chờ VHAL Kết thúc.
- Đợi VHAL kết thúc. Tại thời điểm này, AAOS thông báo cho VHAL rằng nó đã sẵn sàng ngừng hoạt động. VMCU dự kiến sẽ đặt SoC ở chế độ Ngủ sâu và ngắt nguồn điện khỏi bộ xử lý ứng dụng. Khi đó AAOS ở trạng thái Tạm dừng vào RAM, mặc dù không có mã nào được thực thi.
Mô-đun quản lý nguồn
Hệ thống quản lý năng lượng bao gồm các mô-đun sau:
Tên mô-đun | Sự miêu tả |
---|---|
Trình quản lý năng lượng xe hơi | API Java hoặc C++. |
XePowerQuản lýDịch vụ | Phối hợp các chuyển đổi trạng thái năng lượng. |
CarPowerPolicyDaemon | Giao tiếp với các khách hàng chính sách năng lượng bản địa. |
Xe HAL | Giao diện với VMCU. |
hạt nhân | Tạm dừng triển khai RAM hoặc đĩa. |
Tính năng ngủ sâu/ngủ đông (tạm dừng Android vào RAM/đĩa) được triển khai trong kernel. Tính năng này được hiển thị trong không gian người dùng dưới dạng một tệp đặc biệt nằm ở /sys/power/state
. AAOS bị đình chỉ bằng cách ghi mem
hoặc disk
vào tệp này.
CPMS phối hợp trạng thái nguồn với các dịch vụ khác và HAL. CPMS triển khai máy trạng thái được mô tả ở trên và gửi thông báo đến mọi người quan sát khi xảy ra quá trình chuyển đổi trạng thái nguồn. Dịch vụ này cũng sử dụng VHAL để gửi tin nhắn đến phần cứng.
CPPD quản lý chính sách năng lượng cho đến khi CPMS nắm quyền kiểm soát. Nó cũng gửi thông báo thay đổi chính sách quyền lực tới người nghe bản địa.
Một số thuộc tính được định nghĩa trong VHAL. Để giao tiếp với VMCU, CPMS đọc và ghi các thuộc tính này. ứng dụng có thể sử dụng giao diện được xác định trong CPM để theo dõi các thay đổi trạng thái nguồn. Giao diện này cũng cho phép các ứng dụng đăng ký trình nghe chính sách nguồn . API này có thể được gọi từ Java và được chú thích bằng @hide / @System API, nghĩa là nó chỉ khả dụng cho các ứng dụng đặc quyền . Mối quan hệ giữa các mô-đun, ứng dụng và dịch vụ này được minh họa bên dưới:
Hình 2. Sơ đồ tham khảo các thành phần nguồn.
Chuỗi tin nhắn
Phần trước đã mô tả các mô-đun bao gồm hệ thống quản lý nguồn. Phần này sử dụng các ví dụ vào giấc ngủ sâu và thoát khỏi giấc ngủ sâu để giải thích cách các mô-đun và ứng dụng giao tiếp với nhau:
Đi vào giấc ngủ sâu
Chỉ VMCU mới có thể bắt đầu giấc ngủ sâu. Khi chế độ ngủ sâu được bắt đầu, VMCU sẽ gửi thông báo đến CPMS thông qua VHAL. CPMS thay đổi trạng thái thành SHUTDOWN PREPARE và phát sóng quá trình chuyển đổi trạng thái này tới tất cả người quan sát (ứng dụng và dịch vụ giám sát CPMS) bằng cách gọi phương thức onStateChanged()
với ID trạng thái mới do CPM cung cấp.
CPM làm trung gian giữa ứng dụng/dịch vụ và CPMS. Phương thức onStateChanged()
cho ứng dụng/dịch vụ được gọi đồng bộ trong phương thức onStateChanged()
của CPM. Hầu hết các ứng dụng và dịch vụ đều phải hoàn tất quá trình chuẩn bị trước khi quay lại sau cuộc gọi này. Các dịch vụ đặc quyền được phép tiếp tục quá trình chuẩn bị không đồng bộ sau khi quay lại PRE_SHUTDOWN_PREPARE
, SUSPEND_ENTER
, POST_SUSPEND_ENTER
. Trong trường hợp này, dịch vụ đặc quyền có nhiệm vụ gọi Complete() trên đối tượng CompletablePowerStateChangeFuture
được cung cấp khi hoàn tất quá trình chuẩn bị. Lưu ý rằng việc chuẩn bị không đồng bộ không được phép cho SHUTDOWN_PREPARE
. Trước khi DEEP_SLEEP_ENTRY
được gửi tới VHAL, CPMS định kỳ gửi yêu cầu hoãn tắt máy tới VHAL.
Khi tất cả các đối tượng CPM đã hoàn tất việc chuẩn bị tắt máy, CPMS sẽ gửi AP_POWER_STATE_REPORT
tới VHAL, sau đó thông báo cho VMCU rằng AP đã sẵn sàng tạm dừng. CPMS cũng gọi phương thức tạm dừng của nó, phương thức này tạm dừng kernel.
Trình tự được mô tả ở trên được minh họa dưới đây:
Hình 3. Đi vào giấc ngủ sâu.
Giao diện lập trình do CPM cung cấp
Phần này mô tả API Java do CPM cung cấp cho các ứng dụng và dịch vụ hệ thống. API này cho phép phần mềm hệ thống:
- Giám sát sự thay đổi trạng thái nguồn trong AP.
- Áp dụng chính sách quyền lực
Hãy sử dụng các bước sau để gọi các API do CPM cung cấp:
- Để có được phiên bản CPM, hãy gọi API ô tô.
- Gọi phương thức thích hợp trên đối tượng được tạo ở Bước 1.
Tạo đối tượng CarPowerManager
Để tạo đối tượng CPM, hãy gọi phương thức getCarManager()
của đối tượng Xe hơi. Phương thức này là một mặt tiền được sử dụng để tạo các đối tượng CPM. Chỉ định android.car.Car.POWER_SERVICE
làm đối số để tạo đối tượng CPM.
Car car = Car.createCar(this); CarPowerManager powerManager = (CarPowerManager) car.getCarManager(android.car.Car.POWER_SERVICE);
CarPowerStateListener và đăng ký
Các ứng dụng và dịch vụ hệ thống có thể nhận thông báo thay đổi trạng thái nguồn bằng cách triển khai CarPowerManager.CarPowerStateListener
. Giao diện này xác định một phương thức onStateChanged()
, là hàm gọi lại được gọi khi trạng thái nguồn của CPMS bị thay đổi. Ví dụ sau định nghĩa một lớp ẩn danh mới triển khai giao diện:
private final CarPowerManager.CarPowerStateListener powerListener = new CarPowerManager.CarPowerStateListener () { @Override public void onStateChanged(int state) { Log.i(TAG, "onStateChanged() state = " + state); } };
Để hướng dẫn đối tượng trình nghe này giám sát quá trình chuyển đổi trạng thái nguồn, hãy tạo một luồng thực thi mới và đăng ký trình nghe và luồng này với đối tượng CPM:
executor = new ThreadPerTaskExecutor(); powerManager.setListener(powerListener, executor);
Khi trạng thái nguồn được thay đổi, phương thức onStateChanged()
của đối tượng người nghe sẽ được gọi với một giá trị để biểu thị trạng thái nguồn mới. Mối liên hệ giữa giá trị thực và trạng thái nguồn được xác định trong CarPowerManager
và được hiển thị trong bảng sau:
Tên | Sự miêu tả |
---|---|
STATE_ON | Nhập trạng thái bật. Hệ thống đã hoạt động đầy đủ. |
STATE_SHUTDOWN_CANCELLED | Việc tắt máy bị hủy và trạng thái nguồn được đưa về trạng thái bình thường. |
STATE_SHUTDOWN_ENTER | các ứng dụng dự kiến sẽ dọn dẹp và sẵn sàng tắt. |
STATE_POST_SHUTDOWN_ENTER | Công tác chuẩn bị đóng cửa đã hoàn tất và VMCU đã sẵn sàng đóng cửa. Nhập trạng thái tắt máy. |
STATE_PRE_SHUTDOWN_PREPARE | Quá trình tắt máy được yêu cầu nhưng CPMS chưa bắt đầu quá trình. Màn hình và âm thanh vẫn bật |
STATE_SHUTDOWN_PREPARE | Chế độ Gara có thể chạy trong thời gian này. |
STATE_SUSPEND_ENTER | các ứng dụng dự kiến sẽ dọn dẹp và sẵn sàng tạm dừng RAM. |
STATE_POST_SUSPEND_ENTER | Quá trình chuẩn bị cho việc tạm dừng RAM đã hoàn tất và VMCU đã sẵn sàng cho việc tạm dừng RAM. Nhập trạng thái tạm dừng. |
STATE_SUSPEND_EXIT | Thức dậy sau khi tạm dừng hoặc tiếp tục sau khi tạm dừng bị hủy. |
STATE_HIBERNATION_ENTER | các ứng dụng dự kiến sẽ dọn dẹp và sẵn sàng cho chế độ ngủ đông. |
STATE_POST_HIBERNATION_ENTER | Quá trình chuẩn bị cho chế độ ngủ đông đã hoàn tất và VMCU đã sẵn sàng cho chế độ ngủ đông Chuyển sang trạng thái ngủ đông. |
STATE_HIBERNATION_EXIT | Thức dậy sau chế độ ngủ đông hoặc tiếp tục sau chế độ ngủ đông bị hủy. |
STATE_WAIT_FOR_VHAL | Hệ thống đang khởi động nhưng đang chờ thiết lập liên lạc với VHAL trước khi chuyển sang trạng thái BẬT. |
Hủy đăng ký CarPowerStateListener
Để hủy đăng ký tất cả các đối tượng người nghe đã đăng ký CPM, hãy gọi phương thức clearListener
:
powerManager.clearListener();
Tích hợp hệ thống khi triển khai Android của bạn
Các nhà tích hợp chịu trách nhiệm về các mục sau:
- Triển khai giao diện kernel để tạm dừng Android.
- Triển khai các chức năng VHAL để:
- Tuyên truyền việc bắt đầu tạm dừng hoặc tắt máy từ ô tô sang Android.
- Gửi tin nhắn sẵn sàng tắt máy từ Android tới ô tô.
- Bắt đầu tắt hoặc tạm dừng Android thông qua giao diện nhân Linux.
- Đảm bảo rằng tất cả các nguồn đánh thức đều bị tắt khi thiết bị ở trạng thái tạm dừng.
- Đảm bảo rằng các ứng dụng tắt đủ nhanh để không trì hoãn quá trình tắt máy vô thời hạn.
- Đảm bảo rằng BSP bật (hoặc tắt) các thành phần thiết bị theo chính sách nguồn để không chặn trạng thái tạm dừng hoặc ngủ đông
Giao diện hạt nhân: /sys/power/state
AAOS đặt thiết bị vào chế độ tạm dừng khi một ứng dụng hoặc dịch vụ ghi mem
để tạm dừng vào RAM hoặc ghi nhớ vào disk
để tạm dừng vào đĩa vào một tệp nằm ở /sys/power/state
. Nhà tích hợp phải cung cấp chức năng giám sát tệp này và đưa Linux vào trạng thái tạm dừng. Chức năng này có thể gửi GPIO tới VMCU để thông báo cho VMCU rằng thiết bị đã tắt hoàn toàn. Nhà tích hợp cũng chịu trách nhiệm loại bỏ mọi điều kiện tương tranh giữa việc VHAL gửi thông báo cuối cùng tới VMCU và hệ thống chuyển sang chế độ tạm dừng hoặc tắt máy.
trách nhiệm VHAL
VHAL cung cấp giao diện giữa mạng xe và Android. VHL:
- Tuyên truyền việc bắt đầu tạm dừng hoặc tắt máy từ ô tô sang Android.
- Gửi thông báo sẵn sàng tắt máy từ Android tới ô tô.
- Bắt đầu tắt hoặc tạm dừng Android thông qua giao diện nhân Linux.
Khi CPMS thông báo cho VHAL rằng nó đã sẵn sàng tắt, VHAL sẽ gửi thông báo sẵn sàng tắt tới VMCU. Thông thường, các thiết bị ngoại vi trên chip như UART, SPI và USB sẽ truyền tin nhắn. Sau khi tin nhắn được gửi đi, CPMS gọi lệnh kernel để tạm dừng hoặc tắt thiết bị. Trước khi làm như vậy, VHAL hoặc BSP có thể chuyển đổi GPIO để hướng dẫn VMCU rằng việc ngắt nguồn khỏi thiết bị là an toàn.
VHAL phải hỗ trợ các thuộc tính sau để kiểm soát việc quản lý nguồn thông qua VHAL:
Tên | Sự miêu tả |
---|---|
AP_POWER_STATE_REPORT | Android báo cáo các chuyển đổi trạng thái sang VMCU bằng thuộc tính này, sử dụng các giá trị enum VehicleApPowerStateReport. |
AP_POWER_STATE_REQ | VMCU sử dụng thuộc tính này để hướng dẫn Android chuyển sang các trạng thái nguồn khác nhau bằng cách sử dụng các giá trị enum VehicleApPowerStateReq. |
AP_POWER_STATE_REPORT
Sử dụng thuộc tính này để báo cáo trạng thái quản lý nguồn hiện tại của Android. Thuộc tính này chứa hai số nguyên:
-
int32Values[0]
: VehicleApPowerStateReport enum của trạng thái hiện tại. -
int32Values[1]
: Thời gian tính bằng mili giây để trì hoãn hoặc ngủ hoặc tắt máy. Ý nghĩa của giá trị này phụ thuộc vào giá trị đầu tiên.
Giá trị đầu tiên có thể nhận một trong các giá trị sau. VehicleApPowerStateReport.aidl
chứa các mô tả cụ thể hơn, được lưu trữ trong hardware/interfaces/automotive/vehicle/aidl/android/hardware/automotive/vehicle
.
Tên giá trị | Sự miêu tả | Giá trị thứ hai |
---|---|---|
WAIT_FOR_VHAL | AP đang bắt đầu và cần thiết lập liên lạc với VHAL. | |
DEEP_SLEEP_ENTRY | AP đang bước vào trạng thái ngủ sâu. VMCU sẽ bật lại AP sau thời gian được chỉ định trong giá trị thứ hai. | Phải được thiết lập |
DEEP_SLEEP_EXIT | AP đang thoát khỏi trạng thái ngủ sâu. | |
HIBERNATION_ENTRY | AP đang bước vào trạng thái ngủ đông. VMCU sẽ bật lại AP sau thời gian được chỉ định trong giá trị thứ hai. | Phải được thiết lập |
HIBERNATION_EXIT | AP đang thoát khỏi trạng thái ngủ đông. | |
SHUTDOWN_POSTPONE | Android chưa sẵn sàng để tắt. VMCU phải đợi thời gian được chỉ định trong giá trị thứ hai trước khi tắt AP. Android có thể yêu cầu hoãn thêm bằng cách đưa ra báo cáo SHUTDOWN_POSTPONE bổ sung. | Phải được thiết lập |
SHUTDOWN_PREPARE | Android đang chuẩn bị ngừng hoạt động. | Phải được thiết lập |
SHUTDOWN_START | AP đã sẵn sàng để tắt. VMCU sẽ bật lại AP sau thời gian được chỉ định trong giá trị thứ hai. (VMCU không bắt buộc phải hỗ trợ tính năng bật theo thời gian.) | Phải được thiết lập |
SHUTDOWN_CANCELLED | Android sắp ngừng chuẩn bị tắt và sẽ tiến tới WAIT_FOR_VHAL. | |
TRÊN | Android đang chạy bình thường. |
Trạng thái có thể được đặt tự động hoặc đáp ứng yêu cầu thông qua VMCU.
AP_POWER_STATE_REQ
Thuộc tính này được VMCU gửi để chuyển Android sang trạng thái nguồn khác và chứa hai số nguyên:
-
int32Values[0]
: Giá trị enumVehicleApPowerStateReq
, đại diện cho trạng thái mới cần chuyển đổi. -
int32Values[1]
: Giá trị enumVehicleApPowerStateShutdownParam
. Giá trị này chỉ được gửi cho thông báoSHUTDOWN_PREPARE
và truyền tới Android các tùy chọn có trong đó.
Giá trị số nguyên đầu tiên biểu thị trạng thái mới mà Android sẽ chuyển sang. Ngữ nghĩa được xác định trong VehicleApPowerStateReq.aidl
và được cung cấp bên dưới:
Tên giá trị | Sự miêu tả |
---|---|
TRÊN | AP sẽ bắt đầu hoạt động đầy đủ. |
SHUTDOWN_PREPARE | AP nên chuẩn bị tắt máy. Giá trị thứ hai cho biết liệu AP có được phép trì hoãn việc tắt máy hay không và liệu AP sẽ tắt nguồn hay chuyển sang chế độ ngủ sâu. |
CANCEL_SHUTDOWN | AP nên dừng việc chuẩn bị tắt và chuẩn bị BẬT. |
HOÀN THÀNH | AP bây giờ sẽ bị tắt hoặc bị đình chỉ. |
VehicleApPowerStateShutdownParam
được định nghĩa trong VehicleApPowerStateShutdownParam.aidl
. Enum này có các yếu tố sau:
Tên giá trị | Sự miêu tả |
---|---|
CO THE NGU | AP có thể chuyển sang chế độ ngủ sâu thay vì tắt hoàn toàn. Việc trì hoãn được cho phép. |
CAN_HIBERNATE | AP có thể chuyển sang chế độ ngủ đông thay vì tắt hoàn toàn. Việc trì hoãn được cho phép. |
CHỈ TẮT_TẮT | AP nên tắt. Việc trì hoãn được cho phép. Ngủ sâu không được phép. |
NGỦ_ NGAY LẬP TỨC | AP có thể chuyển sang trạng thái ngủ sâu nhưng phải ngủ hoặc tắt ngay lập tức. Việc trì hoãn là không được phép. |
HIBERNATE_ NGAY LẬP TỨC | AP có thể chuyển sang trạng thái tạm dừng vào đĩa nhưng phải ở chế độ ngủ đông hoặc tắt ngay lập tức. Việc trì hoãn là không được phép. |
TẮT TẮT_ NGAY LẬP TỨC | AP phải tắt ngay lập tức. Trì hoãn là không được phép. Ngủ sâu không được phép. |
Nguồn đánh thức
Nhà tích hợp phải tắt các nguồn đánh thức thích hợp khi thiết bị ở chế độ treo. Các nguồn đánh thức phổ biến bao gồm nhịp tim, modem, Wi-Fi và Bluetooth. Nguồn đánh thức hợp lệ duy nhất phải là ngắt từ VMCU để đánh thức SoC. Điều này giả định rằng VMCU có thể nghe modem để biết các sự kiện đánh thức từ xa (chẳng hạn như khởi động động cơ từ xa). Nếu chức năng này được đẩy tới AP thì phải thêm một nguồn đánh thức khác để phục vụ modem.
Ứng dụng
Các OEM phải cẩn thận khi viết ứng dụng để có thể tắt chúng nhanh chóng và không trì hoãn quá trình vô thời hạn.
ruột thừa
Các thư mục trong cây mã nguồn
Nội dung | Danh mục |
---|---|
Mã liên quan đến CarPowerManager. | packages/services/Car/car-lib/src/android/car/hardware/power |
Dịch vụ quản lý CarPower, v.v. | packages/services/Car/service/src/com/android/car/power |
Các dịch vụ liên quan đến VHAL, chẳng hạn như VehicleHal và HAlClient . | packages/services/Car/service/src/com/android/car/hal |
Giao diện VHAL và định nghĩa thuộc tính. | hardware/interfaces/automotive/vehicle/aidl/android/hardware/automotive/vehicle/ |
Ứng dụng mẫu để cung cấp một số ý tưởng về CarPowerManager | packages/services/Car/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink |
Sơ đồ lớp
Sơ đồ lớp này hiển thị các lớp và giao diện Java trong hệ thống quản lý nguồn:
Hình 4. Sơ đồ lớp công suất.
Mối quan hệ đối tượng
Hình 5 minh họa những đối tượng nào có tham chiếu đến các đối tượng khác. Một cạnh có nghĩa là đối tượng nguồn giữ một tham chiếu đến đối tượng đích. Ví dụ: VehicleHAL có tham chiếu đến đối tượng PropertyHalService.
Hình 5. Sơ đồ tham chiếu đối tượng.