Датчики Multi-HAL

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

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

Для устройств под управлением Android 13 или более поздней версии, которые используют датчики AIDL HAL , вы можете использовать слой прокладки multi-HAL, чтобы обеспечить возможность multi-HAL. Подробности реализации см. в разделе «Использование датчиков Multi-HAL с датчиками AIDL HAL» .

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

Sensors Multi-HAL 2, доступный на устройствах под управлением Android 10 или более поздней версии, представляет несколько абстракций поверх Sensors HAL 2 , чтобы упростить взаимодействие с API-интерфейсами HAL. 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 ) следующим образом:

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

Основное различие между датчиками Multi-HAL 2 и датчиками HAL 2 заключается в функциях инициализации. Вместо предоставления FMQ интерфейс 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 создается с помощью Sensors multi-HAL и обрабатывает передачу данных из суб-HAL в структуру датчиков.
  • HalProxy.cpp : реализация HalProxy содержит всю логику, необходимую для мультиплексирования связи между суб-HAL и платформой датчиков.
  • SubHal.h : Интерфейс ISensorsSubHal определяет интерфейс, которому должны следовать суб-HAL, чтобы быть совместимыми с HalProxy . Суб-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/ : В этом примере реализации суб-HAL используются поддельные датчики для генерации поддельных данных. Полезно для тестирования взаимодействия нескольких суб-HAL на устройстве.

Выполнение

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

Используйте датчики Multi-HAL с датчиками AIDL HAL.

Чтобы обеспечить возможность multi-HAL с помощью Sensors AIDL HAL, импортируйте модуль слоя прокладки AIDL Multi-HAL, который находится в hardware/interfaces/sensors/aidl/default/multihal/ . Модуль обрабатывает преобразование между типами определений HAL датчиков AIDL и HIDL и определяет оболочку вокруг интерфейса multi-HAL, описанного в разделе «Реализация датчиков Multi-HAL 2.1» . Уровень прокладки AIDL multi-HAL совместим с устройствами, реализующими Sensors Multi-HAL 2.1.

Слой прокладки AIDL multi-HAL позволяет отображать типы датчиков отслеживания положения головы и IMU с ограниченной осью в разделе «Датчики AIDL HAL». Чтобы использовать эти типы датчиков, определенные интерфейсом AIDL HAL, установите поле type в структуре SensorInfo в реализации getSensorsList_2_1() . Это безопасно, поскольку поля типа датчика с целочисленной поддержкой датчиков AIDL и HIDL HAL не перекрываются.

Датчики агрегата Multi-HAL 2.1

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

  1. Реализуйте интерфейс ISensorsSubHal , как описано в SubHal.h .
  2. Реализуйте метод sensorsHalGetSubHal_2_1 в SubHal.h .
  3. Добавьте цель cc_library_shared для создания недавно реализованного суб-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 запускается, ищет недавно реализованный суб-HAL и инициализирует его, вызывая sensorsHalGetSubHal_2_1 .

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

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

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

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

Порт с датчиков 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() .

Порт с датчиков 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() .

Порт с датчиков 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), чтобы убедиться, что ваши реализации суб-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

Если вы используете слой оболочки AIDL Multi-HAL, запустите VtsAidlHalSensorsTargetTest .

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

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

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

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

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

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

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

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

Два поддельных суб-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, перечисленные в конфигурации.

    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 является большим (1000 или более), это указывает на то, что имеется много событий, ожидающих записи в структуру датчиков. Это указывает на то, что служба датчиков зашла в тупик или вышла из строя и не обрабатывает события датчиков, или что недавно из суб-HAL был опубликован большой пакет событий датчиков.

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

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