định tuyến đầu vào

Trong Android 9 trở xuống, không có cách nào để tương tác với nhiều màn hình thông qua cảm ứng, vì không có cơ chế liên kết giữa màn hình và thiết bị đầu vào. Ví dụ: màn hình cảm ứng có thể cung cấp đầu ra video HDMI (sẽ đăng ký làm màn hình trên Android) và đầu ra USB cho màn hình cảm ứng (sẽ đăng ký làm thiết bị đầu vào). Nếu nhiều thiết bị được kết nối theo cách này, sẽ không có cách nào để xác định thiết bị đầu vào nào thuộc về màn hình nào. Vấn đề tương tự cũng xảy ra với các thiết bị màn hình gập có nhiều màn hình tích hợp.

Android 10 đã thêm cơ chế chỉ định thiết bị đầu vào nào thuộc về màn hình nào. Việc liên kết được thực hiện bằng số cổng trong đó cổng đề cập đến cổng vật lý mà màn hình được kết nối.

Ví dụ: nếu thiết bị Android có hai cổng HDMI được gắn nhãn hdmi1hdmi2 thì giá trị cổng hiển thị có thể là 12 . Các giá trị cổng vẫn giữ nguyên ngay cả khi một màn hình khác được kết nối (chẳng hạn như kiểu màn hình hoặc nhà sản xuất khác) với cùng một cổng HDMI vật lý. Điều này cho phép các nhà sản xuất thiết bị cung cấp hướng dẫn lắp ráp và nâng cấp màn hình.

Liên kết được định cấu hình trong /vendor/etc/input-port-associations.xml . Ví dụ:

<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>

Trong ví dụ trên, display="0" chỉ định cổng mà màn hình được kết nối. input="usb-xhci-hcd.0.auto-1.1/input0" chỉ định cổng mà thiết bị đầu vào được kết nối. Để xác định các cổng được liên kết với các thiết bị cụ thể, hãy sử dụng lệnh đầu cuối sau, sau đó xem lại thuộc tính location trí của các thiết bị đó ở Trạng thái trung tâm sự kiện.

adb shell dumpsys input

Nếu nhiều thiết bị được kết nối, hãy nhấn vào một thiết bị cụ thể để kiểm tra mảng RecentQueue ở Trạng thái Bộ điều phối Đầu vào. Sau đó, bạn có thể xác định những thiết bị đã tạo ra sự kiện gần đây nhất. Sau đó, bạn có thể tìm thấy thiết bị tương ứng ở Trạng thái trung tâm sự kiện.

Để xác định các cổng hiển thị được chỉ định cho các màn hình được kết nối, hãy sử dụng adb shell dumpsys display rồi tìm thuộc tính address của DisplayDeviceInfo cho mỗi màn hình trong Thiết bị hiển thị. Ngoài ra, hãy sử dụng adb shell dumpsys SurfaceFlinger --display-id để kết xuất thông tin nhận dạng cho tất cả các màn hình được kết nối. Xem thêm Mã định danh hiển thị tĩnh .

Nếu bạn chỉ định liên kết cho một thiết bị đầu vào cụ thể và màn hình tương ứng không có trong hệ thống thì thiết bị đầu vào sẽ bị tắt cho đến khi màn hình tương ứng xuất hiện. Việc liên kết chỉ được thực hiện cho các thiết bị cảm ứng.

Định tuyến cho nhiều màn hình động

Android 10 cho phép bạn thiết lập các thiết bị đa màn hình tĩnh. Liên kết động chưa được bật. Tuy nhiên, một số trường hợp sử dụng có thể được giải quyết bằng cách cung cấp thông tin định tuyến cho màn hình và bảng đầu vào không phải lúc nào cũng xuất hiện hoặc sử dụng thiết bị đầu vào ảo, sau đó cung cấp thông tin định tuyến bổ sung cho các thiết bị ảo đó. Nếu việc triển khai thiết bị hỗ trợ:

  • Trải nghiệm giống như máy tính để bàn với một trạm nối, sau đó có thể cung cấp cấu hình định tuyến để nhắm mục tiêu đầu vào từ phụ kiện đầu vào được kết nối với đế (được xác định duy nhất bằng cổng) đến màn hình bên ngoài (được xác định bằng cổng).
  • Màn hình chính đóng vai trò là nguồn đầu vào (chẳng hạn như bàn di chuột) khi được kết nối với màn hình ngoài, sau đó có thể cung cấp cấu hình định tuyến để nhắm mục tiêu đầu vào từ bảng cảm ứng ảo (được xác định bằng ID ảo duy nhất) đến màn hình ngoài (được xác định bằng cổng) .

Thực hiện

  • Đối với các thiết bị vật lý, cổng mà thiết bị đầu vào được kết nối và cổng mà màn hình được kết nối, được sử dụng để khớp màn hình với màn hình cảm ứng.
  • Ánh xạ được lưu trữ trong InputReaderConfiguration .
  • TouchInputMapper.mViewport được đặt thành chế độ xem khớp với cổng được chỉ định cho InputDevice.location .
  • Nếu cổng thiết bị đầu vào được chỉ định trong tệp ánh xạ và hiện không có khung nhìn nào có cổng hiển thị phù hợp thì thiết bị đầu vào trên cổng đó sẽ bị tắt.
  • Nếu cổng không được chỉ định cho thiết bị đầu vào cụ thể thì khung nhìn sẽ được đặt theo quy tắc hiện có.
  • Không cần thay đổi kernel trong trình điều khiển đầu vào.
  • Các cổng thiết bị đầu vào được xác định bằng EVIOCGPHYS ioctl.