FreeBSD kernel usb device Code
uhid.c File Reference
#include <sys/cdefs.h>
#include "opt_hid.h"
#include <sys/stdint.h>
#include <sys/stddef.h>
#include <sys/param.h>
#include <sys/queue.h>
#include <sys/types.h>
#include <sys/systm.h>
#include <sys/kernel.h>
#include <sys/bus.h>
#include <sys/module.h>
#include <sys/lock.h>
#include <sys/mutex.h>
#include <sys/condvar.h>
#include <sys/sysctl.h>
#include <sys/sx.h>
#include <sys/unistd.h>
#include <sys/callout.h>
#include <sys/malloc.h>
#include <sys/priv.h>
#include <sys/conf.h>
#include <sys/fcntl.h>
#include <dev/hid/hid.h>
#include "usbdevs.h"
#include <dev/usb/usb.h>
#include <dev/usb/usbdi.h>
#include <dev/usb/usbdi_util.h>
#include <dev/usb/usbhid.h>
#include <dev/usb/usb_ioctl.h>
#include <dev/usb/usb_generic.h>
#include <dev/usb/usb_debug.h>
#include <dev/usb/input/usb_rdesc.h>
#include <dev/usb/quirk/usb_quirk.h>
Include dependency graph for uhid.c:

Go to the source code of this file.

Data Structures

struct  uhid_softc
 

Macros

#define USB_DEBUG_VAR   uhid_debug
 
#define UHID_BSIZE   1024 /* bytes, buffer size */
 
#define UHID_FRAME_NUM   50 /* bytes, frame number */
 
#define UHID_FLAG_IMMED   0x01 /* set if read should be immediate */
 
#define UHID_FLAG_STATIC_DESC
 

Enumerations

enum  {
  UHID_INTR_DT_WR , UHID_INTR_DT_RD , UHID_CTRL_DT_WR , UHID_CTRL_DT_RD ,
  UHID_N_TRANSFER
}
 

Functions

 __FBSDID ("$FreeBSD$")
 
static void uhid_intr_write_callback (struct usb_xfer *xfer, usb_error_t error)
 
static void uhid_intr_read_callback (struct usb_xfer *xfer, usb_error_t error)
 
static void uhid_fill_set_report (struct usb_device_request *req, uint8_t iface_no, uint8_t type, uint8_t id, uint16_t size)
 
static void uhid_fill_get_report (struct usb_device_request *req, uint8_t iface_no, uint8_t type, uint8_t id, uint16_t size)
 
static void uhid_write_callback (struct usb_xfer *xfer, usb_error_t error)
 
static void uhid_read_callback (struct usb_xfer *xfer, usb_error_t error)
 
static void uhid_start_read (struct usb_fifo *fifo)
 
static void uhid_stop_read (struct usb_fifo *fifo)
 
static void uhid_start_write (struct usb_fifo *fifo)
 
static void uhid_stop_write (struct usb_fifo *fifo)
 
static int uhid_get_report (struct uhid_softc *sc, uint8_t type, uint8_t id, void *kern_data, void *user_data, uint16_t len)
 
static int uhid_set_report (struct uhid_softc *sc, uint8_t type, uint8_t id, void *kern_data, void *user_data, uint16_t len)
 
static int uhid_open (struct usb_fifo *fifo, int fflags)
 
static void uhid_close (struct usb_fifo *fifo, int fflags)
 
static int uhid_ioctl (struct usb_fifo *fifo, u_long cmd, void *addr, int fflags)
 
static int uhid_ioctl_post (struct usb_fifo *fifo, u_long cmd, void *addr, int fflags)
 
static int uhid_probe (device_t dev)
 
static int uhid_attach (device_t dev)
 
static int uhid_detach (device_t dev)
 
 DRIVER_MODULE (uhid, uhub, uhid_driver, uhid_devclass, NULL, 0)
 
 MODULE_DEPEND (uhid, usb, 1, 1, 1)
 
 MODULE_DEPEND (uhid, hid, 1, 1, 1)
 
 MODULE_VERSION (uhid, 1)
 
 USB_PNP_HOST_INFO (uhid_devs)
 

Variables

static const uint8_t uhid_xb360gp_report_descr [] = {UHID_XB360GP_REPORT_DESCR()}
 
static const uint8_t uhid_graphire_report_descr [] = {UHID_GRAPHIRE_REPORT_DESCR()}
 
static const uint8_t uhid_graphire3_4x5_report_descr [] = {UHID_GRAPHIRE3_4X5_REPORT_DESCR()}
 
static device_probe_t uhid_probe
 
static device_attach_t uhid_attach
 
static device_detach_t uhid_detach
 
static usb_callback_t uhid_intr_write_callback
 
static usb_callback_t uhid_intr_read_callback
 
static usb_callback_t uhid_write_callback
 
static usb_callback_t uhid_read_callback
 
static usb_fifo_cmd_t uhid_start_read
 
static usb_fifo_cmd_t uhid_stop_read
 
static usb_fifo_cmd_t uhid_start_write
 
static usb_fifo_cmd_t uhid_stop_write
 
static usb_fifo_open_t uhid_open
 
static usb_fifo_close_t uhid_close
 
static usb_fifo_ioctl_t uhid_ioctl
 
static usb_fifo_ioctl_t uhid_ioctl_post
 
static struct usb_fifo_methods uhid_fifo_methods
 
static const struct usb_config uhid_config [UHID_N_TRANSFER]
 
static const STRUCT_USB_HOST_ID uhid_devs []
 
static devclass_t uhid_devclass
 
static device_method_t uhid_methods []
 
static driver_t uhid_driver
 

Macro Definition Documentation

◆ UHID_BSIZE

#define UHID_BSIZE   1024 /* bytes, buffer size */

Definition at line 94 of file uhid.c.

◆ UHID_FLAG_IMMED

#define UHID_FLAG_IMMED   0x01 /* set if read should be immediate */

Definition at line 125 of file uhid.c.

◆ UHID_FLAG_STATIC_DESC

#define UHID_FLAG_STATIC_DESC
Value:
0x04 /* set if report descriptors are
* static */

Definition at line 126 of file uhid.c.

◆ UHID_FRAME_NUM

#define UHID_FRAME_NUM   50 /* bytes, frame number */

Definition at line 95 of file uhid.c.

◆ USB_DEBUG_VAR

#define USB_DEBUG_VAR   uhid_debug

Definition at line 79 of file uhid.c.

Enumeration Type Documentation

◆ anonymous enum

anonymous enum
Enumerator
UHID_INTR_DT_WR 
UHID_INTR_DT_RD 
UHID_CTRL_DT_WR 
UHID_CTRL_DT_RD 
UHID_N_TRANSFER 

Definition at line 97 of file uhid.c.

Function Documentation

◆ __FBSDID()

__FBSDID ( "$FreeBSD$"  )

◆ DRIVER_MODULE()

DRIVER_MODULE ( uhid  ,
uhub  ,
uhid_driver  ,
uhid_devclass  ,
NULL  ,
 
)

◆ MODULE_DEPEND() [1/2]

MODULE_DEPEND ( uhid  ,
hid  ,
,
,
 
)

◆ MODULE_DEPEND() [2/2]

MODULE_DEPEND ( uhid  ,
usb  ,
,
,
 
)

◆ MODULE_VERSION()

MODULE_VERSION ( uhid  ,
 
)

◆ uhid_attach()

◆ uhid_close()

static void uhid_close ( struct usb_fifo fifo,
int  fflags 
)
static

Definition at line 539 of file uhid.c.

References usb_fifo_free_buffer().

Here is the call graph for this function:

◆ uhid_detach()

static int uhid_detach ( device_t  dev)
static

◆ uhid_fill_get_report()

static void uhid_fill_get_report ( struct usb_device_request req,
uint8_t  iface_no,
uint8_t  type,
uint8_t  id,
uint16_t  size 
)
static

Definition at line 257 of file uhid.c.

References req, size, type, UR_GET_REPORT, USETW, USETW2, and UT_READ_CLASS_INTERFACE.

Referenced by uhid_read_callback().

Here is the caller graph for this function:

◆ uhid_fill_set_report()

static void uhid_fill_set_report ( struct usb_device_request req,
uint8_t  iface_no,
uint8_t  type,
uint8_t  id,
uint16_t  size 
)
static

Definition at line 245 of file uhid.c.

References req, size, type, UR_SET_REPORT, USETW, USETW2, and UT_WRITE_CLASS_INTERFACE.

Referenced by uhid_write_callback().

Here is the caller graph for this function:

◆ uhid_get_report()

static int uhid_get_report ( struct uhid_softc sc,
uint8_t  type,
uint8_t  id,
void *  kern_data,
void *  user_data,
uint16_t  len 
)
static

Definition at line 449 of file uhid.c.

References len, uhid_softc::sc_iface_index, uhid_softc::sc_udev, type, and usbd_req_get_report().

Referenced by uhid_ioctl().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ uhid_intr_read_callback()

◆ uhid_intr_write_callback()

static void uhid_intr_write_callback ( struct usb_xfer xfer,
usb_error_t  error 
)
static

◆ uhid_ioctl()

◆ uhid_ioctl_post()

static int uhid_ioctl_post ( struct usb_fifo fifo,
u_long  cmd,
void *  addr,
int  fflags 
)
static

Definition at line 680 of file uhid.c.

References addr, error, ugen_fill_deviceinfo(), and USB_GET_DEVICEINFO.

Here is the call graph for this function:

◆ uhid_open()

static int uhid_open ( struct usb_fifo fifo,
int  fflags 
)
static

Definition at line 510 of file uhid.c.

References uhid_softc::sc_flags, uhid_softc::sc_isize, uhid_softc::sc_mtx, uhid_softc::sc_osize, UHID_FRAME_NUM, usb_fifo_alloc_buffer(), and usb_fifo_softc().

Here is the call graph for this function:

◆ uhid_probe()

◆ uhid_read_callback()

◆ uhid_set_report()

static int uhid_set_report ( struct uhid_softc sc,
uint8_t  type,
uint8_t  id,
void *  kern_data,
void *  user_data,
uint16_t  len 
)
static

Definition at line 481 of file uhid.c.

References len, uhid_softc::sc_iface_index, uhid_softc::sc_udev, type, and usbd_req_set_report().

Referenced by uhid_ioctl().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ uhid_start_read()

static void uhid_start_read ( struct usb_fifo fifo)
static

Definition at line 406 of file uhid.c.

References uhid_softc::sc_flags, uhid_softc::sc_xfer, UHID_CTRL_DT_RD, UHID_FLAG_IMMED, UHID_INTR_DT_RD, usb_fifo_softc(), and usbd_transfer_start().

Here is the call graph for this function:

◆ uhid_start_write()

static void uhid_start_write ( struct usb_fifo fifo)
static

Definition at line 427 of file uhid.c.

References uhid_softc::sc_flags, uhid_softc::sc_xfer, UHID_CTRL_DT_WR, UHID_FLAG_IMMED, UHID_INTR_DT_WR, usb_fifo_softc(), and usbd_transfer_start().

Here is the call graph for this function:

◆ uhid_stop_read()

static void uhid_stop_read ( struct usb_fifo fifo)
static

Definition at line 418 of file uhid.c.

References uhid_softc::sc_xfer, UHID_CTRL_DT_RD, UHID_INTR_DT_RD, usb_fifo_softc(), and usbd_transfer_stop().

Here is the call graph for this function:

◆ uhid_stop_write()

static void uhid_stop_write ( struct usb_fifo fifo)
static

Definition at line 440 of file uhid.c.

References uhid_softc::sc_xfer, UHID_CTRL_DT_WR, UHID_INTR_DT_WR, usb_fifo_softc(), and usbd_transfer_stop().

Here is the call graph for this function:

◆ uhid_write_callback()

◆ USB_PNP_HOST_INFO()

USB_PNP_HOST_INFO ( uhid_devs  )

Variable Documentation

◆ uhid_attach

device_attach_t uhid_attach
static

Definition at line 136 of file uhid.c.

◆ uhid_close

usb_fifo_close_t uhid_close
static

Definition at line 149 of file uhid.c.

◆ uhid_config

const struct usb_config uhid_config[UHID_N_TRANSFER]
static

Definition at line 367 of file uhid.c.

Referenced by uhid_attach().

◆ uhid_detach

device_detach_t uhid_detach
static

Definition at line 137 of file uhid.c.

Referenced by uhid_attach().

◆ uhid_devclass

devclass_t uhid_devclass
static

Definition at line 915 of file uhid.c.

◆ uhid_devs

const STRUCT_USB_HOST_ID uhid_devs[]
static
Initial value:
= {
}
#define UISUBCLASS_XBOX360_CONTROLLER
Definition: usb.h:521
#define UICLASS_VENDOR
Definition: usb.h:520
#define UIPROTO_XBOX360_GAMEPAD
Definition: usb.h:523
#define UICLASS_HID
Definition: usb.h:453
#define USB_IFACE_SUBCLASS(isc)
Definition: usbdi.h:388
#define USB_IFACE_CLASS(ic)
Definition: usbdi.h:385
#define USB_IFACE_PROTOCOL(ip)
Definition: usbdi.h:391

Definition at line 697 of file uhid.c.

Referenced by uhid_probe().

◆ uhid_driver

driver_t uhid_driver
static
Initial value:
= {
.name = "uhid",
.methods = uhid_methods,
.size = sizeof(struct uhid_softc),
}
static device_method_t uhid_methods[]
Definition: uhid.c:918

Definition at line 926 of file uhid.c.

◆ uhid_fifo_methods

struct usb_fifo_methods uhid_fifo_methods
static
Initial value:
= {
.f_open = &uhid_open,
.f_close = &uhid_close,
.f_ioctl = &uhid_ioctl,
.f_ioctl_post = &uhid_ioctl_post,
.f_start_read = &uhid_start_read,
.f_stop_read = &uhid_stop_read,
.f_start_write = &uhid_start_write,
.f_stop_write = &uhid_stop_write,
.basename[0] = "uhid",
}
static usb_fifo_close_t uhid_close
Definition: uhid.c:149
static usb_fifo_cmd_t uhid_start_read
Definition: uhid.c:144
static usb_fifo_open_t uhid_open
Definition: uhid.c:148
static usb_fifo_ioctl_t uhid_ioctl_post
Definition: uhid.c:151
static usb_fifo_cmd_t uhid_stop_write
Definition: uhid.c:147
static usb_fifo_cmd_t uhid_stop_read
Definition: uhid.c:145
static usb_fifo_ioctl_t uhid_ioctl
Definition: uhid.c:150
static usb_fifo_cmd_t uhid_start_write
Definition: uhid.c:146

Definition at line 153 of file uhid.c.

Referenced by uhid_attach().

◆ uhid_graphire3_4x5_report_descr

const uint8_t uhid_graphire3_4x5_report_descr[] = {UHID_GRAPHIRE3_4X5_REPORT_DESCR()}
static

Definition at line 131 of file uhid.c.

Referenced by uhid_attach().

◆ uhid_graphire_report_descr

const uint8_t uhid_graphire_report_descr[] = {UHID_GRAPHIRE_REPORT_DESCR()}
static

Definition at line 130 of file uhid.c.

Referenced by uhid_attach().

◆ uhid_intr_read_callback

usb_callback_t uhid_intr_read_callback
static

Definition at line 140 of file uhid.c.

◆ uhid_intr_write_callback

usb_callback_t uhid_intr_write_callback
static

Definition at line 139 of file uhid.c.

◆ uhid_ioctl

usb_fifo_ioctl_t uhid_ioctl
static

Definition at line 150 of file uhid.c.

◆ uhid_ioctl_post

usb_fifo_ioctl_t uhid_ioctl_post
static

Definition at line 151 of file uhid.c.

◆ uhid_methods

device_method_t uhid_methods[]
static
Initial value:
= {
DEVMETHOD(device_probe, uhid_probe),
DEVMETHOD(device_attach, uhid_attach),
DEVMETHOD(device_detach, uhid_detach),
DEVMETHOD_END
}
static device_probe_t uhid_probe
Definition: uhid.c:135
static device_detach_t uhid_detach
Definition: uhid.c:137
static device_attach_t uhid_attach
Definition: uhid.c:136

Definition at line 918 of file uhid.c.

◆ uhid_open

usb_fifo_open_t uhid_open
static

Definition at line 148 of file uhid.c.

◆ uhid_probe

device_probe_t uhid_probe
static

Definition at line 135 of file uhid.c.

◆ uhid_read_callback

usb_callback_t uhid_read_callback
static

Definition at line 142 of file uhid.c.

◆ uhid_start_read

usb_fifo_cmd_t uhid_start_read
static

Definition at line 144 of file uhid.c.

◆ uhid_start_write

usb_fifo_cmd_t uhid_start_write
static

Definition at line 146 of file uhid.c.

◆ uhid_stop_read

usb_fifo_cmd_t uhid_stop_read
static

Definition at line 145 of file uhid.c.

◆ uhid_stop_write

usb_fifo_cmd_t uhid_stop_write
static

Definition at line 147 of file uhid.c.

◆ uhid_write_callback

usb_callback_t uhid_write_callback
static

Definition at line 141 of file uhid.c.

◆ uhid_xb360gp_report_descr

const uint8_t uhid_xb360gp_report_descr[] = {UHID_XB360GP_REPORT_DESCR()}
static

Definition at line 129 of file uhid.c.

Referenced by uhid_attach().