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 개조 끝!




* Required

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/

Posted on the 15th of November, 2023 at 6:55 am.

ps2_usb 를 이용해 만들었는데.. 문제가 있어서 issue에 등록하니 ibmpc_usb를 쓰라고 한다. 그래서 ibmpc_usb 코드를 다시 수정했다. 수정한 내용도 github에 반영 완료

Posted on the 6th of April, 2024 at 3:01 am.

tmk_keyboard-master\converter\ibmpc_usb\binary

경로에 있는 hex 파일을 아두이노 레오나르도에 업로드 해봤는데 한/영, 한자키 빼고 이상 없었습니다.

다만 “한/영” 키를 누르면 한/영 전환되지 않았고,”한자”키를 누르면 한자가 나오지 않았습니다. 대신 두 경우 모두 먹통이 되면서 한동안 아무런 키가 입력되지 않고 좀 시간이 지나야 입력됩니다.

teensy 2.0 이나 아두이오 레오나르도가 큰 차이는 없어 보여서 그냥 했습니다. 회로구성에 “저항”은 굳이 필요할까 싶어서 빼긴 했는데 설마 저항 안달았다고 딱 두 가지 키가 작동 안하려나 싶긴 합니다..

Posted on the 6th of April, 2024 at 9:34 am.

@11님,
tmk_keyboard-master\converter\ibmpc_usb\binary 여기에 hex 파일이 있는 줄은 몰랐네요^^; 저는 소스코드만 고쳐서 올린거라 저기 있는건 한/영키가 동작하지 않을거예요.
저항은 없어도 동작한다는 글을 읽기는 했습니다만 있는게 좋다고 해서 달았어요.

Posted on the 6th of April, 2024 at 4:23 pm.

아 hex파일이 수정된 코드가 아닌 이전 것이라 안되었군요.. 그럼 binary폴더에 있는 hex파일을 업로드할게 아니라 ibmpc_usb폴더에 있는 소스파일을 이용해 펌웨어 hex 파일을 추출해야 하는건데 여기서 막히네요… 어떤 프로그램을 써서 어떤 파일을 빌드해야하는 건지…

아래 깃허브 페이지의

https://github.com/jeongsu816/tmk_keyboard/tree/master/converter/ibmpc_usb

“Build Firmware”를 읽어보니 명령어를 볼 때 리눅스환경에서 해야하는것으로 보여 윈도우10에서 Ubuntu on Windows 10을 설치하고 https://github.com/tmk/tmk_keyboard/wiki/Build-on-Ubuntu-On-Windows10 에 있는 대로 tool을 설치하고 \converter\ibmpc_usb 폴더안에 리눅스셀을 실행해서 아래 명령어를 입력하면 되는거 같은데

$ make -f Makefile. clean
$ make -f Makefile.

“$ make -f Makefile.atmega32u4 clean” 입력하니 lufa may be too old or not found: try ‘git submodule update –init’라는 글이 뜨면서 막혔습니다.

혹시 마냥님은 어떻게 펌웨어 추출했는지 알 수 있을까요??

Posted on the 6th of April, 2024 at 7:03 pm.

아 binary폴더 안의 hex파일은 수정되기 이전의 것이라”한/영, 한자키”가 먹통이었군요…
그럼 소스 파일을 빌드해서 hex파일을 추출해야 하는데 깃허브 설명서를 보니 리눅스 환경에서 빌드해야 되는거 같은데 마냥님도 리눅스에서 하셨나요?? 아님 마이크로칩스튜디오 같은 프로그램으로 하셨나요?? ibmpc_usb 폴더 안에 파일이 많아서 뭐부터 해야할지 감이 안섭니다… “ubuntu on windows 10” 설치해서 hash 실행한 뒤 아래 명령어 넣어도 오류 뜨면서 막히네요..

$ cd converter/ibmpc_usb
$ make -f Makefile. clean
$ make -f Makefile.

Posted on the 6th of April, 2024 at 9:34 pm.

빌드 방법은 https://github.com/tmk/tmk_keyboard/wiki#build-firmware 여기 보면 있어요.
git clone 후에 git submodule 명령도 해주셔야 해요

https://github.com/tmk/tmk_keyboard/wiki/Build-on-Ubuntu-On-Windows10 여기에서 빌드 환경 만드는거까지만 확인하시고 git clone 부터는 위에 링크 참고하시면 될거예요

Posted on the 7th of April, 2024 at 2:11 am.

댓글 등록이 잘 안되는듯 합니다.. 몇시간 전에 댓글 등록했는데 아직도 안뜨네요..

https://github.com/tmk/tmk_keyboard/wiki#build-firmware

일단 위 링크로 git clone 후에 git submodule 명령넣고 다시 빌드해보니 문제없이 hex파일이 나왔습니다..

다만 아래 수정된 코드가 들어있는 링크에서 ibmpc_usb 폴더 안의 내용물로 바꿔서 빌드해보니 오류가 떠서 실패했습니다.

https://github.com/jeongsu816/tmk_keyboard

내용물 수정된걸로 바꾼뒤 다시 git clone 후에 git submodule 명령넣고 빌드해도 안되네요.. 뭐가 단계가 빠진건지 파일이름을 바꿔야 하는건지 내용물을 수정해야 하는건지 잘 모르겠습니다.

Posted on the 7th of April, 2024 at 2:17 am.

아 바로 윗댓글 마지막 문장 수정합니다.

git clone후에 converter\ibmpc_usb 폴더 내용물을 수정된걸로 바꾼 뒤 다시 git submodule 명령넣고 빌드해도 안되네요.. 뭐가 단계가 빠진건지 파일이름을 바꿔야 하는건지 내용물을 수정해야 하는건지 잘 모르겠습니다.

Posted on the 7th of April, 2024 at 2:29 am.

마지막 문장 수정 댓글 썼는데 바로 전에 쓴 댓글이 안보이네요..

https://github.com/tmk/tmk_keyboard/wiki#build-firmware

아무튼 위 링크 설명처럼 git clone 하고 git submodule 명령후 빌드하니 hex파일이 나왔습니다.

https://github.com/jeongsu816/tmk_keyboard

다만 이제 본격적으로 위 링크의 converter\ibmpc_usb 경로에 있는 수정된 코드로 다시 빌드해보니 에러뜨면서 실패했습니다. 첫번째 링크와 2번째 링크의 converter\ibmpc_usb 경로에 있는 파일이 1~2개 정도가 다르고 파일 한개가 더 추가된듯한데 빌드과정중에 제가 빠뜨린게 있는건지 아니면 파일이름이나 내용물을 바꿔야 하는건지 모르겠습니다..

수정된 코드로 파일 교체후 git submodule 명령을 다시 하고 빌드해도 에러 뜨네요.

Posted on the 7th of April, 2024 at 7:35 am.

제 코드에서 직접 빌드하는 방법을 github 위키에 정리했어요.
https://github.com/jeongsu816/tmk_keyboard/wiki#how-to-build

그리고 또 에러가 난다면 여기 코멘트 보다는 저기 github issue에서 하는게 더 좋을 거 같아요.
https://github.com/jeongsu816/tmk_keyboard/issues