35#include <sys/stdint.h>
36#include <sys/stddef.h>
39#include <sys/kernel.h>
41#include <sys/linker_set.h>
42#include <sys/module.h>
45#include <sys/condvar.h>
46#include <sys/sysctl.h>
48#include <sys/unistd.h>
49#include <sys/callout.h>
50#include <sys/malloc.h>
59#define USB_DEBUG_VAR g_mouse_debug
64static SYSCTL_NODE(_hw_usb, OID_AUTO, g_mouse, CTLFLAG_RW | CTLFLAG_MPSAFE, 0,
68static int g_mouse_debug = 0;
71 &g_mouse_debug, 0,
"Debug level");
76SYSCTL_INT(_hw_usb_g_mouse, OID_AUTO, mode, CTLFLAG_RWTUN,
81SYSCTL_INT(_hw_usb_g_mouse, OID_AUTO, button_press_interval, CTLFLAG_RWTUN,
86SYSCTL_INT(_hw_usb_g_mouse, OID_AUTO, cursor_update_interval, CTLFLAG_RWTUN,
91SYSCTL_INT(_hw_usb_g_mouse, OID_AUTO, cursor_radius, CTLFLAG_RWTUN,
162 .flags = {.ext_buffer = 1,.pipe_bof = 1,},
185 if ((i <= 0) || (i > 1023))
208 if ((i <= 0) || (i > 1023))
286 mtx_init(&sc->
sc_mtx,
"g_mouse", NULL, MTX_DEF);
349 DPRINTF(
"st=%d aframes=%d actlen=%d bytes\n",
379 radius = (radius * (8000-sc->
sc_tick)) / 8000;
389 }
else if (sc->
sc_tick < 4000) {
392 }
else if (sc->
sc_tick < 6000) {
442 const void *preq,
void **
pptr, uint16_t *
plen,
446 uint8_t is_complete = *
pstate;
451 (
req->wValue[0] == 0x00) &&
452 (
req->wValue[1] == 0x00)) {
static int g_mouse_cursor_update_interval
static void g_mouse_button_press_timeout(void *arg)
static device_probe_t g_mouse_probe
static int g_mouse_button_press_interval
SYSCTL_INT(_hw_usb_g_mouse, OID_AUTO, mode, CTLFLAG_RWTUN, &g_mouse_mode, 0, "Mode selection")
MODULE_DEPEND(g_mouse, usb, 1, 1, 1)
static driver_t g_mouse_driver
DRIVER_MODULE(g_mouse, uhub, g_mouse_driver, g_mouse_devclass, 0, 0)
static void g_mouse_cursor_update_timeout(void *arg)
static int g_mouse_cursor_radius
static void g_mouse_cursor_update_timeout_reset(struct g_mouse_softc *sc)
static device_method_t g_mouse_methods[]
static devclass_t g_mouse_devclass
static usb_callback_t g_mouse_intr_callback
static void g_mouse_update_mode_radius(struct g_mouse_softc *sc)
static const struct usb_config g_mouse_config[G_MOUSE_N_TRANSFER]
static void g_mouse_button_press_timeout_reset(struct g_mouse_softc *sc)
static device_attach_t g_mouse_attach
static SYSCTL_NODE(_hw_usb, OID_AUTO, g_mouse, CTLFLAG_RW|CTLFLAG_MPSAFE, 0, "USB mouse gadget")
static usb_handle_request_t g_mouse_handle_request
static device_detach_t g_mouse_detach
#define G_MOUSE_MODE_SILENT
#define G_MOUSE_MODE_CIRCLE
#define G_MOUSE_MODE_SPIRAL
struct usb_callout sc_cursor_update_callout
uint8_t sc_do_button_update
struct usb_callout sc_button_press_callout
struct usb_xfer * sc_xfer[G_MOUSE_N_TRANSFER]
uint8_t sc_do_cursor_update
struct g_mouse_data sc_data
enum usb_hc_mode usb_mode
struct usbd_lookup_info info
struct usb_device * device
uint8_t bInterfaceSubClass
uint8_t bInterfaceProtocol
#define UT_WRITE_CLASS_INTERFACE
const char * usbd_errstr(usb_error_t err)
static usb_error_t usb_handle_request(struct usb_xfer *)
void usbd_transfer_submit(struct usb_xfer *xfer)
void usbd_xfer_set_frames(struct usb_xfer *xfer, usb_frcount_t n)
void usbd_transfer_unsetup(struct usb_xfer **pxfer, uint16_t n_setup)
void usbd_xfer_set_frame_data(struct usb_xfer *xfer, usb_frcount_t frindex, void *ptr, usb_frlength_t len)
usb_error_t usbd_transfer_setup(struct usb_device *udev, const uint8_t *ifaces, struct usb_xfer **ppxfer, const struct usb_config *setup_start, uint16_t n_setup, void *priv_sc, struct mtx *xfer_mtx)
void usbd_transfer_start(struct usb_xfer *xfer)
void * usbd_xfer_softc(struct usb_xfer *xfer)
void usbd_xfer_set_stall(struct usb_xfer *xfer)
void usbd_xfer_status(struct usb_xfer *xfer, int *actlen, int *sumlen, int *aframes, int *nframes)
void device_set_usb_desc(device_t dev)
#define usb_callout_init_mtx(c, m, f)
#define usb_callout_reset(c,...)
#define usb_callout_drain(c)
#define USB_ST_TRANSFERRED
#define USB_MS_TO_TICKS(ms)
void() usb_callback_t(struct usb_xfer *, usb_error_t)
#define usb_callout_stop(c)
#define USB_GET_STATE(xfer)