Estou desenvolvendo um driver de kernel Linux para um dispositivo multitouch. Eu usei como ponto de partida o driver usbtouchscreen incluído na fonte do kernel linux-3.0.
Embora eu já possa fazer meu ponteiro do mouse se mover com o toque, ainda há muitas perguntas que ainda surgem:
Quando configurado corretamente, o xinput listará meu dispositivo como dispositivo mulitouch ou touchscreen? A única coisa que consegui até agora foi listada na categoria Virtual Core Pointer
Como devo configurar e configurar corretamente o dispositivo de entrada? É assim que eu estou fazendo:
/ * Para toque único * /
input_set_abs_params (input_dev, ABS_X, 0, 6300, 0, 0);
input_set_abs_params (input_dev, ABS_Y, 0, 6300, 0, 0);/ * para multi-toque * /
input_mt_init_slots (input_dev, 6);
input_set_abs_params (input_dev, ABS_MT_TOUCH_MAJOR, 0, 0xff, 0, 0);
input_set_abs_params (input_dev, ABS_MT_POSITION_X, 0, 6300, 0, 0);
input_set_abs_params (input_dev, ABS_MT_POSITION_Y, 0, 6300, 0, 0);
O protocolo é dividido em dois tipos, dependendo das capacidades do hardware. -Para dispositivos que lidam com contatos anônimos (tipo A), o protocolo descreve como enviar os dados brutos para todos os contatos para o receptor. Para dispositivos capazes de rastrear contatos identificáveis (tipo B), o protocolo descreve como enviar atualizações para contatos individuais por meio de slots de eventos.
O que significa contatos anônimos? Meu dispositivo envia dados brutos e meu rastreamento é feito no kernel. No momento em que estou prestes a injetar toques no subsistema do kernel, já toquei em identificado e rastreado. O que é afinal o meu tipo de dispositivo?
Independentemente disso, eu já tentei os dois tipos de relatórios e não parecem me dar uma entrada multitoque. É assim que estou fazendo agora:
if(touchActive)
{
input_mt_slot(usbtouch->input, Touch->Id);
input_mt_report_slot_state(usbtouch->input, MT_TOOL_FINGER, true);
input_report_abs(usbtouch->input, ABS_MT_TOUCH_MAJOR, 128);
input_report_abs(usbtouch->input, ABS_MT_POSITION_X, Touch->ReportedPosition.X);
input_report_abs(usbtouch->input, ABS_MT_POSITION_Y, Touch->ReportedPosition.Y);
touch++;
}
if (touch>0)
{
input_report_key(usbtouch->input, BTN_TOUCH, true);
input_report_abs(usbtouch->input, ABS_X, Touch->ReportedPosition.X);
input_report_abs(usbtouch->input, ABS_Y, Touch->ReportedPosition.Y);
input_sync(usbtouch->input);
}