HDMI-CEC(High-Definition Multimedia Interface Consumer Electronics Control) 표준은 멀티미디어 소비자 제품 간의 통신 및 정보 교환이 이루어질 수 있도록 해줍니다. HDMI-CEC는 원격 제어 패스 스루 및 시스템 오디오 제어와 같은 다수의 기능을 지원하지만 가장 인기 있는 기능 중 하나는 원터치 플레이(One Touch Play)입니다. 원터치 플레이를 사용하면 미디어 소스 기기가 TV를 켜고 입력 포트를 자동으로 전환할 수 있으므로 Chromecast에서 블루레이 플레이어로 전환하기 위해 TV 리모컨을 찾지 않아도 됩니다.
Android 12에서는 HDMI 연결 디스플레이의 전원 컨트롤이 내부 디스플레이의 전원 컨트롤에 맞춰 조정됩니다. HDMI 재생 기기가 절전 모드에서 해제되면 HDMI CEC 원터치 플레이를 통해 커넥티드 TV의 절전 모드를 해제하고 현재 활성 소스가 되려고 합니다. 기기가 현재 활성 소스인 동안 절전 모드로 전환되면 커넥티드 TV를 끄려고 합니다.
HDMI-CEC 지원은 일반적으로 선택사항입니다. 그러나 대부분의 제조업체에서는 기기가 다른 회사 기기와 호환되도록 HDMI-CEC를 채택했습니다. 각 제조업체는 상이한 방식으로 HDMI-CEC 표준을 구현합니다. 따라서 기기 간 인식이 되지 않는 경우도 있고 지원되는 기능도 다릅니다. 이러한 변수 때문에 소비자는 CEC 지원을 주장하는 두 제품이 완벽하게 호환된다고 추정할 수 없습니다.
HDMI-CEC 2.0을 지원하면 송신 및 수신 기기가 모두 이 표준 버전을 지원하는 경우 HDMI 기기 간의 호환성을 개선할 수 있습니다.
해결 방법
Android TV 입력 프레임워크(TIF)의 도입으로 HDMI-CEC는 모든 연결된 기기를 하나로 통합하고 호환성 문제를 최소화합니다.
Android는 위와 같은 고충을 해소하기 위해 HdmiControlService
라는 시스템 서비스를 마련했습니다.
Android는 HdmiControlService
를 Android 생태계의 일부로 편입해 다음과 같은 이점을 제공할 수 있기를 바랍니다.
- 모든 제조업체에 맞는 표준 HDMI-CEC 구현으로 기기의 비호환성을 줄입니다. 이전에는 제조업체에서 HDMI-CEC의 자체 구현을 개발하거나 서드 파티 솔루션을 사용해야 했습니다.
- 수많은 HDMI-CEC 기기를 대상으로 충분한 테스트를 거친 서비스가 이미 시중에 나와 있습니다. Android는 제품 간에 발견된 호환성 문제에 관한 엄격한 조사를 실시하는 동시에, 기술 분야 경험이 풍부한 기기 구현자들로부터 유용한 정보를 수집해 왔습니다. CEC 서비스는 표준과 변화된 표준 사이의 건강한 균형을 유지하여 이미 사용되고 있는 제품과 호환되도록 하는 데 목적이 있습니다.
전반적인 디자인
HdmiControlService
는 표준에 명시된 다양한 기능을 구현하기 위해 TV 입력 프레임워크(TIF), 오디오 서비스, 전원 서비스 등의 나머지 시스템과 연결되어 있습니다.
아래의 다이어그램에는 맞춤 CEC 컨트롤러에서 좀 더 단순한 HDMI-CEC 하드웨어 추상화 계층(HAL)의 구현으로 전환되는 과정이 묘사되어 있습니다.
![Android 5.0 전과 후에 HDMI-CEC가 구현된 방식을 보여주는 다이어그램](https://source.android.com/static/docs/devices/tv/images/HDMI_Control_Service.png?hl=ko)
그림 1. HDMI 제어 서비스 교체
구현
아래의 다이어그램에는 HDMI 제어 서비스가 자세히 묘사되어 있습니다.
![HDMI 제어 서비스의 세부정보를 보여주는 이미지](https://source.android.com/static/docs/devices/tv/images/HDMI_Control_Service_Flow.png?hl=ko)
그림 2. HDMI 제어 서비스 세부정보
다음은 올바른 Android HDMI-CEC 구현을 위한 핵심 요소입니다.
- 관리자 클래스
HdmiControlManager
는 권한이 있는 앱에 API를 제공합니다. TV 입력 관리자 서비스와 오디오 서비스 등의 시스템 서비스는 서비스를 직접 사용할 수 있습니다. - 서비스는 두 가지 이상의 논리 기기 호스팅을 허용하도록 설계되었습니다.
- HDMI-CEC는 기기 간의 프로토콜 및 신호 전송 메커니즘의 차이점 처리를 간소화하기 위해 하드웨어 추상화 계층(HAL)을 통해 하드웨어와 연결됩니다. HAL 정의는 기기 제조업체에서 HAL을 구현하는 용도로 사용할 수 있습니다.
참고: 기기 제조업체는 다음 줄을 device.mk
의 PRODUCT_COPY_FILES
에 추가해야 합니다.
PRODUCT_COPY_FILES += \ frameworks/native/data/etc/android.hardware.hdmi.cec.xml:system/etc/permissions/android.hardware.hdmi.cec.xml
기기가 HDMI 싱크 기기 또는 HDMI 소스 기기인지에 따라 기기 제조업체는 HdmiControlService
가 정상적으로 작동하도록 device.mk
의 ro.hdmi.device_type
을 설정해야 합니다.
오버더톱(OTT)이나 셋톱 박스(STB) 기기와 같은 HDMI 소스 기기의 경우 다음과 같이 설정합니다.
PRODUCT_PROPERTY_OVERRIDES += ro.hdmi.device_type=4
패널 TV와 같은 HDMI 싱크 기기의 경우 다음과 같이 설정합니다.
PRODUCT_PROPERTY_OVERRIDES += ro.hdmi.device_type=0
- 기기 제조업체에서 제공한 독점 CEC 컨트롤러는
HdmiControlService
와 함께 사용할 수 없으며, 중지하거나 제거해야 합니다. 그 이유는 제조업체별 명령어를 처리해야 하기 때문입니다. 제조업체별 명령어 핸들러는 확장/수정을 통해 서비스에 통합되어야 합니다. 이 작업은 기기 제조업체의 역할이며 Android에 의해 명시되지 않습니다. 제조업체별 명령어와 관련하여 서비스에서 이루어진 모든 변경사항은 표준 명령어가 처리되는 방식을 방해하면 안 됩니다. 방해할 경우 기기가 Android와 호환되지 않습니다. - HDMI-CEC 서비스에 관한 액세스는 보호 수준
SignatureOrSystem
에 의해 보호됩니다. 시스템 구성요소 또는/system/priv-app
에 있는 앱만 서비스에 액세스할 수 있습니다. 이는 악의적인 의도가 있는 앱이 서비스를 악용하지 못하도록 하기 위함입니다.
Android에서는 원터치 플레이 명령어를 실행하여 활성 소스가 될 수 있는 유형 TV/Display(0)
, Playback
device(4)
및 시스템 오디오 모드와 ARC를 처리하는 Audio System (5)
을 지원합니다.
다른 기기 유형(튜너, 녹음기)은 현재 지원되지 않습니다.
HDMI-CEC HAL
HDMI-CEC HAL API를 사용하면 HdmiControlService
가 하드웨어 리소스를 활용하여 HDMI-CEC 명령어를 전송/수신하고 필요한 설정을 구성할 수 있습니다. 또한 Android 시스템이 대기 모드에 있는 동안 CEC 제어를 담당하는 기본 플랫폼의 마이크로프로세서와 통신할 수도 있습니다(선택사항).
버전 | 기능 | HAL 파일 |
---|---|---|
1.0 | HAL 데이터(주소, 기능)를 구성합니다. HDMI-CEC 명령어를 전송합니다. 콜백을 등록하여 HDMI-CEC 명령어 및 핫플러그 이벤트를 수신합니다. | IHdmiCec.hal IHdmiCecCallback.hal |
1.1 | HDMI-CEC 2.0 유형을 소개합니다. | @1.1::IHdmiCec.hal @1.1::IHdmiCecCallback.hal |
테스트
기기의 HDMI-CEC 구현은 HDMI-CEC CTS 문서에 따라 CTS 테스트를 통해 테스트되고 확인됩니다.
HDMI-CEC 2.0
Android 소스(재생) 및 싱크(TV 패널) 기기는 HDMI-CEC 2.0을 지원합니다. HDMI-CEC 2.0에서는 HDMI 기기 간의 향상된 상호 운용성과 원격 제어 패스 스루 개선사항, 더 광범위한 인증 테스트를 제공합니다. 일반적으로 다른 기기와의 상호작용은 HDMI-CEC 2.0이 더 효율적이므로 HDMI-CEC 트래픽이 줄어들 뿐 아니라 상호작용도 빨라집니다.
기기에서 HDMI-CEC 2.0을 지원하려면 기기 및 사용자 구성이 HDMI-CEC 2.0을 사용하도록 설정되어 있어야 합니다. 또한 HAL 구현에서는 IHdmiCec#getCecVersion
호출에서 HDMI-CEC 2.0 지원을 보고해야 합니다.
CEC 구성
HDMI-CEC 동작은 빌드 시간(RRO를 사용하는 OEM에서)과 런타임(HdmiControlManager
@SystemApi로)에 모두 구성할 수 있습니다.
HDMI-CEC 설정 예는 다음과 같습니다.
설정 | 옵션 |
---|---|
HDMI-CEC의 사용 설정 여부 | 사용 설정됨 사용 중지됨 |
재생 기기에서 전송한 HDMI-CEC 전원 컨트롤 메시지의 범위 | TV만 TV 및 오디오 시스템 브로드캐스트 없음 |
현재 사용 가능한 설정과 허용된 옵션은 런타임에 앱에서 쿼리할 수 있습니다.