LG IBM 내추럴 키보드 (LKB-0107) USB로 개조
Posted by 마냥 on the 22nd of September, 2023 at 9:46 pm under 컴퓨터. This post has 10 comments.내가 쓰는 키보드는 예전에 LG IBM 컴퓨터와 나왔던 PS/2 방식 내추럴 키보드다. 찾아보니 예전 글도 하나 있다. 그런데 이번에 산 메인보드는 PS/2 포트가 없다. 어떻게 할까 고민하다 USB 방식으로 개조를 했다.
개조한 결과물. USB 케이블 색깔이 검은색이라 좀 아쉽다.
컴퓨터 업그레이드 이후 키보드 개조까지 이런 일들이 있었다. 너무 길어서 가려둔다.
PS/2 to USB 컨버터 검색
원래는 키보드 개조까지는 안하고 컨버터를 사려고 했다. 쿠팡이나 컴퓨존 등 몇몇 제품이 있는데 후기를 보니 한/영, 한자키가 반대로 동작하거나, 게임 등 여러 키가 동시에 입력될 때 오동작이 있을 수 있다고 한다. 한/영키가 있으면 한/영키를 주로 쓰기 때문에 나한테는 꽤 심각한 문제여서 PS/2 to USB 컨버터는 마음을 접었다.
키보드 검색
지금 쓰는 키보드는 만들어진지 20년이 넘은 제품이다. 같은제품을 여러개 구매해서 바꿔가면서 썼는데 이제 마지막 남은 한개다. 이 기회에 그냥 요즘 나오는 제품으로 바꿔볼까 찾아봤다. 지금 쓰는 키보드가 좋기는 하지만 full size 키보드라서 너무 크다. 오른쪽에 마우스가 너무 멀다. 아마존에서 여러 제품을 찾아봤는데.. 딱히 마음에 드는 제품을 찾을 수가 없었다. 배열이 마음에 드는건 full size라 너무 크고, 텐키리스는 방향키가 이상하거나, 펑션키가 없거나, 펑션키가 일반 키보다 작거나, 등등. 그나마 마음에 드는건 키크론 V10 Knob 인데.. End 키가 없다. Fn 키랑 조합해서 써야하는 모양인데, 아무리 생각해도 End키가 없으면 불편할거 같아 포기했다.
PS/2 to USB 컨버터 자작
이 시점에서 다시 PS/2 to USB 컨버터 그나마 괜찮은 제품이 있는지 찾아봤다. 키보드 매니아에서 검색 결과.. 대부분 컨버터가 뭔가 문제가 많고 그나마 현재 추천할만한 제품을 Ali Express에서 살 수 있는데 한/영키가 동작하지 않는다고 한다. 그런데 게시글 중에 PS/2 to USB 컨버터를 직접 만든 분이 있었다. ( n키 롤오버가 가능한 PS/2 -> USB 컨버터 (업데이트), 같은 분 블로그 글) 뭔가 하신 과정을 보니 나도 할 수 있을 거 같았다. 바로 개조에 필요한 부품들을 주문했다.
실제 컨버터 동작을 할 Teensy2.0 보드는 Ali Express를 이용했다. 나머지는 해당 보드와 키보드 사이 연결을 하기 쉽게 점퍼 케이블과 ㄱ자 로 꺾인 핀헤더, 만능 기판, 저항으로 네이버를 통해 구매했다.
Teensy2.0과 키보드 연결
Teensy 보드에 사용할 tmk_keyboard 펌웨어에 맞춰서 아래와 같이 회로를 구성했다.
(출처: https://github.com/tmk/tmk_keyboard/wiki/FAQ#pull-up-resistor)
먼저 중간에 저항을 연결할 부분을 만능기판으로 만들고, Teensy 보드에 연결할 부분에 핀 헤더를 붙였다. 저항은 그림에 1K-4.7K옴 이라길래 대충 중간 2K옴으로 샀는데, 저 그림위에 설명에는 보통 1K옴이면 적절하다고 한다.
그리고 키보드 기판에 원래 있던 케이블을 제거하고 핀에 맞춰 점퍼 케이블로 연결했다
이 시점부터는 펌웨어 작업이 필요해서 일단 Teensy 보드를 키보드 밖으로 꺼내고 조립했다. Teensy 보드에 펌웨어를 올리려면 보드에 있는 버튼을 눌러야 하기 때문이다.
펌웨어 작업
tmk_keyboard/converter/ps2_usb 디렉토리에서 컨버터 펌웨어를 만들 수 있다. 일단 기본 코드 그대로 빌드해서 넣어봤는데 다행히 잘 동작했다. 다만, 한/영키와 한자키는 동작하지 않았다. 이 작업을 시작하게 한 Asurada님 글에 있던 펌웨어도 마찬가지로 한/영키는 동작하지 않았다.
한/영, 한자 키 작업
기본으로 들어있는 unimap_plain.c 를 복사해 unimap_han106.c 파일을 만들었다. TMK Keymap Editor 에서 한/영, 한자 키를 넣고 키 코드를 확인하니 LANG1, LANG2 였다. 원래 있던 MHEN, HENK 키를 LANG2, LANG1로 바꿔넣었다. 그리고 빌드해서 넣었는데, 역시나 동작을 안했다. 코드를 뒤져보니 matrix.c 에서 실제 변환 작업을 하는데, 맨 위에 이런 주석이 있었다.
* Notes:
* Both ‘Hanguel/English'(F1) and ‘Hanja'(F2) collide with ‘Delete'(E0 71) and ‘Down'(E0 72).
* These two Korean keys need exceptional handling and are not supported for now. Sorry.
이게 키 입력을 변환할 때 key code를 바꾸는데 앞에 E0이 붙을 경우 뒤 코드에 0x80이 | 연산이 되면서 Delete는 F1, Down이 F2가 된다. 그런데 PS/2 키보드에서 한/영 키가 F1, 한자 키가 F2로 두 키의 코드가 충돌이 발생하기 때문에 지원이 안되고 있었다. 코드를 천천히 살펴보니, matrix가 빈 부분이 많이 있고, E1과 E2는 할당이 되어있지 않아 Delete와 Down을 F1, F2 에서 E1, E2로 바꿨다. 한/영, 한자 키는 실제 적용되는 키가 뭐일지 몰라 일단 영문자 a, b로 바꾸고 동작을 확인했다.
그런데 이번에는… 한/영, 한자 키를 누르면, a 나 b가 계속해서 찍혔다. 한/영, 한자키 동작이 이상한게, 다른 키들은 눌리면 down, up이 번갈아 가며 이벤트가 올라오는데 한/영, 한자 키는 down 만 오고 up이 없다. 그래서 그냥 계속해서 눌리는 것으로 인식되었다. matrix.c 에서 키 이벤트를 처리하는 matrix_scan() 함수 호출하는 부분을 찾아보니 tmk_core/common/keyboard.c 파일 keyboard_task() 함수였다. 이 함수에서 matrix_scan() 호출 후 눌린 것으로 표시된 키를 PC로 보낸다. 이 부분을 보니 한/영, 한자키가 눌린것을 보낸 뒤에 키가 다시 떼진 것으로 처리하면 좋을 것 같았다. 마침 이벤트를 처리하고 부르는 hook_matrix_change() 함수가 뭔가 이런 작업을 하기 좋아 보였다. matrix.c 파일에 hook_matrix_change() 를 추가해 한/영, 한자 키가 눌려 있으면 다시 떼는 것으로 바꿨다. 그리고 마침내!! a, b 문자가 일반 키를 누른 것처럼 잘 출력 되었다.
마지막으로 실제 한/영, 한자 키로 만들어야 한다. 한/영, 한자키는 keycode로 KC_LANG1, KC_LANG2 인데 변환 후 사용할 unimap 에는 LANG1, LANG2가 없었다. 이걸 어떻게 처리해야 하나 고민하다 JIS keys 중에 있을 거 같아 이것저것 넣고 테스트 해봤다. 그 결과 MHEN과 HENK를 적용하니 한/영, 한자 키 모두 잘 동작했다.
부트로더 작업
Teensy 보드는 펌웨어를 받으려면 보드에 있는 버튼을 눌러야 한다. 그래서 일단은 보드를 밖에 빼고 작업했는데 끝나면 키보드 안쪽 남는 공간에 넣을 예정이다. 그러면 펌웨어 업데이트가 필요한 경우 버튼을 누르기 위해 다시 키보드를 분해해야 한다. 그래서 키보드 분해 없이 부트로더로 들어갈 수 있게 추가작업을 했다.
원래 tmk_keyboard 에서 magic key를 이용한 bootloader 진입 기능이 제공된다. 그런데 이상하게 해당 기능으로는 동작하지 않아 Teensy 보드 홈페이지에 있는 방식 그대로 적용했다. (https://www.pjrc.com/teensy/jump_to_bootloader.html) Magic key를 이용한 bootloader 진입 하는 부분 코드를 찾아서 직접 고치려다 위에 한/영키 작업할 때 썼던 hook을 적용하는데 더 나을 거 같았다. 바로 hook_bootloader_jump() 를 추가하고 ps2_usb 디렉토리에 hook.c 파일에 bootloader로 가는 코드를 넣었다. 생각대로 잘 동작했다.
모든 작업은 github에 올려놓았다. (https://github.com/jeongsu816/tmk_keyboard)
최종 조립
이제 펌웨어도 다 준비가 끝나서 Teensy보드를 키보드 안 빈 공간으로 넣었다. 빈 공간은 넓은데 바닥판에 지지대 부분이 있어 보드와 선이 눌리지 않게 위치를 잡는게 좀 시간이 걸렸다.
선을 빼서 반대쪽으로 옮기고 적절히 위치를 잡았다. 저기에 USB 케이블을 끼웠더니 커넥터 부분이 걸려서 위치 잡기가 쉽지 않았다. 바닥판을 올려보면서 여러차례 위치를 바꿔서 말끔하게 잘 들어가는 위치를 찾을 수 있었다. 그리고 버튼을 누르지 않아도 펌웨어를 받을 수 있게 했지만 혹시라도 다시 눌러야 할 일이 있을지 몰라 바닥판에 구멍을 뚫었다. 그런데… 정확히 어디인지 몰라 시행착오를 하다보니 여러개를 뚫었다. 마지막으로 가장 크게 뚫은 구멍을 통해 버튼을 누를 수 있었다.
USB 개조 끝!
Submit Comment
The URI to TrackBack this entry is:
https://bmp.pe.kr/blog/index.php/2023/09/22/lg-ibm-%eb%82%b4%ec%b6%94%eb%9f%b4-%ed%82%a4%eb%b3%b4%eb%93%9c-lkb-0107-usb%eb%a1%9c-%ea%b0%9c%ec%a1%b0/trackback/