Стек датчиков

На рисунке ниже представлена ​​структура сенсорного стека Android. Каждый компонент взаимодействует только с компонентами, расположенными непосредственно над и под ним, хотя некоторые датчики могут обходить центральный блок датчиков, если он присутствует. Управление осуществляется от приложений к датчикам, а данные передаются от датчиков к приложениям.

Слои и владельцы стека датчиков Android

Рисунок 1. Слои стека датчиков Android и их соответствующие владельцы.

SDK

Приложения получают доступ к датчикам через API комплекта разработки программного обеспечения (SDK) для датчиков . SDK содержит функции для отображения списка доступных датчиков и для регистрации в системе.

При регистрации в системе датчика приложение указывает предпочтительную частоту дискретизации и требования к задержке.

  • Например, приложение может зарегистрироваться в системе акселерометра по умолчанию, запрашивая события с частотой 100 Гц и позволяя передавать данные о событиях с задержкой в ​​1 секунду.
  • Приложение будет получать события от акселерометра с частотой не менее 100 Гц и, возможно, с задержкой до 1 секунды.

Для получения более подробной информации об SDK см. документацию для разработчиков .

Рамки

Данная платформа отвечает за связь различных приложений с HAL . Сам HAL является одноклиентским. Без мультиплексирования на уровне платформы к каждому датчику одновременно могло бы обращаться только одно приложение.

  • Когда первое приложение регистрируется у датчика, платформа отправляет запрос в HAL для активации датчика.
  • Когда к одному и тому же датчику регистрируются дополнительные приложения, платформа учитывает требования каждого приложения и отправляет обновленные запрошенные параметры в HAL.
    • Частота дискретизации будет равна максимальному значению из запрошенных частот дискретизации, то есть некоторые приложения будут получать события с частотой выше запрошенной.
    • Максимальная задержка передачи данных будет равна минимальной из запрошенных. Если одно приложение запрашивает один датчик с максимальной задержкой передачи данных, равной 0, все приложения будут получать события от этого датчика в непрерывном режиме, даже если некоторые из них запрашивали датчик с ненулевой максимальной задержкой передачи данных. Дополнительные сведения см. в разделе «Пакетная обработка» .
  • Когда последнее приложение, зарегистрированное на одном датчике, отменяет регистрацию, фреймворк отправляет запрос в HAL на деактивацию датчика, чтобы избежать ненужного потребления энергии.

Влияние мультиплексирования

Необходимость наличия мультиплексного слоя в данной структуре объясняет некоторые проектные решения.

  • Когда приложение запрашивает определенную частоту дискретизации, нет гарантии, что события не будут поступать с большей скоростью. Если другое приложение запросит данные с того же датчика с большей скоростью, первое приложение также получит их с большей скоростью.
  • Аналогичная ситуация с отсутствием гарантий касается и запрошенной максимальной задержки отправки сообщений: приложения могут получать события с гораздо меньшей задержкой, чем запрашивали.
  • Помимо частоты дискретизации и максимальной задержки передачи данных, приложения не могут настраивать параметры датчиков.
    • Например, представьте себе физический датчик, который может работать как в режиме «высокой точности», так и в режиме «низкого энергопотребления».
    • На устройстве Android можно использовать только один из этих двух режимов, потому что в противном случае одно приложение может запросить режим высокой точности, а другое — режим низкого энергопотребления; у фреймворка не будет возможности удовлетворить оба приложения. Фреймворк всегда должен удовлетворять потребности всех своих клиентов, поэтому такой вариант не подходит.
  • Отсутствует механизм передачи данных от приложений к датчикам или их драйверам. Это гарантирует, что ни одно приложение не сможет изменить поведение датчиков, что приведет к сбоям в работе других приложений.

Объединение данных с датчиков

Фреймворк Android предоставляет реализацию по умолчанию для некоторых составных датчиков. Если на устройстве присутствуют гироскоп , акселерометр и магнитометр , но отсутствуют датчики вектора вращения , гравитации и линейного ускорения , фреймворк реализует эти датчики, чтобы приложения могли их использовать.

Реализация по умолчанию не имеет доступа ко всем данным, доступным другим реализациям, и должна работать на SoC, поэтому она не так точна и энергоэффективна, как другие реализации. По возможности производителям устройств следует определять собственные объединенные датчики (вектор вращения, гравитация и линейное ускорение, а также более новые составные датчики, такие как вектор вращения в игре ), а не полагаться на эту реализацию по умолчанию. Производители устройств также могут обратиться к поставщикам микросхем датчиков с просьбой предоставить им собственную реализацию.

Реализация объединения данных с датчиков по умолчанию не поддерживается, и это может привести к сбоям в работе CTS на устройствах, которые от нее зависят.

Под капотом

Этот раздел предназначен в качестве справочной информации для тех, кто поддерживает код фреймворка Android Open Source Project (AOSP). Он не имеет отношения к производителям оборудования.

JNI

Данная платформа использует Java Native Interface (JNI), связанный с android.hardware и расположенный в каталоге frameworks/base/core/jni/ . Этот код вызывает нативный код нижнего уровня для получения доступа к аппаратному обеспечению датчика.

Нативная структура

Нативная среда разработки определена в frameworks/native/ и предоставляет нативный эквивалент пакета android.hardware . Нативная среда разработки вызывает прокси-серверы межпроцессного взаимодействия Binder для получения доступа к сервисам, специфичным для датчиков.

Binder IPC

Прокси-серверы Binder IPC обеспечивают обмен данными через границы процессов.

ХАЛ

API уровня аппаратной абстракции датчиков (HAL) — это интерфейс между драйверами оборудования и платформой Android. Он состоит из одного интерфейса HAL — sensors.h — и одной реализации HAL, которую мы называем sensors.cpp.

Интерфейс определяется разработчиками Android и AOSP, а реализация предоставляется производителем устройства.

Интерфейс HAL для датчиков находится в hardware/libhardware/include/hardware . Дополнительные сведения см. в файле sensors.h .

Цикл выпуска

Реализация HAL указывает, какую версию интерфейса HAL она использует, устанавливая значение параметра your_poll_device.common.version . Существующие версии интерфейса HAL определены в файле sensors.h, и функциональность привязана к этим версиям.

В настоящее время платформа Android поддерживает версии 1.0 и 1.3, но поддержка версии 1.0 скоро прекратится. В этой документации описывается поведение версии 1.3, до которой следует обновить все устройства. Подробную информацию о том, как обновиться до версии 1.3, см. в разделе «Устаревание версий HAL» .

драйвер ядра

Драйверы датчиков взаимодействуют с физическими устройствами. В некоторых случаях реализация HAL и драйверы представляют собой один и тот же программный компонент. В других случаях интегратор оборудования запрашивает драйверы у производителей микросхем датчиков, но именно они разрабатывают реализацию HAL.

Во всех случаях реализация HAL и драйверы ядра являются ответственностью производителей оборудования, и Android не предлагает предпочтительных подходов к их написанию.

Центр датчиков

В состав сенсорного стека устройства может опционально входить сенсорный концентратор, полезный для выполнения низкоуровневых вычислений с низким энергопотреблением, пока SoC находится в режиме ожидания. Например, на этих микросхемах можно выполнять подсчет шагов или объединение данных с датчиков. Это также хорошее место для реализации пакетной обработки данных с датчиков, с добавлением аппаратных FIFO для событий датчиков. Дополнительную информацию см. в разделе «Пакетная обработка» .

Примечание: Для разработки новых функций ContextHub, использующих новые датчики или светодиоды, вы также можете использовать Neonkey SensorHub, подключенный к плате разработки Hikey или Hikey960.

Способ реализации сенсорного концентратора зависит от архитектуры. Иногда это отдельный чип, а иногда он интегрирован в тот же чип, что и SoC. Важными характеристиками сенсорного концентратора являются наличие достаточного объема памяти для пакетной обработки и очень низкое энергопотребление для обеспечения работы маломощных датчиков Android. Некоторые сенсорные концентраторы содержат микроконтроллер для выполнения общих вычислений и аппаратные ускорители для обеспечения очень низкого энергопотребления при работе с маломощными датчиками.

Архитектура сенсорного концентратора и способы его взаимодействия с датчиками и SoC (шина I2C, шина SPI и т. д.) не определены Android, но предполагается, что он должен стремиться к минимизации общего энергопотребления.

Один из вариантов, который, по-видимому, существенно упрощает реализацию, — это наличие двух линий прерываний, идущих от концентратора датчиков к SoC: одна для прерываний пробуждения (для датчиков, активирующихся при пробуждении), а другая для прерываний, не связанных с пробуждением (для датчиков, не активирующихся при пробуждении).

Датчики

Это физические MEMS-чипы, осуществляющие измерения. Во многих случаях на одном чипе присутствует несколько физических датчиков. Например, некоторые чипы включают акселерометр, гироскоп и магнитометр. (Такие чипы часто называют 9-осевыми, поскольку каждый датчик предоставляет данные по 3 осям.)

Некоторые из этих микросхем также содержат логику для выполнения обычных вычислений, таких как обнаружение движения, обнаружение шагов и объединение данных с 9-осевых датчиков.

Хотя требования и рекомендации CDD по энергопотреблению и точности ориентированы на датчики Android, а не на физические датчики, эти требования влияют на выбор физических датчиков. Например, требование к точности вектора вращения в игре влияет на требуемую точность физического гироскопа. Определение требований к физическим датчикам является задачей производителя устройства.