입력

컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.
Android 입력 HAL 아이콘

Android 입력 하위 시스템은 명목상 시스템의 여러 계층을 통과하는 이벤트 파이프라인으로 구성됩니다.

입력 파이프라인

최하위 계층에서 물리적 입력 장치는 키 누름 및 터치 접점과 같은 상태 변화를 설명하는 신호를 생성합니다. 장치 펌웨어는 USB HID 보고서를 시스템에 보내거나 I2C 버스에서 인터럽트를 생성하는 것과 같은 방식으로 이러한 신호를 인코딩하고 전송합니다.

그런 다음 신호는 Linux 커널의 장치 드라이버에 의해 디코딩됩니다. Linux 커널은 많은 표준 주변 장치, 특히 HID 프로토콜을 준수하는 장치용 드라이버를 제공합니다. 그러나 OEM은 종종 터치 스크린과 같이 낮은 수준에서 시스템에 긴밀하게 통합되는 임베디드 장치용 맞춤형 드라이버를 제공해야 합니다.

입력 장치 드라이버는 Linux 입력 프로토콜을 통해 장치별 신호를 표준 입력 이벤트 형식으로 변환하는 역할을 합니다. Linux 입력 프로토콜은 linux/input.h 커널 헤더 파일에서 이벤트 유형 및 코드의 표준 집합을 정의합니다. 이러한 방식으로 커널 외부의 구성 요소는 물리적 스캔 코드, HID 사용, I2C 메시지, GPIO 핀 등과 같은 세부 사항에 신경 쓸 필요가 없습니다.

다음으로 Android EventHub 구성 요소는 각 입력 장치와 연결된 evdev 드라이버를 열어 커널에서 입력 이벤트를 읽습니다. 그런 다음 Android InputReader 구성요소는 기기 클래스에 따라 입력 이벤트를 디코딩하고 Android 입력 이벤트 스트림을 생성합니다. 이 프로세스의 일부로 Linux 입력 프로토콜 이벤트 코드는 입력 장치 구성, 키보드 레이아웃 파일 및 다양한 매핑 테이블에 따라 Android 이벤트 코드로 변환됩니다.

마지막으로 InputReader 는 입력 이벤트를 적절한 창으로 전달하는 InputDispatcher로 보냅니다.

제어점

입력 장치의 동작을 제어하는 ​​입력 파이프라인에는 여러 단계가 있습니다.

드라이버 및 펌웨어 구성

입력 장치 드라이버는 레지스터에서 매개변수를 설정하거나 펌웨어 자체를 업로드하여 입력 장치의 동작을 자주 구성합니다. 이는 보정 프로세스의 대부분이 이러한 매개변수를 조정하거나 펌웨어를 수정하여 원하는 정확도와 응답성을 제공하고 노이즈를 억제하는 것과 관련된 터치 스크린과 같은 임베디드 장치의 경우 특히 그렇습니다.

드라이버 구성 옵션은 종종 커널 보드 지원 패키지(BSP)에서 모듈 매개변수로 지정되므로 동일한 드라이버가 여러 다른 하드웨어 구현을 지원할 수 있습니다.

이 설명서는 드라이버 또는 펌웨어 구성을 설명하려고 시도하지만 일반적인 장치 보정에 대한 지침을 제공합니다.

보드 구성 속성

커널 보드 지원 패키지(BSP)는 터치 스크린의 가상 키 배치와 같이 Android InputReader 구성 요소에서 사용하는 SysFS를 통해 보드 구성 속성을 내보낼 수 있습니다.

다양한 장치가 보드 구성 속성을 사용하는 방법에 대한 자세한 내용은 장치 클래스 섹션을 참조하십시오.

리소스 오버레이

뚜껑 스위치 작동과 같은 몇 가지 입력 동작은 config.xml 의 리소스 오버레이를 통해 구성됩니다.

다음은 몇 가지 예입니다.

  • config_lidKeyboardAccessibility : 하드웨어 키보드의 액세스 가능 여부에 대한 덮개 스위치의 효과를 지정합니다.

  • config_lidNavigationAccessibility : 트랙패드의 액세스 가능 여부에 대한 덮개 스위치의 효과를 지정합니다.

  • config_longPressOnPowerBehavior : 사용자가 전원 버튼을 누르고 있을 때 발생하는 동작을 지정합니다.

  • config_lidOpenRotation : 화면 방향에 대한 덮개 스위치의 효과를 지정합니다.

각 구성 옵션에 대한 자세한 내용은 frameworks/base/core/res/res/values/config.xml 내의 문서를 참조하세요.

키 맵

키 맵은 Android EventHubInputReader 구성 요소에서 키, 조이스틱 버튼 및 조이스틱 축에 대한 Linux 이벤트 코드에서 Android 이벤트 코드로의 매핑을 구성하는 데 사용됩니다. 매핑은 장치 또는 언어에 따라 다를 수 있습니다.

다양한 장치에서 키 맵을 사용하는 방법에 대한 자세한 내용은 장치 클래스 섹션을 참조하십시오.

입력 장치 구성 파일

입력 장치 구성 파일은 Android EventHubInputReader 구성 요소에서 터치 크기 정보가 보고되는 방법과 같은 특수 장치 특성을 구성하는 데 사용됩니다.

다양한 장치가 입력 장치 구성 맵을 사용하는 방법에 대한 자세한 내용은 장치 클래스 섹션을 참조하십시오.

HID 사용 및 이벤트 코드 이해

키보드의 특정 키, 게임 컨트롤러의 버튼, 조이스틱 축 또는 기타 컨트롤을 참조하는 데 사용되는 여러 가지 식별자가 종종 있습니다. 이러한 식별자 간의 관계는 항상 동일하지 않습니다. 매핑 테이블 집합에 따라 달라지며 일부는 고정되어 있고 일부는 장치의 특성, 장치 드라이버, 현재 로케일, 시스템 구성, 사용자 선호도 및 기타 요인.

물리적 스캔 코드

물리적 스캔 코드는 각 키, 버튼 또는 기타 컨트롤과 관련된 장치별 식별자입니다. 물리적 스캔 코드는 종종 장치마다 다르기 때문에 펌웨어 또는 장치 드라이버는 HID 사용 또는 Linux 키 코드와 같은 표준 식별자에 대한 매핑을 담당합니다.

스캔 코드는 주로 키보드에서 중요합니다. 다른 장치는 일반적으로 GPIO 핀, I2C 메시지 또는 기타 수단을 사용하여 낮은 수준에서 통신합니다. 결과적으로 소프트웨어 스택의 상위 계층은 진행 상황을 파악하기 위해 장치 드라이버에 의존합니다.

HID 사용법

HID 사용은 키보드 키, 조이스틱 축, 마우스 버튼 또는 터치 접점과 같은 컨트롤의 상태를 보고하는 데 사용되는 표준 식별자입니다. 대부분의 USB 및 Bluetooth 입력 장치는 HID 사양을 준수하므로 시스템이 균일한 방식으로 인터페이스할 수 있습니다.

Android 프레임워크는 Linux 커널 HID 드라이버를 사용하여 HID 사용 코드를 Linux 키 코드 및 기타 식별자로 변환합니다. 따라서 HID 사용은 주로 주변 장치 제조업체의 관심사입니다.

리눅스 키 코드

Linux 키 코드는 키 또는 버튼의 표준 식별자입니다. Linux 키 코드는 접두사 KEY_ 또는 BTN_ 으로 시작하는 상수를 사용하여 linux/input.h 헤더 파일에 정의됩니다. Linux 커널 입력 드라이버는 물리적 스캔 코드, HID 사용 및 기타 장치별 신호를 Linux 키 코드로 변환하고 이에 대한 정보를 EV_KEY 이벤트의 일부로 전달하는 역할을 합니다.

Android API는 때때로 키와 연결된 Linux 키 코드를 "스캔 코드"로 참조합니다. 이는 기술적으로 올바르지 않지만 API에서 Linux 키 코드와 Android 키 코드를 구별하는 데 도움이 됩니다.

Linux 상대 또는 절대 축 코드

Linux 상대 또는 절대 축 코드는 X축을 따라 마우스의 상대 이동 또는 X축을 따라 조이스틱의 절대 위치와 같이 축을 따라 상대 이동 또는 절대 위치를 보고하기 위한 표준 식별자입니다. Linux 축 코드는 접두사 REL_ 또는 ABS_ 로 시작하는 상수를 사용하여 linux/input.h 헤더 파일에 정의됩니다. Linux 커널 입력 드라이버는 HID 사용 및 기타 장치별 신호를 Linux 축 코드로 변환하고 이에 대한 정보를 EV_RELEV_ABS 이벤트의 일부로 전달하는 역할을 합니다.

리눅스 스위치 코드

Linux 스위치 코드는 덮개 스위치와 같은 장치의 스위치 상태를 보고하기 위한 표준 식별자입니다. Linux 스위치 코드는 접두사 SW_ 로 시작하는 상수를 사용하여 linux/input.h 헤더 파일에 정의됩니다. Linux 커널 입력 드라이버는 스위치 상태 변경을 EV_SW 이벤트로 보고합니다.

Android 애플리케이션은 일반적으로 스위치에서 이벤트를 수신하지 않지만 시스템은 이를 내부적으로 사용하여 다양한 기기별 기능을 제어할 수 있습니다.

안드로이드 키 코드

Android 키 코드는 'HOME'과 같은 특정 키를 나타내기 위해 Android API에 정의된 표준 식별자입니다. Android 키 코드는 android.view.KeyEvent 클래스에서 프리픽스 KEYCODE_ 로 시작하는 상수로 정의됩니다.

키 레이아웃은 Linux 키 코드가 Android 키 코드에 매핑되는 방식을 지정합니다. 키보드 모델, 언어, 국가, 레이아웃 또는 특수 기능에 따라 다른 키 레이아웃을 사용할 수 있습니다.

Android 키 코드의 조합은 장치 및 로케일 특정 키 문자 맵을 사용하여 문자 코드로 변환됩니다. 예를 들어 KEYCODE_SHIFTKEYCODE_A 로 식별된 키를 함께 누르면 시스템이 키 문자 맵에서 조합을 조회하고 대문자 'A'를 찾은 다음 현재 포커스가 있는 텍스트 위젯에 삽입합니다.

Android 축 코드

Android 축 코드는 특정 장치 축을 나타내기 위해 Android API에 정의된 표준 식별자입니다. Android 축 코드는 android.view.MotionEvent 클래스에서 접두사 AXIS_ 로 시작하는 상수로 정의됩니다.

키 레이아웃은 Linux 축 코드가 Android 축 코드에 매핑되는 방식을 지정합니다. 장치 모델, 언어, 국가, 레이아웃 또는 특수 기능에 따라 다른 키 레이아웃을 사용할 수 있습니다.

Android 메타 상태

Android 메타 상태는 어떤 수정자 키를 눌렀는지 나타내기 위해 Android API에 정의된 표준 식별자입니다. Android 메타 상태는 android.view.KeyEvent 클래스에서 접두사 META_ 로 시작하는 상수로 정의됩니다.

현재 메타 상태는 KEYCODE_SHIFT_LEFT 와 같은 수정자 키를 누르거나 떼는 시기를 모니터링하고 적절한 메타 상태 플래그를 설정/재설정하는 Android InputReader 구성요소에 의해 결정됩니다.

수정자 키와 메타 상태 간의 관계는 하드코딩되어 있지만 키 레이아웃은 수정자 키 자체가 매핑되는 방식을 변경하여 메타 상태에 영향을 줄 수 있습니다.

Android 버튼 상태

Android 버튼 상태는 어떤 버튼(마우스 또는 스타일러스)을 눌렀는지 나타내기 위해 Android API에 정의된 표준 식별자입니다. Android 버튼 상태는 android.view.MotionEvent 클래스에서 BUTTON_ 접두사로 시작하는 상수로 정의됩니다.

현재 버튼 상태는 (마우스 또는 스타일러스에 있는) 버튼이 눌리거나 놓이는 시기를 모니터링하고 적절한 버튼 상태 플래그를 설정/재설정하는 Android InputReader 구성요소에 의해 결정됩니다.

버튼과 버튼 상태 사이의 관계는 하드코딩되어 있습니다.

추가 자료

  1. Linux 입력 이벤트 코드
  2. Linux 멀티 터치 프로토콜
  3. 리눅스 입력 드라이버
  4. 리눅스 포스 피드백
  5. HID 사용 표를 포함한 HID 정보