Jump to content
    

[Android] Проблема с touchscreen драйвером

Привет всем,

 

Пытаюсь написать свой драйвер для тачскрина, работающего по 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);

 

//в обработчике прерываний от контроллера

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);

 

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

 

Linux Ядро 3.10.33

Android 4.4.3

Share this post


Link to post
Share on other sites

Таки завел своими силами.

 

Оказалось все банально просто. У ведроида свои настройки для устройств ввода.

Насколько я понял, по умолчанию все, что сообщает координаты - мышь )

Нужно было создать файл с описанием своего тача. Файлы настроек лежат в /system/usr/idc/

Имя файла должно соответствовать виду пиду если это usb, если это i2c - имя вашего тачскрина. Узнать его можно выполнив cat /proc/bus/input/devices

 

Подробнее тут http://source.android.com/devices/input/in...tion-files.html

Небольшое руководство как написать свой драйвер http://mcpia.com/howto_android.html

 

все!

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...