From 158dde5351977c9b405156c901a206e879bf626a Mon Sep 17 00:00:00 2001 From: <> Date: Fri, 2 Oct 2020 21:37:41 -0700 Subject: [PATCH] Added libevdev --- Makefile | 2 +- hanvon-libusb.c | 103 ++++++++++++++++++++++++++++++++---------------- 2 files changed, 70 insertions(+), 35 deletions(-) diff --git a/Makefile b/Makefile index 75ca2ef..5083e09 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,7 @@ obj-m += hanvon.o all: - gcc hanvon-libusb.c ./hidapi/linux/hid.o -L/usr/local/lib -lusb-1.0 -ludev -g + gcc hanvon-libusb.c -I/usr/include/libevdev-1.0/ -L/usr/local/lib -lusb-1.0 -ludev -levdev -g archive: tar f - --exclude=.git -C ../ -c hanvon | gzip -c9 > ../hanvon-`date +%Y%m%d`.tgz diff --git a/hanvon-libusb.c b/hanvon-libusb.c index bcb271c..429956b 100644 --- a/hanvon-libusb.c +++ b/hanvon-libusb.c @@ -19,9 +19,9 @@ #include #include -#include "hidapi/hidapi.h" -#include -#include +#include +#include +// #include #define STATE_SUCCESS 0 #define STATE_NOT_FOUND 1 @@ -70,6 +70,7 @@ struct hanvon { }; + int find_device(libusb_device **list, unsigned int count) { if (count < 0) { return -1; @@ -107,30 +108,83 @@ int find_device(libusb_device **list, unsigned int count) { return found; } +void display_packets(const unsigned char* buf) { + for(int i = 0; i < AM_PACKET_LEN; i++) { + printf("0x%x, ", buf[i]); + } + printf("\n"); +} + void callback(struct libusb_transfer *transfer) { unsigned char *data = transfer -> buffer; - for(int i = 0; i < 10; i++) { - printf("0x%x, ", data[i]); + display_packets(data); +} + +void callback_gp0504 (struct libusb_transfer *transfer) { // for callback + unsigned char *data = transfer -> buffer; + struct libevdev_uinput *ud = transfer -> user_data; + switch(data[0]) { + case 0x01: + break; + case 0x02: + if((data[1] & 0xf0) != 0) { + ; +// libevdev_uinput_write_event(ud, ABS_X, ) + } + break; + default: + display_packets(data); + break; } - printf("placeholder\n"); +} + +// determine which callback devices to use and how to initialize libevdev +int init_ctrl(struct libusb_device * const d, struct libevdev * evdev, struct libevdev_uinput *uidev) { + int is_ok = 0; + if (d == NULL) { + return is_ok; + } + struct libusb_device_descriptor desc; + libusb_get_device_descriptor(d, &desc); + evdev = libevdev_new(); + switch(desc.idProduct) { + default: // every tablet has these features - allow fall through + libevdev_enable_event_type(evdev, EV_ABS); // enable absolute position + libevdev_enable_event_type(evdev, EV_KEY); // enable pen button + libevdev_enable_event_code(evdev, EV_KEY, BTN_LEFT, NULL); // pen tap + libevdev_enable_event_code(evdev, EV_KEY, BTN_RIGHT, NULL); // pen button + case PRODUCT_ID_GP0906: + break; + case PRODUCT_ID_APPIV0906: + break; + case PRODUCT_ID_GP0504: + libevdev_set_name(evdev, "Hanvon Graphicpal GP0504"); + break; + } + int err = libevdev_uinput_create_from_device(evdev, LIBEVDEV_UINPUT_OPEN_MANAGED, &uidev); + if (err == 0) { + is_ok = 1; + } + return is_ok; } int handle_device_lusb(libusb_device *d) { libusb_device_handle *h; int status = libusb_open(d, &h); - if (status < 0 || h == NULL) { printf("Error opening device, %i.\n", status); libusb_exit(NULL); return 0; } - // Wait and handle interrupts? - struct libusb_transfer *tx; + struct libevdev *evdev = NULL; + struct libevdev_uinput *uidev = NULL; + init_ctrl(d, evdev, uidev); + struct libusb_transfer *tx; const int ENDPOINT_ADDR = 0x81; // bEndpointAddress from lsusb -v - const unsigned int LEN = 10; // wMaxPacketSize from lsusb -v - unsigned char buffer[LEN]; +// AM_PACKET_LEN = 10; // wMaxPacketSize from lsusb -v + unsigned char buffer[AM_PACKET_LEN]; // Allocate memory for transfer, configure, then submit tx = libusb_alloc_transfer(0); @@ -138,10 +192,10 @@ int handle_device_lusb(libusb_device *d) { h, ENDPOINT_ADDR, buffer, - LEN, + AM_PACKET_LEN, callback, - NULL, - 130); // timeout in milliseconds + uidev, // extra data to send in tx + 130); // timeout in milliseconds do { status = libusb_submit_transfer(tx); if (status < 0 ) { @@ -149,6 +203,7 @@ int handle_device_lusb(libusb_device *d) { } libusb_handle_events(NULL); } while (1); + libevdev_uinput_destroy(uidev); return 0; } @@ -179,27 +234,7 @@ int main() } libusb_device *device = devs[index]; libusb_free_device_list (devs, UNREF_DEVICE); - - int res = hid_init(); - hid_device *handle = hid_open(VENDOR_ID_HANVON, PRODUCT_ID_GP0504, NULL); - if (handle != NULL) { - // wchar_t wstr[80]; - // setlocale(LC_CTYPE, ""); - unsigned char buf[10]; - res = hid_read(handle, buf, 10); - for (unsigned int i = 0; i < 10; i++) { - printf("0x%x, ", buf[i]); - } - } else { - printf("hidapi: Could not open device\n"); - } - hid_close(handle); - res = hid_exit(); - - - int s = handle_device_lusb(device); - libusb_exit(NULL); return 0; }