포팅된 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의 값을 변경해야함

+ Recent posts