FreeBSD kernel usb device Code
usb_template_kbd.c File Reference
#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 <dev/usb/usb.h>
#include <dev/usb/usbdi.h>
#include <dev/usb/usb_core.h>
#include <dev/usb/usb_cdc.h>
#include <dev/usb/usb_ioctl.h>
#include <dev/usb/usb_util.h>
#include <dev/usb/template/usb_template.h>
Include dependency graph for usb_template_kbd.c:

Go to the source code of this file.

Macros

#define KBD_DEFAULT_VENDOR_ID   USB_TEMPLATE_VENDOR
 
#define KBD_DEFAULT_PRODUCT_ID   0x27db
 
#define KBD_DEFAULT_INTERFACE   "Keyboard Interface"
 
#define KBD_DEFAULT_MANUFACTURER   USB_TEMPLATE_MANUFACTURER
 
#define KBD_DEFAULT_PRODUCT   "Keyboard Test Device"
 
#define KBD_DEFAULT_SERIAL_NUMBER   "March 2008"
 

Enumerations

enum  {
  KBD_LANG_INDEX , KBD_INTERFACE_INDEX , KBD_MANUFACTURER_INDEX , KBD_PRODUCT_INDEX ,
  KBD_SERIAL_NUMBER_INDEX , KBD_MAX_INDEX
}
 

Functions

static const void * keyboard_get_vendor_desc (const struct usb_device_request *req, uint16_t *plen)
 
static const void * keyboard_get_string_desc (uint16_t lang_id, uint8_t string_index)
 
static void kbd_init (void *arg __unused)
 
static void kbd_uninit (void *arg __unused)
 
 SYSINIT (kbd_init, SI_SUB_LOCK, SI_ORDER_FIRST, kbd_init, NULL)
 
 SYSUNINIT (kbd_uninit, SI_SUB_LOCK, SI_ORDER_FIRST, kbd_uninit, NULL)
 

Variables

static struct usb_string_descriptor kbd_interface
 
static struct usb_string_descriptor kbd_manufacturer
 
static struct usb_string_descriptor kbd_product
 
static struct usb_string_descriptor kbd_serial_number
 
static struct sysctl_ctx_list kbd_ctx_list
 
static const struct usb_temp_packet_size keyboard_intr_mps
 
static const struct usb_temp_interval keyboard_intr_interval
 
static uint8_t keyboard_hid_descriptor []
 
static const struct usb_temp_endpoint_desc keyboard_ep_0
 
static const struct usb_temp_endpoint_desckeyboard_endpoints []
 
static const uint8_t keyboard_raw_desc []
 
static const void * keyboard_iface_0_desc []
 
static const struct usb_temp_interface_desc keyboard_iface_0
 
static const struct usb_temp_interface_desckeyboard_interfaces []
 
static const struct usb_temp_config_desc keyboard_config_desc
 
static const struct usb_temp_config_desckeyboard_configs []
 
static usb_temp_get_string_desc_t keyboard_get_string_desc
 
static usb_temp_get_vendor_desc_t keyboard_get_vendor_desc
 
struct usb_temp_device_desc usb_template_kbd
 

Macro Definition Documentation

◆ KBD_DEFAULT_INTERFACE

#define KBD_DEFAULT_INTERFACE   "Keyboard Interface"

Definition at line 81 of file usb_template_kbd.c.

◆ KBD_DEFAULT_MANUFACTURER

#define KBD_DEFAULT_MANUFACTURER   USB_TEMPLATE_MANUFACTURER

Definition at line 82 of file usb_template_kbd.c.

◆ KBD_DEFAULT_PRODUCT

#define KBD_DEFAULT_PRODUCT   "Keyboard Test Device"

Definition at line 83 of file usb_template_kbd.c.

◆ KBD_DEFAULT_PRODUCT_ID

#define KBD_DEFAULT_PRODUCT_ID   0x27db

Definition at line 80 of file usb_template_kbd.c.

◆ KBD_DEFAULT_SERIAL_NUMBER

#define KBD_DEFAULT_SERIAL_NUMBER   "March 2008"

Definition at line 84 of file usb_template_kbd.c.

◆ KBD_DEFAULT_VENDOR_ID

#define KBD_DEFAULT_VENDOR_ID   USB_TEMPLATE_VENDOR

Definition at line 79 of file usb_template_kbd.c.

Enumeration Type Documentation

◆ anonymous enum

anonymous enum
Enumerator
KBD_LANG_INDEX 
KBD_INTERFACE_INDEX 
KBD_MANUFACTURER_INDEX 
KBD_PRODUCT_INDEX 
KBD_SERIAL_NUMBER_INDEX 
KBD_MAX_INDEX 

Definition at line 70 of file usb_template_kbd.c.

Function Documentation

◆ kbd_init()

◆ kbd_uninit()

static void kbd_uninit ( void *arg  __unused)
static

Definition at line 286 of file usb_template_kbd.c.

References kbd_ctx_list.

◆ keyboard_get_string_desc()

static const void * keyboard_get_string_desc ( uint16_t  lang_id,
uint8_t  string_index 
)
static

◆ keyboard_get_vendor_desc()

static const void * keyboard_get_vendor_desc ( const struct usb_device_request req,
uint16_t *  plen 
)
static

Definition at line 196 of file usb_template_kbd.c.

References keyboard_hid_descriptor, plen, and req.

◆ SYSINIT()

SYSINIT ( kbd_init  ,
SI_SUB_LOCK  ,
SI_ORDER_FIRST  ,
kbd_init  ,
NULL   
)

◆ SYSUNINIT()

SYSUNINIT ( kbd_uninit  ,
SI_SUB_LOCK  ,
SI_ORDER_FIRST  ,
kbd_uninit  ,
NULL   
)

Variable Documentation

◆ kbd_ctx_list

struct sysctl_ctx_list kbd_ctx_list
static

Definition at line 91 of file usb_template_kbd.c.

Referenced by kbd_init(), and kbd_uninit().

◆ kbd_interface

struct usb_string_descriptor kbd_interface
static

Definition at line 86 of file usb_template_kbd.c.

Referenced by kbd_init(), and keyboard_get_string_desc().

◆ kbd_manufacturer

struct usb_string_descriptor kbd_manufacturer
static

Definition at line 87 of file usb_template_kbd.c.

Referenced by kbd_init(), and keyboard_get_string_desc().

◆ kbd_product

struct usb_string_descriptor kbd_product
static

Definition at line 88 of file usb_template_kbd.c.

Referenced by kbd_init(), and keyboard_get_string_desc().

◆ kbd_serial_number

struct usb_string_descriptor kbd_serial_number
static

Definition at line 89 of file usb_template_kbd.c.

Referenced by kbd_init(), and keyboard_get_string_desc().

◆ keyboard_config_desc

const struct usb_temp_config_desc keyboard_config_desc
static
Initial value:
= {
.ppIfaceDesc = keyboard_interfaces,
.bmAttributes = 0,
.bMaxPower = 0,
.iConfiguration = KBD_PRODUCT_INDEX,
}
@ KBD_PRODUCT_INDEX
static const struct usb_temp_interface_desc * keyboard_interfaces[]

Definition at line 158 of file usb_template_kbd.c.

◆ keyboard_configs

const struct usb_temp_config_desc* keyboard_configs[]
static
Initial value:
= {
NULL,
}
static const struct usb_temp_config_desc keyboard_config_desc

Definition at line 165 of file usb_template_kbd.c.

◆ keyboard_endpoints

const struct usb_temp_endpoint_desc* keyboard_endpoints[]
static
Initial value:
= {
NULL,
}
static const struct usb_temp_endpoint_desc keyboard_ep_0

Definition at line 129 of file usb_template_kbd.c.

◆ keyboard_ep_0

const struct usb_temp_endpoint_desc keyboard_ep_0
static
Initial value:
= {
.ppRawDesc = NULL,
.pPacketSize = &keyboard_intr_mps,
.pIntervals = &keyboard_intr_interval,
.bEndpointAddress = UE_DIR_IN,
.bmAttributes = UE_INTERRUPT,
}
#define UE_INTERRUPT
Definition: usb.h:544
#define UE_DIR_IN
Definition: usb.h:531
static const struct usb_temp_packet_size keyboard_intr_mps
static const struct usb_temp_interval keyboard_intr_interval

Definition at line 121 of file usb_template_kbd.c.

◆ keyboard_get_string_desc

usb_temp_get_string_desc_t keyboard_get_string_desc
static

Definition at line 170 of file usb_template_kbd.c.

◆ keyboard_get_vendor_desc

usb_temp_get_vendor_desc_t keyboard_get_vendor_desc
static

Definition at line 171 of file usb_template_kbd.c.

◆ keyboard_hid_descriptor

uint8_t keyboard_hid_descriptor[]
static
Initial value:
= {
0x05, 0x01, 0x09, 0x06, 0xa1, 0x01, 0x05, 0x07,
0x19, 0xe0, 0x29, 0xe7, 0x15, 0x00, 0x25, 0x01,
0x75, 0x01, 0x95, 0x08, 0x81, 0x02, 0x95, 0x01,
0x75, 0x08, 0x81, 0x01, 0x95, 0x03, 0x75, 0x01,
0x05, 0x08, 0x19, 0x01, 0x29, 0x03, 0x91, 0x02,
0x95, 0x05, 0x75, 0x01, 0x91, 0x01, 0x95, 0x06,
0x75, 0x08, 0x15, 0x00, 0x26, 0xff, 0x00, 0x05,
0x07, 0x19, 0x00, 0x2a, 0xff, 0x00, 0x81, 0x00,
0xc0
}

Definition at line 109 of file usb_template_kbd.c.

Referenced by keyboard_get_vendor_desc().

◆ keyboard_iface_0

const struct usb_temp_interface_desc keyboard_iface_0
static
Initial value:
= {
.ppRawDesc = keyboard_iface_0_desc,
.ppEndpoints = keyboard_endpoints,
.bInterfaceClass = UICLASS_HID,
.bInterfaceSubClass = UISUBCLASS_BOOT,
.bInterfaceProtocol = UIPROTO_BOOT_KEYBOARD,
.iInterface = KBD_INTERFACE_INDEX,
}
#define UISUBCLASS_BOOT
Definition: usb.h:454
#define UICLASS_HID
Definition: usb.h:453
#define UIPROTO_BOOT_KEYBOARD
Definition: usb.h:455
@ KBD_INTERFACE_INDEX
static const struct usb_temp_endpoint_desc * keyboard_endpoints[]
static const void * keyboard_iface_0_desc[]

Definition at line 144 of file usb_template_kbd.c.

◆ keyboard_iface_0_desc

const void* keyboard_iface_0_desc[]
static
Initial value:
= {
NULL,
}
static const uint8_t keyboard_raw_desc[]

Definition at line 139 of file usb_template_kbd.c.

◆ keyboard_interfaces

const struct usb_temp_interface_desc* keyboard_interfaces[]
static
Initial value:
= {
NULL,
}
static const struct usb_temp_interface_desc keyboard_iface_0

Definition at line 153 of file usb_template_kbd.c.

◆ keyboard_intr_interval

const struct usb_temp_interval keyboard_intr_interval
static
Initial value:
= {
.bInterval[USB_SPEED_LOW] = 2,
.bInterval[USB_SPEED_FULL] = 2,
.bInterval[USB_SPEED_HIGH] = 5,
}
@ USB_SPEED_LOW
Definition: usb.h:753
@ USB_SPEED_FULL
Definition: usb.h:754
@ USB_SPEED_HIGH
Definition: usb.h:755

Definition at line 101 of file usb_template_kbd.c.

◆ keyboard_intr_mps

const struct usb_temp_packet_size keyboard_intr_mps
static
Initial value:
= {
.mps[USB_SPEED_LOW] = 16,
.mps[USB_SPEED_FULL] = 16,
.mps[USB_SPEED_HIGH] = 16,
}

Definition at line 95 of file usb_template_kbd.c.

◆ keyboard_raw_desc

const uint8_t keyboard_raw_desc[]
static
Initial value:
= {
0x09, 0x21, 0x10, 0x01, 0x00, 0x01, 0x22, sizeof(keyboard_hid_descriptor),
0x00
}
static uint8_t keyboard_hid_descriptor[]

Definition at line 134 of file usb_template_kbd.c.

◆ usb_template_kbd

struct usb_temp_device_desc usb_template_kbd
Initial value:
= {
.getStringDesc = &keyboard_get_string_desc,
.getVendorDesc = &keyboard_get_vendor_desc,
.ppConfigDesc = keyboard_configs,
.idVendor = KBD_DEFAULT_VENDOR_ID,
.idProduct = KBD_DEFAULT_PRODUCT_ID,
.bcdDevice = 0x0100,
.bDeviceClass = UDCLASS_COMM,
.bDeviceSubClass = 0,
.bDeviceProtocol = 0,
.iManufacturer = KBD_MANUFACTURER_INDEX,
.iProduct = KBD_PRODUCT_INDEX,
.iSerialNumber = KBD_SERIAL_NUMBER_INDEX,
}
#define UDCLASS_COMM
Definition: usb.h:372
#define KBD_DEFAULT_VENDOR_ID
static usb_temp_get_vendor_desc_t keyboard_get_vendor_desc
@ KBD_SERIAL_NUMBER_INDEX
@ KBD_MANUFACTURER_INDEX
static const struct usb_temp_config_desc * keyboard_configs[]
static usb_temp_get_string_desc_t keyboard_get_string_desc
#define KBD_DEFAULT_PRODUCT_ID

Definition at line 173 of file usb_template_kbd.c.

Referenced by kbd_init(), and usb_temp_setup_by_index().