센서 AIDL HAL

센서 HAL(하드웨어 추상화 계층)은 Android 센서 프레임워크와 가속도계 또는 자이로스코프와 같은 기기의 센서 간의 인터페이스입니다. 센서 HAL은 프레임워크가 센서를 제어할 수 있도록 구현해야 하는 기능을 정의합니다.

Sensors AIDL HAL은 Android 13 이상에서 신규 및 업그레이드된 기기에서 사용할 수 있습니다. Sensors HAL 2.1 을 기반으로 하는 Sensors AIDL HAL은 AIDL HAL 인터페이스 를 사용하고 헤드 트래커 및 제한된 축 IMU 센서 유형을 노출합니다.

AIDL HAL 인터페이스

센서 AIDL HAL에 대한 문서의 주요 소스는 HAL 정의( hardware/interfaces/sensors/aidl/android/hardware/sensors/ISensors.aidl ) 에 있습니다.

센서 AIDL HAL 구현

센서 AIDL HAL을 구현하려면 객체가 ISensors 인터페이스를 확장하고 hardware/interfaces/sensors/aidl/android/hardware/sensors/ISensors.aidl 에 정의된 모든 기능을 구현해야 합니다.

HAL 초기화

센서 HAL을 사용하려면 먼저 Android 센서 프레임워크에서 초기화해야 합니다. 프레임워크는 initialize() 함수를 호출하여 센서 HAL에 세 가지 매개변수(FMQ 설명자 2개와 ISensorsCallback 개체에 대한 포인터 1개)를 제공합니다.

HAL은 첫 번째 설명자를 사용하여 프레임워크에 센서 이벤트를 쓰는 데 사용되는 이벤트 FMQ를 만듭니다. HAL은 두 번째 설명자를 사용하여 HAL이 WAKE_UP 센서 이벤트에 대한 깨우기 잠금을 해제할 때 동기화하는 데 사용되는 Wake Lock FMQ를 만듭니다. HAL은 필요한 콜백 함수가 호출될 수 있도록 ISensorsCallback 개체에 대한 포인터를 저장해야 합니다.

initialize() 함수는 센서 HAL을 초기화할 때 호출되는 첫 번째 함수여야 합니다.

사용 가능한 센서 노출

장치에서 사용 가능한 모든 정적 센서 목록을 가져오려면 getSensorsList() 함수를 사용하십시오. 이 함수는 핸들로 고유하게 식별되는 센서 목록을 반환합니다. 센서 HAL을 호스팅하는 프로세스가 다시 시작될 때 지정된 센서에 대한 핸들이 변경되어서는 안 됩니다. 핸들은 장치 재부팅 및 시스템 서버 다시 시작 시 변경될 수 있습니다.

여러 센서가 동일한 센서 유형 및 깨우기 속성을 공유하는 경우 목록의 첫 번째 센서를 기본 센서라고 하며 getDefaultSensor(int sensorType, bool wakeUp) 함수를 사용하는 앱으로 반환됩니다.

센서 목록의 안정성

센서 HAL이 다시 시작된 후 getSensorsList() 에서 반환된 데이터가 다시 시작하기 전에 검색된 센서 목록과 비교하여 중요한 변경 사항을 나타내는 경우 프레임워크는 Android 런타임의 다시 시작을 트리거합니다. 센서 목록의 중요한 변경 사항에는 주어진 핸들이 있는 센서가 없거나 속성이 변경된 경우 또는 새 센서가 도입된 경우가 포함됩니다. Android 런타임을 다시 시작하는 것은 사용자에게 방해가 되지만 Android 프레임워크는 앱 수명 동안 정적(비동적) 센서가 변경되지 않는 Android API 계약을 더 이상 충족할 수 없기 때문에 필요합니다. 이렇게 하면 프레임워크가 앱에서 수행한 활성 센서 요청을 다시 설정하지 못할 수도 있습니다. 따라서 HAL 공급업체는 피할 수 있는 센서 목록 변경을 방지하는 것이 좋습니다.

안정적인 센서 핸들을 보장하기 위해 HAL은 디바이스의 지정된 물리적 센서를 핸들에 결정적으로 매핑해야 합니다. Sensors HAL 인터페이스에서 요구하는 특정 구현은 없지만 개발자는 이 요구 사항을 충족하기 위해 여러 가지 옵션을 사용할 수 있습니다.

예를 들어, 센서 목록은 벤더, 모델 및 센서 유형과 같은 각 센서의 고정 속성 조합을 사용하여 정렬할 수 있습니다. 또 다른 옵션은 장치의 정적 센서 세트가 하드웨어에 고정되어 있다는 사실에 의존하므로 HAL은 getSensorsList() 에서 반환하기 전에 예상되는 모든 센서가 초기화를 완료한 시점을 알아야 합니다. 이 예상 센서 목록은 HAL 바이너리로 컴파일하거나 파일 시스템의 구성 파일에 저장할 수 있으며, 표시 순서를 사용하여 안정적인 핸들을 얻을 수 있습니다. 최상의 솔루션은 HAL의 특정 구현 세부 정보에 따라 다르지만 핵심 요구 사항은 HAL을 다시 시작해도 센서 핸들이 변경되지 않는다는 것입니다.

센서 구성

센서가 활성화되기 전에 batch() 함수를 사용하여 샘플링 기간과 최대 보고 대기 시간으로 센서를 구성해야 합니다.

센서는 센서 데이터의 손실 없이 batch() 를 사용하여 언제든지 재구성할 수 있어야 합니다.

샘플링 기간

샘플링 기간은 구성 중인 센서 유형에 따라 다른 의미를 갖습니다.

  • 연속: 센서 이벤트가 연속 속도로 생성됩니다.
  • On-change: 이벤트가 샘플링 주기보다 빠르지 않게 생성되며 측정값이 변경되지 않으면 샘플링 주기보다 느린 속도로 이벤트가 생성될 수 있습니다.
  • One-shot: 샘플링 기간이 무시됩니다.
  • 특수: 자세한 내용은 센서 유형 을 참조하십시오.

샘플링 기간과 센서의 보고 모드 간의 상호 작용에 대해 알아보려면 보고 모드 를 참조하십시오.

최대 보고 지연 시간

최대 보고 대기 시간은 SoC가 깨어 있는 동안 HAL을 통해 이벤트 FMQ에 기록되기 전에 이벤트가 지연되고 하드웨어 FIFO에 저장될 수 있는 최대 시간(나노초)을 설정합니다.

0 값은 FIFO를 모두 건너뛰거나 센서의 이벤트 하나가 FIFO에 존재하는 즉시 FIFO를 비워 이벤트가 측정되는 즉시 보고되어야 함을 의미합니다.

예를 들어 최대 보고 대기 시간이 0인 50Hz에서 활성화된 가속도계는 SoC가 깨어 있을 때 초당 50번 인터럽트를 발생시킵니다.

최대 보고 대기 시간이 0보다 크면 센서 이벤트가 감지되자마자 보고할 필요가 없습니다. 이벤트가 최대 보고 대기 시간보다 지연되지 않는 한 하드웨어 FIFO에 임시로 저장하고 일괄적으로 보고할 수 있습니다. 이전 배치 이후의 모든 이벤트가 기록되고 한 번에 반환됩니다. 이렇게 하면 SoC로 전송되는 인터럽트 수가 줄어들고 센서가 데이터를 캡처하고 일괄 처리하는 동안 SoC가 저전력 모드로 전환할 수 있습니다.

각 이벤트에는 연관된 타임스탬프가 있습니다. 이벤트가 보고되는 시간을 지연시키는 것은 이벤트 타임스탬프에 영향을 미치지 않아야 합니다. 타임스탬프는 정확해야 하며 보고된 시간이 아니라 이벤트가 실제로 발생한 시간과 일치해야 합니다.

최대 보고 대기 시간이 0이 아닌 센서 이벤트 보고에 대한 추가 정보 및 요구 사항은 일괄 처리 를 참조하십시오.

센서 활성화

프레임워크는 activate() 함수를 사용하여 센서를 활성화 및 비활성화합니다. 센서를 활성화하기 전에 프레임워크는 먼저 batch() 를 사용하여 센서를 구성해야 합니다.

센서가 비활성화된 후에는 해당 센서의 추가 센서 이벤트가 이벤트 FMQ에 기록되지 않아야 합니다.

플러싱 센서

센서가 센서 데이터를 일괄 처리하도록 구성된 경우 프레임워크는 flush() 를 호출하여 일괄 처리된 센서 이벤트를 즉시 플러시할 수 있습니다. 이로 인해 지정된 센서 핸들에 대한 일괄 처리된 센서 이벤트가 이벤트 FMQ에 즉시 기록됩니다. 센서 HAL은 flush() 호출의 결과로 작성된 센서 이벤트 끝에 플러시 완료 이벤트를 추가해야 합니다.

플러시는 비동기적으로 발생합니다(즉, 이 함수는 즉시 반환되어야 함). 구현에서 여러 센서에 대해 단일 FIFO를 사용하는 경우 해당 FIFO가 플러시되고 플러시 완료 이벤트가 지정된 센서에 대해서만 추가됩니다.

지정된 센서에 FIFO가 없거나(버퍼링 불가능) 호출 시 FIFO가 비어 있는 경우, flush() 는 여전히 성공하고 해당 센서에 대한 플러시 완료 이벤트를 보내야 합니다. 이는 원샷 센서를 제외한 모든 센서에 적용됩니다.

원샷 센서에 대해 flush() 가 호출되면 flush( flush()BAD_VALUE 를 반환해야 하며 플러시 완료 이벤트를 생성하지 않아야 합니다.

FMQ에 센서 이벤트 쓰기

이벤트 FMQ는 센서 HAL에서 센서 이벤트를 Android 센서 프레임워크로 푸시하는 데 사용됩니다.

이벤트 FMQ는 동기화된 FMQ입니다. 즉, 사용 가능한 공간이 허용하는 것보다 더 많은 이벤트를 FMQ에 쓰려고 하면 쓰기가 실패합니다. 이러한 경우 HAL은 현재 이벤트 집합을 두 개의 더 작은 이벤트 그룹으로 쓸지 또는 충분한 공간을 사용할 수 있을 때 모든 이벤트를 함께 쓸지 결정해야 합니다.

Sensors HAL이 이벤트 FMQ에 원하는 수의 센서 이벤트를 기록하면 Sensors HAL은 EventQueueFlagBits::READ_AND_PROCESS 비트를 Event FMQ의 EventFlag::wake 함수에 기록하여 이벤트가 준비되었음을 프레임워크에 알려야 합니다. EventFlag는 EventFlag::createEventFlag 및 이벤트 FMQ의 getEventFlagWord() 함수를 사용하여 이벤트 FMQ에서 생성할 수 있습니다.

센서 AIDL HAL은 이벤트 writeBlocking 에서 write 및 쓰기 차단을 모두 지원합니다. 기본 구현은 write 사용을 위한 참조를 제공합니다. writeBlocking 기능을 사용하는 경우 readNotification 플래그를 EventQueueFlagBits::EVENTS_READ 로 설정해야 하며, 이는 이벤트 FMQ에서 이벤트를 읽을 때 프레임워크에 의해 설정됩니다. 쓰기 알림 플래그는 이벤트가 이벤트 FMQ에 기록되었음을 프레임워크에 알리는 EventQueueFlagBits::READ_AND_PROCESS 로 설정되어야 합니다.

WAKE_UP 이벤트

WAKE_UP 이벤트는 애플리케이션 프로세서(AP)가 깨어나서 이벤트를 즉시 처리하도록 하는 센서 이벤트입니다. WAKE_UP 이벤트가 이벤트 FMQ에 기록될 때마다 센서 HAL은 프레임워크가 이벤트를 처리할 수 있을 때까지 시스템이 깨어 있는 상태를 유지하도록 웨이크 잠금을 보호해야 합니다. WAKE_UP 이벤트를 수신하면 프레임워크는 자체 절전 모드 해제 잠금을 보호하여 센서 HAL이 절전 모드 해제 잠금을 해제할 수 있도록 합니다. Sensors HAL이 wake lock을 해제할 때 동기화하려면 Wake Lock FMQ를 사용하세요.

센서 HAL은 Wake Lock FMQ를 읽어 프레임워크가 처리한 WAKE_UP 이벤트 수를 결정해야 합니다. HAL은 처리되지 않은 WAKE_UP 이벤트의 총 수가 0인 경우에만 WAKE_UP 이벤트에 대한 깨우기 잠금을 해제해야 합니다. 센서 이벤트를 처리한 후 프레임워크는 WAKE_UP 이벤트로 표시된 이벤트 수를 계산하고 이 수를 Wake Lock FMQ에 다시 씁니다.

프레임워크는 Wake Lock FMQ에 데이터를 쓸 때마다 Wake Lock FMQ에 WakeLockQueueFlagBits::DATA_WRITTEN 쓰기 알림을 설정합니다.

동적 센서

동적 센서는 물리적으로 장치의 일부가 아니지만 가속도계가 있는 게임패드와 같이 장치에 대한 입력으로 사용할 수 있는 센서입니다.

동적 센서가 연결되면 센서 HAL에서 ISensorsCallbackonDynamicSensorConnected 함수를 호출해야 합니다. 이것은 새로운 동적 센서의 프레임워크에 통지하고 센서가 프레임워크를 통해 제어되고 센서의 이벤트가 클라이언트에 의해 소비되도록 합니다.

마찬가지로 동적 센서의 연결이 끊어지면 프레임워크가 더 이상 사용할 수 없는 센서를 제거할 수 있도록 ISensorsCallbackonDynamicSensorDisconnected 함수를 호출해야 합니다.

직접 채널

직접 채널은 Android 센서 프레임워크를 우회하는 이벤트 FMQ 대신 센서 이벤트가 특정 메모리에 기록되는 작동 방식입니다. 직접 채널을 등록하는 클라이언트는 직접 채널을 만드는 데 사용된 메모리에서 직접 센서 이벤트를 읽어야 하며 프레임워크를 통해 센서 이벤트를 수신하지 않습니다. configDirectReport() 함수는 일반 작업의 batch() 와 유사하며 직접 보고 채널을 구성합니다.

registerDirectChannel()unregisterDirectChannel() 함수는 새 직접 채널을 만들거나 삭제합니다.

작동 모드

setOperationMode() 함수를 사용하면 프레임워크가 센서 데이터를 센서에 주입할 수 있도록 프레임워크가 센서를 구성할 수 있습니다. 이것은 테스트, 특히 프레임워크 아래에 있는 알고리즘에 유용합니다.

injectSensorData() 함수는 일반적으로 작동 매개변수를 센서 HAL로 푸시하는 데 사용됩니다. 이 기능을 사용하여 센서 이벤트를 특정 센서에 주입할 수도 있습니다.

확인

센서 HAL 구현을 검증하려면 센서 CTS 및 VTS 테스트를 실행하십시오.

CTS 테스트

센서 CTS 테스트는 자동화된 CTS 테스트와 수동 CTS Verifier 앱 모두에 존재합니다.

자동화된 테스트는 cts/tests/sensor/src/android/hardware/cts 에 있습니다. 이러한 테스트는 센서 활성화, 일괄 처리 및 센서 이벤트 비율과 같은 센서의 표준 기능을 확인합니다.

CTS Verifier 테스트는 cts/apps/CtsVerifier/src/com/android/cts/verifier/sensors 에 있습니다. 이러한 테스트는 테스트 작업자의 수동 입력이 필요하며 센서가 정확한 값을 보고하는지 확인합니다.

CTS 테스트를 통과하는 것은 테스트 중인 장치가 모든 CDD 요구 사항을 충족하는지 확인하는 데 중요합니다.

VTS 테스트

센서 AIDL HAL에 대한 VTS 테스트는 hardware/interfaces/sensors/aidl/vts/ 에 있습니다. 이러한 테스트는 센서 HAL이 올바르게 구현되고 ISensors.aidlISensorsCallback.aidl 내의 모든 요구 사항이 적절하게 충족되는지 확인합니다.

HAL 초기화

프레임워크와 HAL 간에 FMQ를 설정하려면 initialize() 함수가 지원되어야 합니다.

사용 가능한 센서 노출

Sensors AIDL HAL에서 getSensorsList() 함수는 Sensor HAL이 다시 시작되는 경우에도 단일 장치 부팅 중에 동일한 값을 반환해야 합니다. getSensorsList() 함수의 새로운 요구 사항은 센서 HAL이 다시 시작되는 경우에도 단일 장치 부팅 중에 동일한 값을 반환해야 한다는 것입니다. 이렇게 하면 시스템 서버가 다시 시작될 경우 프레임워크가 센서 연결 재설정을 시도할 수 있습니다. getSensorsList() 에 의해 반환된 값은 장치가 재부팅을 수행한 후 변경될 수 있습니다.

FMQ에 센서 이벤트 쓰기

센서 AIDL HAL에서 poll() 이 호출되기를 기다리는 대신 센서 HAL은 센서 이벤트를 사용할 수 있을 때마다 이벤트 FMQ에 센서 이벤트를 사전에 기록해야 합니다. HAL은 또한 EventFlag 에 올바른 비트를 기록하여 프레임워크 내에서 FMQ 읽기를 유발합니다.

WAKE_UP 이벤트

센서 HAL 1.0에서 HAL은 WAKE_UPpoll() 에 게시된 후 poll() 에 대한 후속 호출에서 WAKE_UP 이벤트에 대한 깨우기 잠금을 해제할 수 있었습니다. 이는 프레임워크가 모든 센서 이벤트를 처리하고 필요한 경우 잠금 해제. 센서 AIDL HAL에서 프레임워크가 FMQ에 기록된 이벤트를 처리할 때 HAL에 더 이상 알림이 전송되지 않기 때문에 Wake Lock FMQ를 사용하면 프레임워크가 WAKE_UP 이벤트를 처리했을 때 HAL과 통신할 수 있습니다.

Sensors AIDL HAL에서 WAKE_UP 이벤트에 대해 Sensors HAL에 의해 보호되는 깨우기 잠금은 SensorsHAL_WAKEUP 으로 시작해야 합니다.

동적 센서

센서 HAL 1.0에서 poll() 함수를 사용하여 동적 센서가 반환되었습니다. 센서 AIDL HAL을 사용하려면 동적 센서 연결이 변경될 때마다 ISensorsCallbackonDynamicSensorsConnectedonDynamicSensorsDisconnected 를 호출해야 합니다. 이러한 콜백은 initialize() 함수를 통해 제공되는 ISensorsCallback 포인터의 일부로 사용할 수 있습니다.

작동 모드

WAKE_UP 센서에 대한 DATA_INJECTION 모드가 지원되어야 합니다.

다중 HAL 지원

센서 AIDL HAL은 센서 다중 HAL 프레임워크 를 사용하여 다중 HAL을 지원합니다. 구현 세부 정보 는 센서 HAL 2.1에서 이식을 참조하십시오.