Датчики Multi-HAL

Sensors Multi-HAL — это платформа, которая позволяет HAL датчиков работать вместе с HAL других датчиков. Sensors Multi-HAL динамически загружает суб-HAL датчиков, хранящиеся в виде динамических библиотек в разделе поставщика, и предоставляет им объект обратного вызова, который может обрабатывать события публикации, а также получать и снимать блокировку пробуждения. Sub-HAL датчиков — это HAL датчиков, встроенный в общий объект в разделе поставщика и используемый инфраструктурой с несколькими HAL. Эти подчиненные HAL не зависят друг от друга или от кода multi-HAL, содержащего основную функцию процесса.

Sensors Multi-HAL 2.1, доступный на устройствах под управлением Android 11 или более поздней версии, представляет собой итерацию Sensors Multi-HAL 2.0, которая поддерживает загрузку суб-HAL, которые могут отображать тип датчика угла поворота . Для поддержки этого типа датчика суб-HAL должны использовать API-интерфейсы суб-HAL, определенные в заголовке 2.1 SubHal .

Разница между датчиками Multi-HAL 2 и датчиками HAL 2

Sensors Multi-HAL 2, доступный на устройствах под управлением Android 10 или более поздней версии, представляет несколько абстракций поверх Sensors HAL 2 , чтобы упростить взаимодействие с HAL API. Sensors Multi-HAL 2 представляет класс HalProxy для обработки реализации интерфейса Sensors HAL 2 и интерфейса V2_1/SubHal (или V2_0/SubHal ), позволяющего HalProxy взаимодействовать с суб-HAL.

Интерфейс ISensorsSubHal отличается от интерфейса 2.1/ISensors.hal (или 2.0/ISensors.hal ) следующими способами:

  • Метод initialize передает класс IHalProxyCallback вместо двух FMQ и ISensorsCallback .
  • Sub-HAL должны реализовать функцию отладки для предоставления отладочной информации в отчетах об ошибках.
  • Sub-HAL должны реализовывать функцию имени, чтобы загруженный sub-HAL можно было отличить от других sub-HAL.

Основное различие между датчиками Multi-HAL 2 и датчиками HAL 2 заключается в функциях инициализации. Вместо предоставления IHalProxyCallback интерфейс IHalProxyCallback предоставляет два метода: один метод для отправки событий датчиков в платформу датчиков и один метод для создания блокировок пробуждения. Под капотом Sensors Multi-HAL управляет всеми взаимодействиями с FMQ, чтобы обеспечить своевременную доставку событий датчиков для всех суб-HAL. Настоятельно рекомендуется, чтобы суб-HAL использовали метод createScopedWakelock , чтобы делегировать бремя тайм-аута блокировок пробуждения Multi-HAL датчиков и централизовать использование блокировки пробуждения одной общей блокировке пробуждения для всего Multi-HAL датчиков, что сводит к минимуму блокировку и разблокировку. звонки.

Датчики Multi-HAL 2 также имеют некоторые встроенные функции безопасности. Он обрабатывает ситуации, когда FMQ датчика заполнен или когда платформа датчиков Android перезапускается, и состояние датчика необходимо сбросить. Кроме того, когда события отправляются в класс HalProxy , но структура датчика не может принять события немедленно, Multi-HAL датчиков может переместить события в фоновый поток, чтобы позволить продолжить работу во всех суб-HAL в ожидании событий. быть размещенным.

Исходный код и эталонная реализация

Код Multi-HAL для всех датчиков доступен в hardware/interfaces/sensors/common/default/2.X/multihal/ . Вот указатели на некоторые ресурсы.

  • HalProxy.h : объект HalProxy датчиками multi-HAL и обрабатывает передачу данных из подчиненных HAL в структуру датчиков.
  • HalProxy.cpp : реализация HalProxy содержит всю логику, необходимую для мультиплексной связи между суб-HAL и инфраструктурой датчиков.
  • SubHal.h : интерфейс ISensorsSubHal определяет интерфейс, которому должны следовать подчиненные HAL, чтобы быть совместимыми с HalProxy . Sub-HAL реализует метод инициализации, чтобы объект HalProxyCallback можно было использовать для postEvents и createScopedWakelock .

    Для реализаций Multi-HAL 2.0 используйте SubHal.h версии 2.0.

  • hardware/interfaces/sensors/common/default/2.X/multihal/tests/ : Эти модульные тесты проверяют реализацию HalProxy .

  • hardware/interfaces/sensors/common/default/2.X/multihal/tests/fake_subhal/ : в этом примере реализация sub-HAL использует поддельные датчики для генерации поддельных данных. Полезно для тестирования того, как несколько суб-HAL взаимодействуют на устройстве.

Реализация

В этом разделе описывается, как реализовать датчики Multi-HAL в следующих ситуациях:

Внедрение сенсоров Multi-HAL 2.1

Чтобы реализовать Sensors Multi-HAL 2.1 на новом устройстве, выполните следующие действия:

  1. ISensorsSubHal интерфейс ISensorsSubHal, как описано в SubHal.h .
  2. sensorsHalGetSubHal_2_1 метод sensorHalGetSubHal_2_1 в SubHal.h .
  3. Добавьте цель cc_library_shared для создания недавно реализованного sub-HAL. При добавлении цели:

    1. Убедитесь, что цель перенесена куда-нибудь в раздел поставщика устройства.
    2. В файле конфигурации, расположенном по адресу /vendor/etc/sensors/hals.conf , добавьте путь к библиотеке с новой строки. При необходимости создайте файл hals.conf .

    Пример записи Android.bp для создания библиотеки sub-HAL см. в разделе hardware/interfaces/sensors/common/default/2.X/multihal/tests/Android.bp .

  4. Удалите все записи android.hardware.sensors из файла manifest.xml , который содержит список поддерживаемых HAL на устройстве.

  5. Удалите все файлы android.hardware.sensors service и service.rc из файла device.mk и добавьте android.hardware.sensors@2.1-service.multihal и android.hardware.sensors@2.1-service.multihal.rc в PRODUCT_PACKAGES .

При загрузке HalProxy запускается, ищет недавно реализованный sub-HAL и инициализирует его, вызывая sensorsHalGetSubHal_2_1 .

Перенос датчиков Multi-HAL 2.0 на Multi-HAL 2.1

Для переноса с Multi-HAL 2.0 на Multi-HAL 2.1 реализуйте интерфейс SubHal и перекомпилируйте свой sub-HAL.

Вот различия между интерфейсами SubHal 2.0 и 2.1:

  • IHalProxyCallback использует типы, созданные в версии 2.1 ISensors.hal .
  • Функция initialize() передает новый IHalProxyCallback вместо того, что был в интерфейсе 2.0 SubHal
  • Sub-HAL должны реализовывать getSensorsList_2_1 и injectSensorData_2_1 вместо getSensorsList и injectSensorData , поскольку эти методы используют новые типы, добавленные в версии 2.1 спецификации ISensors.hal .
  • Sub-HAL должны выставлять sensorsHalGetSubHal_2_1 , а не sensorsHalGetSubHal , чтобы Multi-HAL обрабатывал их как sub-HAL версии 2.1.

Портирование с Sensors HAL 2.0

При обновлении до Sensors Multi-HAL 2.0 с Sensors HAL 2.0 убедитесь, что реализация HAL соответствует следующим требованиям.

Инициализация HAL

Датчики HAL 2.0 имеет функцию инициализации, которая позволяет службе датчиков передавать FMQ и динамический обратный вызов датчика. В Sensors Multi-HAL 2.0 функция initialize() передает один обратный вызов, который необходимо использовать для публикации событий датчика, получения блокировок пробуждения и уведомления о динамическом подключении и отключении датчика.

Публикация событий датчиков в реализации Multi-HAL

Вместо того, чтобы отправлять события датчика через FMQ, суб-HAL должен записывать события датчика в IHalProxyCallback , когда события датчика доступны.

События WAKE_UP

В Sensors HAL 2.0 HAL может управлять блокировкой пробуждения для своей реализации. В Sensors Multi-HAL 2.0 под-HAL позволяют реализации Multi-HAL управлять блокировками пробуждения и могут запрашивать блокировку пробуждения, вызывая createScopedWakelock . Заблокированная блокировка пробуждения с заданной областью должна быть получена и передана в postEvents при отправке событий пробуждения в реализацию Multi-HAL.

Динамические датчики

Сенсоры Multi-HAL 2.0 требует, чтобы onDynamicSensorsConnected и onDynamicSensorsDisconnected в IHalProxyCallback вызывались при каждом изменении подключения динамического датчика. Эти обратные вызовы доступны как часть указателя IHalProxyCallback , который предоставляется через функцию initialize() .

Портирование с Sensors HAL 1.0

При обновлении до Sensors Multi-HAL 2.0 с Sensors HAL 1.0 убедитесь, что реализация HAL соответствует следующим требованиям.

Инициализация HAL

Функция initialize() должна поддерживаться для установления обратного вызова между суб-HAL и реализацией Multi-HAL.

Отображение доступных датчиков

В Sensors Multi-HAL 2.0 getSensorsList() должна возвращать одно и то же значение во время загрузки одного устройства, даже при перезапуске HAL датчиков. Это позволяет платформе попытаться восстановить соединения датчиков, если системный сервер перезапустится. Значение, возвращаемое getSensorsList() , может измениться после перезагрузки устройства.

Публикация событий датчиков в реализации Multi-HAL

В Sensors HAL 2.0 вместо ожидания вызова poll() суб-HAL должен заблаговременно записывать события датчика в IHalProxyCallback всякий раз, когда доступны события датчика.

События WAKE_UP

В Sensors HAL 1.0 HAL может управлять блокировкой пробуждения для своей реализации. В Sensors Multi-HAL 2.0 суб-HAL позволяют реализации Multi-HAL управлять блокировками пробуждения и могут запрашивать блокировку пробуждения, вызывая createScopedWakelock . Заблокированная блокировка пробуждения с заданной областью должна быть получена и передана в postEvents при отправке событий пробуждения в реализацию Multi-HAL.

Динамические датчики

В Sensors HAL 1.0 динамические датчики возвращаются через функцию poll() . Сенсоры Multi-HAL 2.0 требует, чтобы onDynamicSensorsConnected и onDynamicSensorsDisconnected в IHalProxyCallback вызывались при каждом изменении подключения динамического датчика. Эти обратные вызовы доступны как часть указателя IHalProxyCallback , который предоставляется через функцию initialize() .

Портирование с Sensors Multi-HAL 1.0

Чтобы перенести существующую реализацию из Sensors Multi-HAL 1.0 , выполните следующие действия.

  1. Убедитесь, что конфигурация HAL датчиков находится в /vendor/etc/sensors/hals.conf. Это может потребовать перемещения файла, расположенного в /system/etc/sensors/hals.conf .
  2. Удалите любые ссылки на hardware/hardware.h и hardware/sensors.h , так как они не поддерживаются для HAL 2.0.
  3. Перенесите суб-HAL, как описано в разделе « Перенос с датчиков Hal 1.0 ».
  4. Установите датчики Multi-HAL 2.0 в качестве назначенного HAL, выполнив шаги 3 и 4 в разделе « Реализация датчиков Mutli-HAL 2.0 ».

Проверка

Запуск СУДС

Когда вы интегрировали один или несколько суб-HAL с Sensors Multi-Hal 2.1, используйте Vendor Test Suite (VTS) , чтобы убедиться, что ваши реализации sub-HAL соответствуют всем требованиям, установленным интерфейсом Sensors HAL.

Чтобы запустить только тесты датчиков VTS, когда VTS настроен на хост-компьютере, выполните следующие команды:

vts-tradefed run commandAndExit vts \
    --skip-all-system-status-check \
    --primary-abi-only \
    --skip-preconditions \
    --module VtsHalSensorsV2_0Target && \
  vts-tradefed run commandAndExit vts \
    --skip-all-system-status-check \
    --primary-abi-only \
    --skip-preconditions \
    --module VtsHalSensorsV2_1Target

Запуск модульных тестов

Модульные тесты в HalProxy_test.cpp проверяют HalProxy с использованием поддельных суб-HAL, которые создаются в модульном тесте и не загружаются динамически. При создании нового суб-HAL эти тесты должны служить руководством по добавлению модульных тестов, которые проверяют правильность реализации нового суб-HAL.

Для запуска тестов выполните следующие команды:

cd $ANDROID_BUILD_TOP/hardware/interfaces/sensors/common/default/2.X/multihal/tests
atest

Тестирование с поддельными sub-HAL

Фальшивые суб-HAL — это фиктивные реализации интерфейса ISensorsSubHal . Вложенные HAL предоставляют различные списки датчиков. Когда датчики активированы, они периодически отправляют автоматически сгенерированные события датчика в HalProxy на основе интервалов, указанных в заданном запросе датчика.

Фальшивые суб-HAL можно использовать для проверки того, как полный код Multi-HAL работает с другими суб-HAL, загруженными в систему, а также для проверки различных аспектов кода сенсоров Multi-HAL.

Два поддельных sub-HAL доступны по адресу hardware/interfaces/sensors/common/default/2.X/multihal/tests/fake_subhal/ .

Чтобы создать и отправить поддельные суб-HAL на устройство, выполните следующие действия:

  1. Выполните следующие команды, чтобы создать и отправить на устройство три разных фальшивых суб-HAL:

    $ANDROID_BUILD_TOP/hardware/interfaces/sensors/common/default/2.X/multihal/tests/
    mma
    adb push \
      $ANDROID_BUILD_TOP/out/target/product/<device>/symbols/vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config1.so \
      /vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config1.so
    adb push \
      $ANDROID_BUILD_TOP/out/target/product/<device>/symbols/vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config2.so \
      /vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config2.so
    adb push \
      $ANDROID_BUILD_TOP/out/target/product/<device>/symbols/vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config3.so \
      /vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config3.so
    
  2. Обновите конфигурацию HAL датчиков в /vendor/etc/sensors/hals.conf , указав пути для поддельных суб-HAL.

    /vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config1.so
    /vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config2.so
    /vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config3.so
    
  3. Перезапустите HalProxy и загрузите новые суб-HAL, перечисленные в config.

    adb shell stop
    adb shell start
    

Отладка

Разработчики могут отлаживать платформу с помощью команды lshal . Чтобы запросить выходные данные отладки HAL датчиков, выполните следующую команду:

adb root
adb shell lshal debug android.hardware.sensors@2.1::ISensors/default

Информация о текущем состоянии HalProxy и его суб-HAL затем выводится на терминал. Ниже показан пример вывода команды для объекта HalProxy и поддельных суб-HAL.

Internal values:
  Threads are running: true
  Wakelock timeout start time: 200 ms ago
  Wakelock timeout reset time: 73208 ms ago
  Wakelock ref count: 0
  # of events on pending write queue: 0
  # of non-dynamic sensors across all subhals: 8
  # of dynamic sensors across all subhals: 0
SubHals (2):
  Name: FakeSubHal-OnChange
  Debug dump:
Available sensors:
Name: Ambient Temp Sensor
Min delay: 40000
Flags: 2
Name: Light Sensor
Min delay: 200000
Flags: 2
Name: Proximity Sensor
Min delay: 200000
Flags: 3
Name: Relative Humidity Sensor
Min delay: 40000
Flags: 2
  Name: FakeSubHal-OnChange
  Debug dump:
Available sensors:
Name: Ambient Temp Sensor
Min delay: 40000
Flags: 2
Name: Light Sensor
Min delay: 200000
Flags: 2
Name: Proximity Sensor
Min delay: 200000
Flags: 3
Name: Relative Humidity Sensor
Min delay: 40000
Flags: 2

Если число, указанное для # of events on pending write queue в платформу датчиков. Это указывает на то, что служба датчиков заблокирована или аварийно завершает работу и не обрабатывает события датчиков, или что из суб-HAL недавно был отправлен большой пакет событий датчиков.

Если счетчик ссылок на блокировку пробуждения больше 0 , это означает, что HalProxy получил блокировку пробуждения. Это значение должно быть больше 0 только в том случае, если ScopedWakelock намеренно или если события пробуждения были отправлены в HalProxy и не были обработаны фреймворком сенсора.

Дескриптор файла, передаваемый методу отладки HalProxy , передается каждому подчиненному HAL, поэтому разработчики должны реализовать метод отладки как часть интерфейса ISensorsSubHal .