[시스템 환경]
하드웨어 : 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에 프로그램이 실행된후 터치패드를 눌러보세요.. 터치가 될것입니다. ㅡㅡ;;
저역시 초보이고 많이 부족해서 어려움이 많습니다. 하긴 했지만 완전히 아는것도 아니고요.
직접,간접적으로 도와주신 많은 분들에게 감사할 따름입니다.
글로 쓰니 얼마안되네요..실제로 해보면....ㅜㅜ;;
혹시 빼먹은 부분이 있어도 이해바랍니다... 터치스크린을 하시려는 다른분들에게도 행운이 따르기를 ...ㅜㅜ