From 3f84e6db5460bda94ce3fc275c9e4ee0fd92b82a Mon Sep 17 00:00:00 2001 From: Giacomo Catenazzi Date: Mon, 29 Apr 2019 15:39:28 +0200 Subject: [PATCH] Import Upstream version 1.2.4 --- ChangeLog | 3 + README | 9 +- configure | 20 ++-- configure.in | 2 +- debian/changelog | 34 +++++++ debian/compat | 1 + debian/control | 21 +++++ debian/copyright | 12 +++ debian/docs | 2 + debian/libg15-dev.install | 6 ++ debian/libg15.install | 1 + debian/rules | 115 ++++++++++++++++++++++ libg15.c | 194 +++++++++++++++++++++++++++++++------- libg15.h | 3 +- rpm/libg15.spec | 4 +- 15 files changed, 377 insertions(+), 50 deletions(-) create mode 100644 debian/changelog create mode 100644 debian/compat create mode 100644 debian/control create mode 100644 debian/copyright create mode 100644 debian/docs create mode 100644 debian/libg15-dev.install create mode 100644 debian/libg15.install create mode 100755 debian/rules diff --git a/ChangeLog b/ChangeLog index e6d8a9b..70021ed 100644 --- a/ChangeLog +++ b/ChangeLog @@ -34,3 +34,6 @@ 1.2.3 * Add support for the newer G15 keyboards which have amber backlights and six 'G' keys. +1.2.4 +* Turns out that the newer G15's have a different (5 byte) keyboard protocol. +* Optimise dumpPixmapIntoLCDFormat routine - Thanks to Adam Nielsen diff --git a/README b/README index ac450bd..d8844c2 100644 --- a/README +++ b/README @@ -1 +1,8 @@ -This is a library to handle the LCD and extra keys on the Logitech G15 Gaming Keyboard. This library requires libusb. +This is a library to handle the LCD and extra keys on the Logitech G15 Gaming +Keyboard and similar devices. +This library requires libusb. +LibG15 currently supports LCD & keys on the following devices: +- Original G15 keyboard +- G11 keyboard +- Z10 speakers +- 2nd revision of the G15 (amber backlight, 6 'G' keys, LCD) diff --git a/configure b/configure index f068cc0..402fec9 100755 --- a/configure +++ b/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.61 for libg15 1.2.3. +# Generated by GNU Autoconf 2.61 for libg15 1.2.4. # # Report bugs to . # @@ -728,8 +728,8 @@ SHELL=${CONFIG_SHELL-/bin/sh} # Identity of this package. PACKAGE_NAME='libg15' PACKAGE_TARNAME='libg15' -PACKAGE_VERSION='1.2.3' -PACKAGE_STRING='libg15 1.2.3' +PACKAGE_VERSION='1.2.4' +PACKAGE_STRING='libg15 1.2.4' PACKAGE_BUGREPORT='mlampard@users.sourceforge.net' ac_default_prefix=/usr @@ -1392,7 +1392,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures libg15 1.2.3 to adapt to many kinds of systems. +\`configure' configures libg15 1.2.4 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1462,7 +1462,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of libg15 1.2.3:";; + short | recursive ) echo "Configuration of libg15 1.2.4:";; esac cat <<\_ACEOF @@ -1564,7 +1564,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -libg15 configure 1.2.3 +libg15 configure 1.2.4 generated by GNU Autoconf 2.61 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, @@ -1578,7 +1578,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by libg15 $as_me 1.2.3, which was +It was created by libg15 $as_me 1.2.4, which was generated by GNU Autoconf 2.61. Invocation command line was $ $0 $@ @@ -2269,7 +2269,7 @@ fi # Define the identity of the package. PACKAGE='libg15' - VERSION='1.2.3' + VERSION='1.2.4' cat >>confdefs.h <<_ACEOF @@ -20586,7 +20586,7 @@ exec 6>&1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by libg15 $as_me 1.2.3, which was +This file was extended by libg15 $as_me 1.2.4, which was generated by GNU Autoconf 2.61. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -20639,7 +20639,7 @@ Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF ac_cs_version="\\ -libg15 config.status 1.2.3 +libg15 config.status 1.2.4 configured by $0, generated by GNU Autoconf 2.61, with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" diff --git a/configure.in b/configure.in index 6d48f28..9363d7b 100644 --- a/configure.in +++ b/configure.in @@ -2,7 +2,7 @@ # Process this file with autoconf to produce a configure script. AC_PREREQ(2.59) -AC_INIT(libg15, 1.2.3, mlampard@users.sourceforge.net) +AC_INIT(libg15, 1.2.4, mlampard@users.sourceforge.net) AC_PREFIX_DEFAULT(/usr) AC_CONFIG_AUX_DIR(config) AM_INIT_AUTOMAKE() diff --git a/debian/changelog b/debian/changelog new file mode 100644 index 0000000..c022813 --- /dev/null +++ b/debian/changelog @@ -0,0 +1,34 @@ +libg15 (1.2.1) edgy; urgency=low + * Add debugging function to enable/disable extra output + * All debugging output is now prefixed with libg15 to aid localising + problems. + * debugging function now also controls libusb debugging output. + * Try to claim usb interface up to 10 times before failing + * Slow down initialisation, to allow keyboard to come out of usb + auto-suspend on newer kernels. + * Attempt to combat ENOSPC by slowing down writes to the lcd if ENOSPC is + received. Unless that error occurs at least once, transfers are sent as normal. + * Add function to change keyboard backlight (independant of lcd backlight). + * Add re-initialising function, which will attempt to reconnect a keyboard + that was previously removed and replugged. + * libg15 now uses pthread mutexes to force sequential access to the bus via + libusb. Control message URBs are no longer being lost if sent by a different + thread in the middle of a screen transfer etc. + * Reset the keyboard before init to ensure correct initialisation on + kernels > 2.6.19 + +libg15 (1.1.1-1) edgy; urgency=low + + * Add basic support for the G11 keyboard + * revert all bulk transfers - bulk transfers are illegal for low-speed + devices, and cause -22 (EINVAL) warnings on new kernels. + * pass most errors to the client app. + + -- Anthony J. Mirabella Fri, 15 Dec 2006 05:17:49 -0500 + +libg15 (1.0-1) breezy; urgency=low + + * Initial release + + -- Anthony J. Mirabella Sun, 24 Sep 2006 22:57:06 -0400 + diff --git a/debian/compat b/debian/compat new file mode 100644 index 0000000..b8626c4 --- /dev/null +++ b/debian/compat @@ -0,0 +1 @@ +4 diff --git a/debian/control b/debian/control new file mode 100644 index 0000000..9eb0d94 --- /dev/null +++ b/debian/control @@ -0,0 +1,21 @@ +Source: libg15 +Priority: optional +Maintainer: Anthony J. Mirabella +Build-Depends: debhelper (>= 4.0.0), autotools-dev, libusb-dev +Standards-Version: 3.6.2 +Section: libs + +Package: libg15-dev +Section: libdevel +Architecture: any +Depends: libg15 (= ${Source-Version}) +Description: Development packages for libg15 + Includes the files needed for developing software that uses libg15. + +Package: libg15 +Section: libs +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends} +Description: Library for interfacing with the Logitech G15 Keyboard + Provides for low-level control of the lcd and extra keys on the + Logitech G15 keyboard. diff --git a/debian/copyright b/debian/copyright new file mode 100644 index 0000000..97407cb --- /dev/null +++ b/debian/copyright @@ -0,0 +1,12 @@ +This package was debianized by Anthony J. Mirabella on +Sun, 24 Sep 2006 22:57:06 -0400. + +It was downloaded from sourceforge.net + +Copyright Holders: Philip Lawatsch + Alex Ibrado + Autotools support added by Anthony J. Mirabella + +License: + +GPL diff --git a/debian/docs b/debian/docs new file mode 100644 index 0000000..50bd824 --- /dev/null +++ b/debian/docs @@ -0,0 +1,2 @@ +NEWS +README diff --git a/debian/libg15-dev.install b/debian/libg15-dev.install new file mode 100644 index 0000000..3c996c8 --- /dev/null +++ b/debian/libg15-dev.install @@ -0,0 +1,6 @@ +usr/include/* +usr/lib/lib*.a +usr/lib/lib*.so +usr/lib/pkgconfig/* +usr/lib/*.la +usr/share/pkgconfig/* diff --git a/debian/libg15.install b/debian/libg15.install new file mode 100644 index 0000000..e26bd09 --- /dev/null +++ b/debian/libg15.install @@ -0,0 +1 @@ +usr/lib/libg15*.so.* diff --git a/debian/rules b/debian/rules new file mode 100755 index 0000000..f98bb43 --- /dev/null +++ b/debian/rules @@ -0,0 +1,115 @@ +#!/usr/bin/make -f +# -*- makefile -*- +# Sample debian/rules that uses debhelper. +# This file was originally written by Joey Hess and Craig Small. +# As a special exception, when this file is copied by dh-make into a +# dh-make output file, you may use that output file without restriction. +# This special exception was added by Craig Small in version 0.37 of dh-make. + +# Uncomment this to turn on verbose mode. +#export DH_VERBOSE=1 + + +# These are used for cross-compiling and for saving the configure script +# from having to guess our platform (since we know it already) +DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE) +DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE) + + +CFLAGS = -Wall -g + +ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS))) + CFLAGS += -O0 +else + CFLAGS += -O2 +endif + +# shared library versions, option 1 +version=1.0.0 +major=1 +# option 2, assuming the library is created as src/.libs/libfoo.so.2.0.5 or so +#version=`ls src/.libs/lib*.so.* | \ +# awk '{if (match($$0,/[0-9]+\.[0-9]+\.[0-9]+$$/)) print substr($$0,RSTART)}'` +#major=`ls src/.libs/lib*.so.* | \ +# awk '{if (match($$0,/\.so\.[0-9]+$$/)) print substr($$0,RSTART+4)}'` + +config.status: configure + dh_testdir + # Add here commands to configure the package. + CFLAGS="$(CFLAGS) -Wl,-z,defs" ./configure --host=$(DEB_HOST_GNU_TYPE) --build=$(DEB_BUILD_GNU_TYPE) --prefix=/usr --mandir=\$${prefix}/share/man --infodir=\$${prefix}/share/info + + +build: build-stamp +build-stamp: config.status + dh_testdir + + # Add here commands to compile the package. + $(MAKE) + + touch build-stamp + +clean: + dh_testdir + dh_testroot + rm -f build-stamp + + # Add here commands to clean up after the build process. + -$(MAKE) distclean +ifneq "$(wildcard /usr/share/misc/config.sub)" "" + cp -f /usr/share/misc/config.sub config.sub +endif +ifneq "$(wildcard /usr/share/misc/config.guess)" "" + cp -f /usr/share/misc/config.guess config.guess +endif + + + dh_clean + +install: build + dh_testdir + dh_testroot + dh_clean -k + dh_installdirs -plibg15 + dh_installdirs -plibg15-dev + + # Add here commands to install the package into debian/tmp + $(MAKE) install DESTDIR=$(CURDIR)/debian/tmp + + +# Build architecture-independent files here. +binary-indep: build install +# We have nothing to do by default. + +# Build architecture-dependent files here. +binary-arch: build install + dh_testdir -a + dh_testroot -a + dh_installchangelogs ChangeLog -a + dh_installdocs -a + dh_installexamples -a + dh_install -a --sourcedir=debian/tmp + dh_installmenu -a + dh_installdebconf -a + dh_installlogrotate -a + dh_installemacsen -a + dh_installpam -a + dh_installmime -a + dh_installinit -a + dh_installcron -a + dh_installinfo -a + dh_installman -a + dh_link -a + dh_strip -a + dh_compress -a + dh_fixperms -a +# dh_perl -a +# dh_python -a + dh_makeshlibs -a + dh_installdeb -a + dh_shlibdeps -a + dh_gencontrol -a + dh_md5sums -a + dh_builddeb -a + +binary: binary-indep binary-arch +.PHONY: build clean binary-indep binary-arch binary install diff --git a/libg15.c b/libg15.c index 9e26f90..d127b44 100644 --- a/libg15.c +++ b/libg15.c @@ -17,7 +17,7 @@ (c) 2006 - 2007 The G15tools Project - g15tools.sf.net - $Revision: 260 $ - $Date: 2007-10-18 12:17:48 +0930 (Thu, 18 Oct 2007) $ $Author: mlampard $ + $Revision: 270 $ - $Date: 2007-11-25 15:32:03 +1030 (Sun, 25 Nov 2007) $ $Author: mlampard $ */ #include @@ -45,7 +45,7 @@ const libg15_devices_t g15_devices[] = { DEVICE("Logitech G15",0x46d,0xc222,G15_LCD|G15_KEYS), DEVICE("Logitech G11",0x46d,0xc225,G15_KEYS), DEVICE("Logitech Z-10",0x46d,0x0a07,G15_LCD|G15_KEYS|G15_DEVICE_IS_SHARED), - DEVICE("Logitech G15 v2",0x46d,0xc227,G15_LCD|G15_KEYS), + DEVICE("Logitech G15 v2",0x46d,0xc227,G15_LCD|G15_KEYS|G15_DEVICE_5BYTE_RETURN), DEVICE(NULL,0,0,0) }; @@ -196,7 +196,7 @@ static usb_dev_handle * findAndOpenDevice(libg15_devices_t handled_device, int d } else { - g15_log(stderr,G15_LOG_INFO,"Sorry, I could not detached the driver, giving up\n"); + g15_log(stderr,G15_LOG_INFO,"Sorry, I could not detach the driver, giving up\n"); return 0; } @@ -334,32 +334,79 @@ int exitLibG15() static void dumpPixmapIntoLCDFormat(unsigned char *lcd_buffer, unsigned char const *data) { - unsigned int offset_from_start = G15_LCD_OFFSET; +/* + + For a set of bytes (A, B, C, etc.) the bits representing pixels will appear on the LCD like this: + + A0 B0 C0 + A1 B1 C1 + A2 B2 C2 + A3 B3 C3 ... and across for G15_LCD_WIDTH bytes + A4 B4 C4 + A5 B5 C5 + A6 B6 C6 + A7 B7 C7 + + A0 + A1 <- second 8-pixel-high row starts straight after the last byte on + A2 the previous row + A3 + A4 + A5 + A6 + A7 + A8 + + A0 + ... + A0 + ... + A0 + ... + A0 + A1 <- only the first three bits are shown on the bottom row (the last three + A2 pixels of the 43-pixel high display.) + + +*/ + + unsigned int output_offset = G15_LCD_OFFSET; + unsigned int base_offset = 0; unsigned int curr_row = 0; unsigned int curr_col = 0; - - for (curr_row=0;curr_row> 7) | + (((data[base_offset + G15_LCD_WIDTH/8 ] << bit) & 0x80) >> 6) | + (((data[base_offset + (G15_LCD_WIDTH/8 * 2)] << bit) & 0x80) >> 5) | + (((data[base_offset + (G15_LCD_WIDTH/8 * 3)] << bit) & 0x80) >> 4) | + (((data[base_offset + (G15_LCD_WIDTH/8 * 4)] << bit) & 0x80) >> 3) | + (((data[base_offset + (G15_LCD_WIDTH/8 * 5)] << bit) & 0x80) >> 2) | + (((data[base_offset + (G15_LCD_WIDTH/8 * 6)] << bit) & 0x80) >> 1) | + (((data[base_offset + (G15_LCD_WIDTH/8 * 7)] << bit) & 0x80) >> 0); + ++output_offset; + if (bit == 7) + base_offset++; } + /* Jump down seven pixel-rows in the source image, since we've just + done a row of eight pixels in one pass (and we counted one pixel-row + while we were going, so now we skip the next seven pixel-rows.) */ + base_offset += G15_LCD_WIDTH - (G15_LCD_WIDTH / 8); } } @@ -397,7 +444,10 @@ int writePixmapToLCD(unsigned char const *data) int ret = 0; int transfercount=0; unsigned char lcd_buffer[G15_BUFFER_LEN]; - memset(lcd_buffer,0,G15_BUFFER_LEN); + /* The pixmap conversion function will overwrite everything after G15_LCD_OFFSET, so we only need to blank + the buffer up to this point. (Even though the keyboard only cares about bytes 0-23.) */ + memset(lcd_buffer, 0, G15_LCD_OFFSET); /* G15_BUFFER_LEN); */ + dumpPixmapIntoLCDFormat(lcd_buffer, data); if(!(g15_devices[found_devicetype].caps & G15_LCD)) @@ -543,7 +593,7 @@ static unsigned char g15KeyToLogitechKeyCode(int key) } } -static void processKeyEvent(unsigned int *pressed_keys, unsigned char *buffer) +static void processKeyEvent8Byte(unsigned int *pressed_keys, unsigned char *buffer) { int i; @@ -634,6 +684,67 @@ static void processKeyEvent(unsigned int *pressed_keys, unsigned char *buffer) } } +static void processKeyEvent5Byte(unsigned int *pressed_keys, unsigned char *buffer) +{ + int i; + + *pressed_keys = 0; + + g15_log(stderr,G15_LOG_WARN,"Keyboard: %x, %x, %x, %x, %x\n",buffer[0],buffer[1],buffer[2],buffer[3],buffer[4]); + + if (buffer[0] == 0x02) + { + if (buffer[1]&0x01) + *pressed_keys |= G15_KEY_G1; + + if (buffer[1]&0x02) + *pressed_keys |= G15_KEY_G2; + + if (buffer[1]&0x04) + *pressed_keys |= G15_KEY_G3; + + if (buffer[1]&0x08) + *pressed_keys |= G15_KEY_G4; + + if (buffer[1]&0x10) + *pressed_keys |= G15_KEY_G5; + + if (buffer[1]&0x20) + *pressed_keys |= G15_KEY_G6; + + if (buffer[1]&0x40) + *pressed_keys |= G15_KEY_M1; + + if (buffer[1]&0x80) + *pressed_keys |= G15_KEY_M2; + + if (buffer[2]&0x20) + *pressed_keys |= G15_KEY_M3; + + if (buffer[2]&0x40) + *pressed_keys |= G15_KEY_MR; + + if (buffer[2]&0x80) + *pressed_keys |= G15_KEY_L1; + + if (buffer[2]&0x2) + *pressed_keys |= G15_KEY_L2; + + if (buffer[2]&0x4) + *pressed_keys |= G15_KEY_L3; + + if (buffer[2]&0x8) + *pressed_keys |= G15_KEY_L4; + + if (buffer[2]&0x10) + *pressed_keys |= G15_KEY_L5; + + if (buffer[2]&0x1) + *pressed_keys |= G15_KEY_LIGHT; + } +} + + int getPressedKeys(unsigned int *pressed_keys, unsigned int timeout) { unsigned char buffer[9]; @@ -641,15 +752,28 @@ int getPressedKeys(unsigned int *pressed_keys, unsigned int timeout) pthread_mutex_lock(&libusb_mutex); ret = usb_interrupt_read(keyboard_device, g15_keys_endpoint, (char*)buffer, 9, timeout); pthread_mutex_unlock(&libusb_mutex); - - if (ret == 9) - { - if (buffer[0] == 1) - return G15_ERROR_TRY_AGAIN; - - processKeyEvent(pressed_keys, buffer); - + + if(g15DeviceCapabilities() & G15_DEVICE_5BYTE_RETURN) { /* new 5byte protocol */ + if (buffer[0] == 1) + return G15_ERROR_TRY_AGAIN; + if (ret == 5) { + + processKeyEvent5Byte(pressed_keys, buffer); + return G15_NO_ERROR; + } + } + else + { + if (ret == 9) + { + if (buffer[0] == 1) + return G15_ERROR_TRY_AGAIN; + + processKeyEvent8Byte(pressed_keys, buffer); + + return G15_NO_ERROR; + } } return handle_usb_errors("Keyboard Read", ret); /* allow the app to deal with errors */ } diff --git a/libg15.h b/libg15.h index be6c4e3..99a9f5f 100644 --- a/libg15.h +++ b/libg15.h @@ -17,7 +17,7 @@ (c) 2006 - 2007 The G15tools Project - g15tools.sf.net - $Revision: 263 $ - $Date: 2007-10-18 12:23:30 +0930 (Thu, 18 Oct 2007) $ $Author: mlampard $ + $Revision: 266 $ - $Date: 2007-11-25 13:32:23 +1030 (Sun, 25 Nov 2007) $ $Author: mlampard $ */ #ifndef _LIBG15_H_ @@ -31,6 +31,7 @@ extern "C" #define G15_LCD 1 #define G15_KEYS 2 #define G15_DEVICE_IS_SHARED 4 +#define G15_DEVICE_5BYTE_RETURN 8 typedef struct libg15_devices_t libg15_devices_t; diff --git a/rpm/libg15.spec b/rpm/libg15.spec index 6e1330c..ecd36cd 100644 --- a/rpm/libg15.spec +++ b/rpm/libg15.spec @@ -3,11 +3,11 @@ %define prefix /usr Summary: library to control logitech G15 keyboards Name: libg15 -Version: 1.2.3 +Version: 1.2.4 Release: 1 Copyright: GPL Group: Applications/System -Source: http://prdownloads.sourceforge.net/g15tools/libg15-1.2.3.tar.bz2 +Source: http://prdownloads.sourceforge.net/g15tools/libg15-1.2.4.tar.bz2 URL: http://sourceforge.net/projects/g15tools Distribution: Linux Vendor: NONE