슬라이드 1 - 임베디드 리눅스 시스템 포럼

Download Report

Transcript 슬라이드 1 - 임베디드 리눅스 시스템 포럼

Qt/Embedded 와 입력 디바이스 드라이
버
에프에이리눅스 장형기 팀장
목차
임베디드 GUI의 소개
Qt 소개
Qt/Embedded 포팅 - I
EZ-X5
• Qt/Embedded 포팅 – II
EZ-EP9312 / EZ-S2410
Qt/Embedded 타겟보드에 올리기
터치스크린의 이해 및 Qt/Embedded 연동
1. 임베디드 GUI의 소개
1.1 Tiny-X
임베디드 시스템을 위한 작은 X-Window server
XFree89 Core 팀 중 Keith Packard에 의해 개발됨
X 서버가 1MB 보다 작은 크기
공개 프로젝트
1.2 Nano-X (Microwindows)
API를 통해서 제어할 수 있는 Client/Server 모델로 구성
Win32/WinCE GDI와 Nano-X API를 지원
공개 프로젝트
1.3 Qt/Embedded
임베디드 리눅스를 위한 QT버전
X-Windows 시스템을 사용하지 않고 프레임버퍼에 직접 접근
PAD 또는 Phone등의 임베디드 제품에 사용된 Qtopia의 기반
상용 솔루션
2. Qt 소개
2.1 Qt ( http://www.trolltech.com )
노르웨이의 Trolltech사가 개발한 제품으로 크로스(cross) 플랫폼을 지원하고, 개
발자에게
그래픽 사용자 인터페이스를 제공하는 C++ 클래스 라이브러리이다.
– C++ 기반
구조는 MFC와 유사하며, 기존의 C 개발에 비해 쉽고, 기능확장이 편리
– 객체 지향적
모듈화와 재사용이 가능하도록 디자인 되었으며, 시그널/슬롯 메커니즘은 진정한 컴포넌트
프로그래밍을 가능하게 한다.
시그널과 슬롯은 독립된 객체간에 대화할 수 있게 연결해 주는 메카니즘이다.
예) QObject::connect ( &quit, SIGNAL(clicked()), &a, SLOT(quit() );
시그널 : 메시지나 이벤트
슬롯 : 처리함수
다양한 플랫폼간 소스 코드 호환
UNIX, Linux, Windows, Mac OS X 등
다양한 언어 지원
16bit 유니코드와 i18n 등의 다양한 언어 지원
풍부한 위젯(Widget) 제공
상용 솔루션
2.2 Qt/Embedded
몇가지 Class 및 Function을 제외하고는 기본적으로 Qt와 동일한 구조를 가진다.
2.3 Qtopia
PDA, 휴대폰 등 모바일 장치들을 위한 어플리케이션 플렛폼으로
QT/Embedded 기반의 윈도우 매니저이다.
2.4 Qt’s Architecture
2.5 Qt 라이센스 정책
Qt는 Dual License를 가지는 형태이다.
Open source Licensing
Qt, Qtopia, Qtopia SDK
Commercial Licensing
Qt, Qtopia, Qtipia SDK, QSA, Teambuilder
3. Qt/Embedded 포팅 - I [ EZ-X5 ]
3.1 작업 환경 및 준비 조건
리눅스 배포판
•
•
•
•
와우리눅스 7.1
와우리눅스 7.3
레드헷 8.0
레드헷 9.0
Toolchain ( 크로스컴파일러 )
• Binutils-2.13.90.0.16
• gcc-3.2.1
• glibc-2.3.1
커널
• linux-2.4.19-x5-v07
•
http://www.falinux.com/zdownload/ez_x5.html
3.2 소스 다운로드
qt-embedded-free-3.3.6.tar.gz
• ftp://ftp.trolltech.com/qt/source/
qt-x11-free-3.3.6.tar.gz
• ftp://ftp.trolltech.com/qt/source/
3.2 uic
Qt/Embedded를 컴파일하기 위해서는 Qt-X11의 uic 파일이 필요하다.
작업 디렉토리 : /project/qt
압축 풀기
[root@jdt qt]# tar -zxvf qt-x11-free-3.3.6.tar.gz
[root@jdt qt]# mv qt-x11-free-3.3.6 qtx-3.3.6
[root@jdt qt]# cd qtx-3.3.6
환경 설정
[root@jdt qtx-3.3.6]# export QTDIR=/project/qt/qtx-3.3.6
[root@jdt qtx-3.3.6]# export PATH=$QTDIR/bin:$PATH
[root@jdt qtx-3.3.6]# export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
[root@jdt qtx-3.3.6]# export MANPATH=$QTDIR/doc/man:$MANPATH
컴파일
[root@jdt qtx-3.3.6]# ./configure -thread -qt-libjpeg -no-xft -qvfb -depths 4,8,16
[root@jdt qtx-3.3.6]# vi Makefile
13
14
all: symlinks src-qmake src-moc sub-src sub-tools # sub-tutorial sub-examples
15
@echo
[root@jdt qtx-3.3.6]# make 또는 /usr/bin/gmake
3.3 Qt/Embedded 설치
작업 디렉토리 : /project/qt
압축 풀기
[root@jdt qt]# tar -zxvf qt-embedded-free-3.3.6.tar.gz
[root@jdt qt]# mv qt-embedded-free-3.3.6 qte-3.3.6
[root@jdt qt]# cd qte-3.3.6
환경 설정
[root@jdt qtx-3.3.6]# export QTDIR=/project/qt/qte-3.3.6
[root@jdt qtx-3.3.6]# export PATH=$QTDIR/bin:$PATH
[root@jdt qtx-3.3.6]# export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
[root@jdt qtx-3.3.6]# export MANPATH=$QTDIR/doc/man:$MANPATH
[root@jdt qtx-3.3.6]# export
uic 파일 복사
[root@jdt qtx-3.3.6]# cp –a /project/qt/qtx-3.3.6/bin/uic /project/qt/qte-3.3.6/bin/
파일 수정
linux-arm-g++ 파일을 linux-armv5l-g++ 이름으로 복사하고, 수정
[root@jdt qte-3.3.6]# cd mkspecs/qws/
[root@jdt qws]# ls
freebsd-generic-g++
qnx6-generic-g++
qnx6-generic-cc
linux-generic-g++ linux-mips-g++
linux-arm-g++
linux-ipaq-g++
solaris-generic-g++
linux-x86-g++
linux-sharp-g++
[root@jdt qws]# cp -a linux-arm-g++ linux-armv5l-g++
[root@jdt qws]# vi linux-armv5l-g++/qmake.conf
10
11
12
...
24
25
26
...
45
46
47
48
...
QMAKE_CC
QMAKE_LEX
= armv5l-linux-gcc
= flex
QMAKE_CXX
QMAKE_CXXFLAGS
= armv5l-linux-g++ -DQT_QWS_EZ_X5
= $$QMAKE_CFLAGS -DQWS -fno-exceptions -fno-rtti
QMAKE_LINK
QMAKE_LINK_SHLIB
QMAKE_LFLAGS
= armv5l-linux-g++
= armv5l-linux-g++
=
qnx4-cc
macx-generic-g++
컴파일
[root@jdt qte-3.3.6]# ./configure -embedded armv5l -shared -depths 16 -thread no-cups -qt-libjpeg -qt-mouse-linuxtp
[root@jdt qtx-3.3.6]# make 또는 /usr/bin/gmake
[root@jdt qte-3.3.6]# ls -al lib/
drwxr-xr-x
drwxr-xr-x
-rw-r--r-drwxr-xr-x
-rw-r--r--rw-r--r--rw-r--r--rw-r--r--rw-r--r--rw-r--r--rw-r--r-lrwxrwxrwx
lrwxrwxrwx
lrwxrwxrwx
-rwxr-xr-x
-rw-r--r--rw-r--r--
3
18
1
2
1
1
1
1
1
1
1
1
1
1
1
1
1
658
658
658
658
root
root
root
root
root
root
root
root
root
root
root
root
root
[root@jdt qte-3.3.6]#
593
593
593
593
root
root
root
root
root
root
root
root
root
root
root
root
root
4096
4096
63
8192
676
592
33800
603
604
679
615
18
18
18
8464251
524
636
Mar
Mar
Sep
Sep
Mar
Mar
Mar
Mar
Mar
Mar
Mar
Mar
Mar
Mar
Mar
Mar
Mar
15
15
2
2
15
15
15
15
15
15
15
15
15
15
15
15
15
22:53
18:34
2005
2005
18:34
18:33
19:42
18:33
18:34
18:33
18:33
22:53
22:53
22:53
22:53
18:33
18:33
.
..
README
fonts
libdesignercore.prl
libeditor.prl
libqassistantclient.a
libqassistantclient.prl
libqnp.prl
libqte-mt.la
libqte-mt.prl
libqte-mt.so -> libqte-mt.so.3.3.6
libqte-mt.so.3 -> libqte-mt.so.3.3.6
libqte-mt.so.3.3 -> libqte-mt.so.3.3.6
libqte-mt.so.3.3.6
libqui.prl
qte-mt.pc
4. Qt/Embedded 포팅 [ EZ-EP9312 / EZ-S2410 ]
4.1 작업 환경 및 준비 조건
리눅스 배포판
• Fedora Core 2
• Fedora Core 3
Toolchain ( 크로스컴파일러 )
• Binutils-2.15.91.0.1
• gcc-3.4.3
• glibc-2.3.3
• http://www.falinux.com/zdownload/toolchain.html
커널
• linux-2.6.11.7-ep9-v02.tar.gz
• http://www.falinux.com/zdownload/ep9312.html
• linux-2.6.8-rc2-s2410-v05.tar
• http://www.falinux.com/zdownload/s2410.html
4.2 uic
Qt/Embedded를 컴파일하기 위해서는 Qt-X11의 uic 파일이 필요하다.
작업 디렉토리 : /project/qt
압축 풀기
[root@jdt qt]# tar -zxvf qt-x11-free-3.3.6.tar.gz
[root@jdt qt]# mv qt-x11-free-3.3.6 qtx-3.3.6
[root@jdt qt]# cd qtx-3.3.6
환경 설정
[root@jdt
[root@jdt
[root@jdt
[root@jdt
qtx-3.3.6]#
qtx-3.3.6]#
qtx-3.3.6]#
qtx-3.3.6]#
export
export
export
export
QTDIR=/project/qt/qtx-3.3.6
PATH=$QTDIR/bin:$PATH
LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
MANPATH=$QTDIR/doc/man:$MANPATH
컴파일
[root@jdt qtx-3.3.6]# ./configure -thread -qt-libjpeg -no-xft -qvfb -depths 4,8,16
[root@jdt qtx-3.3.6]# vi Makefile
13
14
all: symlinks src-qmake src-moc sub-src sub-tools # sub-tutorial sub-examples
15
@echo
[root@jdt qtx-3.3.6]# make 또는 /usr/bin/gmake
4.3 Qt/Embedded 설치
작업 디렉토리 : /project/qt
압축 풀기
[root@arm26 qt]# tar -zxvf qt-embedded-free-3.3.6.tar.gz
[root@arm26 qt]# mv qt-embedded-free-3.3.6 qte-3.3.6
[root@arm26 qt]# cd qte-3.3.6
환경 설정
[root@arm26 qtx-3.3.6]# export QTDIR=/project/qt/qte-3.3.6
[root@arm26 qtx-3.3.6]# export PATH=$QTDIR/bin:$PATH
[root@arm26 qtx-3.3.6]# export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
[root@arm26 qtx-3.3.6]# export MANPATH=$QTDIR/doc/man:$MANPATH
[root@arm26 qtx-3.3.6]# export
uic 파일 복사
[root@arm26 qtx-3.3.6]# cp –a /project/qt/qtx-3.3.6/bin/uic /project/qt/qte-3.3.6/bin/
파일 수정
[root@arm26 qws]# vi mkspecs/qws/linux-arm-g++/qmake.conf
10
11
12
...
24
25
26
...
45
QMAKE_CC
QMAKE_LEX
= arm-linux-gcc
= flex
QMAKE_CXX
QMAKE_CXXFLAGS
= arm-linux-g++ -DQT_QWS_EZ_EP9312 -DQT_QWS_EZ_S2410
= $$QMAKE_CFLAGS -DQWS -fno-exceptions -fno-rtti
컴파일
[root@arm26 qte-3.3.6]# ./configure -embedded arm -shared -depths 16 -thread no-cups -qt-libjpeg -qt-mouse-linuxtp
[root@arm26 qtx-3.3.6]# make 또는 /usr/bin/gmake
[root@arm26 qte-3.3.6]# ls -al lib/
drwxr-xr-x
drwxr-xr-x
-rw-r--r-drwxr-xr-x
-rw-r--r--rw-r--r--rw-r--r--rw-r--r--rw-r--r--rw-r--r--rw-r--r-lrwxrwxrwx
lrwxrwxrwx
lrwxrwxrwx
-rwxr-xr-x
-rw-r--r--rw-r--r--
3
18
1
2
1
1
1
1
1
1
1
1
1
1
1
1
1
658
658
658
658
root
root
root
root
root
root
root
root
root
root
root
root
root
593
593
593
593
root
root
root
root
root
root
root
root
root
root
root
root
root
[root@arm26 qte-3.3.6]#
4096
4096
63
8192
676
592
33800
603
604
679
615
18
18
18
8464251
524
636
Mar
Mar
Sep
Sep
Mar
Mar
Mar
Mar
Mar
Mar
Mar
Mar
Mar
Mar
Mar
Mar
Mar
15
15
2
2
15
15
15
15
15
15
15
15
15
15
15
15
15
22:53
18:34
2005
2005
18:34
18:33
19:42
18:33
18:34
18:33
18:33
22:53
22:53
22:53
22:53
18:33
18:33
.
..
README
fonts
libdesignercore.prl
libeditor.prl
libqassistantclient.a
libqassistantclient.prl
libqnp.prl
libqte-mt.la
libqte-mt.prl
libqte-mt.so -> libqte-mt.so.3.3.6
libqte-mt.so.3 -> libqte-mt.so.3.3.6
libqte-mt.so.3.3 -> libqte-mt.so.3.3.6
libqte-mt.so.3.3.6
libqui.prl
qte-mt.pc
5. Qt/Embedded 타겟보드에 올리기
5.1 nfs를 사용하는 방법
준비 조건
 리눅스 머신과 타겟보드간의 NFS 파일 시스템 환경이 구축되어 있어야 한다.
 작업 디렉토리
/nfs
: 리눅스 머신과 타겟보드간의 공유 디렉토리
/nfs/qt/3.3.6
: 작업 디렉토리
/nfs/qt/3.3.6/lib
: Qt/Embedded 라이브러리 디렉토리
복사
 포팅한 Qt/Embedded 라이브러리를 /nfs/qt/3.3.6/lib 디렉토리로 복사한다.
[root@jdt qte-3.3.6]# cp lib/libqte-mt.so* /nfs/qt/3.3.6/lib/
 폰트 디렉토리로 복사한다.
[root@jdt qte-3.3.6]# cp lib/fonts /nfs/qt/3.3.6/lib/
 예제 파일을 복사한다.
[root@jdt qte-3.3.6]# cp examlpes/hello/hello /nfs/qt/3.3.6/
환경 설정
 타겟보드에서 nfs 마운트를 한다.
[root@ez-x5 /root]$ mount -t nfs -o nolock 192.168.10.xxx:/nfs /mnt/nfs
[root@ez-x5 /root]$ cd /mnt/nfs/qt/3.3.6
 타겟보드에서 Qt/Embedded 라이브러리를 참조하기 위해서는 다음과 같이 환경 설정
이 필요하다.
[root@ez-x5 3.3.6]$ export QTDIR=/mnt/nfs/qt/3.3.6
[root@ez-x5 3.3.6]$ export PATH=$QTDIR/bin:$PATH
[root@ez-x5 3.3.6]$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$QTDIR/lib
[root@ez-x5 3.3.6]$ export QWS_MOUSE_PROTO=linuxtp
실행
 타겟보드에서 응용 프로그램을 실행한다.
[root@ez-x5 3.3.6]$ ./hello -qws
5.2 yaffs를 사용하는 방법
준비 조건
 리눅스 머신과 타겟보드간의 NFS 파일 시스템 환경이 구축되어 있어야 한다.
 작업 디렉토리
/nfs
: 리눅스 머신과 타겟보드간의 공유 디렉토리
/nfs/qt/3.3.6
: 작업 디렉토리
/nfs/qt/3.3.6/lib
: Qt/Embedded 라이브러리 디렉토리
복사
 포팅한 Qt/Embedded 라이브러리를 /nfs/qt/3.3.6/lib 디렉토리로 복사한다.
[root@jdt qte-3.3.6]# cp lib/libqte-mt.so* /nfs/qt/3.3.6/lib/
 폰트 디렉토리로 복사한다.
[root@jdt qte-3.3.6]# cp lib/fonts /nfs/qt/3.3.6/lib/
 예제 파일을 복사한다.
[root@jdt qte-3.3.6]# cp examlpes/hello/hello /nfs/qt/3.3.6/
환경 설정
 타겟보드에서 nfs 마운트를 한다.
[root@ez-x5 /root]$ mount -t nfs -o nolock 192.168.10.xxx:/nfs /mnt/nfs
[root@ez-x5 /root]$ cd /mnt/nfs/qt/3.3.6
 타겟보드로 Qt/Embedded 라이브러리, 폰트, 예제파일을 복사한다.
[root@ez-x5 3.3.6]$ cp -a /mnt/nfs/qt /app/
 타겟보드에서 Qt/Embedded 라이브러리를 참조하기 위해서는 다음과 같이 환경 설정
이 필요하다.
[root@ez-x5 3.3.6]$ export QTDIR=/app/qt/3.3.6
[root@ez-x5 3.3.6]$ export PATH=$QTDIR/bin:$PATH
[root@ez-x5 3.3.6]$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$QTDIR/lib
[root@ez-x5 3.3.6]$ export QWS_MOUSE_PROTO=linuxtp
실행
 타겟보드에서 응용 프로그램을 실행한다.
[root@ez-x5 3.3.6]$ cd
/app/qt/3.3.6
[root@ez-x5 3.3.3]$ ./hello -qws
5.3 root 파일 시스템을 yaffs로 구축하여 사용하는 방법
준비 조건
 리눅스 머신과 타겟보드간의 NFS 파일 시스템 환경이 구축되어 있어야 한다.
 작업 디렉토리
/nfs
: 리눅스 머신과 타겟보드간의 공유 디렉토리
/nfs/qt/3.3.6
: 작업 디렉토리
/nfs/qt/3.3.6/lib
: Qt/Embedded 라이브러리 디렉토리
root 파일 시스템을 yaffs로 구축하는 방법
 타겟보드의 root 에서 mkflashroot 스크립트 파일을 실행 시킨다.
[root@ez-x5 root]$ ./mkflashroot
[root@ez-x5 root]$ reboot –dfip 또는 전원 리셋
 부트로더에서 환경 설정을 변경한다.
EZBOOT> set
Select> k 또는 LF
K. Kernel CMD 1st [initrd=0xa0800000,5M root=/dev/ram ramdisk=12288]
Newvalue : noinitrd root=/dev/mtdblock2
복사
 포팅한 Qt/Embedded 라이브러리를 /nfs/qt/3.3.6/lib 디렉토리로 복사한다.
[root@jdt qte-3.3.6]# cp lib/libqte-mt.so* /nfs/qt/3.3.6/lib/
 폰트 디렉토리로 복사한다.
[root@jdt qte-3.3.6]# cp lib/fonts /nfs/qt/3.3.6/lib/
 예제 파일을 복사한다.
[root@jdt qte-3.3.6]# cp examlpes/hello/hello /nfs/qt/3.3.6/
환경 설정
 타겟보드에서 nfs 마운트를 한다.
[root@ez-x5 /root]$ mount -t nfs -o nolock 192.168.10.xxx:/nfs /mnt/nfs
[root@ez-x5 /root]$ cd /mnt/nfs/qt/3.3.6
 타겟보드로 Qt/Embedded 라이브러리, 폰트, 예제파일을 복사한다.
[root@ez-x5 3.3.6]$ cp -a /mnt/nfs/qt/3.3.6/lib/* /lib/
[root@ez-x5 3.3.6]$ cp -a /mnt/nfs/qt/3.3.6/hello /tmp/
 타겟보드에서 Qt/Embedded 라이브러리를 참조하기 위해서는 다음과 같이 환경 설정
이 필요하다.
[root@ez-x5 3.3.6]$ export QTDIR=
[root@ez-x5 3.3.6]$ export PATH=$QTDIR/bin:$PATH
[root@ez-x5 3.3.6]$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$QTDIR/lib
[root@ez-x5 3.3.6]$ export QWS_MOUSE_PROTO=linuxtp
실행
 타겟보드에서 응용 프로그램을 실행한다.
[root@ez-x5 3.3.6]$ cd
/tmp
[root@ez-x5 3.3.3]$ ./hello -qws
5.4 에러
라이브러리 참조 에러
[root@ez-x5 3.3.5]$ ./hello –qws
./hello: error while loading shared libraries: libqte-mt.so.3: cannot open shared object file:
No such file or directory
이 에러는 라이브러리의 디렉토리 또는 파일들을 찾지 못했을 경우 발생하는 에러이다.
앞서 설정한 환경설정을 다음 명령으로 다시 한번 확인 해 봐야 한다.
[root@ez-x5 3.3.5]$ export
Fonts 참조 에러
[root@ez-x5 3.3.5]$ ./hello –qws
Cannot find font definition file /mnt/nfs/qt/3.3.6/lib/fonts/fontdir - is Qt instal?
이 에러는 fonts 파일들을 찾지 못했을 경우 발생하는 에러이다.
앞서 설정한 환경설정을 다음 명령으로 다시 한번 확인 해 봐야 한다.
[root@ez-x5 3.3.5]$ export
6. 터치스크린의 이해 및 Qt/Embedded 연동
6.1 터치스크린 신호 라인 층
6.3 저항막 방식의 측정 등가 회
로
6.2 터치스크린 접촉 검출 구
조
6.4 터치스크린을 처리하기 위한 리눅스 구조
Hardware
터치 장치와 터치를 제어하여 좌표값을 얻어오는 컨트롤러를 포함한다. 이 커트롤러는 커널
디바이스 드라이버 층에서 해석되어 응용 프로그램에 전달된다.
Kernel
터치 컨트롤러는 하드웨어 장치이므로 리눅스 시스템에서는 응용프로그램이 직접적으로 접
근이 불가능하기 때문에 커널은 디바이스 드라이버를 제공하여 응용프로그램이 접근할 수
있게 한다.
Application
터치를 사용하기 위해서는 GUI라이브러리나 시스템을 이용한다. 임베디드 리눅스에서 사용
하는 대표적인 GUI Application은 Tiny-X, Nano-X, Qt/Embedded를 들 수 있다.
6.5 INPUT 디바이스 드라이버
커널 2.4대 입력 디바이스 드라이버
커널 2.6대 입력 디바이스 드라이버
INPUT 디바이스 드라이버의 정보 보기
[root@falinux
[root@falinux
dr-xr-xr-x
dr-xr-xr-x
-r--r--r--r--r--r--
drivers]$ cd /proc/bus/input/
input]$ ls -al
2 root
root
0 Jan
4 root
root
0 Jan
1 root
root
0 Jan
1 root
root
0 Jan
1
1
1
1
00:03
00:00
00:03
00:03
.
..
devices
handlers
[root@falinux input]$ cat devices
I: Bus=0003 Vendor=055d Product=0001 Version=0001
N: Name="Samsung Samsung Combo Mini Keyboard"
P: Phys=usb-amba-1/input0
H: Handlers=kbd
B: EV=120013
B: KEY=10000 7 ff800000 7ff febeffdf ffefffff ffffffff fffffffe
B: MSC=10
B: LED=1f
I:
N:
P:
H:
B:
B:
B:
B:
Bus=0003 Vendor=045e Product=0040 Version=0121
Name="Microsoft Microsoft Wheel Mouse Optical□
Phys=usb-amba-2/input0
Handlers=mouse0 ts0
EV=17
KEY=70000 0 0 0 0 0 0 0 0
REL=103
MSC=10
I:
N:
P:
H:
B:
B:
B:
Bus=0019 Vendor=1013 Product=9300 Version=0000
Name="Cirrus Logic EP93xx Touchscreen"
Phys=ep93xx_ts/input0
Handlers=mouse1 ts1
EV=b
KEY=20 0 0 0 0 0 0 0 0 0 0
ABS=11000003
[root@falinux input]$ cat handlers
N: Number=0 Name=kbd
N: Number=1 Name=mousedev Minor=32
N: Number=2 Name=tsdev Minor=128
이벤트 핸들러 디바이스 드라이버
키보드 이벤트 핸들러 디바이스 드라이버




커널 소스상에 linux/drivers/char/keyboard.c 에 구현 되어 있다.
이 핸들러를 사용하는 키보드 디바이스 드라이버들은 linux/drivers/input/keyboard 디렉토리
하부에 구현
이 이벤트 핸들러는 내부적으로 가상 콘솔 디바이스 드라이버와 연결되어 있기 때문에 직접적으
로 응용 프로그램에서 열 수 없다.
스위치 입력을 특정 키보드 입력으로 처리하거나 USB 키보드 장치를 다룰때 사용
• 조이스틱 이벤트 핸들러 디바이스 드라이버




커널 소스상에 linux/drivers/input/joydev.c 에 구현 되어 있다.
이 핸들러를 사용하는 조이스틱 디바이스 드라이버들은 linux/drivers/input/joystick 디렉토리
하부에 구현
이 이벤트 핸들러는 내부적으로 가상 콘솔 디바이스 드라이버와 연결되어 있기 때문에 직접적으
로 응용 프로그 램에서 열 수 없다.
조이스틱 입력 장치를 다룰때 사용
마우스 이벤트 핸들러 디바이스 드라이버



커널 소스상에 linux/drivers/input/mousedev.c 에 구현 되어 있다.
이 핸들러를 사용하는 마우스 디바이스 드라이버들은 linux/drivers/input/mouse 디렉토리 하
부에 구현
이 디바이스 파일들은 /dev/input/ 하부 디렉토리에 다음과 같은 주번호와 부번호를 문자형 디
바이스 형태로 할당한다.
[root@falinux input]$ ls –al
crw-r--r-- 1 root
root
crw-r--r-- 1 root
root
crw-r--r-- 1 root
root
crw-r--r-- 1 root
root
...
...
crw-r--r-- 1 root
root
crw-r--r-- 1 root
root
13,
13,
13,
13,
32
33
34
35
Mar 28 22:45 mouse0
Mar 29 00:41 mouse1
Mar 29 00:41 mouse2
Apr 1 10:50 mouse3
13,
13,
62 Apr
63 Apr
1 10:50 mouse30
1 10:50 mice
이벤트 이벤트 핸들러 디바이스 드라이버


커널 소스상에 linux/drivers/input/evdev.c 에 구현 되어 있다.
이 디바이스는 키보드, 마우스, 조이스텍, 터치스크린과 같은 장치의 값을 읽어 들일 수 있다.

이 디바이스 파일들은 /dev/input/ 하부 디렉토리에 다음과 같은 주번호와 부번호를 문자형 디
바이스 형태로 할당한다.
[root@falinux input]$ ls -al
crw-r--r-- 1 root
root
crw-r--r-- 1 root
root
crw-r--r-- 1 root
root
crw-r--r-- 1 root
root
...
crw-r--r-- 1 root
root

13, 64 Apr 1 10:49 event0
13, 65 Apr 1 10:50 event1
13, 66 Apr 1 10:50 event2
13, 67 Apr 1 10:50 event3
13,
95 Apr
1 10:50 event31
응용프로그램은 이 디바이스 파일을 읽어 들이기 위해서는 read 함수를 이용하여 읽을 수 있다.
struct input_event {
struct timeval time;
unsigned short type;
unsigned short code;
unsigned int value;
};
time
type
: 이벤트가 발생한 시간
: include/linux/input.h
#define EV_SYN
0x00
#define EV_KEY
0x01
#define EV_ABS
0x03
code : include/linux/input.h
BTN_TOUCH, ABS_X, ABS_Y, 0
value : 버튼의 상태
// 동기
// 키 or 버튼
// 절대 좌표 값

터치스크린의 터치시 실제 발생 이벤트 예제
[터치가 눌린 상태]
type = EV_KEY, code = BTN_TOUCH, value =
type = EV_ABS, code = ABS_X
, value =
type = EV_ABS, code = ABS_Y
, value =
type = EV_SYN, code = 0
, value =
1,
342,
128,
0,
[터치가 떨어진 상태]
type = EV_KEY, code = BTN_TOUCH, value = 0,
type = EV_SYN, code = 0,
value = 0,

커널 컴파일 옵션 설정
[ 2.6.11 ]
Input Device support --->
<*> Event interface
[ 2.6.13 이후]
Device Drivers --->
Input Device support --->
<*> Event interface




키가 눌렸다.
X 좌표값은 342 다,
Y 좌표값은 128 이다.
지금까지 데이터가 하나의 데이터다.


키가 떨어졌다.
지금까지 데이터가 하나의 데이터다.
터치스크린 이벤트 핸들러 디바이스 드라이버



커널 소스상에 linux/drivers/input/tsdev.c 에 구현 되어 있다.
이 핸들러를 사용하는 터치스크린 디바이스 드라이버들은 linux/drivers/input/touchscreen
디렉토리
하부에 구현
이 디바이스 파일들은 /dev/input/ 하부 디렉토리에 다음과 같은 주번호와 부번호를 문자형 디
바이스 형태로 할당한다.
[root@falinux input]$ ls -al
crw-r--r-- 1 root
root
crw-r--r-- 1 root
root
crw-r--r-- 1 root
root
crw-r--r-- 1 root
root
...
crw-r--r-- 1 root
root

13,
13,
13,
13,
128
129
130
131
Apr
Apr
Apr
Apr
1
1
1
1
10:49
10:50
10:50
10:50
ts0
ts1
ts2
ts3
13,
159 Apr 1 10:50 ts31
iPAQ H3600이라는 PDA의 터치스크린을 위해 설계되고 작성된 디바이스 드라이버이다.
INPUT 디바이스 드라이버의 구현
입력 디바이스 드라이버의 등록과 이벤트 핸드러와의 연결
장치 제거시 입력 디바이스 드라이버 제거와 이벤트 핸들러와의 연결 종료
입력된 이벤트 상태의 보고
커널 컴파일 설정 옵션
INPUT 디바이스 드라이버의 흐름도
6.6 터치스크린와 Qt/Embedded 연동
EZ-X5 / EZ-EP9312/ EZ-S2410
터치스크린 관련 파일 수정
[root@jdt qte-3.3.6]# vi src/embedded/qmouselinuxtp_qws.cpp
81
82
83
84
85
86
87
88
89
90
91
92
93
#define QT_QWS_TP_JITTER_LIMIT 2
#endif
#elif defined(QT_QWS_EZ_X5) || defined(QT_QWS_EZ_EP9312) || defined(QT_QWS_EZ_S2410)
typedef struct {
unsigned int pressure;
unsigned int x;
unsigned int y;
unsigned int pad;
} TS_EVENT;
#else
typedef struct {
unsigned short pressure;
unsigned short x;
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
229
230
231
232
233
234
235
236
# endif
#endif
#if defined(QT_QWS_EZ_X5)
if ((mouseFD = open( "/dev/mk712", O_RDONLY | O_NDELAY)) < 0) {
qWarning( "Cannot open /dev/mk712 (%s)", strerror(errno));
return;
}
#elif defined(QT_QWS_EZ_EP9312) || defined(QT_QWS_EZ_S2410)
if ((mouseFD = open( "/dev/input/ts0", O_RDONLY | O_NDELAY)) < 0) {
qWarning( "Cannot open /dev/input/ts0 (%s)", strerror(errno));
return;
}
#endif
QSocketNotifier *mouseNotifier;
uchar *mb = mouseBuf+idx;
data = (TS_EVENT *) mb;
#ifdef QT_QWS_EZ_X5
if(!(data->pressure) >= QT_QWS_TP_PRESSURE_THRESHOLD) {
#else
if(data->pressure >= QT_QWS_TP_PRESSURE_THRESHOLD) {
#endif
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
#ifdef QT_QWS_SHARP
samples[currSample] = QPoint( 1000 - data->x, data->y );
#else
#if defined(QT_QWS_EZ_X5)
unsigned int xf,yf;
unsigned int MK712_start_dx = 4015;
unsigned int MK712_end_dx = 175;
unsigned int MK712_start_dy = 175;
unsigned int MK712_end_dy = 4015;
QRect desk
if(
if(
if(
If(
data->x
data->x
data->y
data->y
= qApp->desktop()->geometry();
>
<
<
>
MK712_start_dx
MK712_end_dx
MK712_start_dy
MK712_end_dy
)
)
)
)
data->x
data->x
data->y
data->y
=
=
=
=
MK712_start_dx;
MK712_end_dx;
MK712_start_dy;
MK712_end_dy;
xf = (MK712_start_dx - data->x
) / (((MK712_start_dx - MK712_end_dx ) / desk.width() ));
yf = (data->y
- MK712_start_dy) / (((MK712_end_dy
- MK712_start_dy) / desk.height()));
data->x = xf;
data->y = yf;
if(
if(
if(
if(
data->x
data->y
data->x
data->y
< 0
< 0
>= desk.width()
>= desk.height()
)
)
)
)
data->x
data->y
data->x
data->y
=
=
=
=
0;
0;
desk.width() -1;
desk.height()-1;
samples[currSample] = QPoint( data->x, data->y );
#elif defined(QT_QWS_EZ_EP9312) || defined(QT_QWS_EZ_S2410)
samples[currSample] = QPoint( data->x, data->y );
#else
samples[currSample] = QPoint( data->x, data->y );
#endif
#endif
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
333
334
335
336
337
338
339
340
341
342
if ( dxSqr + dySqr < (QT_QWS_TP_MOVE_LIMIT * QT_QWS_TP_MOVE_LIMIT) ) {
if ( waspressed ) {
// if ( (dxSqr + dySqr > (QT_QWS_TP_JITTER_LIMIT * QT_QWS_TP_JITTER_LIMIT) ) || skipCount > 2) {
//
handler->mouseChanged(mousePos,Qt::LeftButton);
handler->sendFiltered(mousePos,Qt::LeftButton);
oldmouse = mousePos;
//
skipCount = 0;
// } else {
//
skipCount++;
// }
} else {
// handler->mouseChanged(mousePos,Qt::LeftButton);
handler->sendFiltered(mousePos,Qt::LeftButton);
oldmouse=mousePos;
waspressed=true;
}
skipCount = 0;
oldTotalMousePos = QPoint(0,0);
if ( waspressed ) {
//
handler->mouseChanged(oldmouse,0);
handler->sendFiltered(oldmouse,0);
oldmouse = QPoint( -100, -100 );
waspressed=false;
}
}
idx += sizeof( TS_EVENT );
Calibrate
다운로드
에프에이리눅스 홈페이지에 이현수_강관순님께서 올려 놓은
qt_touch_pannel_mk712.zip 파일의 압축을 풀면 Calibrate 소스가 있다. 이것을 이용
하기로 한다. 이 소스는 GPL로 되어 있다.
http://www.falinux.com/bbs/zboard.php?id=lec_tip
16
ez-x5 QTE3.3.3에서 터치판넬 구동
소스목록
qt_touch_pannel_mk712.zip 파일의 압축을 풀면 Calibrate라는 디렉토리가 있다.
[root@arm26 calibrate]# ls -al
-rwxrw-rw1 nobody nobody 3241
-rwxr-xr-x
1 root
root
39621
-rwxrw-rw1 nobody nobody 6385
-rwxrw-rw1 nobody nobody
784
-rwxrw-rw1 nobody nobody
335
-rwxrw-rw1 nobody nobody
243
3월
3월
3월
9월
9월
5월
21 23:15 Makefile
21 17:12 calibrate
21 17:12 calibrate.cpp
14 2004 calibrate.h
14 2004 calibrate.pro
16 2004 main.cpp
Makefile 수정 [ EZ-X5 ]
[root@arm26 calibrate]# vi Makefile
11
12
13
14
15
16
CC
CXX
LEX
YACC
CFLAGS
CXXFLAGS
17
18
19
LEXFLAGS =
YACCFLAGS= -d
INCPATH = -I/project/qt/qte-3.3.6/mkspecs/qws/linux-armv5l-g++ -I. -I. -Icrow
-I$(QTDIR)/include
LINK
= armv5l-linux-g++
20
94
95
96
97
98
99
100
101
=
=
=
=
=
=
armv5l-linux-gcc
armv5l-linux-g++ -DQT_QWS_EZ_EP9312
flex
yacc
-pipe -O2 -DQT_NO_DEBUG -DQT_SHARED -DQT_THREAD_SUPPORT
-pipe -DQWS -fno-exceptions -fno-rtti -O2 -DQT_NO_DEBUG -DQT_SHARED
-DQT_THREAD_SUPPORT
( cd $(QTDIR)/src/moc && $(MAKE) )
Makefile: calibrate.pro /project/qt/qte-3.3.6/mkspecs/qws/linux-armv5lg++/qmake.conf /project/qt/qte-3.3.6/lib/libqte-mt.prl
$(QMAKE) -spec qws/linux-armv5l-g++ -o Makefile calibrate.pro
qmake:
@$(QMAKE) -spec qws/linux-armv5l-g++ -o Makefile calibrate.pro
dist:
Makefile 수정 [ EZ-EP9312 / EZ-S2410 ]
[root@arm26 calibrate]# vi Makefile
11
12
13
14
15
16
CC
CXX
LEX
YACC
CFLAGS
CXXFLAGS
17
18
19
LEXFLAGS =
YACCFLAGS= -d
INCPATH = -I/project/qt/qte-3.3.6/mkspecs/qws/linux-arm-g++ -I. -I. -Icrow
-I$(QTDIR)/include
LINK
= arm-linux-g++
20
94
95
96
97
98
99
100
101
=
=
=
=
=
=
arm-linux-gcc
arm-linux-g++ -DQT_QWS_EZ_EP9312
flex
yacc
-pipe -O2 -DQT_NO_DEBUG -DQT_SHARED -DQT_THREAD_SUPPORT
-pipe -DQWS -fno-exceptions -fno-rtti -O2 -DQT_NO_DEBUG -DQT_SHARED
-DQT_THREAD_SUPPORT
( cd $(QTDIR)/src/moc && $(MAKE) )
Makefile: calibrate.pro /project/qt/qte-3.3.6/mkspecs/qws/linux-armg++/qmake.conf /project/qt/qte-3.3.6/lib/libqte-mt.prl
$(QMAKE) -spec qws/linux-arm-g++ -o Makefile calibrate.pro
qmake:
@$(QMAKE) -spec qws/linux-arm-g++ -o Makefile calibrate.pro
dist:
컴파일
[root@arm26 calibrate]# make
arm-linux-g++ -DQT_QWS_EZ_EP9312 -c -pipe -DQWS -fno-exceptions -fno-rtti -O2 DQT_NO_DEBUG -DQT_SHARED -DQT_THREAD_SUPPORT -I/project/qt/qte-3.3.6/mkspecs/qws/linuxarm-g++ -I. -I. -Icrow -I/project/qt/qte-3.3.6/include -o calibrate.o calibrate.cpp
arm-linux-g++ -DQT_QWS_EZ_EP9312 -c -pipe -DQWS -fno-exceptions -fno-rtti -O2 DQT_NO_DEBUG -DQT_SHARED -DQT_THREAD_SUPPORT -I/project/qt/qte-3.3.6/mkspecs/qws/linuxarm-g++ -I. -I. -Icrow -I/project/qt/qte-3.3.6/include -o main.o main.cpp
/project/qt/qte-3.3.6/bin/moc calibrate.h -o moc_calibrate.cpp
arm-linux-g++ -DQT_QWS_EZ_EP9312 -c -pipe -DQWS -fno-exceptions -fno-rtti -O2 DQT_NO_DEBUG -DQT_SHARED -DQT_THREAD_SUPPORT -I/project/qt/qte-3.3.6/mkspecs/qws/linuxarm-g++ -I. -I. -Icrow -I/project/qt/qte-3.3.6/include -o moc_calibrate.o
moc_calibrate.cpp
arm-linux-g++ -Wl,-rpath,/project/qt/qte-3.3.6/lib -o calibrate calibrate.o main.o
moc_calibrate.o
-L/project/qt/qte-3.3.6/lib -lqte-mt
[root@arm26 calibrate]#
7. 관련 사이트 및 참조
사이트
Trolltech
http://www.trolltech.com/
Korone.net
http://www.korone.net/
참조문서
EZ-X5 보드에서 QT-Embedded 3.3.3 버전 사용시 터치스크린 구동
만든사람 : 강관순 . 이현우