Пытаюсь написать свой драйвер для тачскрина, работающего по i2c шине. В общем драйвер таки работает, но тачскрин ведет себя как обыкновенная мышка. На дисплее отображается мелкий круг, его можно потаскать пальцем. Причем при нажатии на произвольную область экрана, кружок остается на своем месте. Перерыл все дрова в папке drivers/input/touchscreen, перепробовал все возможные варианты - ноль.
Может кто имел дело с Multi-touch протоколом в linux - android ? Подскажите как сделать из получившейся мышки мультитач.
инициализирую драйве так :
Код
/* allocate input device */
ts->input_dev = input_allocate_device();
// разрешаю евенты
__set_bit(EV_SYN,(ts->input_dev)->evbit);
__set_bit(EV_KEY,(ts->input_dev)->evbit);
__set_bit(EV_ABS,(ts->input_dev)->evbit);
// выделяю слоты под количество пальцев
int error = input_mt_init_slots(ts->input_dev, FINGER_CNT , 0);
//тут установка лимитов и разрешение эвентов на посылку координат
input_set_abs_params(ts->input_dev, ABS_MT_POSITION_X, 0, ts->x_max, 0, 0);
input_set_abs_params(ts->input_dev, ABS_MT_POSITION_Y, 0, ts->y_max, 0, 0);
input_set_abs_params(ts->input_dev, ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0);
input_set_abs_params(ts->input_dev, ABS_MT_PRESSURE, 0, 255, 0, 0);
input_set_drvdata(ts->input_dev, ts);
ret = input_register_device(ts->input_dev);
ts->input_dev = input_allocate_device();
// разрешаю евенты
__set_bit(EV_SYN,(ts->input_dev)->evbit);
__set_bit(EV_KEY,(ts->input_dev)->evbit);
__set_bit(EV_ABS,(ts->input_dev)->evbit);
// выделяю слоты под количество пальцев
int error = input_mt_init_slots(ts->input_dev, FINGER_CNT , 0);
//тут установка лимитов и разрешение эвентов на посылку координат
input_set_abs_params(ts->input_dev, ABS_MT_POSITION_X, 0, ts->x_max, 0, 0);
input_set_abs_params(ts->input_dev, ABS_MT_POSITION_Y, 0, ts->y_max, 0, 0);
input_set_abs_params(ts->input_dev, ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0);
input_set_abs_params(ts->input_dev, ABS_MT_PRESSURE, 0, 255, 0, 0);
input_set_drvdata(ts->input_dev, ts);
ret = input_register_device(ts->input_dev);
//в обработчике прерываний от контроллера
Код
for(count = 0; count < (finger_list.length); count++)
{
input_report_key(ts->input_dev, BTN_TOUCH, finger_list.pointer[count].state); // если убрать эту строку, на дисплее вообще ничего не появляется,
// тач ни на что не реагирует
input_mt_slot(ts->input_dev, finger_list.pointer[count].num);
input_mt_report_slot_state(ts->input_dev, MT_TOOL_FINGER , finger_list.pointer[count].state);
input_report_abs(ts->input_dev, ABS_MT_POSITION_X, finger_list.pointer[count].x);
input_report_abs(ts->input_dev, ABS_MT_POSITION_Y, finger_list.pointer[count].y);
input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR, finger_list.pointer[count].pressure);
input_report_abs(ts->input_dev, ABS_MT_PRESSURE, finger_list.pointer[count].pressure);
}
input_mt_sync_frame(ts->input_dev);
input_sync(ts->input_dev);
{
input_report_key(ts->input_dev, BTN_TOUCH, finger_list.pointer[count].state); // если убрать эту строку, на дисплее вообще ничего не появляется,
// тач ни на что не реагирует
input_mt_slot(ts->input_dev, finger_list.pointer[count].num);
input_mt_report_slot_state(ts->input_dev, MT_TOOL_FINGER , finger_list.pointer[count].state);
input_report_abs(ts->input_dev, ABS_MT_POSITION_X, finger_list.pointer[count].x);
input_report_abs(ts->input_dev, ABS_MT_POSITION_Y, finger_list.pointer[count].y);
input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR, finger_list.pointer[count].pressure);
input_report_abs(ts->input_dev, ABS_MT_PRESSURE, finger_list.pointer[count].pressure);
}
input_mt_sync_frame(ts->input_dev);
input_sync(ts->input_dev);
cat /proc/bus/input/devices
Код
I: Bus=0000 Vendor=0416 Product=0000 Version=0000
N: Name="Goodix Capacitive TouchScreen"
P: Phys=1-0055/input0
S: Sysfs=/devices/i2c-1/1-0055/input/input1
U: Uniq=
H: Handlers=event1
B: PROP=0
B: EV=b
B: KEY=0
B: ABS=6618000 1000003
N: Name="Goodix Capacitive TouchScreen"
P: Phys=1-0055/input0
S: Sysfs=/devices/i2c-1/1-0055/input/input1
U: Uniq=
H: Handlers=event1
B: PROP=0
B: EV=b
B: KEY=0
B: ABS=6618000 1000003
Linux Ядро 3.10.33
Android 4.4.3