Đầu vào

Biểu tượng HAL đầu vào Android

Hệ thống con đầu vào Android về mặt lý thuyết bao gồm một quy trình sự kiện đi qua nhiều lớp của hệ thống.

Quy trình đầu vào

Ở lớp thấp nhất, thiết bị đầu vào thực tạo ra các tín hiệu mô tả các thay đổi về trạng thái, chẳng hạn như thao tác nhấn phím và điểm tiếp xúc cảm ứng. Phần mềm cơ sở của thiết bị sẽ mã hoá và truyền các tín hiệu này theo một cách nào đó, chẳng hạn như bằng cách gửi báo cáo USB HID đến hệ thống hoặc bằng cách tạo các ngắt trên bus I2C.

Sau đó, các tín hiệu này được trình điều khiển thiết bị giải mã trong nhân Linux. Nhân hệ điều hành Linux cung cấp trình điều khiển cho nhiều thiết bị ngoại vi tiêu chuẩn, đặc biệt là những thiết bị tuân thủ giao thức HID. Tuy nhiên, nhà sản xuất thiết bị gốc (OEM) thường phải cung cấp trình điều khiển tuỳ chỉnh cho các thiết bị nhúng được tích hợp chặt chẽ vào hệ thống ở cấp thấp, chẳng hạn như màn hình cảm ứng.

Trình điều khiển thiết bị đầu vào chịu trách nhiệm dịch các tín hiệu dành riêng cho thiết bị thành định dạng sự kiện đầu vào chuẩn thông qua giao thức đầu vào Linux. Giao thức đầu vào Linux xác định một bộ tiêu chuẩn gồm các loại sự kiện và mã trong tệp tiêu đề hạt nhân linux/input.h. Bằng cách này, các thành phần bên ngoài hạt nhân không cần quan tâm đến các chi tiết như mã quét thực tế, cách sử dụng HID, thông báo I2C, chân GPIO, v.v.

Tiếp theo, thành phần EventHub của Android sẽ đọc các sự kiện đầu vào từ nhân bằng cách mở trình điều khiển evdev liên kết với từng thiết bị đầu vào. Sau đó, thành phần InputReader của Android sẽ giải mã các sự kiện đầu vào theo lớp thiết bị và tạo một luồng sự kiện đầu vào Android. Trong quá trình này, mã sự kiện giao thức đầu vào Linux được dịch sang mã sự kiện Android theo cấu hình thiết bị đầu vào, tệp bố cục bàn phím và nhiều bảng ánh xạ.

Cuối cùng, InputReader sẽ gửi các sự kiện đầu vào đến InputDispatcher để chuyển tiếp các sự kiện đó đến cửa sổ thích hợp.

Điểm điều khiển

Có một số giai đoạn trong quy trình đầu vào ảnh hưởng đến việc kiểm soát hành vi của thiết bị đầu vào.

Cấu hình trình điều khiển và chương trình cơ sở

Trình điều khiển thiết bị đầu vào thường định cấu hình hành vi của thiết bị đầu vào bằng cách đặt các tham số trong thanh ghi hoặc thậm chí tự tải firmware lên. Điều này đặc biệt đúng đối với các thiết bị được nhúng như màn hình cảm ứng, trong đó phần lớn quá trình hiệu chuẩn liên quan đến việc điều chỉnh các thông số này hoặc sửa chữa phần mềm để cung cấp độ chính xác và khả năng phản hồi mong muốn cũng như để giảm nhiễu.

Các tuỳ chọn cấu hình trình điều khiển thường được chỉ định dưới dạng tham số mô-đun trong gói hỗ trợ bo mạch nhân (BSP) để cùng một trình điều khiển có thể hỗ trợ nhiều cách triển khai phần cứng khác nhau.

Tài liệu này cố gắng mô tả cấu hình trình điều khiển hoặc phần mềm, nhưng cũng đưa ra hướng dẫn chung về việc hiệu chỉnh thiết bị.

Thuộc tính cấu hình của bảng

Gói hỗ trợ bo mạch nhân (BSP) có thể xuất các thuộc tính cấu hình bo mạch thông qua SysFS mà thành phần InputReader của Android sử dụng, chẳng hạn như vị trí của các phím ảo trên màn hình cảm ứng.

Hãy tham khảo các phần về lớp thiết bị để biết thông tin chi tiết về cách các thiết bị khác nhau sử dụng các thuộc tính cấu hình bo mạch.

Lớp phủ tài nguyên

Một số hành vi đầu vào được định cấu hình thông qua lớp phủ tài nguyên trong config.xml, chẳng hạn như hoạt động của công tắc nắp.

Dưới đây là một số ví dụ:

  • config_lidKeyboardAccessibility: Chỉ định hiệu ứng của nút chuyển nắp đối với việc bàn phím phần cứng có thể truy cập được hay bị ẩn.

  • config_lidNavigationAccessibility: Chỉ định hiệu ứng của nút chuyển nắp đối với việc có thể truy cập vào bàn di chuột hay không.

  • config_longPressOnPowerBehavior: Chỉ định điều sẽ xảy ra khi người dùng nhấn và giữ nút nguồn.

  • config_lidOpenRotation: Chỉ định hiệu ứng của nút chuyển nắp đối với hướng màn hình.

Hãy tham khảo tài liệu trong frameworks/base/core/res/res/values/config.xml để biết thông tin chi tiết về từng tuỳ chọn cấu hình.

Sơ đồ phím

Các thành phần EventHubInputReader của Android sử dụng bản đồ phím để định cấu hình mối liên kết từ mã sự kiện Linux đến mã sự kiện Android cho các phím, nút cần điều khiển và trục cần điều khiển. Việc liên kết có thể phụ thuộc vào thiết bị hoặc ngôn ngữ.

Hãy tham khảo các phần về lớp thiết bị để biết thông tin chi tiết về cách các thiết bị khác nhau sử dụng bản đồ phím.

Tệp cấu hình thiết bị đầu vào

Các tệp cấu hình thiết bị đầu vào được các thành phần EventHubInputReader của Android sử dụng để định cấu hình các đặc điểm thiết bị đặc biệt, chẳng hạn như cách báo cáo thông tin về kích thước chạm.

Hãy tham khảo các phần về lớp thiết bị để biết thông tin chi tiết về cách các thiết bị khác nhau sử dụng bản đồ cấu hình thiết bị đầu vào.

Tìm hiểu về cách sử dụng HID và mã sự kiện

Thường thì có một số giá trị nhận dạng khác nhau được dùng để tham chiếu đến bất kỳ phím nào trên bàn phím, nút trên tay điều khiển trò chơi, trục cần điều khiển hoặc thành phần điều khiển khác. Mối quan hệ giữa các giá trị nhận dạng này không phải lúc nào cũng giống nhau: chúng phụ thuộc vào một tập hợp bảng ánh xạ, một số bảng là cố định và một số bảng thay đổi dựa trên các đặc điểm của thiết bị, trình điều khiển thiết bị, ngôn ngữ hiện tại, cấu hình hệ thống, lựa chọn ưu tiên của người dùng và các yếu tố khác.

Mã quét thực

Mã quét thực là giá trị nhận dạng dành riêng cho thiết bị, được liên kết với từng phím, nút hoặc thành phần điều khiển khác. Vì mã quét vật lý thường khác nhau giữa các thiết bị, nên phần mềm hoặc trình điều khiển thiết bị sẽ chịu trách nhiệm liên kết các mã này với giá trị nhận dạng chuẩn như Lượt sử dụng HID hoặc mã phím Linux.

Mã quét chủ yếu dành cho bàn phím. Các thiết bị khác thường giao tiếp ở cấp thấp bằng cách sử dụng chân GPIO, thông báo I2C hoặc các phương tiện khác. Do đó, các lớp trên của ngăn xếp phần mềm dựa vào trình điều khiển thiết bị để hiểu được những gì đang diễn ra.

Mức sử dụng HID

Mức sử dụng HID là một giá trị nhận dạng chuẩn dùng để báo cáo trạng thái của một thành phần điều khiển, chẳng hạn như phím bàn phím, trục cần điều khiển, nút chuột hoặc điểm tiếp xúc cảm ứng. Hầu hết các thiết bị đầu vào USB và Bluetooth đều tuân thủ thông số kỹ thuật HID, cho phép hệ thống giao tiếp với các thiết bị này theo cách thống nhất.

Khung Android dựa vào trình điều khiển HID nhân Linux để dịch mã sử dụng HID thành mã phím Linux và các giá trị nhận dạng khác. Do đó, các nhà sản xuất thiết bị ngoại vi chủ yếu quan tâm đến việc sử dụng HID.

Mã khoá Linux

Mã phím Linux là giá trị nhận dạng chuẩn cho một phím hoặc nút. Mã phím Linux được xác định trong tệp tiêu đề linux/input.h bằng cách sử dụng các hằng số bắt đầu bằng tiền tố KEY_ hoặc BTN_. Trình điều khiển đầu vào hạt nhân Linux chịu trách nhiệm dịch mã quét thực, cách sử dụng HID và các tín hiệu dành riêng cho thiết bị khác thành mã phím Linux, đồng thời phân phối thông tin về các mã đó trong sự kiện EV_KEY.

API Android đôi khi đề cập đến mã phím Linux được liên kết với một phím dưới dạng "mã quét". Về mặt kỹ thuật, điều này không chính xác nhưng giúp phân biệt mã phím Linux với mã phím Android trong API.

Mã trục tương đối hoặc tuyệt đối của Linux

Mã trục tương đối hoặc tuyệt đối của Linux là một giá trị nhận dạng chuẩn để báo cáo chuyển động tương đối hoặc vị trí tuyệt đối dọc theo một trục, chẳng hạn như chuyển động tương đối của chuột dọc theo trục X hoặc vị trí tuyệt đối của cần điều khiển dọc theo trục X. Mã trục Linux được xác định trong tệp tiêu đề linux/input.h bằng cách sử dụng các hằng số bắt đầu bằng tiền tố REL_ hoặc ABS_. Trình điều khiển đầu vào hạt nhân Linux chịu trách nhiệm dịch các hoạt động sử dụng HID và các tín hiệu khác dành riêng cho thiết bị thành mã trục Linux và phân phối thông tin về các tín hiệu đó trong sự kiện EV_RELEV_ABS.

Mã chuyển đổi Linux

Mã nút chuyển Linux là giá trị nhận dạng chuẩn để báo cáo trạng thái của nút chuyển trên một thiết bị, chẳng hạn như nút chuyển nắp. Mã chuyển đổi Linux được xác định trong tệp tiêu đề linux/input.h bằng cách sử dụng các hằng số bắt đầu bằng tiền tố SW_. Trình điều khiển đầu vào hạt nhân Linux báo cáo các thay đổi về trạng thái chuyển đổi dưới dạng sự kiện EV_SW.

Các ứng dụng Android thường không nhận được sự kiện từ các nút chuyển, nhưng hệ thống có thể sử dụng các sự kiện đó trong nội bộ để kiểm soát nhiều chức năng dành riêng cho thiết bị.

Mã khoá Android

Mã phím Android là một giá trị nhận dạng chuẩn được xác định trong API Android để chỉ báo một phím cụ thể, chẳng hạn như "HOME". Mã phím Android được lớp android.view.KeyEvent xác định dưới dạng hằng số bắt đầu bằng tiền tố KEYCODE_.

Bố cục phím chỉ định cách ánh xạ mã phím Linux với mã phím Android. Bạn có thể sử dụng nhiều bố cục phím tuỳ thuộc vào mẫu bàn phím, ngôn ngữ, quốc gia, bố cục hoặc chức năng đặc biệt.

Các tổ hợp mã phím Android được chuyển đổi thành mã ký tự bằng cách sử dụng bản đồ ký tự phím dành riêng cho thiết bị và ngôn ngữ. Ví dụ: khi bạn nhấn đồng thời các phím được xác định là KEYCODE_SHIFTKEYCODE_A, hệ thống sẽ tra cứu tổ hợp trong bản đồ ký tự phím và tìm thấy chữ cái viết hoa "A", sau đó chèn chữ cái này vào tiện ích văn bản hiện đang được lấy tiêu điểm.

Mã trục Android

Mã trục Android là một giá trị nhận dạng chuẩn được xác định trong API Android để chỉ báo một trục thiết bị cụ thể. Mã trục Android được lớp android.view.MotionEvent xác định là các hằng số bắt đầu bằng tiền tố AXIS_.

Bố cục phím chỉ định cách ánh xạ Mã trục Linux với mã trục Android. Bạn có thể sử dụng nhiều bố cục phím tuỳ thuộc vào mẫu thiết bị, ngôn ngữ, quốc gia, bố cục hoặc chức năng đặc biệt.

Trạng thái meta của Android

Trạng thái meta Android là một giá trị nhận dạng chuẩn được xác định trong API Android để cho biết phím sửa đổi nào được nhấn. Các trạng thái meta của Android được lớp android.view.KeyEvent xác định dưới dạng hằng số bắt đầu bằng tiền tố META_.

Trạng thái meta hiện tại được xác định bởi thành phần Android InputReader. Thành phần này theo dõi thời điểm nhấn / nhả các phím sửa đổi như KEYCODE_SHIFT_LEFT và đặt / đặt lại cờ trạng thái meta thích hợp.

Mối quan hệ giữa các phím sửa đổi và trạng thái meta được mã hoá cứng, nhưng bố cục phím có thể thay đổi cách các phím sửa đổi được ánh xạ, từ đó ảnh hưởng đến trạng thái meta.

Trạng thái nút Android

Trạng thái nút Android là một giá trị nhận dạng chuẩn được xác định trong API Android để cho biết nút nào (trên chuột hoặc bút cảm ứng) được nhấn. Các trạng thái nút Android được lớp android.view.MotionEvent xác định dưới dạng hằng số bắt đầu bằng tiền tố BUTTON_.

Trạng thái nút hiện tại được xác định bởi thành phần Android InputReader. Thành phần này theo dõi thời điểm nhấn / nhả các nút (trên chuột hoặc bút cảm ứng) và đặt / đặt lại cờ trạng thái nút thích hợp.

Mối quan hệ giữa các nút và trạng thái nút được mã hoá cứng.

Tài liệu đọc thêm

  1. Mã sự kiện đầu vào Linux
  2. Giao thức cảm ứng đa điểm Linux
  3. Trình điều khiển đầu vào Linux
  4. Phản hồi lực trên Linux
  5. Thông tin về HID, bao gồm cả bảng sử dụng HID