Ради одного из своих небольших проектов на Raspberry Pi 2 я приобрел емкостной сенсорный дисплей Waveshare с демократичной ценой, скромным разрешением и сомнительной поддержкой. В коробке с дисплеем лежала DVD-R DL, и по заявлениям продавца, там лежали образы систем на базе Raspbian. Прочитать их мне не удалось, поиск решений в интернете подсказал, что драйвер, который там лежал, был и так не самым лучшим решением (уже скомпилированное ядро без исходников).
В процессе поиска я наткнулся на проект одного парня из дружественного Китая. Благодаря нему я смог прийти к своему решению.
[ 3.518144] usb 1-1.5: new full-speed USB device number 4 using dwc_otg
[ 3.606036] udevd[174]: starting version 175
[ 3.631476] usb 1-1.5: New USB device found, idVendor=0eef, idProduct=0005
[ 3.641195] usb 1-1.5: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 3.653540] usb 1-1.5: Product: By ZH851
[ 3.659956] usb 1-1.5: Manufacturer: RPI_TOUCH
[ 3.659967] usb 1-1.5: SerialNumber: \xffffffc2\xffffff84\xffffff84\xffffffc2\xffffffa0\xffffffa0B54711U335
[ 3.678577] hid-generic 0003:0EEF:0005.0001: hiddev0,hidraw0: USB HID v1.10 Device [RPI_TOUCH By ZH851] on usb-bcm2708_usb-1.5/input0
CONFIG_USB_EGALAX_YZH=y
i@raspberrypi ~ $ sudo xxd -c 25 /dev/hidraw0
0000000: aa01 01bf 00bc bb01 0056 0019 018c 00ef 00b4 02ce 01d7 0182 cc .........V...............
00000af: aa01 01bf 00bc bb01 0056 0019 018c 00ef 00b4 02ce 01d7 0182 cc .........V...............
...
00000fa: aa00 0000 0000 bb00 0000 0000 0000 0000 0000 0000 0000 0000 00 .........................
int try_init_device(struct udev_device *dev) {
struct udev_device *devusb = udev_device_get_parent_with_subsystem_devtype(dev, "usb", "usb_device");
if (devusb) {
if (strcmp(udev_device_get_sysattr_value(devusb, "idVendor"), DEVICE_ID_VENDOR) == 0 &&
strcmp(udev_device_get_sysattr_value(devusb, "idProduct"), DEVICE_ID_PRODUCT) == 0)
{
return try_start_device_loop(udev_device_get_devnode(dev));
}
}
return -2;
}
ABS_MT_POSITION_X x[0]
ABS_MT_POSITION_Y y[0]
SYN_MT_REPORT
ABS_MT_POSITION_X x[1]
ABS_MT_POSITION_Y y[1]
SYN_MT_REPORT
SYN_REPORT
ABS_MT_SLOT 0
ABS_MT_TRACKING_ID 45
ABS_MT_POSITION_X x[0]
ABS_MT_POSITION_Y y[0]
ABS_MT_SLOT 1
ABS_MT_TRACKING_ID 46
ABS_MT_POSITION_X x[1]
ABS_MT_POSITION_Y y[1]
SYN_REPORT
struct uinput_user_dev user_dev;
memset(&user_dev, 0, sizeof(struct uinput_user_dev));
user_dev.absmin[ABS_MT_POSITION_X] = 0;
user_dev.absmax[ABS_MT_POSITION_X] = DEVICE_WIDTH;
user_dev.absmin[ABS_MT_POSITION_Y] = 0;
user_dev.absmax[ABS_MT_POSITION_Y] = DEVICE_HEIGHT;
user_dev.id.bustype = BUS_USB;
user_dev.id.vendor = DEVICE_ID_VENDOR_HEX;
user_dev.id.product = DEVICE_ID_PRODUCT_HEX;
user_dev.id.version = 1;
strcpy(user_dev.name, "Waveshare multitouch screen");
int abs_axes[] = {
ABS_MT_POSITION_X,
ABS_MT_POSITION_Y
};
int i;
for (i = 0; i < 2; ++i) {
if (suinput_enable_event(uinput_fd, EV_ABS, abs_axes[i]) == -1) {
close(uinput_fd);
entry.thread = 0;
pthread_exit(NULL);
return 0;
}
}
gcc -std=c99 -Wall ./waveshare.c -pthread -lsuinput -ludev -o waveshare-touch-driver
sudo waveshare-touch-driver &
pi@raspberrypi ~ $ evtest /dev/input/event0
Input driver version is 1.0.1
Input device ID: bus 0x3 vendor 0xeef product 0x5 version 0x1
Input device name: "Waveshare multitouch screen"
Supported events:
Event type 0 (EV_SYN)
Event type 3 (EV_ABS)
Event code 53 (ABS_MT_POSITION_X)
Value 0
Min 0
Max 800
Event code 54 (ABS_MT_POSITION_Y)
Value 0
Min 0
Max 480
Properties:
Testing ... (interrupt to exit)
...
Event: time 20159.696497, type 3 (EV_ABS), code 53 (ABS_MT_POSITION_X), value 728
Event: time 20159.696497, type 3 (EV_ABS), code 54 (ABS_MT_POSITION_Y), value 41
Event: time 20159.696497, ++++++++++++++ SYN_MT_REPORT ++++++++++++
Event: time 20159.696497, type 3 (EV_ABS), code 53 (ABS_MT_POSITION_X), value 595
Event: time 20159.696497, type 3 (EV_ABS), code 54 (ABS_MT_POSITION_Y), value 154
Event: time 20159.696497, ++++++++++++++ SYN_MT_REPORT ++++++++++++
Event: time 20159.696497, type 3 (EV_ABS), code 53 (ABS_MT_POSITION_X), value 456
Event: time 20159.696497, type 3 (EV_ABS), code 54 (ABS_MT_POSITION_Y), value 145
Event: time 20159.696497, ++++++++++++++ SYN_MT_REPORT ++++++++++++
Event: time 20159.696497, -------------- SYN_REPORT ------------
Event: time 20159.728497, type 3 (EV_ABS), code 53 (ABS_MT_POSITION_X), value 728
Event: time 20159.728497, type 3 (EV_ABS), code 54 (ABS_MT_POSITION_Y), value 41
Event: time 20159.728497, ++++++++++++++ SYN_MT_REPORT ++++++++++++
Event: time 20159.728497, type 3 (EV_ABS), code 53 (ABS_MT_POSITION_X), value 595
Event: time 20159.728497, type 3 (EV_ABS), code 54 (ABS_MT_POSITION_Y), value 154
Event: time 20159.728497, ++++++++++++++ SYN_MT_REPORT ++++++++++++
Event: time 20159.728497, type 3 (EV_ABS), code 53 (ABS_MT_POSITION_X), value 456
Event: time 20159.728497, type 3 (EV_ABS), code 54 (ABS_MT_POSITION_Y), value 145
Event: time 20159.728497, ++++++++++++++ SYN_MT_REPORT ++++++++++++
Event: time 20159.728497, -------------- SYN_REPORT ------------
Event: time 20159.760360, ++++++++++++++ SYN_MT_REPORT ++++++++++++
Event: time 20159.760360, -------------- SYN_REPORT ------------
К сожалению, не доступен сервер mySQL