2019-10-02

안드로이드용 게임 컨트롤러 키 레이아웃(.kl) 파일 만드는 법

알리익스프레스에서 슈퍼패미컴 디자인의 무선 게임 패드가 왔는데, 안드로이드 박스에 연결해서 써보니 키 배치가 엉망이었다.


안드로이드에서 실행 버튼과 취소 버튼이 기존과 달라서 적응에 애를 먹었다. .emu 시리즈 앱에서 키 맵핑을 해보면, 게임 패드에 적힌 버튼 이름(A, B, X, Y)과 인식되는 버튼 명이 따로 놀고 있음을 알 수 있다.
어차피 에뮬 앱에선 무시하고 맵핑하면 게임 하는 데는 지장이 없지만, 게임 하다 나와서 에뮬 설정 같은 걸 할 경우는 버튼 배치가 생소해져서 불편하다. 또한, 에뮬이 아닌 안드로이드용 게임에선 키가 이상하게 인식되기도 한단다.
X-plore File Manager 같은 탐색기 앱에선 B 버튼이 복사 버튼으로 인식되어서 게임 패드로 조작이 불편했다.

이 문제는 안드로이드가 엑스박스 컨트롤러, 듀얼쇼크 등의 유명 컨트롤러만 키 배치를 제대로 지원하고, 알리발 듣보잡 게임 컨트롤러는 지원해주지 않아서 생긴다. 즉, 해당 게임 컨트롤러에 맞는 정확한 키 레이아웃 파일을 넣어주지 않은 것이다.

이 문제 해결을 위해 특정 앱으로 버튼을 강제 할당하는 방법도 있다고 하는데, 이렇게 하면, 앱을 거치기 때문에 딜레이가 생긴다고 한다.

그래서 안드로이드가 듣보잡 게임 컨트롤러의 키 배치를 정확하게 인식하게끔 키 레이아웃 파일을 직접 만드는 방법을 정리한다.

이 방법에는 조건이 있다.
1. 루팅된 안드로이드 기기
2. 유선 또는 2.4g 무선 게임 컨트롤러인 경우, 사용할 안드로이드 기기가 OTG를 지원해야 하고, 블루투스 게임 컨트롤러는 페어링이 잘 되어야 한다.

내 안드로이드 박스는 이미 루팅된 펌웨어라서 가능했다.

<작업 순서>
01. 구글 플레이 스토어에서 Terminal Emulator for Android를 설치한다. 보통은 이미 설치되어 있다.

02. 게임 컨트롤러를 연결하지 않은 상태에서 Terminal Emulator 앱을 실행한 뒤, 아래 명령어를 입력한다.
cat /proc/bus/input/devices

03. 그럼 화면이 아래와 같이 뜬다.


현재 기기에 연결된 입력 장치들의 정보다.

04. 이제 게임 컨트롤러를 안드로이드 기기에 연결한다. 인식이 확인되면, 다시 아래 명령어를 입력한다.
cat /proc/bus/input/devices

05. 전에 없었던 항목이 보인다. 이것이 현재 안드로이드 기기에 연결된 게임 컨트롤러의 정보다.


06. 여기서 중요한 건 'Vendor='와 'Product=' 뒤에 적힌 네 자리 숫자다. 이걸 따로 적어둔다.

07. keytest.apk 또는 Gamepad tester(elron 제작)를 찾아 설치한다.
https://play.google.com/store/apps/details?id=ru.elron.gamepadtester&hl=en&gl=US


08. keytest 앱을 실행한 뒤, 게임 컨트롤러의 버튼을 눌러보면, 버튼마다 나타나는 정보가 달라짐을 알 수 있다. 게임 컨트롤러의 버튼을 하나하나 다 눌러보고 'scanCode=' 뒤에 오는 숫자를 따로 적어둔다. 방향키, 아날로그키, 일부 트리거 버튼은 눌러도 저 숫자가 안 나오거나 0으로 나오는 경우도 있다고 한다. 내 게임 패드의 경우도 방향키는 0으로 나왔다. 그건 빼놓고 일단 알 수 있는 건 다 적어둔다.


09. 위 단계에서 알아내지 못한 scanCode 값을 찾기 위해 Mupen64+AE FREE 앱을 깐다. 게임 컨트롤러가 연결된 상태에서 앱을 실행한 뒤, Keytest 앱에서 숫자가 안 나왔던 버튼을 누른다. 그럼 그림 아래에 문자열이 나타난다. 내 게임 컨트롤러 방향키의 경우는 AXIS_Y(+)... 식으로 나왔다. 이 문자들을 또 적어둔다.

10. X-plore File Manager나 Root Explorer 같은 루트 경로 탐색 가능 앱을 실행한다. 루트에서 /system/usr/keylayout 폴더로 이동한다(루팅된 기기만 가능. 그리고 펌웨어에 따라 경로가 vendor/usr/keylayout일 수도 있으니 확인). 그곳에 온갖 kl 확장자 파일들이 있다. 이것이 각종 게임 컨트롤러의 키 레이아웃 파일들이다. 유명한 게임 컨트롤러는 이미 파일이 들어 있다.
이중에서 Generic.kl 파일을 텍스트 파일 보기로 연다. 이 파일을 PC로 복사해서 열어도 무방하다(단, 윈도우 메모장 말고 EM에디터나 에디트플러스 같은 걸로 작업하는 게 문제 없음).


12. 위의 09번 단계에서 적어둔 문자열들을 Generic.kl 파일에서 찾아본다. 만일 'AXIS_RZ'라는 문자열을 찾는다면, Generic.kl 파일의 'axis 0x05 RZ'라는 문자열이 해당한다. 가운데 '0x05'라는 값이 바로 그 키의 scanCode 값이다. 이 값을 각각 적어둔다.
여기서 나는 문제가 생겼다. 내 게임 패드의 방향키 문자열은 상='AXIS_Y(-)', 하='AXIS_Y(+)', 좌='AXIS_X(-)', 우='AXIS_X(+)' 이렇게 나왔는데, Generic.kl 파일의 문자열 어디에 해당되는지 알 수가 없었다. 'axis 0x00 X', 'axis 0x01 Y'만 있을 뿐, 뒤의 (+), (-)는 없었다. 이걸 어떻게 해결했는지는 뒤에 적겠다.

13. 루트 탐색기 앱으로 /system/usr/keylayout 폴더에 있는 Vendor_045e_Product_028e.kl 파일(XBOX360 유선 컨트롤러 레이아웃)을 편한 곳에 복사한 뒤, 파일 이름을 위의 06번 단계에서 알아낸 Vendor와 Product 값으로 바꿔준다. 내 경우는 Vendor_0079_Product_0126.kl로 바꿨다.

14. 이름을 바꾼 파일을 텍스트 편집기로 연다. 문자열 앞의 #는 주석 표시다. 명령이 아니라 단순 설명이다. 내 경우는 XBOX360 컨트롤러라는 주석을 지우고 # SUPER FAMICOM 2.4g Controller로 바꿔 적었다.
이전 단계들에서 알아낸 각 버튼의 scanCode 값을 해당되는 버튼의 기존 scanCode 값 자리에 대신 넣어준다.
예1 : KeyTest 앱에서 게임 컨트롤러의 A 버튼을 눌렀더니 scanCode 값이 201로 출력되었다면, XBOX360 컨트롤러의 레이아웃 파일에서 'BUTTON_A' 항목을 찾는다. scanCode 값이 '304'로 되어 있는데 이것을 '201'로 바꾸면 된다.
예2 : Mupen64 앱에서 왼쪽 트리거 버튼을 눌렀더니 'BRAKE'라고 나왔다면 Generic.kl 파일에서 그에 해당하는 scanCode 값은 axis 0x0a이다. XBOX360 컨트롤러의 kl 파일에서 왼쪽 트리거 버튼은 L TRIGGER인데, 이 값이 axis 0x02로 되어 있으므로 이 값을 바꿔서 axis 0x0a LTRIGGER 로 바꿔준다.

내 슈퍼패미컴 게임 패드는 아래처럼 수정했다.
key 305   BUTTON_A
key 306   BUTTON_B
key 304   BUTTON_X
key 307   BUTTON_Y
key 308   BUTTON_L1
key 309   BUTTON_R1
key 312   BUTTON_SELECT
key 313   BUTTON_START

XBOX360 컨트롤러는 슈퍼패미컴 패드보다 버튼 수가 많기 때문에 슈퍼패미컴 패드에 없는 버튼 항목들은 지워주는 게 깔끔하다. 나도 지원 버튼만 남기고 싹 지웠다.

15. 위의 12번 단계에서 슈퍼패미컴 패드의 방향키가 어느 문자열에 해당되는지 알 수 없어서 헤맸는데, 생각해보니 원래 방향키는 다른 버튼과 달리 키 배치에 문제가 없었다. 슈퍼패미컴 패드는 Generic.kl의 키 설정을 쓰고 있었으니 그걸 열어서 방향키 부분만 복사해오면 되지 않을까 하는 생각이 떠올랐다.

axis 0x00 X
axis 0x01 Y
axis 0x02 Z
axis 0x05 RZ

위 부분이 Generic.kl의 방향키 값이었다. 이걸 Vendor_0079_Product_0126.kl 파일 안에 복사해서 붙였다. 슈퍼패미컴 패드의 완성된 레이아웃 값은 다음과 같다.


16. 이렇게 만든 .kl 파일을 다시 /system/usr/keylayout 폴더에 복사해 넣는다. 복사한 뒤, X-plore File Manager나 Root Explorer로 그 파일에 권한(Permission)을 줘야 한다. RW-R-R로 맞춘다(주의 : 이 권한 설정을 안 하면, 부팅되다 먹통 될 수 있음).

17. 재부팅한 뒤, 게임 컨트롤러의 키 배치가 바뀌었는지 테스트해본다. 잘 되었으면, 언루팅해도 상관 없다.

해외 웹을 보면 파일을 따로 안 만들고 Generic.kl 파일을 열어 직접 수정하는 방법도 있는데, 이 방법은 권하지 않는다. Generic.kl은 해당 게임 컨트롤러뿐 아니라 다른 연결 기기에도 쓰이기 때문에 함부로 고쳤다간 다른 기기 입력에 문제가 생긴다.

위 방식으로 한 번 만들어둔 .kl 파일은 다른 안드로이드 기기(루팅 필요)에서도 쓸 수 있다. 만들어둔 파일을 /system/usr/keylayout 폴더에 넣고 권한 주면 끝이다.

댓글 1개:

  1. 찾고있던 정보였습니다. 감사합니다.

    답글삭제