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