본문 바로가기
개발이야기

LinuxQt + tslib 터치 보정 적용기: libinput 충돌을 뚫고 제대로 적용하기

by 코저씨 2025. 5. 18.
728x90

임베디드 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 설정을 수정했다.

  1. make menuconfig에서 libinput 비활성화
  2. qt5base.mk에 다음 줄 추가: QT5BASE_CONF_OPTS += -no-feature-libinput
  3. 전체 재빌드 (2시간 😭): make clean && make
  4. 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
 
728x90