리모콘 신호형식을 이용한 팜 무선키보드용 리눅스 드라이버 제작

김 현종


                <lampo1@paran.com>
            

차례

드라이버의 동작원리
팜 무선 키보드의 키 입력의 특징
드라이버 작성에 앞서 갖추어야 할 것
적외선 신호 수신장치
lirc 설치
출력
팜 무선키보드의 적외선 신호 해석
팜 무선 키보드 드라이버 프로그래밍
데이터 파일
유의사항
물음표(Question Mark)의 입력
다른 프로그램과의 충돌
기타
고마운 분들과 앞으로의 개선점
<pubdate>2005. 5. 14</pubdate>

초록

이 문서의 내용은 잘못된 것이다!!! 팜 무선키보드에 대해 제조사가 직접 내놓은 정확하고도 상세한 문서를 다음 사이트에서 받을 수 있다. 간단한 로그인 과정을 거쳐야 한다. 그 기본 원리는 포켓탑등의 다른 IRDA 적외선 키보드에도 유용하다. 결정적인 문서이므로 필독해야 한다.http://www.thinkoutside.com/developer/developer.html

따라서 본 문서의 이하 내용은 pwkdriver v0.2.3 이하의 버전에 대한 설명이 된다. 필자의 무지로 인하여 이 버전까지는 키보드에서 방출되는 적외선 신호를 lirc 드라이버로 받아 해석하는 방법을 취하였다. 이는 사실 팜 무선 키보드와는 맞지 않는 방식이었다. 버전 0.3 부터는 제대로 irda 신호를 해석하는 방법을 취하였다. 따라서 본 문서의 내용은 문외한의 잘못된 해석의 대표적인 예라 할수 있다. 그럼에도 불구하고 이 오해로 점철된 잘못된 문서를 없애지 않는 이유는 나름대로 이것도 도움될 곳이 있기 때문이다. 예를 들어 삼성전기의 cir-9000 같이 리모콘 신호형식을 취하는 적외선 키보드라면 이 문서의 내용이 적용될수 있을 것이다. cir-9000 에 대한 리눅스 드라이버는 조영현님의 사이트에서 찾아볼수 있다. http://redcamel.x-y.net/wikix/index.php?display=Yopy/CIR9000

리눅스용 팜 무선 키보드(Palm Wireless Keyboard, TM)에서 발생하는 적외선 신호를 리모콘 형식으로 해석하여 리눅스용 드라이버를 작성하는 방법을 설명한다. 이 드라이버는 다른 모델의 무선 키보드에서는 작동하지 않는다. 프로그램 소스와 실행파일은 http://kldp.net/projects/irkbd/ 에서 다운로드 받을수 있다. 프로그램의 버그나 하자로 인해 발생할 수 있는 손해는 전적으로 사용자의 책임이며 필자는 절대 책임질수 없음을 분명히 밝힌다.

팜 무선 키보드에 대한 사항은 다음 사이트에서 찾아볼수 있다. http://www.palmone.com/us/support/accessories/wirelesskeyboard.html

드라이버의 동작원리

드라이버는 콘솔 출력도 가능한 pwkcns 와 Xwindow 에서만 동작하는 pwkxwin 두 종류가 있다. 두 드라이버를 동시에 사용할 수는 없다.

팜 적외선 무선 키보드의 키를 누르면 그 키에 해당하는 적외선 신호가 발생한다. 발생된 적외선 신호는 컴퓨터의 irda 포트를 통해 lirc 드라이버가 수신되며, 이 수신된 신호 숫자열을 미리 작성해놓은 신호테이블과 비교해 키의 동작을 알아낸다. 콘솔 출력을 원한다면 pwkcns 드라이버를 이용해 해당 키의 스캔코드를 /dev/kbde 로 보내고, Xwindow 응용프로그램쪽으로 출력하려면 pwkxwin 드라이버를 이용해 Xlib 의 XTestFakeKeyEvent 함수로 보낸다.

다음은 lirc 와 kbde 프로젝트의 홈페이지다.

http://www.lirc.org http://kbde.sourceforge.net

필자의 드라이버는 독립적인 키보드 드라이버가 아니라 리눅스 운영체제의 키보드 드라이버에 부수하는 프로그램이다. 따라서 리눅스 시스템에서 지원하지 않는 기능은 본 프로그램도 지원할 수 없다. 예를 들어, 리눅스의 키보드 드라이버가 101 표준 키보드로 설정되었다면 이 프로그램 역시 그 101 키 이외의 키들을 입력시킬수 없다.

팜 무선 키보드의 키 입력의 특징

팜 무선키보드(Palm Wireless Keyboard(TM). 이하 PWK 라 약칭한다)는 51 개의 키를 가지고 있으며 각각의 키는 누를 때와 뗄때 서로 다른 신호를 발생시킨다. 누를 때 나오는 신호를 make 신호라 하고 뗄때 나오는 신호를 break 신호라 한다. 또한 키를 계속 누르고 있으면 키의 연속을 의미하는 별도의 신호가 발생한다. 따라서, 모두 합해 103 개의 서로 다른 적외선 신호열을 발생시킬수 있다.

51 개의 키로서 표준 101 키를 입력시키기 위해 불가피하게 좌우측에 각각 FN 키가 있다. 자판에는 또 팜 PDA 전용 기능을 위한 다양한 단축키들이 새겨져있지만 단축키로서 눌렀다 해서 하드웨어적으로 보통 키 때와 다른 별개의 신호가 나오는 것은 아니다. 보통 키때와 똑같은 신호가 나올 뿐이며 팜 PDA 내의 드라이버가 FN 키와의 조합을 판단해 특수한 기능을 발현시킬 뿐이다.

키를 누른 상태를 계속 유지할 경우 그 키의 make 신호가 연속으로 나오는 것이 아니라 키가 계속 눌려지고 있음을 나타내는 별도의 신호가 반복발생한다. 편의적으로 이 신호를 REPEAT 신호라고 부르기로 한다. 다음 키들은 다른 키들과 달리 계속 누른채 있어도 REPEAT 신호를 발생시키지 않는다. 그러나 이들 키와의 조합으로 일단 다른 키들이 눌렸다 떼어지면 이제는 이 키들도 눌려진 상태에서 일정 신호를 연속적으로 내보낸다. 이 신호는 REPEAT 신호와도 또 다르지만 필자는 이 신호는 이용하지 않았으므로 따로 명칭을 부여하지는 않겠다. 아래의 키명칭은 필자가 임의로 붙인 것으로 어느 키를 지칭하는지는 쉽게 알수 있을 것이다.

LSHIFT, RSHIFT, LCTRL, CMD, LALT, LFN, RFN.

PWK 자판의 CMD 키는 표준 101 키보드의 ESC 키로 가정했다. 한 가지 주의할 점은 물음표키(?) 의 입력이다. 팜 키보드 자판에는 SHIFT-UARROW 로 물음표키를 입력하도록 되어있지만, 필자의 드라이버를 통해 물음표 키를 입력하려면 그 대신 SHIFT-슬래쉬(/)를 입력해야 한다. 이 문제의 해결방법은 문서 말미에서 설명한다.

드라이버 작성에 앞서 갖추어야 할 것

적외선 신호 수신장치

가장 간편한 것은 irda 적외선 포트가 내장된 노트북이다. 대부분의 노트북에 irda 수신 장치가 있을 것이다.

그러한 노트북이 없을 경우, 일반 데스크탑 컴퓨터에 연결하는 적외선 디바이스를 이용할 수도 있다. 직렬포트, 병렬포트, USB 등등 다양한 연결방식의 적외선 디바이스들이 출시되어있지만 lirc 프로젝트의 드라이버는 그중 몇가지만 지원하고 있다. 필자의 프로그램은 lirc 의 드라이버들 중에서도 lirc_sir.o 모듈을 기준으로 작성되었으므로 다른 하드웨어를 가졌다면 그에 맞는 모듈을 사용해야 할 것이다. 프로그램의 소스를 고쳐 해당 명칭도 정정해야 할 것이다. 적외선 하드웨어중 특기할 만한 것이 하나 있는데 바로 메인보드 기판에 직접 연결하는 형태의 적외선 디바이스다.

대부분의 메인보드들의 기판에는 5핀(4핀) 커넥터가 있으며, 여기에 적외선 디바이스를 연결할 수 있다. 대개는 메인보드에 커넥터만 달려있고 여기에 꽂는 디바이스는 별도로 구매해야 한다. 필자가 알아본 바로는 ACTiSYS 제품중에 그런 게 있다. 다행히도 메인보드 커넥터에 연결하는 디바이스는 매우 간단하므로 직접 제작하는 것도 어렵지 않다. 약 만원 안팍의 부품비용과 납땜 장비가 필요하다. 다음을 참고하라.

http://www.todaysppc.com/main/bhtml.php?pgname=http://www.todaysppc.com/gm/archives/00000851.htm http://tscherwitschke.de/irda.html 그밖에도 인터넷에서 tfds4500 으로 검색하면 제법 찾을 수 있다.

시리얼 커넥터에 연결하는 적외선 디바이스는 lirc_serial.o 모듈을 사용하는 데 반해 메인보드의 커넥터에 연결하는 디바이스는 lirc_sir.o 모듈을 사용한다. 서로 다른 것이니 헷갈리지 말기 바란다. 특히 아래에서 설명할 lirc 공식 홈페이지의 내용을 읽다보면 둘을 혼동하기 쉬우니 차제에 분명히 설명하고 넘어가자.

컴퓨터의 시리얼 커넥터(25핀 또는 9핀)에서 직접 적외선이 발사될리는 만무하다. 당연히 그 시리얼 커넥터에 연결해 적외선 신호를 전기신호로 바꾸거나 그 반대기능을 수행하는 장치가 있어야 할 것이다. 컴퓨터의 시리얼 커넥터(25 핀 또는 9 핀)에 꽂는 형태의 적외선 디바이스가 그런 장비의 일종이다. 이 장치는 시리얼 커넥터에서 전기신호를 받아 신호의 길이를 3/16 으로 압축한 후 적외선 신호로 바꾸어 외부로 발사한다. 이 시리얼 디바이스는 lirc_serial.o 를 사용한다.

그런데 이렇게 전기신호를 3/16 으로 압축하는 과정을 메인보드 기판상에서 미리 처리해 둔 것이 바로 위에서 설명했던 5핀 메인보드 커넥터이다. 여기에 연결하는 적외선 디바이스는 이미 압축된 신호를 다루기 때문에 위의 디바이스보다 훨씬 간단한 회로가 된다. 이 디바이스는 lirc_sir.o 를 사용한다. 둘다 똑같이 시리얼 포트 하나를 irda 포트로 변환시켜 사용하기 때문에 모두 시리얼 포트 디바이스라고 통칭되지만 각각을 구동시킬때는 소프트웨어적으로 다른 모듈을 써야 하는 것이다.

어떤 하드웨어를 선택하든 BIOS 설정에 주의해야한다. 반드시 IRDA SIR 모드로 설정해야 하며 FIR 로 설정해서는 안된다. RX,TX 옵션등은 보통 lo,hi 로 설정하라던데 일부 메인보드는 반대로 되어있는 경우도 있다. 잘못 설정하면 디바이스가 파괴된다는 무시무시한 경고도 본 적이 있다. 메인보드 메뉴얼을 참고해서 각자 알아서 책임질 부분이다.

lirc 설치

노트북이든 데스크탑이든 적외선 디바이스가 준비가 됐다면 lirc 드라이버를 설치할 차례다. 이 프로젝트의 공식 사이트는 http://www.lirc.org이다. 하지만 이곳의 설명은 사전지식이 없는 사람에게는 다소 어렵게 느껴질 것이다. 필자는 우선 다음 사이트를 볼 것을 권한다. 매우 자세하고 이해하기 쉽게 설명되어 있다. 특히 두번째 홈페이지의 신호해석방법은 꼼꼼히 읽어보기 바란다.

http://www.turbobit.com/lirc.html http://www.turbobit.com/lirc2.html

필요한 부분만 요약하면 아래와 같다.

우리가 사용하는 적외선 기기는 두가지 표준이 있으니, 하나는 일반적으로 가전제품에 많이 사용되는 리모콘(Consumer IR) 표준이고 다른 하나는 irda 표준이다. 이 두 표준은 이용하는 적외선 신호의 파장 자체부터 다르고 하드웨어적으로도 다르다. 하지만 다행히도 irda 하드웨어를 구동시키는 드라이버를 적절히 작성하면 리모콘 신호 형식 및 기타 다른 적외선 신호도 읽어낼 수 있다. 그런 드라이버가 바로 lirc 프로젝트에서 작성한 드라이버다.

lirc 프로젝트의 주 목적은 컴퓨터를 일반 리모콘으로 조정하는데 있다. 그래서 거실에다 조그만 PC 를 두고 리모콘으로 PC 를 조종해 DVD 등을 보자는 것이 lirc 프로젝트의 주 목적이다. 다행히도 이 분들이 작성한 드라이버를 이용하면 irda 하드웨어의 적외선 신호도 수신, 분석할 수가 있는 것이다.

참고로 irda-linux 라는 프로젝트가 있는데 헷갈리지 말기 바란다. 이것은 irda 프로토콜(주로 파일 교환 프로토콜)을 리눅스에서 구현하자는 프로젝트다. 비록 우리가 irda 포트를 이용하기는 하지만 irda 프로토콜을 이용하는 것은 아니므로 irda 패키지로는 아직은 무선 키보드를 구동시킬 수 없다.

이상과 같이 사전 지식을 갖추었다면 이제 http://www.lirc.org 에서 lirc-0.6.6.tar.gz 을 다운받아 지시대로 설치한다. 각자의 시스템에 맞는 배포판의 패키지를 사용할 수도 있을 것이다. 이 패키지에 있는 mode2 라는 프로그램도 신호점검을 위해 필요하다.

lirc_sir.o 나 lirc_serial.o 을 이용하는 분은 당연한 이야기지만 해당 시리얼 포트의 io 주소와 irq 넘버를 미리 잘 파악해 기존의 시리얼 포트 장비와 충돌이 없도록 해야 할 것이다. lirc 의 주의 사항을 잘 읽어보기 바란다. 노트북의 경우 pcmcia 등의 주변기기가 irq 3 을 점유하는 수가 있으니 미리 확인해야 한다. 커널이 /proc 파일 시스템을 지원한다면 cat /proc/interrupts 명령으로 미리 irq 점유 여부를 알아볼 수 있을 것이다.

이제 lirc 드라이버를 다 설치했다면 insmod lirc_sir 명령으로 모듈을 올린 후 터미널에서 mode2 를 실행해 적외선 신호를 수신해본다. 팜 무선 키보드의 적외선 송출부를 컴퓨터의 적외선 수신부에 대고 아무 키나 누른다. 주르륵 숫자들이 올라갈 것이다. 이게 된다면 일단 lirc 는 성공적으로 설치된 것이다. 반드시 무선 키보드가 아니어도 좋다. TV 리모콘처럼 누르면 신호를 계속 내보내는 리모콘은 대부분 다 될것이다. 에어콘용 리모콘은 실패했다. 아마도 신호가 잠깐 나오고 마는 모양이다. 리모콘으로 컴퓨터를 조작하는데 흥미가 있는 분은 lirc 홈페이지를 더 보시기 바라며 본론으로 돌아가자.

출력된 숫자를 보면 알겠지만 위의 lirc 참고 홈페이지에서 설명한 신호형태는 나오지 않는다. 당연한 것이 위 홈페이지의 설명은 리모콘 신호형식에 대한 설명이었고, 무선 키보드는 리모콘이 아닌 것이다. 무선 키보드의 키 하나를 눌렀다 떼면 적어도 수십개의 숫자가 순식간에 출력되어야 정상이다. 숫자가 안나오거나 두어개 나오다 말면 거리와 방향을 조정해서 다시 시도한다. 무선 키보드의 배터리가 부족해도 이런 현상이 생긴다. 3 파장 스탠드 불빛에 간섭받는 경우도 가끔 있다.

출력

kbde

이 절은 콘솔 출력용 드라이버인 pwkcns 를 설명한다. 만일 Xwindow 출력만 필요하고 콘솔 출력은 필요없다면 이 절은 생략하고 다음 절로 넘어가야한다.

pwkcns 프로그램은 해당 키에 대한 스캔코드를 커널의 키보드 큐로 보낸다. 이는 kbde 라는 오픈소스를 이용하면 간단히 해결된다. kbde.o 는 /dev/kbde 라는 디바이스 파일로 입력된 스캔코드를 키보드 큐로 넣는 역할을 하는 커널 모듈이다.

http://kbde.sourceforge.net 에서 kbde-driver.tar.gz 을 받는다. kbde-1.1.0.tar.gz 이라는 것도 있는데 이것은 kbde-driver 의 응용프로그램이므로 필요없다. INSTALL 파일에 적힌대로 따르면 쉽게 설치될 것이다. 제대로 설치되었는지 확인하는 간단한 방법이 man kbde 에 나온다. 그대로 해서 kbde.o 의 작동여부를 분명히 확인한다.

kbde 가 있음으로해서 우리는 키보드의 동작원리에 대해 전혀 알 필요가 없어졌지만, 그래도 키보드의 동작원리에 관한 유용한 참고 사이트를 적어둔다. 조금은 상식선에서 알아두는 것이 바람직한데 바로 스캔코드라는 것이다. 아래 참고 사이트의 용어대로 말하자면 우리는 lirc 로 받은 숫자무리를 스캔코드 set 1, 즉 XT 스캔코드로 변환하는 프로그램을 짜야 한다.

http://panda.cs.ndsu.nodak.edu/%7Eachapwes/PICmicro/keyboard/atkeyboard.html#General%20Description%20FN

XTest 라이브러리

이 절은 Xwindow 쪽으로만 출력할 경우에 해당한다. pwkxwin 드라이버가 이를 구현한다. pwkxwin.c 소스코드를 컴파일려면 Xwindow 프로그래밍에 필요한 기본적인 라이브러리와 더불어 XTest 라는 extension 라이브러리가 필요하다. 대개는 XFree86 패키지에 같이 들어있다.

Xlib extension 인 Xtest 패키지의 XTestFakeKeyEvent() 함수를 이용하면 X 응용 프로그램에서는 실제의 키입력과 이 함수를 이용한 키입력을 전혀 구별할수 없다. Xwindow 에 설정된 키 대응표은 xmodmap 명령으로 알아볼 수 잇다. 어떤 키가 타이핑됐는지 알아낸 후 해당 키의 키코드를 대응표에서 찾아 이 함수로 보내면 된다. 간편하고 커널을 경유하지 않는다는 것이 장점이나 콘솔로는 출력할 수 없다.

유의할 점은 사용하고있는 윈도우매니저가 응용프로그램간의 focus 변경을 허용하느냐이다. 허용되지 않는다면 다른 응용프로그램쪽으로 키 입력이 들어가지 않게 되므로 결국 이 프로그램은 별 쓸모가 없을 것이다. 필자가 확인한 바로는 ICEwm 에서는 허용되나 BlackBox 는 허용되지 않았다. 이에대한 해결책은 http://www.srcf.ucam.org/~mjg59/angry/2.html에서 제시하고 있는듯 하나 필자의 드라이버는 아직 이를 구현하지는 못했다.

팜 무선키보드의 적외선 신호 해석

여기까지 준비되었다면 이제 /dev 디렉토리 밑에 lirc 이라는 디바이스가 생겼을 것이다. 정상작동여부를 다시 확인하기 바란다. lirc 설치중 혹시 디바이스 파일이 안생겼다면 mknod 명령으로 직접 만들어주어도 된다.

이제부터 본론이다. 당연한 이야기지만 필자는 PWK 만 가지고 있기 때문에 그 신호만 분석한다. 다른 무선 키보드라면 물론 이것과는 다른 신호형식을 가지겠지만, 적어도 분석방법 만큼은 참고가 될것이다.

PWK 의 적외선 송출부와 리눅스 컴퓨터의 수신부를 마주보게 한후, mode2 > temp.data 명령을 내린다. 이제 A 키만 자연스레 눌렀다가 뗀다. 계속 누르고 있으면 REPEAT 신호가 나와버리므로 그냥 타자치듯 툭툭 치면 된다. 이걸 10 번쯤 반복한후 ctrl-c 로 중단시키고 출력된 temp.data 를 잘 읽어본다. 자연스럽게 어떤 패턴이 반복됨을 알수 있을 것이다.

a 키를 예로 든다. 다른 키들도 예외없이 같은 형식을 가진다.

space 16777176
pulse 39
space 1107
pulse 636
space 496
pulse 39
space 164
pulse 237
space 170
pulse 237
.............
.............        (중간 생략)
space 164
pulse 39
space 369
pulse 39
space 280
pulse 39
space 165
pulse 443
        

너무 길어서 중간은 생략했다. 이 숫자열을 39 를 기준으로 잘라서 옆으로 다시 써보면 다음과 같다.

16777176        (제일 먼저 다른 숫자에 비해 매우큰 숫자가 나온다. 항상 같은 수는 아니다.) 
39 1106 639 495     (신호의 처음에는 항상 이 4 개의 숫자가 나온다. 약간의 오차는 있다. A 키의 make 신호 시작을 의미한다.)
39 159 240 167 242 291 441 378 
39 278 
39 163 244 696 
39 154 442  (신호의 끝에는 항상 이 3 개의 숫자가 나온다. 약간의 오차는 있다. 신호의 끝을 의미한다.)
888776                 (역시 무지 큰 숫자)
39 1098 636 493    (위에서 설명했듯이 첫머리 신호 4 개의 숫자가 나온다. 신호의 시작을 의미한다.)
39 167 240 169 134 398 336 476 
39 282 
39 163 
39 164 
39 372 
39 283 
39 162 442 600   (위에서 설명한 끝신호 3 개의 숫자가 등장하고 그 뒤에 600 정도의 수가 등장.)
39 1094 637 493  (다시 첫머리 4 개의 숫자 등장. 이하의 부분을 바로 위의 패턴과 비교해보라. 반복되고있다.)
39 167 240 169 135 395 339 475    
39 284 
39 162 
39 163 
39 372 
39 284 
39 161 442   (신호의 끝을 나타내는 3 개의 신호 등장.)
        

이상은 필자의 리눅스 노트북에서 수신한 값이다. 분석해보자.

make 신호 숫자열은 한번 나온다. break 숫자열은 600 을 기준으로 한번 반복, 즉 두번 나온다. make 숫자열이든 break 숫자열이든 각 숫자열들의 합은 약 6331 가량이 된다. 51 개의 키를 모두 점검해보면 가장 짧은 숫자열은 17 개이고 가장 긴 숫자열은 35 개이다. 또한 숫자들의 갯수도 모두 홀수개다.

같은 키도 누를때마다 수치가 약간씩은 다르다. 오차가 있다는 이야긴데 그래서 코드변환부분을 작성할 때 약간은 주의해야 한다. 각 숫자들의 오차를 어디까지 봐줄것이냐가 문제인데 반복실험을 통해 평균값을 취하도록 한다.

위의 특성들을 이용하면 간단히 프로그래밍 할 수 있다. 총 103 개의 서로 다른 적외선 신호를 미리 표로 만들어놓은 후 신호가 수신되면 표와 맞는 것을 검색해서 키 동작을 확인하면 된다.

다음은 자우루스용 팜 무선 키보드 드라이버 소스다. C++ 이고 Qtopia 용이다. http//www.geocities.jp/bakkeo2004/source.tar.gz

여기까지 신호를 해석하는 예를 보였다. 문제는 수신시스템에 따라 수치가 달라진다는 점이다. 일례로, Yopy yp3700 PDA 시스템에서는 전혀 엉뚱한 수치들이 입력되었고 불행히도 종료코드에 일관성이 없었다. make 신호는 1번, break 신호는 2 번이라는 반복패턴만이 유사할 뿐이었다. 왜 그렇게 되는지 이유는 모르겠지만 어쨌든 특정수치를 기준으로 하드코딩해서 프로그램을 짜버리면 다른 시스템에서는 전혀 사용할수 없게 된다.

팜 무선 키보드 드라이버 프로그래밍

만일 PWK 가 표준 키보드 처럼 101 개의 키를 가지고 있고 각각의 키가 자신만의 신호를 발생시키는 거였다면, 적외선 신호열 하나에 스캔(키)코드 하나씩 일대일로 대응하게 되므로 프로그래밍이 간단했을 것이다. 하지만, PWK 는 51 개의 키만을 가지고 있다. 나머지 50 개 표준 키는 PWK 특유의 좌우 FN 키와 다른 키와의 조합으로 입력한다. 필자의 드라이버를 다른 무선 키보드 모델에 그대로 쓸수 없는 이유도 바로 여기에 있다.

예를 들어 설명해보자. 표준 101 키보드에는 1 이라는 키가 있지만 팜 키보드에는 일반 키보드의 숫자키가 없다. 그래서 숫자 1 을 누르려면 왼쪽 FN 키를 누른채 영문키 Q 를 눌러야 한다. 드라이버는 이 LFN-Q 조합으로 발생한 신호열 숫자들을 해석해서, LFN 키가 눌리고 Q 키가 눌리고 Q 키가 떼여졌고 LFN 키가 떼여졌음을 알아낸 후, 대응되는 표준 101 키보드의 키 1 의 스캔(키)코드들( 1 키가 눌리고 1 키가 떼여진 것이므로 두개의 스캔(키)코드 열이다)을 커널내의 키보드의 입력 버퍼 또는 XTestFakeKeyEvent() 함수에 넣어주면 된다.

쉬프트 키나 컨트롤 키와 다른 키와의 조합등은 표준 101 키보드에서도 일어나는 일이므로 리눅스의 자체 키보드 드라이버가 처리하게 된다. 그러므로 드라이버는 쉬프트나 알트, 컨트롤 키의 조합은 신경쓰지 않아도 된다. 오직 팜 특유의 키인 LFN, RFN 키만 인지하도록 작성하면 된다.

PWK 의 CMD 키를 표준 101 키보드의 ESC 로 취급하기로 약속한다면, 이제 표준 101 키들 중에서 이 두 FN 키를 통해야 입력이 되는 키들을 파악한 후, 이들에 대해서는 FN 키의 눌림여부를 참조해 스캔(키)코드로 변환시킨다.

필자의 드라이버가 아직 해결못한 문제는 팜 무선 키보드를 눌러 시그널을 발생시킨 경우다. 이때, 키입력을 받던 응용프로그램의 터미널상태가 망가져 버리게 되는데 아직 마땅한 해결책을 아직 찾지 못했다. 미봉책으로서 모든 시그널을 봉쇄시켜서 ctrl-c 등과 같은 키입력에 의한 시그널을 무시하도록 프로그래밍했다. 그 결과 다소 불편하지만 kill -9 류의 프로세스 제어명령을 써야만 프로그램을 종료시킬수 있다.

데이터 파일

하나의 팜 무선 키보드에 대해 수신 시스템마다 입력되는 신호수치가 다르다는 것은 결국 각 시스템마다 시스템에 맞는 별도의 데이터파일을 가져야 한다는 결론이 된다. 완전히 같은 모델의 두 시스템이라면 아마도 데이터 파일도 호환되겠지만 그마저 장담할 수는 없다.

필자의 드라이버들은 데이터파일로서 /etc/pwkrc 라는 파일을 읽어오도록 작성되었다. 신호수치가 수신 시스템마다 다를 터이므로 키보드 사용자가 적외선키보드를 사용하기 전에 작성해두어야 한다. 위에서 설명한 대로 설명대로 mode2 프로그램으로 직접 수치를 받아 텍스트편집기로 편집하는게 제일 정확하겠지만 번거로운 일이다.

이 데이터 파일을 보다 쉽게 얻고싶다면 irdatagen 과 keycodegen.sh 라는 프로그램을 이용할 수 있다. 그러나 그 출력 수치들을 전적으로 믿어서는 곤란하며 오차가 너무 많이 나오는 경우는 다시 테스트해야 한다. 디폴트로 80 정도의 오차를 주었다. 대략 50 이상의 오차가 나오면 다시 테스트할 것을 권한다. 아쉬운대로 도움은 될것이다. irdatagen 은 각 키의 적외선 신호를 채집하고, keycodegen.sh 는 여기에 Xwindow 키매핑을 읽어 더해 완전한 pwkrc 파일을 완성시키게 된다. 따라서 pwk4cns 드라이버를 쓴다면 keycodegen.sh 는 필요없다. 정확한 시그널 값을 얻는 가장 편리한 방법은 irdatagen 에 -t 옵션을 주어 채록한 신호값을 모두 파일로 받아낸 후 적당한 스프레드쉬트 프로그램을 써서 오차가 큰 신호들을 솎아내는 것이다.

만일 일부 키는 동작하고 일부 키는 동작하지 않는다면 동작하지 않는 키에 대한 데이터의 오차가 심하기 때문일 공산이 크다. 이때는 그 키에 대한 테스트만 다시 한다. 이처럼 키의 신호데이터만 수정하고자 할 때는 keycodegen.sh 는 필요없고 irdatagen 만 실행시키면 된다.

유의사항

물음표(Question Mark)의 입력

특이하게도 팜 무선 키보드에서는 물음표가 슬래쉬키가 아닌 UARROW 키위에 배치되어있다. 최종적인 키해석은 리눅스 시스템이 담당하기 때문에 팜 무선 키보드를 통해 응용프로그램에 물음표키를 입력하고 싶다면 자판상의 물음표키 대신 SHIFT-SLASH 키를 눌러야 한다.

pwkxwin 드라이버를 사용하는 경우 이 문제는 다음 명령을 입력하면 간단히 해결된다.

      xmodmap -e "keysym 98 = Up question"
            

여기서 98 은 Up 키의 키코드값으로 시스템마다 다르다. Up 키의 값이 98 이 아니거나 Up 키의 쉬프트 상태에 이미 다른 키가 배치되었을 가능성이 있으므로 명령을 내리기 전에 xmodmap -pk 명령으로 미리 Up 에 할당된 값이 무엇인지 반드시 확인해야 한다. xmodmap 명령의 정확한 사용법은 맨페이지를 참고하라.

pwkcns 프로그램을 사용한다면 쉬프트 상태까지 인식하도록 다시 프로그래밍하든지 아니면 커널이 참조하는 키 매핑 테이블을 수정하는 수밖에 없을 듯 하다.

다른 프로그램과의 충돌

당연한 이야기지만 적외선을 통한 파일 교환에 사용하는 irda.o 모듈과 lirc_sir.o 모듈은 동시에 사용할 수 없다.

기타

lirc 홈페이지에는 lirc 드라이버 사용시 시스템 시간이 조금씩 느려질수 있다고 되어있다.

고마운 분들과 앞으로의 개선점

질문에 친절히 답해주신 Takeo Tojo 씨에 감사한다. kbde 프로젝트의 Resnick 씨와 LIRC 프로젝트의 모든 분들께 감사한다. 프로그램의 버그나 개선점은 http://kldp.net/projects/irkbd/ 의 게시판으로 보내주시면 참고하겠다. 그러나 단시일내의 수정을 기대해선 곤란하다.

kldp.net 에 일단 CVS 개발공간을 마련해봤는데 제대로 운영할수 있을지 모르겠다. 이제 겨우 CVS 관리법을 익히는 중이다. 혹시 무선 키보드와 관련된 개발공간이 필요한 분은 메시지를 남기시면 CVS 에 개발자 계정을 드리겠다. 익명 CVS 도 가능하니 굳이 개발자로 가입하지 않아도 개발버전 소스들을 제한없이 받아갈 수 있다. 다른 무선키보드들에 대한 드라이버들도 등장하기를 기대한다.