터치 스크린 이상 유무를 확인
터치스크린 라이브러리, Tslib 소개
Tslib 설치
ts_calibrate 프로그램 실행
ts_test 프로그램 실행

 

이번 (주)FALINUX에서 MIPS core 를 사용하는 EZ-AU1200 제품이 나왔죠. 지금껏 ARM core 제품만 사용하다가 MIPS core 제품이라서, 판매되기 전부터 관심을 가졌던 제품입니다. 제가 알기로는 아이스테이션 제품에 MIPS core를 사용한다고 하죠? MIPS core는 메모리를 억세스가 매우 빠르기 때문에 특히 그래픽이나 멀티미디어에 적합하다고 합니다.

 

그래서 EZ-AU1200을 사용해 보면서 QT와 같은 그래픽 얘기를 떼 놓을 수 없겠죠. 거기다가 EZ-AU1200 SET-A 제품에는 터치 기능이 있는 EZ-LCD-V2가 합쳐져 있기 때ㅣ문에 QT 뿐만 아니라 터치 스크린을 이용하는 방법을 학습하면서 정리하여 그 방법을 소개하려 합니다.

 

즉, 아래의 내용을 앞으로 몇 번이 될지 모르겠습니다만 정리하여 올리겠습니다.

  1. 터치 스크린을 사용하는 방법과
  2. 터치 스크린을 이용할 수 있도록 QT 라이브러리를 설치하고
  3. QT 프로그램을 실행하는 방법

터치 스크린 이상 유무를 확인

우선 정신 건강을 위해 터치 스크린 부품에 이상이 있는지부터 확인해 보겠습니다. 고생고생해서 라이브러리를 설치하고 프로그램을 작성했는데, 결국 부품이나 제품 이상으로 안되는 경우도 있습니다. 혈압 올리는 경우를 줄이기 위해서라도 먼저 제품에 이상이 없는지 확인하는 것이 좋습니다. ^^

 

먼전 터치 스크린은 USB로 연결되는 키보드와 마우스처럼 입력 장치의 일종입니다. 그러므로 먼저 이 입력장치가 시스템의 어디와 연결되어 있는지 확인해야 합니다. 시스템과 하드웨어적으로 연결된 모습이 아니라 시스템이 터치 스크린 장치를 어떻게 인식하고 있는지를 확인한다는 말씀이 되겠습니다.

 

주의!! 터치 스크린을 사용하기 전에 터치 스크린이 /dev/input 에 어떤 장치명으로 연결되었는지 반드시 확인해야 합니다. 왜냐하면 EZ-AU1200이나 EZ-S3C2440과 같이 USB 포트가 있고, 이 포트를 통해 키보드나 마우스와 같이 다른 입력장치가 연결되면, 장치명이 변경될 수 있기 때문입니다.

 

자, "주의!!"에서도 말씀을 드렸지만 터치 스크린 입력 장치가 어떤 장치명으로 등록되어 있는지부터 확인해 보겠습니다. 먼저 USB 포트에 다른 입력장치를 제거하고 오로지 터치 스크린만 연결된 상태에서 입력 장치를 확인해 보겠습니다.

]$ cat /proc/bus/input/devices   
I: Bus=0013 Vendor=fa00 Product=0000 Version=0100
N: Name="wm9712 TouchScreen 0.30"
P: Phys=
S: Sysfs=/class/input/input0
H: Handlers=mouse0 event0 evbug 
B: EV=b
B: KEY=400 0 0 0 0 0 0 0 0 0 0
B: ABS=1000003

이름에 TouchScreen으로 되어 있고, 이벤트 핸들러에는 event0 으로 되어 있습니다. 이번에는 키보드를 USB 포트에 연결해 보겠습니다.

]$ cat /proc/bus/input/devices 
I: Bus=0003 Vendor=05af Product=0802 Version=0110
N: Name="  USB Keyboard"
P: Phys=usb-au1xxx-1/input0
S: Sysfs=/class/input/input0
H: Handlers=kbd event0 evbug 
B: EV=120003
B: KEY=10000 7 ff800000 7ff febeffdf f3cfffff ffffffff fffffffe
B: LED=7

I: Bus=0003 Vendor=05af Product=0802 Version=0110
N: Name="  USB Keyboard"
P: Phys=usb-au1xxx-1/input1
S: Sysfs=/class/input/input1
H: Handlers=kbd event1 evbug 
B: EV=3
B: KEY=3878 d801d101 1e0000 0 0 0

I: Bus=0013 Vendor=fa00 Product=0000 Version=0100
N: Name="wm9712 TouchScreen 0.30"
P: Phys=
S: Sysfs=/class/input/input2
H: Handlers=mouse0 event2 evbug 
B: EV=b
B: KEY=400 0 0 0 0 0 0 0 0 0 0
B: ABS=1000003

]$

이전과 달리 키보드 정보가 출력되며, event0 이었던 터치 스크린의 핸들러가 event2로 변경되었습니다. 이번에는 마우스도 USB포트에 연결해 보겠습니다.

]$ cat /proc/bus/input/devices 
I: Bus=0003 Vendor=05af Product=0802 Version=0110
N: Name="  USB Keyboard"
P: Phys=usb-au1xxx-1/input0
S: Sysfs=/class/input/input0
H: Handlers=kbd event0 evbug 
B: EV=120003
B: KEY=10000 7 ff800000 7ff febeffdf f3cfffff ffffffff fffffffe
B: LED=7

I: Bus=0003 Vendor=05af Product=0802 Version=0110
N: Name="  USB Keyboard"
P: Phys=usb-au1xxx-1/input1
S: Sysfs=/class/input/input1
H: Handlers=kbd event1 evbug 
B: EV=3
B: KEY=3878 d801d101 1e0000 0 0 0

I: Bus=0003 Vendor=0458 Product=0007 Version=0110
N: Name="KYE USB MOUSE"
P: Phys=usb-au1xxx-2/input0
S: Sysfs=/class/input/input2
H: Handlers=mouse0 event2 evbug 
B: EV=7
B: KEY=70000 0 0 0 0 0 0 0 0
B: REL=103

I: Bus=0013 Vendor=fa00 Product=0000 Version=0100
N: Name="wm9712 TouchScreen 0.30"
P: Phys=
S: Sysfs=/class/input/input3
H: Handlers=mouse1 event3 evbug 
B: EV=b
B: KEY=400 0 0 0 0 0 0 0 0 0 0
B: ABS=1000003

]$ 

이전과는 달리 터치스크린의 핸들러가 event0에서 event3 로 변경되었죠. 이와같이 외부 입력장치의 존재 여부에 따라 터치 스크린의 장치를 제어하는 핸들러가 변경되므로 유의해햐 합니다.

터치 스크린을 제어하는 핸들러 이름을 알았으니 hexdum 로 간단히 터치 스크린의 작동 여부를 확인해 보겠습니다.

]$ hexdump /dev/input/event3

             // 이후로 스크린을 여기저기 눌러 보세요.
             // 아래와 같이 HEX 값이 출력된다면 정상입니다.

0000000 44ea 386d bcef 0006 0003 0000 089f 0000
0000010 44ea 386d bcf8 0006 0003 0001 0697 0000
0000020 44ea 386d bcfc 0006 0001 014a 0001 0000
0000030 44ea 386d bcfe 0006 0003 0018 0001 0000
0000040 44ea 386d bd00 0006 0000 0000 0000 0000
0000050 44ea 386d 438d 0008 0003 0000 07e5 0000
0000060 44ea 386d 4397 0008 0003 0001 0683 0000
0000070 44ea 386d 439c 0008 0000 0000 0000 0000
0000080 44ea 386d c3fe 0009 0001 014a 0000 0000
0000090 44ea 386d c40a 0009 0003 0018 0000 0000
00000a0 44ea 386d c40b 0009 0000 0000 0000 0000
00000b0 44eb 386d 5454 0000 0003 0000 08d0 0000
00000c0 44eb 386d 545e 0000 0003 0001 03b1 0000
00000d0 44eb 386d 5462 0000 0001 014a 0001 0000
                          :

터치스크린 라이브러리, Tslib 소개

이번 시간은 그 첫 번째로 터치 스크린에 대한 말씀을 올리겠습니다. 사실 저는 이전까지 터치 스크린을 사용해 본적이 없습니다. 이번 EZ-AU1200 SET-A 제품 덕분에 사용해 보게 되었습니다만, 처음 접하는 것이라 난감했습니다. 공개된 예제 프로그램을 이용하여 만들면 된다고 하는데, 이게 어디 터치 스크린만 그런가요? 리눅스 프로그램은 대부분 이렇게 일이 진행되더군요. ^^

그러나 다행이 터치스크린을 쉽게 사용할 수 있도록 해주는 Tslib 라는 터치 스크린을 위한 라이브러리가 있다는 것을 알게 되었습니다.

 

박진호팀장님께 감사드립니다. ^^ tslib 설치와 tslib에 맞추어 qt를 설치하는 방법을 (주)FALINUX의 개발 팀장으로 계시는 박진호팀장님께서 모두 알려 주셨습니다. 이번 글도 박진호 팀장님께서 꼼꼼이 정리하신 노트에 따라 "따라하기" 식으로 작업해 보고 확인한 것을 정리한 것 뿐입니다. 이 자리를 빌어 귀한 내용을 알려 주신 박진호팀장님께 감사드립니다. ^^

 

이 라이브러리에는 터치의 좌표를 보상할 수 있는 값을 구해 주는 프로그램까지 준비되어 있습니다. 왜, 터치 기능이 있는 PDA나 핸드폰을 사게되면 제일 먼저 4 귀퉁이를 찔러되는(?) 작업부터하지 않습니까? 말씀을 들어보니 아무리 똑 같은 회사에, 똑 같은 부품의 터치 LCD를 사용한다고 해도, 만들어진 제품마다 터치 좌표와 인식되는 좌표가 다르답니다.

이래서 먼저 터치 위치와 프로그램이 인식되는 화면 좌표와 가급적 일치시켜 주는 보정작업이 필요한데, Tslib에서 이 기능을 제공한다는 얘기가 되겠습니다. 즉, 이 프로그램으로 화면 4 귀퉁이와 화면 가운데를 터치해 주면 터치 위치와 화면 좌표에 대한 보정 값이 생성되고, 이후로 이 보정 값에 의해 라이브러리는 자동으로 좌표값을 보정하여 프로그램에 제공됩니다. 좋죠? ^^

Tslib 설치

제 환경은 아래와 같습니다. EZ-AU1200이 MIPS core 제품이라서 크로스 컴파일러뿐만 아니라 QT도 MIPS core에 맞추어 설치하겠습니다.

  • EZ 보드 : EZ-AU1200-SET-A
  • 리 눅 스: CentOS 5.1
  • gcc 버전:
    • 네이티브 컴파일러: gcc (GCC) 4.1.2 20070626 (Red Hat 4.1.2-14)
    • 크 로 스 컴파일러: mipsel-linux-gcc (GCC) 3.4.4

설치 위치

Tslib 뿐만 아니라 앞으로 QT를 설치해야 하기 때문에 아래와 같이 디렉토리를 구성하여 설치하겠습니다.

 

설치 내용 설치 위치 설명
X11을 위한 QT /qt4/qt-x11 X11 용으로 컴파일된 QT 4
MIPS core를 위한 QT /qt4/qt-mips MIPS core 용으로 컴파일된 QT4
MIPS core를 위한 tslib /qt4/tslib-mips MIPS core 용으로 컴파일된 Tslib

 

X11을 위한 QT 설치 방법은 여기서 소개하지 않겠습니다. 대신에 "QT4 설치하기"의 내용을 참고하시기 바랍니다.

 

참고 사항 본 설명서는 타겟보드에 tslib와 qt 라이브러리 뿐만 아니라 예제 파일 모두 복사해 놓고 실행하는 것을 목저으로 하고 있으므로 타겟보드를 램디스크 모드에서 반드시 YAFFS 모드로 변경하십시오. YAFFS 모드로 변경하는 방법은 "EZ-Board의 램 디스크 모드와 YAFFS 모드 변경하기" 글을 참고하여 주십시오.

 

Tslib 내려 받기 및 설치

 

임시 디렉토리인 /tmp로 이동하고, 임시 디렉토리에서 tslib를 내려 받겠습니다.

]# cd /tmp
]# svn co svn://svn.berlios.de/tslib/trunk/tslib tslib   <-- Tslib 를 내려 받습니다.
A    tslib/m4
A    tslib/m4/external
A    tslib/m4/external/PLACEHOLDER
A    tslib/m4/internal
A    tslib/etc/.cvsignore

...중략...

A    tslib/autogen.sh
A    tslib/NEWS
A    tslib/.cvsignore
체크아웃된 리비전 52.
]# 

설치할 tslib 환경을 설정합니다. 저도 정확한 이유와 내용을 몰라서 경험상으로 적습니다만, QT가 실행될 때 tslib를 찾는 디레토리 위치가 /usr/lib이라서 prefix 의 내용을 /usr로 했습니다. QT 뿐만 아니라 다른 라이브러리라도 쉽게 찾는 위치가 /usr/lib 라서 /usr 로 설정한 것으로 이해하고 있습니다.

]# cd tslib
]# ./autogen.sh
]# ./configure --prefix=/usr --enable-inputapi --enable-shared --disable-h3600 --disable-corgi
   --disable-collie --enable-input --enable-mk712 --disable-arctic2 --disable-ucb1x00
   --build=i386-linux --host=mipsel-linux

위 configure 행을 복사하기 힘드시죠. 아래의 행을 이용하십시오.

 

./configure --prefix=/usr --enable-inputapi --enable-shared --disable-h3600 --disable-corgi --disable-collie --enable-input --enable-mk712 --disable-arctic2 --disable-ucb1x00 --build=i386-linux --host=mipsel-linux

 

소스 코드를 수정할 내용이 있습니다. 수정하는 내용은 정확히 모릅니다. "따라하기" 식으로 작성하다 보니, 또한 선배들이 경험한 달콤한 과일만 얻다 보니 이유를 모릅니다만 내용이 확인하는 대로 내용을 첨부하겠습니다.

config.h 에서 181행의 #define malloc rpl_malloc 내용을 주석으로 처리합니다.

]# vi config.h
... 중략 ... 180 /* Define to rpl_malloc if the replacement function should be used. */ 181 // #define malloc rpl_malloc --> 주석 처리 합니다. 182 183 /* Define to `unsigned' if does not define. */ 184 /* #undef size_t */

plugins/input-raw.c 내용에서 65행에서 "&& (absbit & (1 << ABS_PRESSURE))" 부분을 삭제합니다.

]# vi plugins/input-raw.c

              ... 중략 ...
              
변경 전: 65   (absbit & (1 << ABS_Y)) && (absbit & (1 << ABS_PRESSURE)))) {
변경 후: 65   (absbit & (1 << ABS_Y)) )) {               

이제 컴파일 합니다.

]# make
make  all-recursive
make[1]: Entering directory `/tmp/temp/qt4/tslib'
Making all in etc
make[2]: Entering directory `/tmp/temp/qt4/tslib/etc'
make[2]: `all'를 위해 할 일이 없습니다

... 중략 ...

x16.o  ../src/.libs/libts.so -ldl 
creating ts_harvest
make[2]: Leaving directory `/tmp/temp/qt4/tslib/tests'
make[2]: Entering directory `/tmp/temp/qt4/tslib'
make[2]: `all-am'를 위해 할 일이 없습니다
make[2]: Leaving directory `/tmp/temp/qt4/tslib'
make[1]: Leaving directory `/tmp/temp/qt4/tslib'
]#

/qt4/tslib-mips 디렉토리에 tslib 를 설치하겠습니다.

]# make prefix=/qt4/tslib-mips install
Making install in etc
make[1]: Entering directory `/tmp/temp/qt4/tslib/etc'
make[2]: Entering directory `/tmp/temp/qt4/tslib/etc'
test -z "/qt4/tslib-mips/etc" || mkdir -p -- "/qt4/tslib-mips/etc"
 /usr/bin/install -c -m 644 'ts.conf' '/qt4/tslib-mips/etc/ts.conf'
make[2]: `install-data-am'를 위해 할 일이 없습니다
... 중략 ...

make[2]: Entering directory `/tmp/temp/qt4/tslib'
make[2]: `install-exec-am'를 위해 할 일이 없습니다
test -z "/qt4/tslib-mips/lib/pkgconfig" || mkdir -p -- "/qt4/tslib-mips/lib/pkgconfig"
 /usr/bin/install -c -m 644 'tslib-0.0.pc' '/qt4/tslib-mips/lib/pkgconfig/tslib-0.0.pc'
make[2]: Leaving directory `/tmp/temp/qt4/tslib'
make[1]: Leaving directory `/tmp/temp/qt4/tslib'
]#

이렇게 작업 후에는 자동으로 /qt4/tslib-mips 디렉토리가 생성되며 tslib 파일이 설치됩니다.

]# cd /qt4/tslib-mips/
]# ls -al
합계 24
drwxr-xr-x 6 root root 4096  5월 20 20:02 .
drwxr-xr-x 3 root root 4096  5월 20 20:02 ..
drwxr-xr-x 2 root root 4096  5월 20 20:02 bin
drwxr-xr-x 2 root root 4096  5월 20 20:02 etc
drwxr-xr-x 2 root root 4096  5월 20 20:02 include
drwxr-xr-x 4 root root 4096  5월 20 20:02 lib
]# 

이제 tslib의 환경 파일만 설정하면 작업이 완료됩니다.

]# vi /qt4/tslib-mips/etc/ts.conf
# Uncomment if you wish to use the linux input layer event interface
변경 전: # module_raw input   --> 주석문을 만드는 # 을 없앱니다. 아래와 같이

변경 후: module_raw input  

앞서 터치스크린의 장치 핸들러가 주위 입력 장치의 유무에 따라서 이름이 변경되는 것을 말씀드렸습니다. 이렇게 변경되는 내용이나 필요한 내용을 Tslib도 알아야 하므로 환경변수를 미리 준비해 주어야 합니다. 이 환경변수는 보드가 재 부팅될 때 마다 설정해 주어야 하므로 아래와 같이 파일로 만들어 두는 것이 편리합니다.

]$ vi /qt4/tslib-mips/tslib.sh                 <-- tslib-mips 디렉토리에 환경파일을 생성합니다.
#!/bin/bash
export TSLIB_TSDEVICE=/dev/input/event3        <-- 터치의 이벤트 핸들러 이름을 지정했습니다.
export TSLIB_CONFFILE=/qt4/tslib-mips/etc/ts.conf
export TSLIB_CALIBFILE=/etc/pointercal         <-- ts_calibrate로 구해진 좌표 보정 값이 저장되는 파일 이름
export QWS_MOUSE_PROTO=tslib:$TSLIB_TSDEVICE

 

타겟보드로 복사

 

이제 타겟보드로 복사하겠습니다. 타겟보드에서 개발 호스트로 마운트한 후 바로 복사할 수 있습니다만 링크 파일 복사를 위해서도 원본을 압축하고 타겟보드에서 압축을 풀어 복사하는 것이 좋습니다.

]# cd /qt4    <-- tslib 생성 위치인 /qt4로 이동합니다.
]# tar zcvf /tmp/tslib-mips.tar.gz tslib-mips

이후로 타켓보드에서 작업하겠습니다.

제일 먼저 개발 호스트의 nfs 서버와 mount 합니다.

]$ mount -t nfs -o nolock 192.168.10.51:/tmp /mnt/temp

개발 호스트와 마찬가지로 타겟보드에 /qt4를 생성하겠습니다.

]$ mkdir /qt4
]$ cd /qt4

/qt4로 이동하여 개발호스트에서 압축해 두었던 tslib-mips.tar.gz을 압축 해제하겠습니다.

]$ tar zxvf /mnt/temp/tslib-mips.tar.gz

tslib의 라이브러리는 QT와 같은 다른 라이브러리에서 사용될 수 있으므로
/usr/lib 로 이동합니다.

]# mv /qt4/tslib-mips/lib /usr

tslib 를 위한 환경 변수를 등록합니다.

]$ source /qt4/tslib-mips/tslib.sh

ts_calibrate 프로그램 실행

이제 tslib의 bin 디렉토리에 있는 ./ts_calibrate 를 실행하여 터치 스크린의 좌표 위치를 갱신합니다.

]# cd /qt4/tslib-mips/bin
]# ./ts_calibrate 

ts_calbrate를 실행하면 오른쪽 사진에서 처럼 터치 위치와 스크린 위치의 좌표값을 보정할 수 있는 좌표값을 구하기 위해 커서가 출력되는 것을 보실 수 있습니다.

 

커서를 차례로 클릭해 줍니다. 이제 이렇게 클릭해서 얻은 보정 값은 Tslib 를 위해 환경 변수로 지정했던 /etc/pointercal 파일이 저장됩니다.

 

export TSLIB_CALIBFILE=/etc/pointercal

 

앞으로 Tslib 함수를 이용하여 터치 좌표를 읽어 들이면, 이 파일의 내용에 있는 보정 값에 맞추어 계산된 좌표값을 구할 수 있게 됩니다.

ts_test 프로그램 실행

오른쪽 그림은 ts_test 프로그램을 실행하고 터치로 그린 그림입니다. ts_test는 간단한 테스트 프로그램이고 터치된 값을 표준 출력장치로 출력하는 루틴이 있어서 인지 조금 느리게 그려지네요.