임베디드 Qt 환경에서 터치스크린 보정을 하기 위해, 우리는 tslib를 사용하기로 했다.
libinput 기반의 입력 처리도 가능하긴 하지만, 정전식 화면에서 **터치 좌표 보정(calibration)**이 필요한 상황에서,
X11 서버가 필요 없는 경량 보정 라이브러리인 tslib는 최적의 선택이다.
🎯 왜 tslib인가?
- libinput은 xinput을 통해 보정해야 하고, 이는 X 서버가 실행 중일 때만 가능
- tslib는 Framebuffer 환경에서도 동작하며, /etc/pointercal 파일을 통해 보정값을 관리할 수 있음
🚀 초기 설정: 환경 변수 설정
부팅 스크립트에서 다음과 같이 설정했다:
export QT_QPA_PLATFORM=linuxfb:tslib
export TSLIB_TSDEVICE=/dev/input/event0
export TSLIB_CALIBFILE=/etc/pointercal
export TSLIB_CONFFILE=/etc/ts.conf
export TSLIB_PLUGINDIR=/usr/lib/ts
ts_calibrate를 실행하면 /etc/pointercal이 잘 생성되고, ts_print를 통해 보정값이 적용되는 것도 확인할 수 있었다. 하지만 문제는… Qt 애플리케이션에서는 tslib 보정이 적용되지 않았다.
🐞 문제 분석: tslib 대신 libinput이 동작 중?
디버깅을 위해 Qt의 로그 출력을 활성화했다.
export QT_LOGGING_RULES=qt.qpa.*=true
export QT_DEBUG_PLUGINS=1
# ./qt-touchpaint-test
qt.qpa.input: libinput: event0 - generic ft5x06 (79): is tagged by udev as: Touchscreen
qt.qpa.input: libinput: event0 - generic ft5x06 (79): device is a touch device
qt.qpa.input: xkbcommon not available, not performing key mapping
qt.qpa.input: libinput: registerDevice /dev/input/event0 - generic ft5x06 (79)
❗ tslib가 아닌 libinput이 입력을 처리하고 있었다!
🔥 첫 번째 시도: libinput.so 삭제 → Qt 실행 실패
libinput이 적용되지 않게 하려고 /usr/lib/libinput.so.10 을 삭제해봤더니…
Qt 애플리케이션이 아예 실행되지 않음 😅
→ Buildroot에서 빌드된 Qt가 libinput을 동적으로라도 로드하려 하고 있었던 것이다.
🔧 두 번째 시도: Buildroot 설정 수정 + Qt 재빌드
Buildroot 설정을 수정했다.
- make menuconfig에서 libinput 비활성화
- qt5base.mk에 다음 줄 추가: QT5BASE_CONF_OPTS += -no-feature-libinput
- 전체 재빌드 (2시간 😭): make clean && make
- RootFS를 다시 작성하고 보드에 플래시
😐 그런데 또 evdevtouch?
재실행 후 로그:
qt.qpa.input: evdevtouch: Using device /dev/input/event0
qt.qpa.input.events: reporting TouchPoint...
이번엔 libinput이 아니라 evdevtouch 플러그인이 활성화된 상태. tslib 설정이 제대로 적용되지 않았던 것.
✅ 최종 해결: tslib 환경 완전 적용
환경변수를 다음과 같이 명확하게 설정:
export TSLIB_TSDEVICE=/dev/input/event0
export TSLIB_CALIBFILE=/etc/pointercal
export TSLIB_CONFFILE=/etc/ts.conf
export TSLIB_PLUGINDIR=/usr/lib/ts
export QT_QPA_PLATFORM=linuxfb:tslib
export QT_QPA_GENERIC_PLUGINS="tslib:/dev/input/event0"
export QT_LOGGING_RULES=qt.qpa.*=true #로깅용
드디어 tslib를 통해 입력이 처리되고 있고, /etc/pointercal의 보정값도 제대로 적용되고 있다는 것을 확인할 수 있었다. 🎉
qt.qpa.input: Found matching devices ()
qt.qpa.input: Initializing tslib plugin "tslib" "/dev/input/event0"
qt.qpa.input: tslib device is /dev/input/event0

'개발이야기' 카테고리의 다른 글
Qt4에서 Qt5포팅시 팁 (0) | 2024.12.01 |
---|---|
U-Boot env 이미지 만들기(mkenvimage) (0) | 2024.11.28 |
IAR embedded workbench와 가격, Crack 이야기 (1) | 2024.11.16 |
센서 데이터 평균과 중앙값 (0) | 2024.11.05 |
Orange Pi 3B 기가 이더넷 동작 안함 !! (1) | 2024.10.14 |