FreeBSD kernel usb device Code
g_keyboard.c File Reference
#include <sys/param.h>
#include <sys/stdint.h>
#include <sys/stddef.h>
#include <sys/queue.h>
#include <sys/systm.h>
#include <sys/kernel.h>
#include <sys/bus.h>
#include <sys/linker_set.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 <dev/usb/usb.h>
#include <dev/usb/usbdi.h>
#include <dev/usb/usbdi_util.h>
#include <dev/usb/usbhid.h>
#include "usb_if.h"
#include <dev/usb/usb_debug.h>
#include <dev/usb/gadget/g_keyboard.h>
Include dependency graph for g_keyboard.c:

Go to the source code of this file.

Data Structures

struct  g_keyboard_data
 
struct  g_keyboard_softc
 

Macros

#define USB_DEBUG_VAR   g_keyboard_debug
 
#define UPROTO_BOOT_KEYBOARD   1
 
#define G_KEYBOARD_NMOD   8 /* units */
 
#define G_KEYBOARD_NKEYCODE   6 /* units */
 
#define MOD_CONTROL_L   0x01
 
#define MOD_CONTROL_R   0x10
 
#define MOD_SHIFT_L   0x02
 
#define MOD_SHIFT_R   0x20
 
#define MOD_ALT_L   0x04
 
#define MOD_ALT_R   0x40
 
#define MOD_WIN_L   0x08
 
#define MOD_WIN_R   0x80
 

Enumerations

enum  { G_KEYBOARD_INTR_DT , G_KEYBOARD_N_TRANSFER }
 

Functions

 __FBSDID ("$FreeBSD$")
 
static SYSCTL_NODE (_hw_usb, OID_AUTO, g_keyboard, CTLFLAG_RW|CTLFLAG_MPSAFE, 0, "USB keyboard gadget")
 
 SYSCTL_INT (_hw_usb_g_keyboard, OID_AUTO, mode, CTLFLAG_RWTUN, &g_keyboard_mode, 0, "Mode selection")
 
 SYSCTL_INT (_hw_usb_g_keyboard, OID_AUTO, key_press_interval, CTLFLAG_RWTUN, &g_keyboard_key_press_interval, 0, "Key Press Interval in milliseconds")
 
 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")
 
 DRIVER_MODULE (g_keyboard, uhub, g_keyboard_driver, g_keyboard_devclass, 0, 0)
 
 MODULE_DEPEND (g_keyboard, usb, 1, 1, 1)
 
static void g_keyboard_timeout (void *arg)
 
static void g_keyboard_timeout_reset (struct g_keyboard_softc *sc)
 
static int g_keyboard_probe (device_t dev)
 
static int g_keyboard_attach (device_t dev)
 
static int g_keyboard_detach (device_t dev)
 
static uint8_t g_keyboard_get_keycode (struct g_keyboard_softc *sc, int index)
 
static void g_keyboard_intr_callback (struct usb_xfer *xfer, usb_error_t error)
 
static int g_keyboard_handle_request (device_t dev, const void *preq, void **pptr, uint16_t *plen, uint16_t offset, uint8_t *pstate)
 

Variables

static int g_keyboard_mode = 0
 
static int g_keyboard_key_press_interval = 1000
 
static char g_keyboard_key_press_pattern [G_KEYBOARD_MAX_STRLEN]
 
static device_probe_t g_keyboard_probe
 
static device_attach_t g_keyboard_attach
 
static device_detach_t g_keyboard_detach
 
static usb_handle_request_t g_keyboard_handle_request
 
static usb_callback_t g_keyboard_intr_callback
 
static devclass_t g_keyboard_devclass
 
static device_method_t g_keyboard_methods []
 
static driver_t g_keyboard_driver
 
static const struct usb_config g_keyboard_config [G_KEYBOARD_N_TRANSFER]
 

Macro Definition Documentation

◆ G_KEYBOARD_NKEYCODE

#define G_KEYBOARD_NKEYCODE   6 /* units */

Definition at line 94 of file g_keyboard.c.

◆ G_KEYBOARD_NMOD

#define G_KEYBOARD_NMOD   8 /* units */

Definition at line 93 of file g_keyboard.c.

◆ MOD_ALT_L

#define MOD_ALT_L   0x04

Definition at line 102 of file g_keyboard.c.

◆ MOD_ALT_R

#define MOD_ALT_R   0x40

Definition at line 103 of file g_keyboard.c.

◆ MOD_CONTROL_L

#define MOD_CONTROL_L   0x01

Definition at line 98 of file g_keyboard.c.

◆ MOD_CONTROL_R

#define MOD_CONTROL_R   0x10

Definition at line 99 of file g_keyboard.c.

◆ MOD_SHIFT_L

#define MOD_SHIFT_L   0x02

Definition at line 100 of file g_keyboard.c.

◆ MOD_SHIFT_R

#define MOD_SHIFT_R   0x20

Definition at line 101 of file g_keyboard.c.

◆ MOD_WIN_L

#define MOD_WIN_L   0x08

Definition at line 104 of file g_keyboard.c.

◆ MOD_WIN_R

#define MOD_WIN_R   0x80

Definition at line 105 of file g_keyboard.c.

◆ UPROTO_BOOT_KEYBOARD

#define UPROTO_BOOT_KEYBOARD   1

Definition at line 91 of file g_keyboard.c.

◆ USB_DEBUG_VAR

#define USB_DEBUG_VAR   g_keyboard_debug

Definition at line 59 of file g_keyboard.c.

Enumeration Type Documentation

◆ anonymous enum

anonymous enum
Enumerator
G_KEYBOARD_INTR_DT 
G_KEYBOARD_N_TRANSFER 

Definition at line 110 of file g_keyboard.c.

Function Documentation

◆ __FBSDID()

__FBSDID ( "$FreeBSD$"  )

◆ DRIVER_MODULE()

DRIVER_MODULE ( g_keyboard  ,
uhub  ,
g_keyboard_driver  ,
g_keyboard_devclass  ,
,
 
)

◆ g_keyboard_attach()

◆ g_keyboard_detach()

static int g_keyboard_detach ( device_t  dev)
static

◆ g_keyboard_get_keycode()

static uint8_t g_keyboard_get_keycode ( struct g_keyboard_softc sc,
int  index 
)
static

Definition at line 285 of file g_keyboard.c.

References index, g_keyboard_softc::sc_pattern, and g_keyboard_softc::sc_pattern_len.

Referenced by g_keyboard_intr_callback().

Here is the caller graph for this function:

◆ g_keyboard_handle_request()

static int g_keyboard_handle_request ( device_t  dev,
const void *  preq,
void **  pptr,
uint16_t *  plen,
uint16_t  offset,
uint8_t *  pstate 
)
static

◆ g_keyboard_intr_callback()

◆ g_keyboard_probe()

◆ g_keyboard_timeout()

static void g_keyboard_timeout ( void *  arg)
static

◆ g_keyboard_timeout_reset()

static void g_keyboard_timeout_reset ( struct g_keyboard_softc sc)
static

Definition at line 175 of file g_keyboard.c.

References g_keyboard_key_press_interval, g_keyboard_timeout(), g_keyboard_softc::sc_callout, usb_callout_reset, and USB_MS_TO_TICKS.

Referenced by g_keyboard_attach(), and g_keyboard_timeout().

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

◆ MODULE_DEPEND()

MODULE_DEPEND ( g_keyboard  ,
usb  ,
,
,
 
)

◆ SYSCTL_INT() [1/2]

SYSCTL_INT ( _hw_usb_g_keyboard  ,
OID_AUTO  ,
key_press_interval  ,
CTLFLAG_RWTUN  ,
g_keyboard_key_press_interval,
,
"Key Press Interval in milliseconds"   
)

◆ SYSCTL_INT() [2/2]

SYSCTL_INT ( _hw_usb_g_keyboard  ,
OID_AUTO  ,
mode  ,
CTLFLAG_RWTUN  ,
g_keyboard_mode,
,
"Mode selection"   
)

◆ SYSCTL_NODE()

static SYSCTL_NODE ( _hw_usb  ,
OID_AUTO  ,
g_keyboard  ,
CTLFLAG_RW|  CTLFLAG_MPSAFE,
,
"USB keyboard gadget"   
)
static

◆ SYSCTL_STRING()

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"   
)

Variable Documentation

◆ g_keyboard_attach

device_attach_t g_keyboard_attach
static

Definition at line 131 of file g_keyboard.c.

◆ g_keyboard_config

const struct usb_config g_keyboard_config[G_KEYBOARD_N_TRANSFER]
static
Initial value:
= {
.type = UE_INTERRUPT,
.endpoint = UE_ADDR_ANY,
.direction = UE_DIR_IN,
.flags = {.ext_buffer = 1,.pipe_bof = 1,},
.bufsize = sizeof(struct g_keyboard_data),
.frames = 2,
.usb_mode = USB_MODE_DEVICE,
},
}
static usb_callback_t g_keyboard_intr_callback
Definition: g_keyboard.c:134
@ G_KEYBOARD_INTR_DT
Definition: g_keyboard.c:111
#define UE_INTERRUPT
Definition: usb.h:544
#define UE_ADDR_ANY
Definition: usb.h:537
#define UE_DIR_IN
Definition: usb.h:531
@ USB_MODE_DEVICE
Definition: usb.h:779

Definition at line 159 of file g_keyboard.c.

Referenced by g_keyboard_attach().

◆ g_keyboard_detach

device_detach_t g_keyboard_detach
static

Definition at line 132 of file g_keyboard.c.

Referenced by g_keyboard_attach().

◆ g_keyboard_devclass

devclass_t g_keyboard_devclass
static

Definition at line 136 of file g_keyboard.c.

◆ g_keyboard_driver

driver_t g_keyboard_driver
static
Initial value:
= {
.name = "g_keyboard",
.methods = g_keyboard_methods,
.size = sizeof(struct g_keyboard_softc),
}
static device_method_t g_keyboard_methods[]
Definition: g_keyboard.c:138

Definition at line 150 of file g_keyboard.c.

◆ g_keyboard_handle_request

usb_handle_request_t g_keyboard_handle_request
static

Definition at line 133 of file g_keyboard.c.

◆ g_keyboard_intr_callback

usb_callback_t g_keyboard_intr_callback
static

Definition at line 134 of file g_keyboard.c.

◆ g_keyboard_key_press_interval

int g_keyboard_key_press_interval = 1000
static

Definition at line 80 of file g_keyboard.c.

Referenced by g_keyboard_timeout_reset().

◆ g_keyboard_key_press_pattern

char g_keyboard_key_press_pattern[G_KEYBOARD_MAX_STRLEN]
static

Definition at line 85 of file g_keyboard.c.

Referenced by g_keyboard_timeout().

◆ g_keyboard_methods

device_method_t g_keyboard_methods[]
static
Initial value:
= {
DEVMETHOD(device_probe, g_keyboard_probe),
DEVMETHOD(device_attach, g_keyboard_attach),
DEVMETHOD(device_detach, g_keyboard_detach),
DEVMETHOD_END
}
static device_detach_t g_keyboard_detach
Definition: g_keyboard.c:132
static usb_handle_request_t g_keyboard_handle_request
Definition: g_keyboard.c:133
static device_attach_t g_keyboard_attach
Definition: g_keyboard.c:131
static device_probe_t g_keyboard_probe
Definition: g_keyboard.c:130
static usb_error_t usb_handle_request(struct usb_xfer *)

Definition at line 138 of file g_keyboard.c.

◆ g_keyboard_mode

int g_keyboard_mode = 0
static

Definition at line 75 of file g_keyboard.c.

Referenced by g_keyboard_timeout().

◆ g_keyboard_probe

device_probe_t g_keyboard_probe
static

Definition at line 130 of file g_keyboard.c.