Migrate from legacy libusb-0.1 to libusb-1.0

This commit is contained in:
Alexander Ponyatykh committed 2019-11-17 00:21:34 +03:00
1 parent 9bccbfa208
commit 92e60dd1a4
6 files changed
+702 -9

No files matched your search

+7
View File
@@ -1,3 +1,10 @@
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 <lazyranma@gmail.com> Sun, 17 Nov 2019 00:17:00 +0300
libg15 (1.3.0~svn324-1) unstable; urgency=medium libg15 (1.3.0~svn324-1) unstable; urgency=medium
* New upstream version 1.3.0~svn324. * New upstream version 1.3.0~svn324.
+2 -2
View File
@@ -2,7 +2,7 @@ Source: libg15
Section: libs Section: libs
Priority: optional Priority: optional
Maintainer: Alexander Ponyatykh <lazyranma@gmail.com> Maintainer: Alexander Ponyatykh <lazyranma@gmail.com>
Build-Depends: debhelper (>=12), libusb-dev Build-Depends: debhelper (>=12), libusb-1.0-0-dev (>=2:1.0.22)
Standards-Version: 4.4.1 Standards-Version: 4.4.1
Homepage: https://sourceforge.net/projects/g15tools/ Homepage: https://sourceforge.net/projects/g15tools/
Vcs-Git: https://salsa.debian.org/debian/libg15.git Vcs-Git: https://salsa.debian.org/debian/libg15.git
@@ -11,7 +11,7 @@ Vcs-Browser: https://salsa.debian.org/debian/libg15
Package: libg15-1 Package: libg15-1
Architecture: any Architecture: any
Multi-Arch: same Multi-Arch: same
Depends: ${shlibs:Depends}, ${misc:Depends} Depends: libusb-1.0-0 (>=2:1.0.22), ${shlibs:Depends}, ${misc:Depends}
Description: Library for interfacing with the Logitech G15 keyboards Description: Library for interfacing with the Logitech G15 keyboards
libg15 provides an API for low level control of the LCD display and libg15 provides an API for low level control of the LCD display and
the extra keys on some Logitech keyboards (G11, G15) the extra keys on some Logitech keyboards (G11, G15)
+13 -4
View File
@@ -1,12 +1,21 @@
Description: fix re_initLibG15() to properly reset internal state. From: Alexander Ponyatykh <lazyranma@gmail.com>
Author: Alexander Ponyatykh <lazyranma@gmail.com> Date: Fri, 15 Nov 2019 02:19:01 +0300
Subject: fix re_initLibG15() to properly reset internal state.
Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/libusb/+bug/1357556 Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/libusb/+bug/1357556
Forwarded: no Forwarded: no
Last-Update: 2015-05-17 Last-Update: 2015-05-17
=================================================================== ===================================================================
---
libg15.c | 55 ++++++++++++++++++++++++++++---------------------------
1 file changed, 28 insertions(+), 27 deletions(-)
diff --git a/libg15.c b/libg15.c
index 31b2bd6..369ed40 100644
--- a/libg15.c --- a/libg15.c
+++ b/libg15.c +++ b/libg15.c
@@ -283,19 +283,36 @@ @@ -283,19 +283,36 @@ static usb_dev_handle * findAndOpenG15() {
return keyboard_device; return keyboard_device;
} }
@@ -52,7 +61,7 @@ Last-Update: 2015-05-17
keyboard_device = findAndOpenG15(); keyboard_device = findAndOpenG15();
if (!keyboard_device) if (!keyboard_device)
@@ -327,28 +344,12 @@ @@ -327,28 +344,12 @@ int initLibG15()
return retval; return retval;
} }
@@ -1,6 +1,16 @@
From: Alexander Ponyatykh <lazyranma@gmail.com>
Date: Fri, 15 Nov 2019 02:19:01 +0300
Subject: fix spelling error
---
libg15.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/libg15.c b/libg15.c
index 369ed40..ba1c94b 100644
--- a/libg15.c --- a/libg15.c
+++ b/libg15.c +++ b/libg15.c
@@ -152,7 +152,7 @@ @@ -152,7 +152,7 @@ static usb_dev_handle * findAndOpenDevice(libg15_devices_t handled_device, int d
if (!devh) if (!devh)
{ {
g15_log(stderr,G15_LOG_INFO, "Error, could not open the keyboard\n"); g15_log(stderr,G15_LOG_INFO, "Error, could not open the keyboard\n");
@@ -9,7 +19,7 @@
return 0; return 0;
} }
@@ -434,7 +434,7 @@ @@ -434,7 +434,7 @@ int handle_usb_errors(const char *prefix, int ret) {
case -ETIMEDOUT: case -ETIMEDOUT:
return G15_ERROR_READING_USB_DEVICE; /* backward-compatibility */ return G15_ERROR_READING_USB_DEVICE; /* backward-compatibility */
break; break;
@@ -0,0 +1,666 @@
From: Alexander Ponyatykh <lazyranma@gmail.com>
Date: Fri, 15 Nov 2019 08:46:54 +0300
Subject: Migrate from legacy libusb-0.1 to libusb-1.0
---
configure.in | 5 +-
libg15.c | 458 ++++++++++++++++++++++++++++-------------------------------
2 files changed, 222 insertions(+), 241 deletions(-)
--- a/configure.in
+++ b/configure.in
@@ -31,7 +31,8 @@
esac
# Checks for libraries.
-AC_CHECK_LIB([usb], [main], ,AC_MSG_ERROR(["libusb not found. please install it"]))
+AC_CHECK_LIB([usb-1.0], [main], ,AC_MSG_ERROR(["libusb-1.0 not found. Please install it."]))
+AC_CHECK_LIB([usb-1.0], [libusb_set_option], ,AC_MSG_ERROR(["libusb-1.0 is too old. Please upgrade to version 1.0.22 or later."]))
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 @@
# Checks for header files.
AC_HEADER_STDC
AC_CHECK_HEADERS([string.h])
-AC_CHECK_HEADERS([usb.h])
+AC_CHECK_HEADERS([libusb-1.0/libusb.h])
# Checks for typedefs, structures, and compiler characteristics.
AC_C_CONST
--- a/libg15.c
+++ b/libg15.c
@@ -24,14 +24,14 @@
#include "libg15.h"
#include <stdio.h>
#include <stdarg.h>
-#include <usb.h>
+#include <libusb-1.0/libusb.h>
#include <string.h>
#include <errno.h>
+#include <unistd.h>
#include "config.h"
-static usb_dev_handle *keyboard_device = 0;
+static libusb_device_handle *keyboard_device = 0;
static int libg15_debugging_enabled = 0;
-static int enospc_slowdown = 0;
static int found_devicetype = -1;
static int shared_device = 0;
@@ -67,7 +67,8 @@
void libg15Debug(int option) {
libg15_debugging_enabled = option;
- usb_set_debug(option);
+ if (option)
+ libusb_set_option(NULL, LIBUSB_OPTION_LOG_LEVEL, LIBUSB_LOG_LEVEL_DEBUG);
}
/* debugging wrapper */
@@ -86,191 +87,205 @@
/* return number of connected and supported devices */
int g15NumberOfConnectedDevices() {
- struct usb_bus *bus = 0;
- struct usb_device *dev = 0;
- int i=0;
+ struct libusb_device_descriptor desc;
+ libusb_device **list;
unsigned int found = 0;
- for (i=0; g15_devices[i].name !=NULL;i++)
- for (bus = usb_busses; bus; bus = bus->next)
+ ssize_t cnt = libusb_get_device_list(NULL, &list);
+
+ if (cnt < 0)
+ {
+ g15_log(stderr, G15_LOG_WARN, "Unable to list USB devices: %s\n", libusb_strerror(cnt));
+ return 0;
+ }
+
+ for (ssize_t i = 0; i < cnt; i++)
{
- for (dev = bus->devices; dev; dev = dev->next)
+ libusb_get_device_descriptor(list[i], &desc);
+
+ for (int j = 0; g15_devices[i].name != NULL; j++)
{
- if ((dev->descriptor.idVendor == g15_devices[i].vendorid && dev->descriptor.idProduct == g15_devices[i].productid))
+ if ((desc.idVendor == g15_devices[j].vendorid && desc.idProduct == g15_devices[j].productid))
found++;
+ break;
}
}
+
+ libusb_free_device_list(list, 1);
+
g15_log(stderr,G15_LOG_INFO,"Found %i supported devices\n",found);
return found;
}
static int initLibUsb()
{
- usb_init();
-
- /**
- * 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(NULL);
- if (!usb_find_busses())
- return G15_ERROR_OPENING_USB_DEVICE;
-
- if (!usb_find_devices())
+ if (errcode != 0)
+ {
+ g15_log(stderr, G15_LOG_WARN, "Failed to initialize libusb-1.0: %s\n", libusb_strerror(errcode));
return G15_ERROR_OPENING_USB_DEVICE;
+ }
return G15_NO_ERROR;
}
-static usb_dev_handle * findAndOpenDevice(libg15_devices_t handled_device, int device_index)
+static libusb_device_handle * findAndOpenDevice(libg15_devices_t handled_device, int device_index)
{
- struct usb_bus *bus = 0;
- struct usb_device *dev = 0;
- int retries=0;
- int j,i,k,l;
- int interface=0;
+ struct libusb_device_descriptor desc;
+ libusb_device_handle *devh = 0;
+ libusb_device **list = 0;
+ libusb_device *dev = 0;
+ int interface = 0;
+ int retries = 0;
+ int ret;
+
+ ssize_t cnt = libusb_get_device_list(NULL, &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_WARN, "Unable to list USB devices: %s\n", libusb_strerror(cnt));
+ return 0;
+ }
+
+ for (ssize_t devno = 0; devno < cnt; devno++)
+ {
+ libusb_get_device_descriptor(list[devno], &desc);
+ if (desc.idVendor == handled_device.vendorid && desc.idProduct == handled_device.productid)
{
- if ((dev->descriptor.idVendor == handled_device.vendorid && dev->descriptor.idProduct == handled_device.productid))
- {
- int ret=0;
- char name_buffer[65535];
- name_buffer[0] = 0;
- usb_dev_handle *devh = 0;
- found_devicetype = device_index;
- g15_log(stderr,G15_LOG_INFO,"Found %s, trying to open it\n",handled_device.name);
-#if 0
- devh = usb_open(dev);
- usb_reset(devh);
- usleep(50*1000);
- usb_close(devh);
-#endif
- devh = usb_open(dev);
- if (!devh)
- {
- g15_log(stderr,G15_LOG_INFO, "Error, could not open the keyboard\n");
- g15_log(stderr,G15_LOG_INFO, "Perhaps you don't have enough permissions to access it\n");
- return 0;
- }
+ dev = list[devno];
+ break;
+ }
+ }
+
+ 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);
+ if (ret || !devh)
+ {
+ g15_log(stderr,G15_LOG_WARN, "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; j<dev->descriptor.bNumConfigurations;j++){
- struct usb_config_descriptor *cfg = &dev->config[j];
+ for (int j = 0; j < desc.bNumConfigurations; j++)
+ {
+ struct libusb_config_descriptor *cfg;
+ if (libusb_get_config_descriptor(dev, j, &cfg)) continue;
+
+ for (int i = 0; i < cfg->bNumInterfaces; i++)
+ {
+ if (g15DeviceCapabilities() & G15_DEVICE_G510)
+ {
+ if (i==G510_STANDARD_KEYBOARD_INTERFACE) continue;
+ }
- for (i=0;i<cfg->bNumInterfaces; 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 (int k=0; k < ifp->num_altsetting; k++)
+ {
+ const struct libusb_interface_descriptor *as = &ifp->altsetting[k];
+ /* verify that the interface is for a HID device */
+ if (as->bInterfaceClass == LIBUSB_CLASS_HID)
+ {
+ g15_log(stderr, G15_LOG_INFO, "Interface %i has %i Endpoints\n", i, as->bNumEndpoints);
+ usleep(50*1000);
+
+ if (libusb_kernel_driver_active(devh, i) == 1)
+ {
+ g15_log(stderr, G15_LOG_INFO, "Trying to detach driver currently attached.\n");
+
+ ret = libusb_detach_kernel_driver(devh, i);
+ if (!ret)
+ {
+ g15_log(stderr,G15_LOG_INFO,"Success, detached the driver\n");
+ }
+ else
+ {
+ g15_log(stderr,G15_LOG_INFO,"Could not detach the driver, giving up: %s\n", libusb_strerror(ret));
+ break;
}
- struct usb_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(k=0;k<ifp->num_altsetting;k++){
- struct usb_interface_descriptor *as = &ifp->altsetting[k];
- /* verify that the interface is for a HID device */
- if(as->bInterfaceClass==USB_CLASS_HID){
- g15_log(stderr, G15_LOG_INFO, "Interface %i has %i Endpoints\n", i, as->bNumEndpoints);
- usleep(50*1000);
- /* libusb functions ending in _np are not portable between OS's
- * Non-linux users will need some way to detach the HID driver from
- * the G15 until we work out how to do this for other OS's automatically.
- * For the moment, we just skip this code..
- */
-#ifdef LIBUSB_HAS_GET_DRIVER_NP
- ret = usb_get_driver_np(devh, i, name_buffer, 65535);
- /* some kernel versions say that a driver is attached even though there is none
- in this case the name buffer has not been changed
- thanks to RobEngle for pointing this out */
- if (!ret && name_buffer[0])
- {
- g15_log(stderr,G15_LOG_INFO,"Trying to detach driver currently attached: \"%s\"\n",name_buffer);
-
- ret = usb_detach_kernel_driver_np(devh, i);
- if (!ret)
- {
- g15_log(stderr,G15_LOG_INFO,"Success, detached the driver\n");
- }
- else
- {
- g15_log(stderr,G15_LOG_INFO,"Sorry, I could not detach the driver, giving up\n");
- return 0;
- }
-
- }
-#endif
- /* don't set configuration if device is shared */
- if(0 == shared_device) {
- ret = usb_set_configuration(devh, 1);
- if (ret)
- {
- g15_log(stderr,G15_LOG_INFO,"Error setting the configuration, this is fatal\n");
- return 0;
- }
- }
- usleep(50*1000);
- while((ret = usb_claim_interface(devh,i)) && retries <10) {
- usleep(50*1000);
- retries++;
- g15_log(stderr,G15_LOG_INFO,"Trying to claim interface\n");
- }
-
- if (ret)
- {
- g15_log(stderr,G15_LOG_INFO,"Error claiming interface, good day cruel world\n");
- return 0;
- }
-
- for (l=0; l< as->bNumEndpoints;l++){
- struct usb_endpoint_descriptor *ep=&as->endpoint[l];
- g15_log(stderr, G15_LOG_INFO, "Found %s endpoint %i with address 0x%X maxtransfersize=%i \n",
- 0x80&ep->bEndpointAddress?"\"Extra Keys\"":"\"LCD\"",
- ep->bEndpointAddress&0x0f,ep->bEndpointAddress, ep->wMaxPacketSize
- );
-
- if(0x80 & ep->bEndpointAddress) {
- g15_keys_endpoint = ep->bEndpointAddress;
- } else {
- g15_lcd_endpoint = ep->bEndpointAddress;
- }
-#if 0
- usb_resetep(devh,ep->bEndpointAddress);
-#endif
- }
-
- if (ret)
- {
- g15_log(stderr, G15_LOG_INFO, "Error setting Alternate Interface\n");
- }
- }
+ }
+ /* don't set configuration if device is shared */
+ if (0 == shared_device) {
+ ret = libusb_set_configuration(devh, 1);
+ if (ret)
+ {
+ g15_log(stderr,G15_LOG_INFO,"Error setting the configuration, this is fatal: %s\n", libusb_strerror(ret));
+ break;
}
}
- }
+ usleep(50*1000);
+ while((ret = libusb_claim_interface(devh,i)) && retries <10) {
+ usleep(50*1000);
+ retries++;
+ g15_log(stderr,G15_LOG_INFO,"Trying to claim interface\n");
+ }
+ if (ret)
+ {
+ g15_log(stderr,G15_LOG_INFO,"Error claiming interface, good day cruel world: %s\n", libusb_strerror(ret));
+ break;
+ }
- g15_log(stderr,G15_LOG_INFO,"Done opening the keyboard\n");
- usleep(500*1000); // sleep a bit for good measure
- return devh;
+ for (int l = 0; l < as->bNumEndpoints; l++)
+ {
+ const struct libusb_endpoint_descriptor *ep=&as->endpoint[l];
+ g15_log(stderr, G15_LOG_INFO, "Found %s endpoint %i with address 0x%X maxtransfersize=%i \n",
+ 0x80&ep->bEndpointAddress?"\"Extra Keys\"":"\"LCD\"",
+ ep->bEndpointAddress&0x0f,ep->bEndpointAddress, ep->wMaxPacketSize
+ );
+
+ if(0x80 & ep->bEndpointAddress)
+ {
+ g15_keys_endpoint = ep->bEndpointAddress;
+ } else {
+ g15_lcd_endpoint = ep->bEndpointAddress;
+ }
+ }
+ }
}
}
+
+ libusb_free_config_descriptor(cfg);
+ }
+
+ if (g15_keys_endpoint || g15_lcd_endpoint) {
+ g15_log(stderr,G15_LOG_INFO,"Done opening the keyboard\n");
+ usleep(500*1000); // sleep a bit for good measure
+ return devh;
+ } else {
+ found_devicetype = -1;
+ libusb_release_interface(devh, 0);
+ libusb_attach_kernel_driver(devh, 0);
+ libusb_close(devh);
+ return 0;
}
- return 0;
}
-static usb_dev_handle * findAndOpenG15() {
+static libusb_device_handle * findAndOpenG15() {
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 +303,13 @@
{
int retval = G15_NO_ERROR;
- enospc_slowdown = shared_device = g15_keys_endpoint = g15_lcd_endpoint = 0;
+ shared_device = g15_keys_endpoint = g15_lcd_endpoint = 0;
found_devicetype = -1;
- if (keyboard_device){
-#ifndef SUN_LIBUSB
- retval = usb_release_interface (keyboard_device, 0);
- usleep(50*1000);
-#endif
-#if 0
- retval = usb_reset(keyboard_device);
- usleep(50*1000);
-#endif
- usb_close(keyboard_device);
+ if (keyboard_device) {
+ retval = libusb_release_interface(keyboard_device, 0);
+ libusb_attach_kernel_driver(keyboard_device, 0);
+ libusb_close(keyboard_device);
keyboard_device=0;
return retval;
}
@@ -311,9 +320,6 @@
{
closeKeyboardDevice();
- usb_find_busses();
- usb_find_devices();
-
keyboard_device = findAndOpenG15();
if (!keyboard_device)
return G15_ERROR_OPENING_USB_DEVICE;
@@ -330,10 +336,6 @@
g15_log(stderr,G15_LOG_INFO,"%s\n",PACKAGE_STRING);
-#ifdef SUN_LIBUSB
- g15_log(stderr,G15_LOG_INFO,"Using Sun libusb.\n");
-#endif
-
g15NumberOfConnectedDevices();
keyboard_device = findAndOpenG15();
@@ -428,36 +430,6 @@
}
}
-int handle_usb_errors(const char *prefix, int ret) {
-
- switch (ret){
- case -ETIMEDOUT:
- return G15_ERROR_READING_USB_DEVICE; /* backward-compatibility */
- break;
- case -ENOSPC: /* the we don't have enough bandwidth, apparently.. something has to give here.. */
- g15_log(stderr,G15_LOG_INFO,"usb error: ENOSPC.. reducing speed\n");
- enospc_slowdown = 1;
- break;
- case -ENODEV: /* the device went away - we probably should attempt to reattach */
- case -ENXIO: /* host controller bug */
- case -EINVAL: /* invalid request */
- case -EAGAIN: /* try again */
- case -EFBIG: /* too many frames to handle */
- case -EMSGSIZE: /* msgsize is invalid */
- g15_log(stderr,G15_LOG_INFO,"usb error: %s %s (%i)\n",prefix,usb_strerror(),ret);
- break;
- case -EPIPE: /* endpoint is stalled */
- g15_log(stderr,G15_LOG_INFO,"usb error: %s EPIPE! clearing...\n",prefix);
- pthread_mutex_lock(&libusb_mutex);
- usb_clear_halt(keyboard_device, 0x81);
- pthread_mutex_unlock(&libusb_mutex);
- break;
- default: /* timed out */
- g15_log(stderr,G15_LOG_INFO,"Unknown usb error: %s !! (err is %i (%s))\n",prefix,ret,usb_strerror());
- }
- return ret;
-}
-
int writePixmapToLCD(unsigned char const *data)
{
int ret = 0;
@@ -474,43 +446,27 @@
/* the keyboard needs this magic byte */
lcd_buffer[0] = 0x03;
- /* in an attempt to reduce peak bus utilisation, we break the transfer into 32 byte chunks and sleep a bit in between.
- It shouldnt make much difference, but then again, the g15 shouldnt be flooding the bus enough to cause ENOSPC, yet
- apparently does on some machines...
- I'm not sure how successful this will be in combatting ENOSPC, but we'll give it try in the real-world. */
-
- if(enospc_slowdown != 0){
-#ifndef LIBUSB_BLOCKS
- pthread_mutex_lock(&libusb_mutex);
-#endif
- for(transfercount = 0;transfercount<=31;transfercount++){
- ret = usb_interrupt_write(keyboard_device, g15_lcd_endpoint, (char*)lcd_buffer+(32*transfercount), 32, 1000);
- if (ret != 32)
- {
- handle_usb_errors ("LCDPixmap Slow Write",ret);
- return G15_ERROR_WRITING_PIXMAP;
- }
- usleep(100);
+
+ /* transfer entire buffer in one hit */
+ int transferred = 0;
+ pthread_mutex_lock(&libusb_mutex);
+ ret = libusb_interrupt_transfer(keyboard_device, g15_lcd_endpoint, (char*)lcd_buffer, G15_BUFFER_LEN, &transferred, 1000);
+ pthread_mutex_unlock(&libusb_mutex);
+ if (ret || transferred != G15_BUFFER_LEN)
+ {
+ if (!ret) {
+ g15_log(stderr,G15_LOG_INFO,"LCDPixmap write error: short write.\n");
+ } else {
+ g15_log(stderr,G15_LOG_INFO,"LCDPixmap write error: %s.\n", libusb_strerror(ret));
}
-#ifndef LIBUSB_BLOCKS
- pthread_mutex_unlock(&libusb_mutex);
-#endif
- }else{
- /* transfer entire buffer in one hit */
-#ifdef LIBUSB_BLOCKS
- ret = usb_interrupt_write(keyboard_device, g15_lcd_endpoint, (char*)lcd_buffer, G15_BUFFER_LEN, 1000);
-#else
- pthread_mutex_lock(&libusb_mutex);
- ret = usb_interrupt_write(keyboard_device, g15_lcd_endpoint, (char*)lcd_buffer, G15_BUFFER_LEN, 1000);
- pthread_mutex_unlock(&libusb_mutex);
-#endif
- if (ret != G15_BUFFER_LEN)
- {
- handle_usb_errors ("LCDPixmap Write",ret);
- return G15_ERROR_WRITING_PIXMAP;
+ if (ret == LIBUSB_ERROR_PIPE) {
+ pthread_mutex_lock(&libusb_mutex);
+ libusb_clear_halt(keyboard_device, g15_lcd_endpoint);
+ pthread_mutex_unlock(&libusb_mutex);
}
- usleep(100);
+ return G15_ERROR_WRITING_PIXMAP;
}
+ usleep(100);
return 0;
}
@@ -535,7 +491,9 @@
usb_data[3] = 18;
}
pthread_mutex_lock(&libusb_mutex);
- retval = usb_control_msg(keyboard_device, USB_TYPE_CLASS + USB_RECIP_INTERFACE, 9, 0x302, 0, (char*)usb_data, 4, 10000);
+ retval = libusb_control_transfer(keyboard_device,
+ LIBUSB_REQUEST_TYPE_CLASS + LIBUSB_RECIPIENT_INTERFACE + LIBUSB_ENDPOINT_OUT,
+ 9, 0x302, 0, (char*)usb_data, 4, 10000);
pthread_mutex_unlock(&libusb_mutex);
return retval;
}
@@ -553,7 +511,9 @@
return G15_ERROR_UNSUPPORTED;
pthread_mutex_lock(&libusb_mutex);
- retval = usb_control_msg(keyboard_device, USB_TYPE_CLASS + USB_RECIP_INTERFACE, 9, 0x302, 0, (char*)m_led_buf, 4, 10000);
+ retval = libusb_control_transfer(keyboard_device,
+ LIBUSB_REQUEST_TYPE_CLASS + LIBUSB_RECIPIENT_INTERFACE + LIBUSB_ENDPOINT_OUT,
+ 9, 0x302, 0, (char*)m_led_buf, 4, 10000);
pthread_mutex_unlock(&libusb_mutex);
return retval;
}
@@ -578,7 +538,9 @@
usb_data[2] = 0x00;
}
pthread_mutex_lock(&libusb_mutex);
- retval = usb_control_msg(keyboard_device, USB_TYPE_CLASS + USB_RECIP_INTERFACE, 9, 0x302, 0, (char*)usb_data, 4, 10000);
+ retval = libusb_control_transfer(keyboard_device,
+ LIBUSB_REQUEST_TYPE_CLASS + LIBUSB_RECIPIENT_INTERFACE + LIBUSB_ENDPOINT_OUT,
+ 9, 0x302, 0, (char*)usb_data, 4, 10000);
pthread_mutex_unlock(&libusb_mutex);
return retval;
}
@@ -604,7 +566,9 @@
usb_data[2] = 0x0;
}
pthread_mutex_lock(&libusb_mutex);
- retval = usb_control_msg(keyboard_device, USB_TYPE_CLASS + USB_RECIP_INTERFACE, 9, 0x302, 0, (char*)usb_data, 4, 10000);
+ retval = libusb_control_transfer(keyboard_device,
+ LIBUSB_REQUEST_TYPE_CLASS + LIBUSB_RECIPIENT_INTERFACE + LIBUSB_ENDPOINT_OUT,
+ 9, 0x302, 0, (char*)usb_data, 4, 10000);
pthread_mutex_unlock(&libusb_mutex);
return retval;
}
@@ -619,7 +583,9 @@
usb_data[3] = b;
pthread_mutex_lock(&libusb_mutex);
- retval = usb_control_msg(keyboard_device, USB_TYPE_CLASS + USB_RECIP_INTERFACE, 9, 0x305, 1, (char*)usb_data, 4, 10000);
+ retval = libusb_control_transfer(keyboard_device,
+ LIBUSB_REQUEST_TYPE_CLASS + LIBUSB_RECIPIENT_INTERFACE + LIBUSB_ENDPOINT_OUT,
+ 9, 0x305, 1, (char*)usb_data, 4, 10000);
pthread_mutex_unlock(&libusb_mutex);
return retval;
}
@@ -1033,18 +999,30 @@
int getPressedKeys(unsigned int *pressed_keys, unsigned int timeout)
{
unsigned char buffer[G15_KEY_READ_LENGTH];
+ int transferred = 0;
int ret = 0;
int caps = 0;
-#ifdef LIBUSB_BLOCKS
- ret = usb_interrupt_read(keyboard_device, g15_keys_endpoint, (char*)buffer, G15_KEY_READ_LENGTH, timeout);
-#else
pthread_mutex_lock(&libusb_mutex);
- ret = usb_interrupt_read(keyboard_device, g15_keys_endpoint, (char*)buffer, G15_KEY_READ_LENGTH, timeout);
+ ret = libusb_interrupt_transfer(keyboard_device, g15_keys_endpoint, (char*)buffer, G15_KEY_READ_LENGTH, &transferred, timeout);
pthread_mutex_unlock(&libusb_mutex);
-#endif
- if(ret>0) {
- if(buffer[0] == 1)
+
+ switch (ret)
+ {
+ case 0:
+ break;
+ case LIBUSB_ERROR_TIMEOUT:
+ return G15_ERROR_TIMEOUT;
+ case LIBUSB_ERROR_PIPE:
+ pthread_mutex_lock(&libusb_mutex);
+ libusb_clear_halt(keyboard_device, g15_keys_endpoint);
+ pthread_mutex_unlock(&libusb_mutex);
+ //no break
+ default:
+ g15_log(stderr,G15_LOG_INFO,"USB error on keybaord read: %s.\n", libusb_strerror(ret));
+ }
+
+ if (transferred > 0 && buffer[0] == 1) {
return G15_ERROR_TRY_AGAIN;
}
@@ -1054,7 +1032,7 @@
return G15_NO_ERROR;
}
- switch(ret) {
+ switch(transferred) {
case 4:
processKeyEvent4Byte(pressed_keys, buffer);
return G15_NO_ERROR;
@@ -1065,6 +1043,6 @@
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;
}
}
+2 -1
View File
@@ -1,2 +1,3 @@
00-fix-reinit.patch 00-fix-reinit.patch
01-fix-spelling-error 01-fix-spelling.path
02-Migrate-from-legacy-libusb-0.1-to-libusb-1.0.patch