From bd4495ec0157df9f0e9f1148580256afa705cdff Mon Sep 17 00:00:00 2001 From: Alexander Ponyatykh Date: Sun, 17 Nov 2019 14:28:42 +0300 Subject: [PATCH] Fix transfer error handling --- debian/changelog | 2 +- ...from-legacy-libusb-0.1-to-libusb-1.0.patch | 152 ++++++++++-------- 2 files changed, 90 insertions(+), 64 deletions(-) diff --git a/debian/changelog b/debian/changelog index 3edcc35..45ccc3d 100644 --- a/debian/changelog +++ b/debian/changelog @@ -3,7 +3,7 @@ libg15 (1.3.0~svn324-2) unstable; urgency=medium * Migrate from legacy libusb-0.1 to libusb-1.0 (closes: bug#810409, bug#611649). - -- Alexander Ponyatykh Sun, 17 Nov 2019 03:14:55 +0300 + -- Alexander Ponyatykh Sun, 17 Nov 2019 14:29:55 +0300 libg15 (1.3.0~svn324-1) unstable; urgency=medium diff --git a/debian/patches/02-Migrate-from-legacy-libusb-0.1-to-libusb-1.0.patch b/debian/patches/02-Migrate-from-legacy-libusb-0.1-to-libusb-1.0.patch index e728f9d..aee2cc4 100644 --- a/debian/patches/02-Migrate-from-legacy-libusb-0.1-to-libusb-1.0.patch +++ b/debian/patches/02-Migrate-from-legacy-libusb-0.1-to-libusb-1.0.patch @@ -4,12 +4,14 @@ Subject: Migrate from legacy libusb-0.1 to libusb-1.0 --- configure.in | 5 +- - libg15.c | 476 +++++++++++++++++++++++++++++------------------------------ - 2 files changed, 234 insertions(+), 247 deletions(-) + libg15.c | 504 +++++++++++++++++++++++++++++------------------------------ + 2 files changed, 249 insertions(+), 260 deletions(-) +diff --git a/configure.in b/configure.in +index 074d98e..b533d2c 100644 --- a/configure.in +++ b/configure.in -@@ -31,7 +31,8 @@ +@@ -31,7 +31,8 @@ case $host_os in esac # Checks for libraries. @@ -19,7 +21,7 @@ Subject: Migrate from legacy libusb-0.1 to libusb-1.0 dnl Some versions of libusb do not honour timeout and block. Suns' version is one of them. if test "x$libusb_blocks" == "xtrue"; then -@@ -41,7 +42,7 @@ +@@ -41,7 +42,7 @@ fi # Checks for header files. AC_HEADER_STDC AC_CHECK_HEADERS([string.h]) @@ -28,6 +30,8 @@ Subject: Migrate from legacy libusb-0.1 to libusb-1.0 # Checks for typedefs, structures, and compiler characteristics. AC_C_CONST +diff --git a/libg15.c b/libg15.c +index ba1c94b..ba01ae0 100644 --- a/libg15.c +++ b/libg15.c @@ -24,20 +24,21 @@ @@ -55,7 +59,7 @@ Subject: Migrate from legacy libusb-0.1 to libusb-1.0 /* to add a new device, simply create a new DEVICE() in this list */ /* Fields are: "Name",VendorID,ProductID,Capabilities */ -@@ -67,7 +68,9 @@ +@@ -67,7 +68,9 @@ int g15DeviceCapabilities() { void libg15Debug(int option) { libg15_debugging_enabled = option; @@ -66,7 +70,7 @@ Subject: Migrate from legacy libusb-0.1 to libusb-1.0 } /* debugging wrapper */ -@@ -86,191 +89,207 @@ +@@ -86,191 +89,207 @@ static int g15_log (FILE *fd, unsigned int level, const char *fmt, ...) { /* return number of connected and supported devices */ int g15NumberOfConnectedDevices() { @@ -110,13 +114,13 @@ Subject: Migrate from legacy libusb-0.1 to libusb-1.0 static int initLibUsb() { - usb_init(); -+ int errcode = libusb_init(&libg15_libusb_context); - +- - /** - * usb_find_busses and usb_find_devices both report the number of devices - * / busses added / removed since the last call. since this is the first - * call we have to return values != 0 or else we didnt find anything */ -- ++ int errcode = libusb_init(&libg15_libusb_context); + - if (!usb_find_busses()) + if (errcode != 0) + { @@ -148,17 +152,17 @@ Subject: Migrate from legacy libusb-0.1 to libusb-1.0 + int ret; + + ssize_t cnt = libusb_get_device_list(libg15_libusb_context, &list); - -- for (bus = usb_busses; bus; bus = bus->next) ++ + if (cnt < 0) - { -- for (dev = bus->devices; dev; dev = dev->next) ++ { + g15_log(stderr, G15_LOG_INFO, "Unable to list USB devices: %s\n", libusb_strerror(cnt)); + return 0; + } -+ + +- for (bus = usb_busses; bus; bus = bus->next) + for (ssize_t devno = 0; devno < cnt; devno++) -+ { + { +- for (dev = bus->devices; dev; dev = dev->next) + libusb_get_device_descriptor(list[devno], &desc); + if (desc.idVendor == handled_device.vendorid && desc.idProduct == handled_device.productid) { @@ -187,40 +191,40 @@ Subject: Migrate from legacy libusb-0.1 to libusb-1.0 + break; + } + } -+ + +- usleep(50*1000); + if (!dev) { + libusb_free_device_list(list, 1); + return 0; + } -+ -+ found_devicetype = device_index; -+ -+ g15_log(stderr,G15_LOG_INFO,"Found %s, trying to open it\n",handled_device.name); - -- usleep(50*1000); -+ ret = libusb_open(dev, &devh); -+ libusb_free_device_list(list, 1); - g15_log(stderr, G15_LOG_INFO, "Device has %i possible configurations\n",dev->descriptor.bNumConfigurations); ++ found_devicetype = device_index; + +- /* if device is shared with another driver, such as the Z-10 speakers sharing with alsa, we have to disable some calls */ +- if(g15DeviceCapabilities() & G15_DEVICE_IS_SHARED) +- shared_device = 1; ++ g15_log(stderr,G15_LOG_INFO,"Found %s, trying to open it\n",handled_device.name); ++ ++ ret = libusb_open(dev, &devh); ++ libusb_free_device_list(list, 1); ++ + if (ret || !devh) + { + g15_log(stderr,G15_LOG_INFO, "Error, could not open the keyboard: %s\n", libusb_strerror(ret)); + return 0; + } -+ -+ usleep(50*1000); -+ -+ g15_log(stderr, G15_LOG_INFO, "Device has %i possible configurations\n", desc.bNumConfigurations); - -- /* if device is shared with another driver, such as the Z-10 speakers sharing with alsa, we have to disable some calls */ -- if(g15DeviceCapabilities() & G15_DEVICE_IS_SHARED) -- shared_device = 1; -+ /* if device is shared with another driver, such as the Z-10 speakers sharing with alsa, we have to disable some calls */ -+ if(g15DeviceCapabilities() & G15_DEVICE_IS_SHARED) -+ shared_device = 1; - for (j = 0; jdescriptor.bNumConfigurations;j++){ - struct usb_config_descriptor *cfg = &dev->config[j]; ++ usleep(50*1000); ++ ++ g15_log(stderr, G15_LOG_INFO, "Device has %i possible configurations\n", desc.bNumConfigurations); ++ ++ /* if device is shared with another driver, such as the Z-10 speakers sharing with alsa, we have to disable some calls */ ++ if(g15DeviceCapabilities() & G15_DEVICE_IS_SHARED) ++ shared_device = 1; ++ + for (int j = 0; j < desc.bNumConfigurations; j++) + { + struct libusb_config_descriptor *cfg; @@ -232,16 +236,16 @@ Subject: Migrate from legacy libusb-0.1 to libusb-1.0 + { + if (i==G510_STANDARD_KEYBOARD_INTERFACE) continue; + } - -- for (i=0;ibNumInterfaces; i++){ -- if (g15DeviceCapabilities()&G15_DEVICE_G510){ -- if (i==G510_STANDARD_KEYBOARD_INTERFACE) continue; ++ + const struct libusb_interface *ifp = &cfg->interface[i]; + /* if endpoints are already known, finish up */ + if (g15_keys_endpoint && g15_lcd_endpoint) + break; + g15_log(stderr, G15_LOG_INFO, "Device has %i Alternate Settings\n", ifp->num_altsetting); -+ + +- for (i=0;ibNumInterfaces; i++){ +- if (g15DeviceCapabilities()&G15_DEVICE_G510){ +- if (i==G510_STANDARD_KEYBOARD_INTERFACE) continue; + for (int k=0; k < ifp->num_altsetting; k++) + { + const struct libusb_interface_descriptor *as = &ifp->altsetting[k]; @@ -418,7 +422,7 @@ Subject: Migrate from legacy libusb-0.1 to libusb-1.0 int i; for (i=0; g15_devices[i].name !=NULL ;i++){ g15_log(stderr,G15_LOG_INFO,"Trying to find %s\n",g15_devices[i].name); -@@ -288,19 +307,13 @@ +@@ -288,19 +307,13 @@ static int closeKeyboardDevice() { int retval = G15_NO_ERROR; @@ -443,7 +447,7 @@ Subject: Migrate from legacy libusb-0.1 to libusb-1.0 keyboard_device=0; return retval; } -@@ -311,9 +324,6 @@ +@@ -311,9 +324,6 @@ int re_initLibG15() { closeKeyboardDevice(); @@ -453,7 +457,7 @@ Subject: Migrate from legacy libusb-0.1 to libusb-1.0 keyboard_device = findAndOpenG15(); if (!keyboard_device) return G15_ERROR_OPENING_USB_DEVICE; -@@ -330,10 +340,6 @@ +@@ -330,10 +340,6 @@ int initLibG15() g15_log(stderr,G15_LOG_INFO,"%s\n",PACKAGE_STRING); @@ -464,7 +468,7 @@ Subject: Migrate from legacy libusb-0.1 to libusb-1.0 g15NumberOfConnectedDevices(); keyboard_device = findAndOpenG15(); -@@ -347,7 +353,9 @@ +@@ -347,7 +353,9 @@ int initLibG15() int exitLibG15() { pthread_mutex_destroy(&libusb_mutex); @@ -475,7 +479,7 @@ Subject: Migrate from legacy libusb-0.1 to libusb-1.0 } static void dumpPixmapIntoLCDFormat(unsigned char *lcd_buffer, unsigned char const *data) -@@ -428,36 +436,6 @@ +@@ -428,36 +436,6 @@ static void dumpPixmapIntoLCDFormat(unsigned char *lcd_buffer, unsigned char con } } @@ -512,7 +516,7 @@ Subject: Migrate from legacy libusb-0.1 to libusb-1.0 int writePixmapToLCD(unsigned char const *data) { int ret = 0; -@@ -474,43 +452,27 @@ +@@ -474,43 +452,27 @@ int writePixmapToLCD(unsigned char const *data) /* the keyboard needs this magic byte */ lcd_buffer[0] = 0x03; @@ -574,7 +578,7 @@ Subject: Migrate from legacy libusb-0.1 to libusb-1.0 return 0; } -@@ -535,7 +497,9 @@ +@@ -535,7 +497,9 @@ int setLCDContrast(unsigned int level) usb_data[3] = 18; } pthread_mutex_lock(&libusb_mutex); @@ -585,7 +589,7 @@ Subject: Migrate from legacy libusb-0.1 to libusb-1.0 pthread_mutex_unlock(&libusb_mutex); return retval; } -@@ -553,7 +517,9 @@ +@@ -553,7 +517,9 @@ int setLEDs(unsigned int leds) return G15_ERROR_UNSUPPORTED; pthread_mutex_lock(&libusb_mutex); @@ -596,7 +600,7 @@ Subject: Migrate from legacy libusb-0.1 to libusb-1.0 pthread_mutex_unlock(&libusb_mutex); return retval; } -@@ -578,7 +544,9 @@ +@@ -578,7 +544,9 @@ int setLCDBrightness(unsigned int level) usb_data[2] = 0x00; } pthread_mutex_lock(&libusb_mutex); @@ -607,7 +611,7 @@ Subject: Migrate from legacy libusb-0.1 to libusb-1.0 pthread_mutex_unlock(&libusb_mutex); return retval; } -@@ -604,7 +572,9 @@ +@@ -604,7 +572,9 @@ int setKBBrightness(unsigned int level) usb_data[2] = 0x0; } pthread_mutex_lock(&libusb_mutex); @@ -618,7 +622,7 @@ Subject: Migrate from legacy libusb-0.1 to libusb-1.0 pthread_mutex_unlock(&libusb_mutex); return retval; } -@@ -619,7 +589,9 @@ +@@ -619,7 +589,9 @@ int setG510LEDColor(unsigned char r, unsigned char g, unsigned char b) usb_data[3] = b; pthread_mutex_lock(&libusb_mutex); @@ -629,7 +633,7 @@ Subject: Migrate from legacy libusb-0.1 to libusb-1.0 pthread_mutex_unlock(&libusb_mutex); return retval; } -@@ -1033,18 +1005,30 @@ +@@ -1033,38 +1005,54 @@ static void processKeyEvent4Byte(unsigned int *pressed_keys, unsigned char *buff int getPressedKeys(unsigned int *pressed_keys, unsigned int timeout) { unsigned char buffer[G15_KEY_READ_LENGTH]; @@ -661,26 +665,48 @@ Subject: Migrate from legacy libusb-0.1 to libusb-1.0 + //no break + default: + g15_log(stderr,G15_LOG_INFO,"USB error on keybaord read: %s.\n", libusb_strerror(ret)); ++ return G15_ERROR_READING_USB_DEVICE; + } + + if (transferred > 0 && buffer[0] == 1) { return G15_ERROR_TRY_AGAIN; } -@@ -1054,7 +1038,7 @@ - return G15_NO_ERROR; + caps = g15DeviceCapabilities(); +- if((caps & G15_DEVICE_G13) && buffer[0]==0x25){ +- processKeyEventG13(pressed_keys, buffer); +- return G15_NO_ERROR; ++ if ((caps & G15_DEVICE_G13) && buffer[0]==0x25) ++ { ++ processKeyEventG13(pressed_keys, buffer); ++ return G15_NO_ERROR; } - switch(ret) { -+ switch(transferred) { - case 4: - processKeyEvent4Byte(pressed_keys, buffer); - return G15_NO_ERROR; -@@ -1065,6 +1049,6 @@ - processKeyEvent9Byte(pressed_keys, buffer); - return G15_NO_ERROR; - default: +- case 4: +- processKeyEvent4Byte(pressed_keys, buffer); +- return G15_NO_ERROR; +- case 5: +- processKeyEvent5Byte(pressed_keys, buffer); +- return G15_NO_ERROR; +- case 9: +- processKeyEvent9Byte(pressed_keys, buffer); +- return G15_NO_ERROR; +- default: - return handle_usb_errors("Keyboard Read", ret); /* allow the app to deal with errors */ -+ return G15_ERROR_READING_USB_DEVICE; ++ switch (transferred) ++ { ++ case 4: ++ processKeyEvent4Byte(pressed_keys, buffer); ++ return G15_NO_ERROR; ++ case 5: ++ processKeyEvent5Byte(pressed_keys, buffer); ++ return G15_NO_ERROR; ++ case 9: ++ processKeyEvent9Byte(pressed_keys, buffer); ++ return G15_NO_ERROR; ++ default: ++ g15_log(stderr, G15_LOG_INFO,"USB error on keybaord read: unsupported packet size.\n"); ++ return G15_ERROR_READING_USB_DEVICE; } }