Wilbern Cobb submitted a fix for building BSD joystick support that should work on all BSD flavors.
authorSam Lantinga <slouken@libsdl.org>
Tue, 28 May 2002 20:01:29 +0000
changeset 381 bc1401311390
parent 380 bce7171e7a85
child 382 74bdcae44bf5
Wilbern Cobb submitted a fix for building BSD joystick support that should work on all BSD flavors.
configure.in
src/joystick/bsd/SDL_sysjoystick.c
--- a/configure.in	Tue May 28 19:31:32 2002 +0000
+++ b/configure.in	Tue May 28 20:01:29 2002 +0000
@@ -1445,6 +1445,86 @@
     fi
 }
 
+dnl Check for the usbhid(3) library on *BSD
+CheckUSBHID()
+{
+    if test x$enable_joystick = xyes; then
+        have_libusbhid=no
+        have_libusb=no
+        AC_CHECK_LIB(usbhid, hid_init, have_libusbhid=yes)
+        AC_CHECK_LIB(usb, hid_init, have_libusb=yes)
+        if test x$have_libusbhid = xyes; then
+            SYSTEM_LIBS="$SYSTEM_LIBS -lusbhid"
+        fi
+        if test x$have_libusb = xyes; then
+            SYSTEM_LIBS="$SYSTEM_LIBS -lusb"
+        fi
+
+        AC_CHECK_HEADER(usbhid.h, have_usbhid_h=yes)
+        AC_CHECK_HEADER(libusb.h, have_libusb_h=yes)
+        AC_CHECK_HEADER(libusbhid.h, have_libusbhid_h=yes)
+        if test x$have_usbhid_h = xyes; then
+            CFLAGS="$CFLAGS -DHAVE_USBHID_H"
+        fi
+        if test x$have_libusb_h = xyes; then
+            CFLAGS="$CFLAGS -DHAVE_LIBUSB_H"
+        fi
+        if test x$have_libusbhid_h = xyes; then
+            CFLAGS="$CFLAGS -DHAVE_LIBUSBHID_H"
+        fi
+
+        AC_MSG_CHECKING(for usbhid)
+        have_usbhid=no
+        AC_TRY_COMPILE([
+          #include <dev/usb/usb.h>
+          #include <dev/usb/usbhid.h>
+          #if defined(HAVE_USBHID_H)
+          #include <usbhid.h>
+          #elif defined(HAVE_LIBUSB_H)
+          #include <libusb.h>
+          #elif defined(HAVE_LIBUSBHID_H)
+          #include <libusbhid.h>
+          #endif
+        ],[
+          struct report_desc *repdesc;
+          struct usb_ctl_report *repbuf;
+          enum hid_kind hidkind;
+        ],[
+        have_usbhid=yes
+        ])
+        AC_MSG_RESULT($have_usbhid)
+
+        if test x$have_usbhid = xyes; then
+            AC_MSG_CHECKING(for ucr_data member of usb_ctl_report)
+            have_usbhid_ucr_data=no
+            AC_TRY_COMPILE([
+              #include <dev/usb/usb.h>
+              #include <dev/usb/usbhid.h>
+              #include <stdio.h>
+              #if defined(HAVE_USBHID_H)
+              #include <usbhid.h>
+              #elif defined(HAVE_LIBUSB_H)
+              #include <libusb.h>
+              #elif defined(HAVE_LIBUSBHID_H)
+              #include <libusbhid.h>
+              #endif
+            ],[
+              struct usb_ctl_report buf;
+              if (buf.ucr_data) { }
+            ],[
+            have_usbhid_ucr_data=yes
+            ])
+            if test x$have_usbhid_ucr_data = xyes; then
+                CFLAGS="$CFLAGS -DUSBHID_UCR_DATA"
+            fi
+            AC_MSG_RESULT($have_usbhid_ucr_data)
+
+            JOYSTICK_SUBDIRS="$JOYSTICK_SUBDIRS bsd"
+            JOYSTICK_DRIVERS="$JOYSTICK_DRIVERS bsd/libjoystick_bsd.la"
+        fi
+    fi
+}
+
 case "$target" in
     *-*-linux*)
         ARCH=linux
@@ -1598,6 +1678,7 @@
         CheckAAlib
         CheckOpenGL
         CheckPTHREAD
+        CheckUSBHID
         # Set up files for the main() stub
         COPY_ARCH_SRC(src/main, linux, SDL_main.c)
         # Set up files for the audio library
@@ -1607,12 +1688,6 @@
         #    AUDIO_SUBDIRS="$AUDIO_SUBDIRS sun"
         #    AUDIO_DRIVERS="$AUDIO_DRIVERS sun/libaudio_sun.la"
         #fi
-        # Set up files for the joystick library
-        if test x$enable_joystick = xyes; then
-            JOYSTICK_SUBDIRS="$JOYSTICK_SUBDIRS bsd"
-            JOYSTICK_DRIVERS="$JOYSTICK_DRIVERS bsd/libjoystick_bsd.la"
-            SYSTEM_LIBS="$SYSTEM_LIBS -lusb"
-        fi
         # Set up files for the cdrom library
         if test x$enable_cdrom = xyes; then
             CDROM_SUBDIRS="$CDROM_SUBDIRS freebsd"
@@ -1652,6 +1727,7 @@
         CheckAAlib
         CheckOpenGL
         CheckPTHREAD
+        CheckUSBHID
         # Set up files for the main() stub
         COPY_ARCH_SRC(src/main, linux, SDL_main.c)
         # Set up files for the audio library
@@ -1660,12 +1736,6 @@
             AUDIO_SUBDIRS="$AUDIO_SUBDIRS sun"
             AUDIO_DRIVERS="$AUDIO_DRIVERS sun/libaudio_sun.la"
         fi
-        # Set up files for the joystick library
-        if test x$enable_joystick = xyes; then
-            JOYSTICK_SUBDIRS="$JOYSTICK_SUBDIRS bsd"
-            JOYSTICK_DRIVERS="$JOYSTICK_DRIVERS bsd/libjoystick_bsd.la"
-            SYSTEM_LIBS="$SYSTEM_LIBS -lusb"
-        fi
         # Set up files for the cdrom library
         if test x$enable_cdrom = xyes; then
             CDROM_SUBDIRS="$CDROM_SUBDIRS openbsd"
@@ -1707,6 +1777,7 @@
         CheckAAlib
         CheckOpenGL
         CheckPTHREAD
+        CheckUSBHID
         # Set up files for the main() stub
         COPY_ARCH_SRC(src/main, linux, SDL_main.c)
         # Set up files for the audio library
@@ -1719,12 +1790,6 @@
         if test x$have_oss = xyes; then
             SYSTEM_LIBS="$SYSTEM_LIBS -lossaudio"
         fi
-        # Set up files for the joystick library
-        if test x$enable_joystick = xyes; then
-            JOYSTICK_SUBDIRS="$JOYSTICK_SUBDIRS bsd"
-            JOYSTICK_DRIVERS="$JOYSTICK_DRIVERS bsd/libjoystick_bsd.la"
-            SYSTEM_LIBS="$SYSTEM_LIBS -lusbhid"
-        fi
         # Set up files for the cdrom library
         if test x$enable_cdrom = xyes; then
             CDROM_SUBDIRS="$CDROM_SUBDIRS openbsd"
--- a/src/joystick/bsd/SDL_sysjoystick.c	Tue May 28 19:31:32 2002 +0000
+++ b/src/joystick/bsd/SDL_sysjoystick.c	Tue May 28 20:01:29 2002 +0000
@@ -42,10 +42,12 @@
 #include <dev/usb/usb.h>
 #include <dev/usb/usbhid.h>
 
-#if defined(__FreeBSD__)
-# include <libusb.h>
-#else
-# include <usbhid.h>
+#if defined(HAVE_USBHID_H)
+#include <usbhid.h>
+#elif defined(HAVE_LIBUSB_H)
+#include <libusb.h>
+#elif defined(HAVE_LIBUSBHID_H)
+#include <libusbhid.h>
 #endif
 
 #include "SDL_error.h"
@@ -113,6 +115,12 @@
 static int	report_alloc(struct report *, struct report_desc *, int);
 static void	report_free(struct report *);
 
+#ifdef USBHID_UCR_DATA
+#define REP_BUF_DATA(rep) ((rep)->buf->ucr_data)
+#else
+#define REP_BUF_DATA(rep) ((rep)->buf->data)
+#endif
+
 int
 SDL_SYS_JoystickInit(void)
 {
@@ -274,14 +282,15 @@
 void
 SDL_SYS_JoystickUpdate(SDL_Joystick *joy)
 {
-	static struct hid_item hitem;
-	static struct hid_data *hdata;
-	static struct report *rep;
+	struct hid_item hitem;
+	struct hid_data *hdata;
+	struct report *rep;
 	int nbutton, naxe = -1;
 	Sint32 v;
 	
 	rep = &joy->hwdata->inreport;
-	if (read(joy->hwdata->fd, rep->buf->data, rep->size) != rep->size) {
+
+	if (read(joy->hwdata->fd, REP_BUF_DATA(rep), rep->size) != rep->size) {
 		return;
 	}
 	hdata = hid_start_parse(joy->hwdata->repdesc, 1 << hid_input);
@@ -316,7 +325,8 @@
 					goto scaleaxe;
 				}
 scaleaxe:
-				v = (Sint32)hid_get_data(rep->buf->data, &hitem);
+				v = (Sint32)hid_get_data(REP_BUF_DATA(rep),
+				    &hitem);
 				if (v != 127) {
 					if (v < 127) {
 						v = -(256 - v);
@@ -335,7 +345,7 @@
 				}
 				break;
 			case HUP_BUTTON:
-				v = (Sint32)hid_get_data(rep->buf->data,
+				v = (Sint32)hid_get_data(REP_BUF_DATA(rep),
 				    &hitem);
 				if (joy->buttons[nbutton] != v) {
 					SDL_PrivateJoystickButton(joy,
@@ -395,7 +405,7 @@
 	r->size = len;
 
 	if (r->size > 0) {
-		r->buf = malloc(sizeof(*r->buf) - sizeof(r->buf->data) +
+		r->buf = malloc(sizeof(*r->buf) - sizeof(REP_BUF_DATA(r)) +
 		    r->size);
 		if (r->buf == NULL) {
 			SDL_OutOfMemory();