Routing wejściowy

W systemie Android 9 i starszych wersjach nie było możliwości interakcji z wieloma wyświetlaczami za pomocą dotyku, ponieważ nie istniał mechanizm powiązania między wyświetlaczami a urządzeniami wejściowymi. Na przykład wyświetlacz z ekranem dotykowym może zapewniać wyjście wideo HDMI (które można zarejestrować jako wyświetlacz w systemie Android) i wyjście USB dla ekranu dotykowego (które można zarejestrować jako urządzenie wejściowe). Jeżeli w ten sposób podłączonych byłoby wiele urządzeń, nie byłoby możliwości określenia, które urządzenie wejściowe należy do którego wyświetlacza. Ten sam problem dotyczy urządzeń składanych z wieloma wbudowanymi wyświetlaczami.

W Androidzie 10 dodano mechanizm określający, które urządzenia wejściowe należą do jakich wyświetlaczy. Powiązanie odbywa się poprzez numery portów, gdzie port odnosi się do fizycznego portu, do którego podłączony jest wyświetlacz.

Na przykład, jeśli urządzenie z systemem Android ma dwa porty HDMI oznaczone hdmi1 i hdmi2 , wartościami portów wyświetlacza mogą być 1 i 2 . Wartości portów pozostają takie same, nawet jeśli inny wyświetlacz (np. inny model wyświetlacza lub inny producent) jest podłączony do tego samego fizycznego portu HDMI. Dzięki temu producenci urządzeń mogą dostarczać instrukcje dotyczące montażu i modernizacji wyświetlaczy.

Powiązanie konfiguruje się w /vendor/etc/input-port-associations.xml . Na przykład:

<ports>
    <port display="0" input="usb-xhci-hcd.0.auto-1.1/input0" />
    <port display="1" input="usb-xhci-hcd.0.auto-1.2/input0" />
</ports>

W powyższym przykładzie display="0" określa port, do którego podłączony jest wyświetlacz. input="usb-xhci-hcd.0.auto-1.1/input0" określa port, do którego podłączone jest urządzenie wejściowe. Aby określić porty skojarzone z określonymi urządzeniami, użyj następującego polecenia terminala, a następnie przejrzyj właściwość location tych urządzeń w stanie centrum zdarzeń.

adb shell dumpsys input

Jeśli podłączonych jest wiele urządzeń, dotknij określonego urządzenia, aby sprawdzić tablicę RecentQueue w stanie modułu wejściowego. Następnie można zidentyfikować urządzenia, które wygenerowały najnowsze zdarzenie. Następnie można znaleźć odpowiednie urządzenie w stanie centrum zdarzeń.

Aby określić porty wyświetlacza przypisane do podłączonych wyświetlaczy, użyj adb shell dumpsys display , a następnie poszukaj właściwości address DisplayDeviceInfo dla każdego wyświetlacza w obszarze Urządzenia wyświetlające. Alternatywnie użyj adb shell dumpsys SurfaceFlinger --display-id aby zrzucić informacje identyfikacyjne dla wszystkich podłączonych wyświetlaczy. Zobacz także Statyczne identyfikatory wyświetlania .

Jeśli określisz powiązanie dla konkretnego urządzenia wejściowego, a w systemie nie ma odpowiedniego wyświetlacza, urządzenie wejściowe zostanie wyłączone do czasu pojawienia się odpowiedniego wyświetlacza. Powiązanie odbywa się tylko w przypadku urządzeń dotykowych.

Routing dla dynamicznych wyświetlaczy wieloekranowych

Android 10 umożliwia konfigurowanie statycznych urządzeń z wieloma wyświetlaczami. Powiązania dynamiczne nie są jeszcze włączone. Jednak w niektórych przypadkach użycia można rozwiązać, dostarczając informacje o routingu dla wyświetlaczy i paneli wejściowych, które nie zawsze są obecne lub używając wirtualnych urządzeń wejściowych, a następnie dostarczając dodatkowe informacje o routingu do tych urządzeń wirtualnych. Jeśli implementacja urządzenia obsługuje:

  • Doświadczenie podobne do komputera stacjonarnego ze stacją dokującą, wówczas można zapewnić konfigurację routingu skierowaną do wejścia z akcesorium wejściowego podłączonego do stacji dokującej (identyfikowanego jednoznacznie przez port) do wyświetlacza zewnętrznego (identyfikowanego przez port).
  • Główny ekran działający jako źródło sygnału wejściowego (taki jak touchpad) po podłączeniu do wyświetlacza zewnętrznego, wówczas można zapewnić konfigurację routingu w celu kierowania danych wejściowych z wirtualnego panelu dotykowego (identyfikowanego za pomocą unikalnego wirtualnego identyfikatora) do wyświetlacza zewnętrznego (identyfikowanego przez port) .

Realizacja

  • W przypadku urządzeń fizycznych port, do którego podłączone jest urządzenie wejściowe, oraz port, do którego podłączony jest wyświetlacz, służą do dopasowania wyświetlaczy z ekranami dotykowymi.
  • Mapowania są przechowywane w InputReaderConfiguration .
  • TouchInputMapper.mViewport jest ustawiony na rzutnię odpowiadającą portowi określonemu w parametrze InputDevice.location .
  • Jeśli w pliku mapowania określono port urządzenia wejściowego, a obecnie nie ma rzutni, która ma pasujący port wyświetlacza, urządzenie wejściowe na tym porcie jest wyłączone.
  • Jeżeli dla konkretnego urządzenia wejściowego nie określono portu, wówczas rzutnia jest ustawiana zgodnie z obowiązującymi regułami.
  • W sterownikach wejściowych nie są wymagane żadne zmiany jądra.
  • Porty urządzeń wejściowych są określane za pomocą ioctl EVIOCGPHYS.