[시스템 환경]

하드웨어 : EZ-EP9312보드

OS : Fedora Core3 (커널 버전 : 2.6.9)

Tool Chain과 커널소스는 FALINUX에서 제공하는 것을 사용했습니다.

- GLIBC-2.3.3
- BINUTILS-2.15.91.0.1
- GCC-3.4.3

QT 임베디드 버전 :QTE-3.3.8

 

[참고문서]

FALINUX 2006 세미나 자료

인터넷 검색....;;;

 

[터치스크린 구동 후기]

 제 짧은 지식으로 강좌를 쓰기엔 무리가 있을 거 같고 제가 했던 경험을 토대로 후기 형식으로 글을 써봅니다. ...다소 잘못된 지식을 전달하는 것이 아닌지 걱정되네요 -,-;;

 터치스크린의 종류는 제어선의 가닥수에 따라 나누어집니다.  4 , 5 , 7, 8wire 제어방식이 있습니다.

좀더 자세한 것은 인터넷에 잘 나와 있습니다. ㅡㅡ;;

 

1. 터치스크린 구동

 제가 사용한 EZ-EP9312보드에는 4선방식을 사용하게끔 4핀 컨넥터가 있습니다. 물론 드라이버도 지원이 되구요.. 다 지원해주기 때문에...ㅡㅡ;; 처음 해보는 분만 아니라면 터치스크린을 구동하는것은 어렵지 않게 할 수 있습니다. 단지 커널소스를 컴파일할때 옵션에서 터치스크린을 체크해주기만 하면 됩니다.

 
==== 제공되는 소스에서 터치드라이버의 위치 ===

linux/driver/input/touchscreen/ep93xx_ts.c ,  ep93xx_ts.h


==== 컴파일 옵션설정 ====

]# make menuconfig

Input device support  --->

--- Userland interface

--- Mouse interface

..

<*> Touchscreen interface                   <<<--- 이부분을 체크합니다.

(800) Horizontal screen resolution          <<<--- LCD와 같은 해상도를 맞춰야 될겁니다.

(400) Vertical screen resolution

<*> Event interface                              <<<--- Event 핸들러 드라이버를 사용할경우 체크합니다.

< > Event debugging                                       QT와 같은 application은 이벤트핸들러를 사용하

---                                                                므로 체크합니다.

 

커널 컴파일 후

Ez보드에 컴파일한 zImage를 적재시키고 부팅시킵니다.

리눅스콘솔창에서 터치스크린에 터치를 해봅니다.

~]$

X=1004, Y=500, Z1=512, Z2=3620, InPressure=0x17ce  <<<--- 터치를 하면 이런 디버깅코드가 출력

X=1004, Y=500, Z1=512, Z2=3620, InPressure=0x17ce              될 것입니다. 

..                                                                                  

 

]$hexdump /dev/input/event0                                 <<<--- 이것은 이벤트 핸들러가 연결되었는

X=1005, Y=501, Z1=512, Z2=3620, InPressure=0x17d4      지 확인하는 디버깅코드인듯 합니다....-,-;;

X=1005, Y=501, Z1=512, Z2=3620, InPressure=0x17d4

..

00000000 0502 0000 e36b 0002 0003 0000 068b 0000

..

주의] hexdump 실행후 ctrl+C로 종료하면 위의 터치 디버깅코드는 나오지 않을 것입니다.고장난게 아닙니다. ㅡㅡ;;

 

2. 터치 스크린과 QTE연동

 QTE설치는 장길석님이 올려주신 방법을 참조했습니다. 거기서 터치스크린과 연동을 하기 위한

부분을 추가해서 설치하셔야 QTE에서 터치스크린을 사용할 수 있습니다. 이것만 주의하시면 터치

스크린을 사용할 수 있습니다.  ㅡㅡ;;

 

 먼저 qte를 설치하기 전에 qmouselinuxtp_qws.cpp를 수정해야 합니다. 직접 수정하실 수 정도면 이

글을 안보겠죠? ^^;;  저는 문제를 해결하기 위해 FALINUX Q&A에 질문을 올렸습니다. 장형기팀장님이 수정된 qmouselinuxtp_qws.cpp파일을 올려주셔서 그걸 사용했습니다. ㅡㅡ;; 음.. 개인적으로 주

신건 아니어서 퍼트려도 되는지 모르겠네요.. 저작권은 FALINUX에 있다고 보는게 좋겠네요..ㅡㅡ;;

그냥  제가 질문했던 글에 링크를 거는 걸로 대신하겠습니다.

http://forum.falinux.com/zbxe/?mid=question&page=2&document_srl=409334 

 

]#cd /qt/qte-3.3.8                                                             <<<--- QTE디렉토리로 이동합니다.

]#cp src/embedded/  /home/share/qmouselinuxtp_qws.cpp  

* 수정된 qmouselinuxtp_qws.cpp파일을  /qt/qte-3.3.8/src/embedded/에 복사합니다. 이 파일의 역할은 터치좌표에서 입력된 좌표값을 qte로 올려보내주는 것인듯 합니다. ㅡㅡ;;

 

*** 또 그대로 수정된 파일을 옮겨 쓰시면 아마 좌표가 잘 안맞을 것입니다.. 파일을 복사한 후 이 파일을 열어서 현재 터치패드에 맞게 수정해야 되더군요.. ㅡㅡ;;

]#vi src/embedded/qmouselinuxtp_qws.cpp

여기서 readMouseData() 함수부분을 찾습니다. 이 함수가 좌표값을 읽어오는 데이터입니다. 그럼 아래와 같은 부분이 있을 것입니다. 

252  #if defined(QT_QWS_EZ_EP9312_EVENT)

253

254  unsigned int  xf, yf;

255  input_event_t  ie;

256  QPoint        q;

.

.

.

258  float    tp_min_dx = 640;                   <<<---  X좌표의 최소값

259  float    tp_min_dy = 840;                   <<<---  Y좌표의 최소값

260  float    tp_max_dx  =  3480;               <<<--- X좌표의 최대값

261  float    tp_max_dy  =  3380;               <<<--- Y좌표의 최대값

 

** 아까  터치스크린을 타겟보드에서 터치하면 나오던 디버깅코드를 기억하실지 모르겠지만.. X값과 Y값이 있습니다. 이 값에 최소와 최대값을 터치패드에 직접 찍어서 확인합니다.. 그리고 위의 최소,최

대값범위에 들어가게끔 수정해야 좌표가 제대로 맞을 것입니다.

 

275  swith(ie.type)

276  {

277   case EV_SYN:   if( abs_button == 1)   //터치가 눌리면

278                           { //abs_x_real, abs_y_real은 디바이스에서 올라오는 좌표값입니다.

279                                  if( abs_x_real  < tp_min_dx )  abs_x_real = tp_min_dx; 

280                                  if( abs_x_real  < tp_max_dx )  abs_x_real = tp_min_dx;

281                                  if( abs_y_real  < tp_min_dy )  abs_y_real = tp_min_dy;

282                                  if( abs_y_real  < tp_max_dy )  abs_y_real = tp_min_dy;

283                                

284                                  if( abs_x_real  == abs_y_real)   <<<--- 이부분은 잘 이해가 안가는 부

                                                                                 분이네요.. 같으면 리턴(?)을 하는.ㅡㅡ; 

285                                  {

286                                      handler->mouseChanged(oldmouse, 0);

287                                     //handler->sendFiltered(oldmouse, 0);

288                                     return;

289                                  }

290                                 xf = ((float)abs_x_real - tp_min_dx) / ((tp_max_dx - tp_min_dx) / (float)desk.width());

291                                 yf = ((float)abs_y_real - tp_min_dy) / ((tp_max_dy - tp_min_dy) / (float)desk.height());

** 위의 코드가 캘리브레이션을 해줍니다.. 이렇게 되어 있어서 따로 캘리브레이션 프로그램을 쓸 필요가 없습니다.... ^_^. 좀더 소스에 대해 설명을 써놓으려 했지만 QT는 이제막 시작하고 리눅스초보라....아는코드가 없네요...ㅜㅜ;; 

 

 QTE설치시 컴파일전 컴파일 옵션을 설정합니다. 이 옵션중에 터치스크린을 구동하는 옵션이 있습니다. 이것을 추가해서 옵션설정을 해줍니다.

]# ./configure -embedded arm -system-jpeg -shared -thread -no-cups -no-ipv6 -qvfb -depths 16 -qt-mouse-linuxtp

 

* -qt-mouse-linuxtp 가 터치스크린을 구동하기 위한 옵션입니다. QTE설치에 대한 설명은 장길석님이 자세하게 올리신거 같아서 생략했습니다. 저도 그걸 보고 따라했기 때문에....ㅡㅡ;;

 

3. QTE실행파일을 올려서 터치스크린 테스트

설치한 후  간단한 버튼누르는 예제프로그램 같은것을 구하셔서 테스트해보셔도 되고 그냥 헬로프로그램을 올려보시면 마우스 포인터가 보입니다. 터치하시면 터치하는 곳으로 마우스포인터가 이동될 것입니다.

 

타겟보드에서 사용할 qte환경파일을 작성합니다.

]#cd /nfs

]#vi qte.env

export QTDIR=/app/qt

export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH

export QWS_MOUSE_PROTO=Linuxtp:/dev/input/event0        <<<--- 이부분이 터치를 사용하기

                                                                                      위해 추가되어야 합니다.

* /dev/input/event0 디바이스 파일에서 QT가 터치좌표를 읽어오게 한다는 의미입니다. 터치디바이스드라이버가 왜 아니냐면 제공된 디바이스 드라이버가 이벤트핸들러와 연결되게끔 되어있는듯 합니다.. 저는 EZ_EP9312보드를 쓰고 있다는것에 주의하시길...^^;; 다른보드와 드라이버 설계가 다를수 있을 겁니다. 만일 다르다면 해당 디바이스파일을 연결시켜 줘야 될겁니다.ㅡㅡ;;

 

타겟보드에서

]$mount -t nfs -o nolock 192.168.1.10:/nfs /mnt/nfs   <<<---  nfs로 PC와 연결합니다.

]$source /mnt/nfs/qte.env                                     <<<--- qte 환경파일을 적용시킵니다.

]$/mnt/nfs/button -qws                                         <<<--- qt 실행파일을 실행시킵니다.

Could not read calibration:  /etc/pointercal               <<<--- 이 파일은 QT에서 마우스포인터위치

[800 x 400]                                                            를 잡아주기 위한 것이라고 하는데 터치에서

                                                                           올라오는 좌표에 대한 켈리브레이션을 해놓으

                                                                           면 없어도 됩니다. 저것과 같은 에러메시지는

                                                                           나와도 좌표는 정확하게 잘찍힙니다.ㅡㅡ;;

 

LCD에 프로그램이 실행된후 터치패드를 눌러보세요.. 터치가 될것입니다.  ㅡㅡ;;

 

저역시 초보이고 많이 부족해서 어려움이 많습니다. 하긴 했지만 완전히 아는것도 아니고요.

직접,간접적으로 도와주신 많은 분들에게 감사할 따름입니다. 

 

글로 쓰니 얼마안되네요..실제로 해보면....ㅜㅜ;;

혹시 빼먹은 부분이 있어도 이해바랍니다... 터치스크린을 하시려는 다른분들에게도 행운이 따르기를 ...ㅜㅜ