Wilbern Cobb submitted a fix for building BSD joystick support that should work on all BSD flavors.
--- 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();