Google cam kết thúc đẩy công bằng chủng tộc cho Cộng đồng người da đen. Xem cách thực hiện.

Cảm biến HAL 2

Lớp trừu tượng phần cứng cảm biến (HAL) là giao diện giữa khung cảm biến Android và cảm biến của thiết bị, chẳng hạn như gia tốc kế hoặc con quay hồi chuyển. Cảm biến HAL xác định các chức năng phải được thực hiện để cho phép khuôn khổ điều khiển các cảm biến.

Cảm biến HAL 2.0 có sẵn trong Android 10 trở lên cho các thiết bị mới và nâng cấp. Cảm biến HAL 2.0 dựa trên Cảm biến HAL 1.0 nhưng có một số điểm khác biệt chính khiến nó không tương thích ngược. Cảm biến HAL 2.0 sử dụng Hàng đợi tin nhắn nhanh (FMQ) để gửi các sự kiện cảm biến từ HAL vào khung cảm biến Android.

Cảm biến HAL 2.1 có sẵn trong Android 11 trở lên cho các thiết bị mới và nâng cấp. Cảm biến HAL 2.1 là sự lặp lại của Cảm biến HAL 2.0 cho thấy loại cảm biến HINGE_ANGLE và cập nhật các phương pháp khác nhau để chấp nhận loại HINGE_ANGLE .

Giao diện HAL 2.1

Nguồn tài liệu chính cho Cảm biến HAL 2.1 nằm trong định nghĩa HAL tại phần cứng / giao diện / cảm biến / 2.1 / ISensors.hal . Nếu có xung đột về yêu cầu giữa trang này và ISensors.hal , hãy sử dụng yêu cầu trong ISensors.hal .

Giao diện HAL 2.0

Nguồn tài liệu chính cho Cảm biến HAL 2.0 nằm trong định nghĩa HAL tại phần cứng / giao diện / cảm biến / 2.0 / ISensors.hal . Nếu có xung đột về yêu cầu giữa trang này và ISensors.hal , hãy sử dụng yêu cầu trong ISensors.hal .

Triển khai cảm biến HAL 2.0 và HAL 2.1

Để triển khai Sensors HAL 2.0 hoặc 2.1, một đối tượng phải mở rộng giao diện ISensors và triển khai tất cả các chức năng được định nghĩa trong 2.0/ISensors.hal hoặc 2.1/ISensors.hal .

Khởi tạo HAL

Cảm biến HAL phải được khởi tạo bởi khung cảm biến Android trước khi có thể được sử dụng. Khung này gọi initialize() cho HAL 2.0 và initialize_2_1() cho HAL 2.1 để cung cấp ba tham số cho Cảm biến HAL: hai bộ mô tả FMQ và một con trỏ tới đối tượng ISensorsCallback .

HAL sử dụng bộ mô tả đầu tiên để tạo Sự kiện FMQ được sử dụng để ghi các sự kiện cảm biến vào khung. HAL sử dụng bộ mô tả thứ hai để tạo Wake Lock FMQ được sử dụng để đồng bộ hóa khi HAL phát hành khóa đánh thức cho các sự kiện cảm biến WAKE_UP . HAL phải lưu một con trỏ tới đối tượng ISensorsCallback để bất kỳ hàm gọi lại cần thiết nào có thể được gọi.

Hàm initialize() hoặc initialize_2_1() phải là hàm đầu tiên được gọi khi khởi tạo Cảm biến HAL.

Để lộ các cảm biến có sẵn

Để có danh sách tất cả các cảm biến tĩnh có sẵn trong thiết bị, hãy sử dụng hàm getSensorsList() trên HAL 2.0 và getSensorsList_2_1() trên HAL 2.1. Hàm này trả về một danh sách các cảm biến, mỗi cảm biến được xác định duy nhất bởi tay cầm của nó. Tay cầm của một cảm biến nhất định không được thay đổi khi quá trình lưu trữ Cảm biến HAL khởi động lại. Các xử lý có thể thay đổi qua các lần khởi động lại thiết bị và trên các lần khởi động lại máy chủ hệ thống.

Nếu một số cảm biến chia sẻ cùng một loại cảm biến và thuộc tính đánh thức, thì cảm biến đầu tiên trong danh sách được gọi là cảm biến mặc định và được trả lại cho các ứng dụng sử dụng chức năng getDefaultSensor(int sensorType, bool wakeUp) .

Tính ổn định của danh sách cảm biến

Sau khi khởi động lại Sensors HAL, nếu dữ liệu được trả về bởi getSensorsList() hoặc getSensorsList_2_1() cho biết có sự thay đổi đáng kể so với danh sách cảm biến được truy xuất trước khi khởi động lại, thì khung sẽ kích hoạt khởi động lại thời gian chạy Android. Những thay đổi đáng kể đối với danh sách cảm biến bao gồm các trường hợp thiếu cảm biến với một tay cầm nhất định hoặc có các thuộc tính thay đổi hoặc khi các cảm biến mới được giới thiệu. Mặc dù việc khởi động lại thời gian chạy Android gây khó chịu cho người dùng, nhưng điều đó là bắt buộc vì khung công tác Android không còn có thể đáp ứng hợp đồng API Android mà các cảm biến tĩnh (không hợp thời trang) không thay đổi trong suốt thời gian hoạt động của ứng dụng. Điều này cũng có thể ngăn khung thiết lập lại các yêu cầu cảm biến đang hoạt động do các ứng dụng thực hiện. Do đó, các nhà cung cấp HAL nên ngăn chặn các thay đổi danh sách cảm biến có thể tránh được.

Để đảm bảo tay cầm cảm biến ổn định, HAL phải ánh xạ một cách xác định một cảm biến vật lý nhất định trong thiết bị với tay cầm của nó. Mặc dù giao diện Sensors HAL không bắt buộc triển khai cụ thể nhưng các nhà phát triển có sẵn một số tùy chọn để đáp ứng yêu cầu này.

Ví dụ: danh sách cảm biến có thể được sắp xếp bằng cách sử dụng kết hợp các thuộc tính cố định của từng cảm biến, chẳng hạn như nhà cung cấp, kiểu máy và loại cảm biến. Một tùy chọn khác dựa trên thực tế là bộ cảm biến tĩnh của thiết bị được cố định trong phần cứng, vì vậy HAL cần biết khi nào tất cả các cảm biến dự kiến ​​đã hoàn tất quá trình khởi tạo trước khi quay trở lại từ getSensorsList() hoặc getSensorsList_2_1() . Danh sách các cảm biến dự kiến ​​này có thể được biên dịch thành tệp nhị phân HAL hoặc được lưu trữ trong tệp cấu hình trong hệ thống tệp và thứ tự xuất hiện có thể được sử dụng để lấy ra các tay cầm ổn định. Mặc dù giải pháp tốt nhất phụ thuộc vào chi tiết triển khai cụ thể của HAL của bạn, nhưng yêu cầu quan trọng là tay cầm cảm biến không thay đổi khi khởi động lại HAL.

Cấu hình cảm biến

Trước khi kích hoạt cảm biến, cảm biến phải được định cấu hình với chu kỳ lấy mẫu và độ trễ báo cáo tối đa bằng cách sử dụng hàm batch() .

Cảm biến phải có thể được cấu hình lại bất kỳ lúc nào bằng batch() mà không làm mất dữ liệu cảm biến.

Thời gian lấy mẫu

Khoảng thời gian lấy mẫu có một ý nghĩa khác dựa trên loại cảm biến đang được định cấu hình:

  • Liên tục: Các sự kiện cảm biến được tạo với tốc độ liên tục.
  • Khi thay đổi: Các sự kiện được tạo không nhanh hơn chu kỳ lấy mẫu và có thể được tạo với tốc độ chậm hơn chu kỳ lấy mẫu nếu giá trị đo được không thay đổi.
  • Một lần: Khoảng thời gian lấy mẫu bị bỏ qua.
  • Đặc biệt: Để biết thêm chi tiết, hãy xem Các loại cảm biến .

Để tìm hiểu về sự tương tác giữa khoảng thời gian lấy mẫu và các chế độ báo cáo của cảm biến, hãy xem Chế độ báo cáo .

Độ trễ báo cáo tối đa

Độ trễ báo cáo tối đa đặt thời gian tối đa tính bằng nano giây mà các sự kiện có thể bị trì hoãn và được lưu trữ trong FIFO phần cứng trước khi được ghi vào Sự kiện FMQ thông qua HAL trong khi SoC hoạt động.

Giá trị bằng 0 có nghĩa là các sự kiện phải được báo cáo ngay sau khi chúng được đo, bỏ qua hoàn toàn FIFO hoặc làm trống FIFO ngay khi một sự kiện từ cảm biến có mặt trong FIFO.

Ví dụ: một gia tốc kế được kích hoạt ở 50 Hz với độ trễ báo cáo tối đa là 0, bộ kích hoạt sẽ ngắt 50 lần mỗi giây khi SoC hoạt động.

Khi độ trễ báo cáo tối đa lớn hơn 0, các sự kiện cảm biến không cần phải được báo cáo ngay khi chúng được phát hiện. Các sự kiện có thể được lưu trữ tạm thời trong FIFO phần cứng và được báo cáo theo lô, miễn là không có sự kiện nào bị trì hoãn nhiều hơn độ trễ báo cáo tối đa. Tất cả các sự kiện kể từ đợt trước được ghi lại và trả về cùng một lúc. Điều này làm giảm số lần ngắt gửi đến SoC và cho phép SoC chuyển sang chế độ công suất thấp hơn trong khi cảm biến đang thu thập và phân phối dữ liệu.

Mỗi sự kiện có một dấu thời gian được liên kết với nó. Việc trì hoãn thời gian sự kiện được báo cáo không được ảnh hưởng đến dấu thời gian của sự kiện. Dấu thời gian phải chính xác và tương ứng với thời gian mà sự kiện đã xảy ra trên thực tế, không phải thời gian nó được báo cáo.

Để biết thêm thông tin và yêu cầu về báo cáo các sự kiện cảm biến có độ trễ báo cáo tối đa khác không, hãy xem Batch .

Kích hoạt cảm biến

Khung làm việc bật và tắt các cảm biến bằng cách sử dụng chức năng activate() . Trước khi kích hoạt cảm biến, trước tiên, khuôn khổ phải định cấu hình cảm biến bằng batch() .

Sau khi một cảm biến bị tắt, các sự kiện cảm biến bổ sung từ cảm biến đó không được ghi vào Event FMQ.

Cảm biến xả

Nếu một cảm biến được định cấu hình để dữ liệu cảm biến hàng loạt, thì khuôn khổ có thể buộc loại bỏ ngay lập tức các sự kiện cảm biến theo đợt bằng cách gọi flush() . Điều này khiến các sự kiện cảm biến theo đợt đối với tay cầm cảm biến được chỉ định sẽ được ghi ngay lập tức vào Event FMQ. Bộ cảm biến HAL phải nối một sự kiện hoàn thành tuôn ra vào cuối các sự kiện cảm biến được ghi là kết quả của một lệnh gọi đến flush() .

Quá trình xả xảy ra không đồng bộ (nghĩa là hàm này phải trả về ngay lập tức). Nếu quá trình triển khai sử dụng một FIFO duy nhất cho một số cảm biến, FIFO đó sẽ được xóa và sự kiện hoàn thành xả chỉ được thêm vào cho cảm biến được chỉ định.

Nếu cảm biến được chỉ định không có FIFO (không thể đệm) hoặc nếu FIFO trống tại thời điểm cuộc gọi, flush() vẫn phải thành công và gửi một sự kiện hoàn thành tuôn ra cho cảm biến đó. Điều này áp dụng cho tất cả các cảm biến không phải là cảm biến chụp một lần.

Nếu flush() được gọi cho cảm biến một lần, thì flush() phải trả về BAD_VALUE và không tạo ra sự kiện flush hoàn thành.

Ghi các sự kiện cảm biến vào FMQ

Sự kiện FMQ được Sensors HAL sử dụng để đẩy các sự kiện cảm biến vào khung cảm biến Android.

Sự kiện FMQ là một FMQ được đồng bộ hóa, có nghĩa là bất kỳ nỗ lực nào để ghi nhiều sự kiện vào FMQ hơn dung lượng khả dụng sẽ dẫn đến việc ghi không thành công. Trong trường hợp đó, HAL nên xác định xem nên viết nhóm sự kiện hiện tại dưới dạng hai nhóm sự kiện nhỏ hơn hay viết tất cả các sự kiện cùng nhau khi có đủ dung lượng.

Khi Bộ cảm biến HAL đã ghi số lượng sự kiện cảm biến mong muốn vào Event FMQ, Bộ cảm biến HAL phải thông báo cho khung rằng các sự kiện đã sẵn sàng bằng cách ghi bit EventQueueFlagBits::READ_AND_PROCESS vào EventFlag::wake của Event FMQ. EventFlag có thể được tạo từ Event FMQ bằng EventFlag::createEventFlag và hàm getEventFlagWord() của Event FMQ.

Cảm biến HAL 2.0 / 2.1 hỗ trợ cả write và khóa ghi trên Event writeBlocking . Việc triển khai mặc định cung cấp một tham chiếu để sử dụng write . Nếu chức năng writeBlocking được sử dụng, cờ readNotification phải được đặt thành EventQueueFlagBits::EVENTS_READ , được đặt bởi khuôn khổ khi nó đọc các sự kiện từ Event FMQ. Cờ thông báo ghi phải được đặt thành EventQueueFlagBits::READ_AND_PROCESS , thông báo cho khung rằng các sự kiện đã được ghi vào Event FMQ.

Sự kiện WAKE_UP

Sự kiện WAKE_UP là sự kiện cảm biến khiến bộ xử lý ứng dụng (AP) thức dậy và xử lý sự kiện ngay lập tức. Bất cứ khi nào một sự kiện WAKE_UP được ghi vào Sự kiện FMQ, Bộ cảm biến HAL phải bảo mật khóa đánh thức để đảm bảo rằng hệ thống vẫn hoạt động cho đến khi khung có thể xử lý sự kiện. Khi nhận được sự kiện WAKE_UP , khuôn khổ bảo mật khóa đánh thức của chính nó, cho phép Cảm biến HAL phát hành khóa đánh thức của nó. Để đồng bộ hóa khi Cảm biến HAL nhả khóa đánh thức, hãy sử dụng Wake Lock FMQ.

Cảm biến HAL phải đọc Wake Lock FMQ để xác định số lượng sự kiện WAKE_UP mà khung đã xử lý. HAL chỉ nên phát hành khóa đánh thức của nó cho các sự kiện WAKE_UP nếu tổng số sự kiện WAKE_UP lý bằng 0. Sau khi xử lý các sự kiện cảm biến, khung sẽ đếm số lượng sự kiện được đánh dấu là sự kiện WAKE_UP và ghi lại số này vào Wake Lock FMQ.

Khung thiết lập thông báo ghi WakeLockQueueFlagBits::DATA_WRITTEN trên Wake Lock FMQ bất cứ khi nào nó ghi dữ liệu vào Wake Lock FMQ.

Cảm biến động

Cảm biến động là cảm biến không phải là một bộ phận vật lý của thiết bị nhưng có thể được sử dụng làm đầu vào cho thiết bị, chẳng hạn như gamepad với gia tốc kế.

Khi một cảm biến động được kết nối, chức năng onDynamicSensorConnected trong ISensorsCallback phải được gọi từ Sensors HAL. Điều này thông báo cho khuôn khổ của cảm biến động mới và cho phép cảm biến được điều khiển thông qua khuôn khổ và để khách hàng sử dụng các sự kiện của cảm biến.

Tương tự, khi một cảm biến động bị ngắt kết nối, hàm onDynamicSensorDisconnected trong ISensorsCallback phải được gọi để khung có thể loại bỏ bất kỳ cảm biến nào không còn khả dụng.

Kênh trực tiếp

Kênh trực tiếp là một phương pháp hoạt động trong đó các sự kiện cảm biến được ghi vào bộ nhớ cụ thể thay vì vào FMQ Sự kiện bỏ qua Khung cảm biến Android. Máy khách đăng ký kênh trực tiếp phải đọc các sự kiện cảm biến trực tiếp từ bộ nhớ được sử dụng để tạo kênh trực tiếp và sẽ không nhận các sự kiện cảm biến thông qua khung. Hàm configDirectReport() tương tự như batch() để hoạt động bình thường và định cấu hình kênh báo cáo trực tiếp.

Các hàm registerDirectChannel()unregisterDirectChannel() tạo hoặc hủy một kênh trực tiếp mới.

Các chế độ hoạt động

Hàm setOperationMode() cho phép khuôn khổ định cấu hình cảm biến để khuôn khổ có thể đưa dữ liệu cảm biến vào bộ cảm biến. Điều này rất hữu ích cho việc thử nghiệm, đặc biệt là đối với các thuật toán tồn tại bên dưới khuôn khổ.

Hàm injectSensorData() trong HAL 2.0 và injectSensorsData_2_1() trong HAL 2.0 thường được sử dụng để đẩy các thông số hoạt động vào Cảm biến HAL. Chức năng này cũng có thể được sử dụng để đưa các sự kiện cảm biến vào một cảm biến cụ thể.

Thẩm định

Để xác thực việc triển khai Cảm biến HAL của bạn, hãy chạy các bài kiểm tra CTS và VTS của cảm biến.

Kiểm tra CTS

Kiểm tra CTS cảm biến tồn tại trong cả kiểm tra CTS tự động và ứng dụng CTS Verifier thủ công.

Các bài kiểm tra tự động được đặt trong cts / tests / sensor / src / android / cứng / cts . Các bài kiểm tra này xác minh chức năng tiêu chuẩn của cảm biến, chẳng hạn như kích hoạt cảm biến, chia lô và tỷ lệ sự kiện cảm biến.

Các bài kiểm tra CTS Verifier được đặt trong cts / apps / CtsVerifier / src / com / android / cts / Verifier / sensor . Các thử nghiệm này yêu cầu đầu vào thủ công từ người vận hành thử nghiệm và đảm bảo rằng các cảm biến báo cáo các giá trị chính xác.

Vượt qua các bài kiểm tra CTS là rất quan trọng để đảm bảo rằng thiết bị được kiểm tra đáp ứng tất cả các yêu cầu của CDD.

Kiểm tra VTS

Các bài kiểm tra VTS cho Cảm biến HAL 2.0 nằm trong phần cứng / giao diện / cảm biến / 2.0 / vts . Các bài kiểm tra VTS cho Cảm biến HAL 2.1 nằm trong phần cứng / giao diện / cảm biến / 2.1 / vts . Các bài kiểm tra này đảm bảo rằng HAL của Cảm biến được triển khai đúng cách và tất cả các yêu cầu trong ISensors.halISensorsCallback.hal đều được đáp ứng đúng cách.

Nâng cấp lên Cảm biến HAL 2.1 từ 2.0

Khi nâng cấp lên Sensors HAL 2.1 từ 2.0, việc triển khai HAL của bạn phải bao gồm các phương thức initialize_2_1() tạo_2_1 (), getSensorsList_2_1() , và injectSensorsData_2_1() cùng với các loại HAL 2.1. Các phương pháp này phải đáp ứng các yêu cầu tương tự được nêu đối với HAL 2.0 ở trên.

Vì HAL phiên bản nhỏ phải hỗ trợ tất cả các chức năng từ HAL trước đó, 2.1 HAL phải hỗ trợ được khởi tạo dưới dạng 2.0 HAL. Để tránh sự phức tạp khi hỗ trợ cả hai phiên bản HAL, bạn nên sử dụng Multi-HAL 2.1.

Để biết ví dụ về cách triển khai Cảm biến 2.1 HAL của riêng bạn, hãy xem Cảm biến.h.

Nâng cấp lên Cảm biến HAL 2.0 từ 1.0

Khi nâng cấp lên Cảm biến HAL 2.0 từ 1.0, hãy đảm bảo việc triển khai HAL của bạn đáp ứng các yêu cầu sau.

Khởi tạo HAL

Hàm initialize() phải được hỗ trợ để thiết lập FMQ giữa khung và HAL.

Để lộ các cảm biến có sẵn

Trong Sensors HAL 2.0, hàm getSensorsList() phải trả về cùng một giá trị trong một lần khởi động thiết bị, ngay cả khi khởi động lại Sensors HAL. Một yêu cầu mới của hàm getSensorsList() là nó phải trả về cùng một giá trị trong một lần khởi động thiết bị, ngay cả khi khởi động lại Sensors HAL. Điều này cho phép khuôn khổ cố gắng thiết lập lại các kết nối cảm biến nếu máy chủ hệ thống khởi động lại. Giá trị được trả về bởi getSensorsList() có thể thay đổi sau khi thiết bị thực hiện khởi động lại.

Ghi các sự kiện cảm biến vào FMQ

Thay vì đợi gọi poll() , trong Cảm biến HAL 2.0, Cảm biến HAL phải chủ động ghi các sự kiện cảm biến vào Event FMQ bất cứ khi nào có sẵn các sự kiện cảm biến. HAL cũng chịu trách nhiệm ghi các bit chính xác vào EventFlag để đọc FMQ trong khuôn khổ.

Sự kiện WAKE_UP

Trong Cảm biến HAL 1.0, HAL có thể phát hành khóa đánh thức của nó cho bất kỳ sự kiện WAKE_UP nào trên bất kỳ lệnh gọi poll() sau khi WAKE_UP được đăng lên poll() vì điều này cho thấy rằng khung đã xử lý tất cả các sự kiện cảm biến và đã thu được khóa đánh thức, nếu cần thiết. Bởi vì, trong Sensors HAL 2.0, HAL không còn biết khi nào khung đã xử lý các sự kiện được ghi vào FMQ, Wake Lock FMQ cho phép khung giao tiếp với HAL khi nó đã xử lý các sự kiện WAKE_UP .

Trong Cảm biến HAL 2.0, khóa đánh thức được Bảo vệ bởi Cảm biến HAL cho các sự kiện WAKE_UP phải bắt đầu bằng SensorsHAL_WAKEUP .

Cảm biến động

Các cảm biến động được trả về bằng cách sử dụng hàm poll() trong Cảm biến HAL 1.0. Cảm biến HAL 2.0 yêu cầu onDynamicSensorsConnectedonDynamicSensorsDisconnected trong ISensorsCallback được gọi bất cứ khi nào kết nối cảm biến động thay đổi. Các lệnh gọi lại này có sẵn như một phần của con trỏ ISensorsCallback được cung cấp thông qua initialize() .

Các chế độ hoạt động

Chế độ DATA_INJECTION cho cảm biến WAKE_UP phải được hỗ trợ trong Cảm biến HAL 2.0.

Hỗ trợ nhiều HAL

Cảm biến HAL 2.0 và 2.1 hỗ trợ đa HAL bằng cách sử dụng khuôn khổ Cảm biến Multi-HAL . Để biết chi tiết triển khai, hãy xem Cổng từ cảm biến HAL 1.0 .