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_keyboard_debug
65 CTLFLAG_RW | CTLFLAG_MPSAFE, 0,
66 "USB keyboard gadget");
69static int g_keyboard_debug = 0;
72 &g_keyboard_debug, 0,
"Debug level");
77SYSCTL_INT(_hw_usb_g_keyboard, OID_AUTO, mode, CTLFLAG_RWTUN,
82SYSCTL_INT(_hw_usb_g_keyboard, OID_AUTO, key_press_interval, CTLFLAG_RWTUN,
87SYSCTL_STRING(_hw_usb_g_keyboard, OID_AUTO, key_press_pattern, CTLFLAG_RW,
89 "Key Press Patterns");
91#define UPROTO_BOOT_KEYBOARD 1
93#define G_KEYBOARD_NMOD 8
94#define G_KEYBOARD_NKEYCODE 6
98#define MOD_CONTROL_L 0x01
99#define MOD_CONTROL_R 0x10
100#define MOD_SHIFT_L 0x02
101#define MOD_SHIFT_R 0x20
102#define MOD_ALT_L 0x04
103#define MOD_ALT_R 0x40
104#define MOD_WIN_L 0x08
105#define MOD_WIN_R 0x80
151 .name =
"g_keyboard",
164 .flags = {.ext_buffer = 1,.pipe_bof = 1,},
238 mtx_init(&sc->
sc_mtx,
"g_keyboard", NULL, MTX_DEF);
300 if (key >=
'a' && key <=
'z')
301 return (key -
'a' + 0x04);
315 DPRINTF(
"st=%d aframes=%d actlen=%d bytes\n",
381 const void *preq,
void **
pptr, uint16_t *
plen,
386 uint8_t is_complete = *
pstate;
391 (
req->wValue[0] == 0x00) &&
392 (
req->wValue[1] == 0x02)) {
402 (
req->wValue[0] == 0x00) &&
403 (
req->wValue[1] == 0x00)) {
DRIVER_MODULE(g_keyboard, uhub, g_keyboard_driver, g_keyboard_devclass, 0, 0)
static driver_t g_keyboard_driver
#define G_KEYBOARD_NKEYCODE
static device_detach_t g_keyboard_detach
SYSCTL_INT(_hw_usb_g_keyboard, OID_AUTO, mode, CTLFLAG_RWTUN, &g_keyboard_mode, 0, "Mode selection")
static void g_keyboard_timeout_reset(struct g_keyboard_softc *sc)
static usb_handle_request_t g_keyboard_handle_request
SYSCTL_STRING(_hw_usb_g_keyboard, OID_AUTO, key_press_pattern, CTLFLAG_RW, g_keyboard_key_press_pattern, sizeof(g_keyboard_key_press_pattern), "Key Press Patterns")
static devclass_t g_keyboard_devclass
static int g_keyboard_key_press_interval
static const struct usb_config g_keyboard_config[G_KEYBOARD_N_TRANSFER]
static int g_keyboard_mode
static device_attach_t g_keyboard_attach
static device_method_t g_keyboard_methods[]
static uint8_t g_keyboard_get_keycode(struct g_keyboard_softc *sc, int index)
static void g_keyboard_timeout(void *arg)
MODULE_DEPEND(g_keyboard, usb, 1, 1, 1)
static device_probe_t g_keyboard_probe
static char g_keyboard_key_press_pattern[G_KEYBOARD_MAX_STRLEN]
static usb_callback_t g_keyboard_intr_callback
#define UPROTO_BOOT_KEYBOARD
static SYSCTL_NODE(_hw_usb, OID_AUTO, g_keyboard, CTLFLAG_RW|CTLFLAG_MPSAFE, 0, "USB keyboard gadget")
#define G_KEYBOARD_MODE_PATTERN
#define G_KEYBOARD_MODE_SILENT
#define G_KEYBOARD_MAX_STRLEN
uint8_t keycode[G_KEYBOARD_NKEYCODE]
char sc_pattern[G_KEYBOARD_MAX_STRLEN]
struct usb_xfer * sc_xfer[G_KEYBOARD_N_TRANSFER]
struct usb_callout sc_callout
struct g_keyboard_data sc_data[2]
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)