반응형
포팅된 touchscreen을 TSLIB에서 사용하기 위해서, ts_test 등의 tslib를 사용 할 때,
나타나는 현상
/dev/input/event0로에서 'cat /dev/input/event0 | hexdump' 를 통해 정상적 이벤트가 발생됨을 확인을 전제
TSLIB 환경변수 및 ts.conf 또한 정상적으로 세팅 되어있을때,
동작하지 않을경우에는 커널버전 과 TSLIB Protocol 버전 또는
evbit 등의 세팅이 맞지 않을경우이다.
최신의 TSLIB는 뜨지 않으며, 낮은버전을 사용할 경우 발생 하게 되는데
patch work를 통해 확인한 결과는 아래와 같다.
static int check_fd(struct tslib_input *i) { struct tsdev *ts = i->module.dev; int version; - u_int32_t bit; - u_int64_t absbit; + long evbit[BITS_TO_LONGS(EV_CNT)]; + long absbit[BITS_TO_LONGS(ABS_CNT)]; + long keybit[BITS_TO_LONGS(KEY_CNT)]; - if (! ((ioctl(ts->fd, EVIOCGVERSION, &version) >= 0) && - (version == EV_VERSION) && - (ioctl(ts->fd, EVIOCGBIT(0, sizeof(bit) * 8), &bit) >= 0) && - (bit & (1 << EV_ABS)) && - (ioctl(ts->fd, EVIOCGBIT(EV_ABS, sizeof(absbit) * 8), &absbit) >= 0) && - (absbit & (1 << ABS_X)) && - (absbit & (1 << ABS_Y)) && (absbit & (1 << ABS_PRESSURE)))) { - fprintf(stderr, "selected device is not a touchscreen I understand\n"); + if (ioctl(ts->fd, EVIOCGVERSION, &version) < 0) { + fprintf(stderr, "tslib: Selected device is not a Linux input event device\n"); return -1; }
위와 같이 input-raw.c 에서 EV_VERSION과 ,evbit과 absbit 등을 ioctl로 확인 후에 touch driver로 인식한다.
이 과정에서 맞지 않을 경우 비정상 종료가 이루어져 driver가 제대로 호출되지 않게 된다.
그에 따라 input driver의 bit세팅값 또는 EV_VERSION을 확인해야 한다.
단적인 예로
낮은버전은 0x010000이여야만 가능하다.
TSLIB가 높은 경우 + 코드와 같이 버전과 관계없이 실행된다.
File - "<kernel home>/include/linux/input.h"
-- #define EV_VERSION 0x010000
++ #define EV_VERSION 0x010001
이외의 상황이라면,
driver의 문제 또는 ts.conf의 값을 변경해야함
반응형
'System Programming > Tips' 카테고리의 다른 글
Rockchip Booting Mode Description (0) | 2020.03.11 |
---|---|
Samba Memory Leak 및 Out of memory 에러 수정 (0) | 2020.02.21 |
크로스 컴파일 실행파일 no such file or directory 문제 (0) | 2017.01.17 |
HDMI Hot Plug Detect Pin and +5V Pin (0) | 2016.12.26 |
현재시간 얻어오기 (0) | 2016.10.04 |