src/joystick/bsd/SDL_sysjoystick.c
branchSDL-1.2
changeset 4540 e978b888d87a
parent 4401 1a7b62893c9d
child 6081 895486678126
equal deleted inserted replaced
4539:d2517c0de52b 4540:e978b888d87a
    57 #include <libusb.h>
    57 #include <libusb.h>
    58 #elif defined(HAVE_LIBUSBHID_H)
    58 #elif defined(HAVE_LIBUSBHID_H)
    59 #include <libusbhid.h>
    59 #include <libusbhid.h>
    60 #endif
    60 #endif
    61 
    61 
    62 #ifdef __FREEBSD__
    62 #if defined(__FREEBSD__) || defined(__FreeBSD_kernel__)
    63 #ifndef __DragonFly__
    63 #ifndef __DragonFly__
    64 #include <osreldate.h>
    64 #include <osreldate.h>
    65 #endif
    65 #endif
    66 #include <sys/joystick.h>
    66 #include <sys/joystick.h>
    67 #endif
    67 #endif
    76 
    76 
    77 #define MAX_UHID_JOYS	4
    77 #define MAX_UHID_JOYS	4
    78 #define MAX_JOY_JOYS	2
    78 #define MAX_JOY_JOYS	2
    79 #define MAX_JOYS	(MAX_UHID_JOYS + MAX_JOY_JOYS)
    79 #define MAX_JOYS	(MAX_UHID_JOYS + MAX_JOY_JOYS)
    80 
    80 
    81 #if defined(__FREEBSD__) && (__FreeBSD_kernel_version > 800063)
    81 #if defined(__FREEBSD__) && (__FreeBSD_kernel_version > 800063) && false
    82 struct usb_ctl_report {
    82 struct usb_ctl_report {
    83 	int	ucr_report;
    83 	int	ucr_report;
    84 	u_char	ucr_data[1024]; /* filled data size will vary */
    84 	u_char	ucr_data[1024]; /* filled data size will vary */
    85 };
    85 };
    86 #endif
    86 #endif
   146 static char *joydevnames[MAX_JOYS];
   146 static char *joydevnames[MAX_JOYS];
   147 
   147 
   148 static int	report_alloc(struct report *, struct report_desc *, int);
   148 static int	report_alloc(struct report *, struct report_desc *, int);
   149 static void	report_free(struct report *);
   149 static void	report_free(struct report *);
   150 
   150 
   151 #if defined(USBHID_UCR_DATA) || (defined(__FREEBSD__) && (__FreeBSD_kernel_version > 800063))
   151 #if defined(USBHID_UCR_DATA) || (defined(__FREEBSD__) && (__FreeBSD_kernel_version > 800063)) || defined(__FreeBSD_kernel__)
   152 #define REP_BUF_DATA(rep) ((rep)->buf->ucr_data)
   152 #define REP_BUF_DATA(rep) ((rep)->buf->ucr_data)
   153 #else
   153 #else
   154 #define REP_BUF_DATA(rep) ((rep)->buf->data)
   154 #define REP_BUF_DATA(rep) ((rep)->buf->data)
   155 #endif
   155 #endif
   156 
   156 
   302 		SDL_SetError("%s: USB_GET_REPORT_DESC: %s", hw->path,
   302 		SDL_SetError("%s: USB_GET_REPORT_DESC: %s", hw->path,
   303 		    strerror(errno));
   303 		    strerror(errno));
   304 		goto usberr;
   304 		goto usberr;
   305 	}
   305 	}
   306 	rep = &hw->inreport;
   306 	rep = &hw->inreport;
   307 #if defined(__FREEBSD__) && (__FreeBSD_kernel_version > 800063)
   307 #if defined(__FREEBSD__) && (__FreeBSD_kernel_version > 800063) || defined(__FreeBSD_kernel__)
   308        rep->rid = hid_get_report_id(fd);
   308        rep->rid = hid_get_report_id(fd);
   309        if (rep->rid < 0) {
   309        if (rep->rid < 0) {
   310 #else
   310 #else
   311 	if (ioctl(fd, USB_GET_REPORT_ID, &rep->rid) < 0) {
   311 	if (ioctl(fd, USB_GET_REPORT_ID, &rep->rid) < 0) {
   312 #endif
   312 #endif
   319 		SDL_SetError("%s: Input report descriptor has invalid length",
   319 		SDL_SetError("%s: Input report descriptor has invalid length",
   320 		    hw->path);
   320 		    hw->path);
   321 		goto usberr;
   321 		goto usberr;
   322 	}
   322 	}
   323 
   323 
   324 #if defined(USBHID_NEW) || (defined(__FREEBSD__) && __FreeBSD_kernel_version >= 500111)
   324 #if defined(USBHID_NEW) || (defined(__FREEBSD__) && __FreeBSD_kernel_version >= 500111) || defined(__FreeBSD_kernel__)
   325 	hdata = hid_start_parse(hw->repdesc, 1 << hid_input, rep->rid);
   325 	hdata = hid_start_parse(hw->repdesc, 1 << hid_input, rep->rid);
   326 #else
   326 #else
   327 	hdata = hid_start_parse(hw->repdesc, 1 << hid_input);
   327 	hdata = hid_start_parse(hw->repdesc, 1 << hid_input);
   328 #endif
   328 #endif
   329 	if (hdata == NULL) {
   329 	if (hdata == NULL) {
   403 	struct hid_data *hdata;
   403 	struct hid_data *hdata;
   404 	struct report *rep;
   404 	struct report *rep;
   405 	int nbutton, naxe = -1;
   405 	int nbutton, naxe = -1;
   406 	Sint32 v;
   406 	Sint32 v;
   407 
   407 
   408 #if defined(__FREEBSD__) || SDL_JOYSTICK_USBHID_MACHINE_JOYSTICK_H
   408 #if defined(__FREEBSD__) || SDL_JOYSTICK_USBHID_MACHINE_JOYSTICK_H || defined(__FreeBSD_kernel__)
   409 	struct joystick gameport;
   409 	struct joystick gameport;
   410  
   410  
   411 	if (joy->hwdata->type == BSDJOY_JOY) {
   411 	if (joy->hwdata->type == BSDJOY_JOY) {
   412 		if (read(joy->hwdata->fd, &gameport, sizeof gameport) != sizeof gameport)
   412 		if (read(joy->hwdata->fd, &gameport, sizeof gameport) != sizeof gameport)
   413 			return;
   413 			return;
   458 	rep = &joy->hwdata->inreport;
   458 	rep = &joy->hwdata->inreport;
   459 
   459 
   460 	if (read(joy->hwdata->fd, REP_BUF_DATA(rep), rep->size) != rep->size) {
   460 	if (read(joy->hwdata->fd, REP_BUF_DATA(rep), rep->size) != rep->size) {
   461 		return;
   461 		return;
   462 	}
   462 	}
   463 #if defined(USBHID_NEW) || (defined(__FREEBSD__) && __FreeBSD_kernel_version >= 500111)
   463 #if defined(USBHID_NEW) || (defined(__FREEBSD__) && __FreeBSD_kernel_version >= 500111) || defined(__FreeBSD_kernel__)
   464 	hdata = hid_start_parse(joy->hwdata->repdesc, 1 << hid_input, rep->rid);
   464 	hdata = hid_start_parse(joy->hwdata->repdesc, 1 << hid_input, rep->rid);
   465 #else
   465 #else
   466 	hdata = hid_start_parse(joy->hwdata->repdesc, 1 << hid_input);
   466 	hdata = hid_start_parse(joy->hwdata->repdesc, 1 << hid_input);
   467 #endif
   467 #endif
   468 	if (hdata == NULL) {
   468 	if (hdata == NULL) {