mpx on serial port

2009. 5. 31. 04:22 from 컴퓨터/Linux
멀티포인트 프로젝트를 시작한지 벌써 두달이..

다시 되새겨보면, 임베디드 보드에서 멀티 좌표 정보를 보내주고, USB를 통해 리눅스 디바이스 드라이버를 만드는 것이 최종 목적이다.
하지만 현재 임베디드 보드 상에서 멀티 좌표 정보를 보내줄 수 있는 형편이 아니다. 문제로는 보드 상에서 영상처리를 위해 제공되는 라이브러리나 드라이버 등을 고려해서 제한적인 웹캠만 가능하기 때문이다... ln2440의 r1.4 lcd를 이용해서 임베디드 리눅스를 탑재해서 하려고 했으나, 결국 해당 lcd에 대한 리눅스 디바이스 드라이버가 존재하지 않아서 포기! (제조사에서 제공을 안해줌).
그리고, smdk2440 보드에서 임베디드 리눅스를 포팅하고 하고 있는데, 웹캠 드라이버가 적재되었지만, 해당 qt 버전과 gcc 컴파일러 버전이 너무 낮아서 현재 설치된 서버용 리눅스에서 가동이 안된다는 점.. 아무튼 어려움이 많았다.

그런 상황에서 일단, ln2440 보드에 winCE를 탑재하고나서 로지텍Pro5000 웹캠을 기다리는 중이다... 일단은 winCE에서 lcd에 터치를 하면, 그 좌표 정보를 서버용 리눅스에 전송하게 하였고(강세욱 담당), 전송받은 데이터를 리눅스 드라이버단에서 처리하여 터치스크린 이벤트로 전달하여 mpx기반의 X-window에서 두개 이상의 좌표로 인식하게 하는 것으로 마무리를 지었다. 영상처리를 추가해야 진짜 멀티 포인트인데...

암튼 현 상황은 아래와 같다.



뭐니뭐니해도 임베디드 보드에서 보내는 시리얼 데이터를 가동되는 리눅스 상에서 인터럽트로 처리하는 것이 중요하다. 물론, 터치 스크린 드라이버는 기존 리눅스에 있는 시리얼 기반의 터치 스크린 드라이버를 참조해서, 최대한 비슷하게 구현하였다. (0x80의 의미는 몇년이 지나도 잊혀지지 않을 만큼 나에게 충격을 주었다.. 시리얼 기반이라 0x00이 전송이 불가능하다는 거.. 이걸 어찌 알고 0x80으로 미리 선수를 썼는지..암튼.. 존경스러운 전세계 해커들..)

실행 방법을 까먹을 듯하여 정리해본다.

1) 터치 스크린용 이벤트 드라이버를 생성하는 시리얼 디바이스 드라이버 적재

# insmod uv_mtd.ko
# ./inputattach --uv_mtd /dev/ttyS0 &
# dmesg
May 31 11:20:22 mola_server uv_mtd_init
May 31 11:20:27 mola_server serio: Serial port ttyS0
May 31 11:20:27 mola_server uv_mtd_connect
May 31 11:20:27 mola_server uv_mtd[0] ttyS0/serio0/input0
May 31 11:20:27 mola_server uv_mtd[1] ttyS0/serio0/input1
May 31 11:20:27 mola_server input: UV Serial Multi-TouchScreen #1 as /class/input/input8
May 31 11:20:27 mola_server input: UV Serial Multi-TouchScreen #2 as /class/input/input9


2) 임베디드 보드에서 시리얼로 좌표값을 보내는 프로그램 실행 후 터치 테스트

# dmesg
uv_mtd->count = 2
uv_mtd->length = 13
0 input_report_abs(uv_mtd->dev, ABS_X, 543)
0 input_report_abs(uv_mtd->dev, ABS_Y, 176)
0 input_report_key(uv_mtd->dev, BTN_TOUCH, 0)
1 input_report_abs(uv_mtd->dev, ABS_X, 553)
1 input_report_abs(uv_mtd->dev, ABS_Y, 176)
1 input_report_key(uv_mtd->dev, BTN_TOUCH, 0)

3) X-server 가동

ssh1# ./start_xserver
ssh2# ./start_xclient
ssh3# ./start_mpwm
ssh4# xterm &
ssh4# xinput --list --short
"Virtual core pointer"  id=0    [XPointer]
"Virtual core keyboard" id=1    [XKeyboard]
"Virtual core Xtst pointer"     id=2    [XExtensionPointer]
"Virtual core Xtst keyboard"    id=3    [XExtensionKeyboard]
"Mouse0"        id=4    [XExtensionPointer]
"Mouse1"        id=5    [XExtensionPointer]
"Keyboard0"     id=6    [XExtensionKeyboard]
"<default pointer>"     id=7    [XExtensionPointer]
# xinput --create-master "foobar1"
# xinput --reattach "Mouse0" "foobar1 pointer"
# xinput --create-master "foobar2"
# xinput --reattach "Mouse1" "foobar2 pointer"
# xinput --list --short
"Virtual core pointer"  id=0    [XPointer]
"Virtual core keyboard" id=1    [XKeyboard]
"Virtual core Xtst pointer"     id=2    [XExtensionPointer]
"Virtual core Xtst keyboard"    id=3    [XExtensionKeyboard]
"Mouse0"        id=4    [XExtensionPointer]
"Mouse1"        id=5    [XExtensionPointer]
"Keyboard0"     id=6    [XExtensionKeyboard]
"<default pointer>"     id=7    [XExtensionPointer]
"foobar1 pointer"       id=8    [XPointer]
"foobar1 keyboard"      id=9    [XKeyboard]
"foobar1 Xtst pointer"  id=10   [XExtensionPointer]
"foobar1 Xtst keyboard" id=11   [XExtensionKeyboard]
"foobar2 pointer"       id=12   [XPointer]
"foobar2 keyboard"      id=13   [XKeyboard]
"foobar2 Xtst pointer"  id=14   [XExtensionPointer]
"foobar2 Xtst keyboard" id=15   [XExtensionKeyboard]

4) 추가적인 설정 사항 (Xorg.conf)

Section "ServerLayout"
        Identifier     "X.org Configured"
        Screen      0  "Screen0" 0 0
        InputDevice    "Mouse0" "SendCoreEvents"     <- 중요
        InputDevice    "Mouse1" "SendCoreEvents"     <- 중요
        InputDevice    "Keyboard0" "CoreKeyboard"
        Option         "AllowEmptyInput" "off"
        Option         "AutoAddDevices" "off"
EndSection
...........중략..........
Section "InputDevice"
        Identifier  "Mouse0"
        Driver      "evdev"
        Option      "Protocol" "usb"
        Option      "Device" "/dev/input/event6"       <- 위에 적재된 모듈에 의해 생성된 event 파일 #1
        Option      "ZAxisMapping" "4 5"
EndSection
Section "InputDevice"
        Identifier  "Mouse1"
        Driver      "evdev"
        Option      "Protocol" "usb"
        Option      "Device" "/dev/input/event7"       <- 위에 적재된 모듈에 의해 생성된 event 파일 #2
        Option      "ZAxisMapping" "4 5"
EndSection



p.s. 시리얼 디바이스 드라이버를 개인적으로 꼭 정리하고 싶다. 너무나 고생한 걸 생각하면... ㅡ.ㅜ
Posted by wbhacker :