Usługa sterowania HDMI-CEC

Standard HDMI-CEC (High-Definition Multimedia Interface Consumer Electronics Control) umożliwia urządzeniom multimedialnym komunikowanie się i wymianę informacji. HDMI-CEC obsługuje wiele funkcji, takich jak przekazywanie sygnału pilota i sterowanie dźwiękiem systemowym, ale jedną z najpopularniejszych jest funkcja One Touch Play. One Touch Play umożliwia urządzeniu źródłowemu włączenie telewizora i automatyczne przełączenie jego portu wejściowego, dzięki czemu nie musisz szukać pilota do telewizora, aby przełączyć się z Chromecasta na odtwarzacz Blu-ray.

W Androidzie 12 zarządzanie energią wyświetlacza podłączonego przez HDMI jest zgodne z zarządzaniem energią wyświetlacza wewnętrznego. Gdy urządzenie odtwarzające HDMI się wybudza, próbuje wybudzić podłączony telewizor i stać się bieżącym aktywnym źródłem za pomocą funkcji HDMI CEC One Touch Play. Jeśli urządzenie przejdzie w stan uśpienia, gdy jest bieżącym aktywnym źródłem, spróbuje wyłączyć podłączony telewizor.

Obsługa HDMI-CEC jest zwykle opcjonalna. Jednak większość producentów przyjęła standard HDMI-CEC, aby ich urządzenia działały z urządzeniami innych firm. Każdy producent implementuje standard HDMI-CEC na swój sposób, więc urządzenia nie zawsze się rozumieją, a obsługiwane funkcje różnią się w zależności od urządzenia. Z tego powodu konsumenci nie mogą zakładać, że 2 produkty, które deklarują obsługę CEC, są w pełni kompatybilne.

Obsługa HDMI-CEC 2.0 pomaga zwiększyć kompatybilność między urządzeniami HDMI, jeśli zarówno urządzenie wysyłające, jak i odbierające obsługują tę wersję standardu.

Rozwiązanie

Dzięki wprowadzeniu platformy Android TV Input Framework (TIF) standard HDMI-CEC łączy wszystkie podłączone urządzenia i minimalizuje problemy z kompatybilnością. Aby rozwiązać te problemy, Android utworzył usługę systemową o nazwie HdmiControlService.

Oferując HdmiControlService jako część ekosystemu Androida, chcemy zapewnić:

  • Standardową implementację HDMI-CEC dla wszystkich producentów, co zmniejszy niezgodność urządzeń. Wcześniej producenci musieli opracowywać własne implementacje HDMI-CEC lub korzystać z rozwiązań innych firm.
  • Usługę, która została dokładnie przetestowana na wielu urządzeniach HDMI-CEC dostępnych już na rynku. Przeprowadziliśmy rygorystyczne badania dotyczące problemów z kompatybilnością występujących w produktach i zebraliśmy przydatne porady od producentów urządzeń, którzy mają doświadczenie w tej technologii. Usługa CEC została zaprojektowana tak, aby zachować równowagę między standardem a jego modyfikacjami, dzięki czemu będzie działać z produktami, których użytkownicy już używają.

Ogólny projekt

HdmiControlService jest połączona z resztą systemu, np. z platformą TV Input Framework (TIF), usługą audio i usługą zasilania, aby implementować różne funkcje określone w standardzie.

Na ilustracji poniżej przedstawiono przejście z niestandardowego kontrolera CEC na implementację prostszej warstwy abstrakcji sprzętu (HAL) HDMI-CEC.

Diagram pokazujący, jak HDMI-CEC było zaimplementowane przed Androidem 5.0 i po nim

Rysunek 1. Zastąpienie usługi sterowania HDMI

Implementacja

Na ilustracji poniżej przedstawiono szczegółowy widok usługi sterowania HDMI.

Ilustracja pokazująca szczegóły usługi sterowania HDMI

Rysunek 2. Szczegóły usługi sterowania HDMI

Oto najważniejsze elementy prawidłowej implementacji HDMI-CEC w Androidzie:

  • Klasa menedżera HdmiControlManager udostępnia interfejs API aplikacjom z uprawnieniami. Usługi systemowe, takie jak usługa TV Input Manager i usługa audio, mogą korzystać z usługi bezpośrednio.
  • Usługa jest zaprojektowana tak, aby umożliwiać hostowanie więcej niż 1 typu urządzenia logicznego.
  • HDMI-CEC jest połączony ze sprzętem za pomocą warstwy abstrakcji sprzętu (HAL), aby uprościć obsługę różnic w protokole i mechanizmach sygnalizacji między urządzeniami. Definicja HAL jest dostępna dla producentów urządzeń, którzy mogą jej używać do implementowania warstwy HAL.

Uwaga: producenci urządzeń powinni dodać ten wiersz do PRODUCT_COPY_FILES w pliku device.mk.

PRODUCT_COPY_FILES += \
frameworks/native/data/etc/android.hardware.hdmi.cec.xml:system/etc/permissions/android.hardware.hdmi.cec.xml

W zależności od tego, czy urządzenie jest urządzeniem HDMI sink czy HDMI source, producenci urządzeń muszą ustawić ro.hdmi.device_type w pliku device.mk, aby usługa HdmiControlService działała prawidłowo.

W przypadku urządzeń HDMI source, takich jak urządzenia OTT (Over the Top) lub dekodery, ustaw:

PRODUCT_PROPERTY_OVERRIDES += ro.hdmi.device_type=4

W przypadku urządzeń HDMI sink, takich jak telewizory panelowe, ustaw:

PRODUCT_PROPERTY_OVERRIDES += ro.hdmi.device_type=0
  • Własny kontroler CEC dostarczony przez producenta urządzenia nie może współistnieć z usługą HdmiControlService. Musi zostać wyłączony lub usunięty. Typowe wymagania w tym zakresie wynikają z potrzeby obsługi poleceń specyficznych dla producenta. Obsługę poleceń specyficznych dla producenta należy włączyć do usługi przez jej rozszerzenie lub zmodyfikowanie. To zadanie należy do producenta urządzenia i nie jest określone przez Androida. Pamiętaj, że wszelkie zmiany wprowadzone w usłudze w celu obsługi poleceń specyficznych dla producenta nie mogą zakłócać sposobu obsługi poleceń standardowych, ponieważ w przeciwnym razie urządzenie nie będzie zgodne z Androidem.
  • Dostęp do usługi HDMI-CEC jest chroniony poziomem ochrony SignatureOrSystem. Tylko komponenty systemowe lub aplikacje umieszczone w katalogu /system/priv-app mogą uzyskiwać dostęp do usługi. Ma to chronić usługę przed nadużyciami ze strony aplikacji o złośliwych zamiarach.

Android obsługuje typy TV/Display(0), Playback device(4) (które mogą wysyłać polecenie One Touch Play, aby stać się aktywnym źródłem) oraz Audio System (5) (które obsługuje tryb dźwięku systemowego i ARC). Inne typy urządzeń (tuner i rejestrator) nie są obecnie obsługiwane.

HAL HDMI-CEC

Interfejs HDMI-CEC HAL API umożliwia usłudze HdmiControlService korzystanie z zasobów sprzętowych do wysyłania i odbierania poleceń HDMI-CEC, konfigurowania niezbędnych ustawień oraz (opcjonalnie) komunikowania się z mikroprocesorem w bazowej platformie, który przejmie sterowanie CEC, gdy system Android będzie w trybie gotowości.

Wersja Funkcje Pliki HAL
1.0 Konfigurowanie danych HAL (adresów, funkcji). Wysyłanie poleceń HDMI-CEC. Rejestrowanie wywołania zwrotnego w celu odbierania poleceń HDMI-CEC i zdarzeń hotplug. IHdmiCec.hal
IHdmiCecCallback.hal
1.1 Wprowadzenie typów HDMI-CEC 2.0 @1.1::IHdmiCec.hal
@1.1::IHdmiCecCallback.hal

Testowanie

Implementacje HDMI-CEC urządzeń są testowane i weryfikowane za pomocą testów CTS zgodnie z dokumentacją HDMI-CEC CTS.

HDMI-CEC 2.0

Urządzenia źródłowe (odtwarzające) i sink (panel telewizora) z Androidem obsługują HDMI-CEC 2.0. HDMI-CEC 2.0 zapewnia lepszą interoperacyjność między urządzeniami HDMI, ulepszenia w zakresie przekazywania sygnału pilota i bardziej rozbudowane testy certyfikacyjne. Ogólnie interakcje HDMI-CEC 2.0 z innymi urządzeniami są bardziej wydajne, co skutkuje mniejszym ruchem HDMI-CEC i szybszymi interakcjami.

Aby urządzenie obsługiwało HDMI-CEC 2.0, musi być skonfigurowane tak, aby korzystać z HDMI-CEC 2.0. Implementacja HAL musi też zgłaszać obsługę HDMI-CEC 2.0 w wywołaniach IHdmiCec#getCecVersion.

Konfiguracja CEC

Działanie HDMI-CEC można skonfigurować zarówno w czasie kompilacji (przez producentów OEM za pomocą RRO), jak i w czasie działania (przez HdmiControlManager @SystemApi).

Przykłady ustawień HDMI-CEC:

Ustawienie Opcja
Czy HDMI-CEC jest włączony czy wyłączony. Włączony
Wyłączony
Zakres komunikatów zarządzania energią HDMI-CEC wysyłanych przez urządzenie odtwarzające. Tylko do telewizora
Do telewizora i systemu audio
Rozgłaszaj
Brak

W przypadku każdego ustawienia aplikacje mogą w czasie działania sprawdzać dostępne i dozwolone opcje.