# HG changeset patch # User Sam Lantinga # Date 1022616089 0 # Node ID bc1401311390d1f3a59b4bfe3c48ab6b79c63dfd # Parent bce7171e7a85272376ab71c2b15e0e21d06a3705 Wilbern Cobb submitted a fix for building BSD joystick support that should work on all BSD flavors. diff -r bce7171e7a85 -r bc1401311390 configure.in --- 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 + #include + #if defined(HAVE_USBHID_H) + #include + #elif defined(HAVE_LIBUSB_H) + #include + #elif defined(HAVE_LIBUSBHID_H) + #include + #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 + #include + #include + #if defined(HAVE_USBHID_H) + #include + #elif defined(HAVE_LIBUSB_H) + #include + #elif defined(HAVE_LIBUSBHID_H) + #include + #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" diff -r bce7171e7a85 -r bc1401311390 src/joystick/bsd/SDL_sysjoystick.c --- 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 #include -#if defined(__FreeBSD__) -# include -#else -# include +#if defined(HAVE_USBHID_H) +#include +#elif defined(HAVE_LIBUSB_H) +#include +#elif defined(HAVE_LIBUSBHID_H) +#include #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();