タッチパネル

タッチパネル

タッチパネルからのデータを見てみる。

タッチパネルからのデータを取り込んで、adb shell もしくは、Terminal のシェル環境に出力してみる。
コード と Makefile は最後に…あります。

コンパイル済みバイナリは→ touchscreen

kernel上の該当箇所は
kernel/drivers/input/touchscreen/msm-i2ctps.c
kernel/drivers/sharp/shdisp/shdisp_kerl.c
周りのようだ。

使い方。
$ adb push touchscreen /system/bin
97 KB/s (5934 bytes in 0.059s)
$ adb shell chmod 755 /system/bin/touchscreen
転送先は、/data/local/bin でも良いと思う。わざわざ /system/bin に書くような物ではないので…。

実行
$ adb shell '/system/bin/touchscreen < /dev/input/event6'
もしくは、
$ adb shell
# /system/bin/touchscreen < /dev/input/event6
もしくは、Terminal Emulator で
# /system/bin/touchscreen < /dev/input/event6

結果
(XとYが逆転しているけども、プログラム上のX,Yと画面上のX,Yが入れ替わってるような感じなので入れ替えた。(kernel ドライバソースのGPL部分を見ると、180度回転させていただけのような…アレ?^^;)
タップ
event.type=EV_SYN
event.type=EV_KEY BTN_TOUCH DWON
event.type=EV_ABS ev.code=ABS_X value Y=188
event.type=EV_ABS ev.code=ABS_Y value X=528
event.type=EV_SYN
event.type=EV_KEY BTN_TOUCH UP
event.type=EV_SYN
押下のまま動かす
event.type=EV_SYN
event.type=EV_ABS ev.code=ABS_Y value X=386
event.type=EV_SYN
event.type=EV_ABS ev.code=ABS_Y value X=393
event.type=EV_SYN
event.type=EV_ABS ev.code=ABS_Y value X=399
event.type=EV_SYN
event.type=EV_ABS ev.code=ABS_Y value X=404
デュアルタッチ(ピンチ動作と言うのだっけな?)
event.type=EV_SYN
event.type=EV_ABS ev.code=ABS_TOOL_WIDTH value=273
event.type=EV_ABS ev.code=ABS_X value Y=221
event.type=EV_ABS ev.code=ABS_Y value X=422
event.type=EV_SYN
event.type=EV_ABS ev.code=ABS_TOOL_WIDTH value=296
event.type=EV_ABS ev.code=ABS_Y value X=418
event.type=EV_SYN
event.type=EV_ABS ev.code=ABS_TOOL_WIDTH value=327
event.type=EV_ABS ev.code=ABS_X value Y=225
event.type=EV_ABS ev.code=ABS_Y value X=420
event.type=EV_ABS ev.code=ABS_TOOL_WIDTH value=327 は2点間の距離らしい

参考資料

/dev/input/event6…タッチパネル (touchpanel)
/dev/input/event5…キーボード&トラックボール (qwerty_key)
/dev/input/event4…端末の開閉通知 (handset_key)
/dev/input/event3…headset_key
/dev/input/event2…pm_key
/dev/input/event1…compass
/dev/input/event0…msm_touchscreen

コードは下記の通り。
#include <stdio.h>
#include <stdlib.h>
#include <linux/input.h>
#include <unistd.h>
      
int main(void)
{
  struct input_event event;

  printf("Input test.\n");

  for (;;) {

    if (read(0, &event, sizeof(event)) != sizeof(event)) {
      exit(EXIT_FAILURE);
    }

    switch(event.type) {
    case EV_SYN:
      printf("event.type=EV_SYN\n");
      break;

    case EV_KEY:
      switch(event.code) {
      case BTN_TOUCH:
	switch(event.value) {
	case 0:
	  printf("event.type=EV_KEY BTN_TOUCH UP\n");
	  break;

	case 1:
	  printf("event.type=EV_KEY BTN_TOUCH DWON\n");
	  break;
	}
	break;
      default:
	printf("event.type=EV_KEY code=%d KEY=%d\n",event.code ,event.value );
	break;
      }
      break;

    case EV_ABS:
      switch(event.code) {
      case ABS_X:
	printf("event.type=EV_ABS ev.code=ABS_X value Y=%d\n" ,event.value );
	break;
      case ABS_Y:
	printf("event.type=EV_ABS ev.code=ABS_Y value X=%d\n" ,event.value );
	break;
      case ABS_TOOL_WIDTH:
	printf("event.type=EV_ABS ev.code=ABS_TOOL_WIDTH value=%d\n" ,event.value );
	break;
      default:
	printf("event.type=EV_ABS(%d) ev.code=%d\n value=%d" ,event.type ,event.code , event.value);
	break;
      }
      break;

    default:
      printf("event.type=%d\n",event.type);
      break;
    }
  }
  return 0;
}

Malefile
古い表記みたいだが、そして伝統的にどうなの?というものだがとりあえず…。
HOME=/ndk/android-ndk-r5/toolchains/arm-eabi-4.4.0/prebuilt/linux-x86/bin
CC=$(HOME)/arm-eabi-gcc
LD=$(HOME)/arm-eabi-ld
PLATFORM=/ndk/android-ndk-r5/platforms/android-4/arch-arm/usr
INCLUDE=$(PLATFORM)/include
LIB=$(PLATFORM)/lib

LINKER=/system/bin/linker

TARGET=touchscreen
OBJS=main.o start.o
# start.o
#MYLIB=
.SUFFIXES:	.o .c 

.PHONY: all
all:$(TARGET)

$(TARGET):$(OBJS)
	$(LD) \
	-dynamic-linker $(LINKER) \
	-rpath-link $(LIB) \
	-nostdlib \
	-L$(LIB) \
	-lc \
	$(OBJS) \
	-o $@

#	$(LIB)/crtbegin_dynamic.o \
#	$(LIB)/crtend_android.o \

.c.o:
	$(CC) \
	-g \
	-I$(INCLUDE) \
	-c $<

push:
	adb push $(TARGET) /system/bin
	adb shell chmod 755 /system/bin/$(TARGET)
	adb shell '/system/bin/$(TARGET) < /dev/input/event6'
  
.PHONY: clean
clean:
	rm -rf *~
	rm -rf *.o
	rm $(TARGET)

comment
名前:
コメント:








最終更新:2011年01月14日 03:13
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。