Android的虚拟触摸屏设备的多点触摸协议
问题描述:
我能够创建一个植根Android手机使用uinput一个虚拟的触摸屏。使用下面的JNI代码:
static int startDevice(const char *touchdevice) {
struct uinput_user_dev uidev;
int fd;
fd = open("/dev/uinput", O_WRONLY | O_NONBLOCK);
if (fd < 0) {
die("error: open");
}
memset(&uidev, 0, sizeof(uidev));
snprintf(uidev.name, UINPUT_MAX_NAME_SIZE, "%s",touchdevice);
uidev.id.bustype = 0;
uidev.id.vendor = 0x0;
uidev.id.product = 0x0;
uidev.id.version = 0;
uidev.absmax[ABS_MT_POSITION_X] = 1280;
uidev.absmax[ABS_MT_POSITION_Y] = 800;
if (write(fd, &uidev, sizeof(uidev)) < 0) {
die("error: write");
}
ioctl(fd, UI_SET_EVBIT, EV_ABS);
ioctl(fd, UI_SET_ABSBIT, ABS_MT_POSITION_X);
ioctl(fd, UI_SET_ABSBIT, ABS_MT_POSITION_Y);
ioctl(fd, UI_SET_ABSBIT, ABS_MT_PRESSURE);
ioctl(fd, UI_SET_ABSBIT, ABS_MT_TOUCH_MAJOR);
ioctl(fd, UI_SET_ABSBIT, ABS_MT_SLOT);
ioctl(fd, UI_SET_ABSBIT, ABS_MT_TRACKING_ID);
ioctl(fd, UI_SET_KEYBIT, BTN_TOUCH);
if (ioctl(fd, UI_DEV_CREATE, 0) < 0) {
die("error: ioctl");
}
idVirtualTouch = fd;
return 55;
}
当调用方法我给touchdevice相同的名称有默认的Android触摸屏。因此,当它创建触摸设备时,它将加载默认触摸屏的配置文件(.idc)。
问题是,它创建了一个虚拟设备,它可以回答多点触控协议A而不是B(https://www.kernel.org/doc/Documentation/input/multi-touch-protocol.txt)。
我目前在android 4.1.2上使用Galaxy tab2,如果我将默认设备(协议b)事件转发给虚拟驱动器,它期望协议A事件,所以它无法正常工作。
没有.IDC默认触摸屏,所以我创建了一个只有:
touch.deviceType = touchScreen
touch.internal = 1
所以我的问题是我必须做我的触摸驱动程序与协议B的工作是什么?问题是.idc还是设备的初始化?
谢谢您的时间
答
发现问题,忘了定义插槽和追踪ID
uidev.absmax[ABS_MT_TRACKING_ID] = 65535;
uidev.absmax[ABS_MT_SLOT] = 9;