[완료] IR과 QT간 키값 전달 방법?
안녕하세요. 질문좀 하나 드리겠습니다. 답변좀 부탁드립니다.
일단, 리눅스를 사용하고 있습니다.
아래와 같은 과정으로, IR을 QT에서 사용하려고 합니다.
[remocon]-->[micom]-->(serial통신)-->[kerenl의 serial driver]--> [QT]
QT에서 /dev/ttyS1을 open 하고, 프로토콜 넣고, 쓰레드로 돌리면,
다른 메인 어플이 돌고 있기 때문에 상당히 느려질것 같다는 판단입니다.
좀더 빠르게 키값을 전달했으면 합니다.
그래서 말인데, 리모콘의 키값을 QT로 올려주려면,
어떤 방법으로 구현하는게 제일 좋을까요?
또 한가지, QT에서는 표준 키보드를 입력으로 받고 있습니다.
키보드를 누르면, 화면에 글씨가 찍힙니다.
이것을 이용하면 QT쪽을 건들이지 않고,
IR의 키값을 디바이스 드라이버를 하나 만들어서 하면 가능할것 같긴 한데...
이렇게 해도 가능할까요?
근데, 일단 시작하려고 보니, 드라이버에서 UART를 OPEN하고,
프로토콜을 정의 하는것 조차 제가 보기엔 좀 어렵군요.-_-;;
여튼 드라이버쪽은 여차여차해서 시리얼 통신이 된다고 했을때,
QT쪽으로 표준으로 값을 넣어주려면 어떤식으로 해야할까요?
방법좀 알려주세요.
결론적으로 위와 같이, 드라이버단에서 QT로의 키값 전달 방법을 알고 싶습니다.
어떤 방법으로 구현하는게 제일 좋을까요?
질문이 난잡합니다. 요점을 추려서 봐주세요~
좋은 하루 되시길 바랍니다.^^
정공법입니다. 커널
정공법입니다.
커널모드 드라이버
http://lxr.linux.no/#linux+v2.6.32/drivers/input/keyboard/stowaway.c
유저모드 데몬
유저모드 데몬은 하는 일 별거 없습니다.
ttyS1 따위 열어서 baudrate 등등 설정해주고 커널의 "Serial port line discipline" 드라이버에 attach 시켜줍니다.
+
노파심에 덧붙입니다.
stowaway 키보드는... 대략 10쯤 전에 지금의 iPhone 만큼 유명했던 iPaq 라는 PDA 용으로 나온 serial 포트 인터페이스를 가진 키보드입니다.
(그 동안 여러가지 변종이 나와서 최종적으론 bluetooth 로까지 진화한 것으로 압니다)
만약 micom 과 초기에 뭔가 주고 받아서 초기화를 시킨다거나 등의 일을 해야 한다면 유저모드 데몬에서 attach 시키기 전에 처리하시고,
micom 이 키코드만 달랑 보내는 것이 아니라 모종의 protocol 을 가지고 있다면 그 해석기는 커널모드 드라이버에 구현해야 합니다.
예제로 든 stowaway 키보드 드라이라면 skbd_interrupt() 함수 안에서 하면 되겠죠.
OTL
bushi 답변 감사드립니다. 하나 더 질문드립니다.
일단, 보드용으로, inputattach 소스를 구하여, cross compile해놓은 상태입니다.
그리고, # ./inputattach --help를 사용해서 실행해보았습니다.
일단 소스내용은 시리얼 통신(인자로 가용한 /dev/ttyS1 등의 장치파일 open하고,
프로토콜 설정하고, read하고.이런 루틴을 여러 장치를 지원하는듯?) 했습니다.
그리고, 이 유틸을 실행해보면,
# ./inputattach --daemon -ipaqkbd /dev/ttyS1
==> inputattach 가 데몬으로 돌면서, /dev/ttyS1에서 값을 읽어올꺼라 생각되는데..
드라이버가 없어서 인지...당연 통신이 안되는군요..^^
그중 bushi 님이 알려주신, 키보드 드라이버를 제가 갖고 있는 커널에서 2.6.15에서
stowaway.c 드라이버를 kernel/driver/input/keyboard/ 에서 찾아봤으나,
없습니다.
그래서 일단 알려주신 링크를 따라 들어갔습니다만,
http://lxr.linux.no/#linux+v2.6.32/drivers/input/keyboard/stowaway.c
관련 소스가 보이지 않습니다. 개인적으로 서치 내공을 좀 쌓을 필요가 있다고 봄...-_-;;
일단, 이것은 관과하고, 스스로 찾아보기로 하고..
그렇다면, 전체적인 내용으로 정리해본다면,
키보드 드라이버를 이용해서 드라이버를 하나 만들고,
그안에 프로토콜이 있다면 넣어주고, 초기화 해주고,
그리고 inputattach 에서 시리얼 설정(baud, 및 기타 시리얼 관련 설정)해주고,
이것을 데몬으로 돌리면,
자동으로 qt에서도 인식할수 있다는 말이 되는건가요?
전체적인 계략도가 서지 않아서 다시 질문드립니다.^^
오늘 날씨가 꾸리꾸리 하네요... 전 이런날 일이 더 잘됩니다.
마음의 안정이랄까? ㅎㅎ
오늘은 무언가 결론을 내야할것 같네요..
모두 행복한 하루 보내시길 바랍니다.^^
공부하자!
더 궁금한 것은 직접
inputattach 가 데몬으로 돌면서 ttyS1 에서 값을 읽어오는 것이 아닙니다.
말씀드렸지만, serio attach 이후엔 커널 모드 드라이버에서 처리됩니다.
inpuattach을 데몬 형식으로 사용하는 이유는,
프로세스 종료시 자동으로 serio detach 가 되고, 더 이상 커널 모드 드라이버에서 키코드를 처리하지 못하게 하기 위해섭니다.
붙박이 입력장치가 아니라 탈착식 입력장치를 사용할 때를 위한 배려죠.
더 궁금한 것은 직접 몸으로 부딪혀보세요.
firefox 추천합니다.
webkit 사용한 브라우저들에선 바로 링크되지 않습니다.
OTL
다른 방법도
다른 방법도 있습니다.
전적으로 유저 모드에서만 처리하는 것이라 반응 속도가 느릴 수 있습니다.
UINPUT 드라이버가 있습니다. "User level driver support" 라 합니다.
커널 드라이버 소스는 drivers/input/misc/uinput.c 입니다.
어플리케이션 예제는 http://www.mail-archive.com/linux-input@vger.kernel.org/msg00063.html
추가적인 커널 드라이버가 필요치 않다는 것이 장점이고,
그럼에도 불구하고 linux input subsystem 이 다룰 수 있는 모든 event 를 유저모드에서 쉽게 만들어 커널 쪽으로 던져줄 수 있다는 더 큰 장점이 있습니다.
쉽게말하면, 이더넷 인터페이스 키보드나 wifi 인터페이스 마우스도 가능합니다.
다만... 유저모드 어플리케이션에 크게 의존하기 때문에 반응 속도가 느립니다.
실은 ... 몇 개월 전에... 키패드가 고장난 기계에 android 를 올려 테스트하느라고... 이 uinput 을 사용했었습니다.
ESC 키가 아쉬워서요.
처음에 설명드린 정공법이나 이 uinput 이나 ... Qt 가 올라가건 Android 가 올라가건 아무 상관없습니다.
평범한 키보드와 똑같습니다.
OTL
bushi 님 답변 감사드립니다.
bushi님 지금 열심히 하고 있답니다..^^
많은 도움주셔서 감사드립니다~
좋은 하루 되세요~
공부하자!
댓글 달기