2014-02-08 225 views
1

早上好,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還是設備的初始化?

謝謝您的時間

回答

0

發現問題,忘了定義插槽和追蹤ID

uidev.absmax[ABS_MT_TRACKING_ID] = 65535; 
uidev.absmax[ABS_MT_SLOT] = 9;