BBQ20KBD라는 것은 그냥 쉽게 말하자면 BlackBerry Q20 Keyboard라는 의미입니다.

 

한때 엄청 유명했던 전설의 휴대폰 블랙베리 Q20의 키보드를 사용해서 일반적인 키보드를 만드는 프로젝트입니다.

https://www.solder.party/docs/bbq20kbd/

 

BBQ20KBD

A BB Q20 Keyboard in USB/PMOD/Qwiic format with a injection molded clear plastic case. This is the evolution of our previous BBQ10 PMOD board. We took all the feedback from that board and improved on the design in every way. We added a Qwiic/Stemma QT conn

www.solder.party

Solder Party라는 곳에서 제작 및 진행을 하고 있고 BlackBerry 키보드 부품도 필요하지만 잘 뒤져보시면 PCB와 함께 완제품?을 구할 수도 있습니다.

저는 운 좋게 완제품을 구해서 가지고 놀고 있었습니다.

 

그런데 이 키보드가 한/영키가 따로 존재하지 않습니다. 그래서 표준이라 할 수 있는 Shift+Space를 함께 눌러봤는데...

이상하게 작동이 안 되더군요.

이건 아무래도 펌웨어 문제가 분명했습니다.

 

공개된 펌웨어 코드를 다운로드 받아서 분석을 해보니...

https://github.com/solderparty/i2c_puppet

 

GitHub - solderparty/i2c_puppet

Contribute to solderparty/i2c_puppet development by creating an account on GitHub.

github.com

해당 부분이 HID 키보드 신호를 뿌려주는 부분이다. 뭔가...키코드가 이상하다.

KEY_MOD_SHL

KEY_MOD_SHR

KEY_MOD_ALT

KEY_MOD_SYM

 

여기 있는 키는 입력을 씹는 것으로 되어 있습니다. 근데 씹는게 맞기는 합니다. 저 키는 원래 조합으로 만들어지는 부분이니까요.

 

원래 코드 기준 76번째 줄 보면 (위 스크린샷 기준 81번째 제가 좀 손을 봤거든요.)

tud_hid_n_keyboard_report(USB_ITF_KEYBOARD, 0, modifier, keycode);

 

이 함수로 키코드와 조합키를 만들어서 보내는 듯 합니다.

그러면 해당 함수를 호출 하는 곳을 찾아봅니다.

 

열심히 찾다보니 콜백 함수를 찾을 수 있었습니다. key_callback이라는 구조로 콜백하게 되어 있군요. 그러면 key_callback을 찾아봅니다.

 

여기저기 있었지만 찾아본 결과 keyboard.c에서

여기 있는 이 부분이 바로 중요한 부분이었습니다.

즉 keyboard_inject_event함수가 호출 될 때 해당 부분을 콜백하면서 작동되는 구조더군요.

 

그리고 해당 함수를 호출 하는 부분은 위쪽에 있었습니다.

-

transition_to 함수에서 키코드를 받아이런 저런 조합을 하는 부분이 있었습니다.

그래서 생각을 한 것이 해당 키보드의 SYM키 위치가 좋아보이더군요. 그래서 이걸 0xF2로 바꿔봤습니다. 0xF2가 한국키보드의 한/영 키를 의미합니다. 요즘은 그냥 오른쪽Alt키를 더 많이 쓰는 거 같지만 위 스크린샷의 109번째 줄 처럼 key=0xF2로 바꿔봤습니다.

 

그리고 해당 코드를 빌드 후에 키보드에 입혀봤습니다.

 

설명서를 보시면

 

여기 있는 해당 부분을 누르면서 USB를 연결하면 부트로더 모드로 진입하고 이때 뜨는 드라이브에 빌드된 uf2 파일을 복사하면 알아서 펌웨어가 입혀집니다.

 

(uf2파일로 빌드하는 것은 이전 글 https://moordev.tistory.com/451참조)

 

그랬더니 윈도우에서 잘 먹힙니다. 그런데 이건 윈도우에서 먹히는 거고 안드로이드에서는 또 안 먹힙니다.

안드로이드는 Shfit+Space가 아니면 언어 전환이 안 되거든요.

 

그래서 추가로 손을 댔습니다.

 

 

usb.c 파일의 key_cb 함수를 수정해서 저 위치에

if (key == 0xF2) { // HANGUL KEY
    modifier = KEYBOARD_MODIFIER_LEFTSHIFT;
    keycode[0] = conv_table[0x20][1];
    //HANGUL KEY Press to Shift+Space

이 코드를 추가하면 0xF2 코드가 들어왔을 때 Shift+space로 작동 되게끔 신호를 쏴줍니다.

 

이렇게 해주니 SYM키를 누를 때마다 한/영전환이 안드로이드에서 아주 잘 되기 시작합니다. 대신 윈도우에서 또 안 되네요...

윈도우가 Shift+Space 전환을 지원을 안 하는게 아닌걸로 아는데 이건 이유를 모르겠네요.

 

그냥... 이 키보드를 어디서 쓸거냐에 따라 그때그때마다 펌웨어를 바꿔주는 것으로 합시다... 굉장히 귀찮아지기 시작했습니다.

원한다면 다른 방식으로 그냥 키를 싹싹 바꿔보는 것도 방법일거 같기도 하네요.

,