14#ifndef ZEPHYR_INCLUDE_USBD_H_ 
   15#define ZEPHYR_INCLUDE_USBD_H_ 
   46#define USB_BSTRING_LENGTH(s)           (sizeof(s) * 2 - 2) 
   58#define USB_STRING_DESCRIPTOR_LENGTH(s) (sizeof(s) * 2) 
  108#define USBD_NUMOF_INTERFACES_MAX       16U 
  193#define USBD_CCTX_REGISTERED            0 
  212                              const struct net_buf *
const buf);
 
  281#define USBD_DEVICE_DEFINE(device_name, uhc_dev, vid, pid)              \ 
  282        static struct usb_device_descriptor                             \ 
  283        desc_##device_name = {                                          \ 
  284                .bLength = sizeof(struct usb_device_descriptor),        \ 
  285                .bDescriptorType = USB_DESC_DEVICE,                     \ 
  286                .bcdUSB = sys_cpu_to_le16(USB_SRN_2_0),                 \ 
  287                .bDeviceClass = USB_BCC_MISCELLANEOUS,                  \ 
  288                .bDeviceSubClass = 2,                                   \ 
  289                .bDeviceProtocol = 1,                                   \ 
  290                .bMaxPacketSize0 = USB_CONTROL_EP_MPS,                  \ 
  293                .bcdDevice = sys_cpu_to_le16(USB_BCD_DRN),              \ 
  294                .iManufacturer = 0,                                     \ 
  296                .iSerialNumber = 0,                                     \ 
  297                .bNumConfigurations = 0,                                \ 
  299        static STRUCT_SECTION_ITERABLE(usbd_contex, device_name) = {    \ 
  300                .name = STRINGIFY(device_name),                         \ 
  302                .desc = &desc_##device_name,                            \ 
  305#define USBD_CONFIGURATION_DEFINE(name, attrib, power)                  \ 
  306        static struct usb_cfg_descriptor                                \ 
  307        cfg_desc_##name = {                                             \ 
  308                .bLength = sizeof(struct usb_cfg_descriptor),           \ 
  309                .bDescriptorType = USB_DESC_CONFIGURATION,              \ 
  311                .bNumInterfaces = 0,                                    \ 
  312                .bConfigurationValue = 1,                               \ 
  313                .iConfiguration = 0,                                    \ 
  314                .bmAttributes = USB_SCD_RESERVED | (attrib),            \ 
  315                .bMaxPower = (power),                                   \ 
  317        BUILD_ASSERT((power) < 256, "Too much power");                  \
 
  318        static struct usbd_config_node name = {                         \
 
  319                .desc = &cfg_desc_##name,                               \
 
  335#define USBD_DESC_LANG_DEFINE(name)                                     \ 
  336        static struct usb_string_descriptor                             \ 
  337        string_desc_##name = {                                          \ 
  338                .bLength = sizeof(struct usb_string_descriptor),        \ 
  339                .bDescriptorType = USB_DESC_STRING,                     \ 
  340                .bString = sys_cpu_to_le16(0x0409),                     \ 
  342        static struct usbd_desc_node name = {                           \ 
  344                .utype = USBD_DUT_STRING_LANG,                          \ 
  345                .desc = &string_desc_##name,                            \ 
  348#define USBD_DESC_STRING_DEFINE(d_name, d_string, d_utype)              \ 
  349        struct usb_string_descriptor_##d_name {                         \ 
  351                uint8_t bDescriptorType;                                \ 
  352                uint8_t bString[USB_BSTRING_LENGTH(d_string)];          \ 
  354        static struct usb_string_descriptor_##d_name                    \ 
  355        string_desc_##d_name = {                                        \ 
  356                .bLength = USB_STRING_DESCRIPTOR_LENGTH(d_string),      \ 
  357                .bDescriptorType = USB_DESC_STRING,                     \ 
  358                .bString = d_string,                                    \ 
  360        static struct usbd_desc_node d_name = {                         \ 
  362                .desc = &string_desc_##d_name,                          \ 
  376#define USBD_DESC_MANUFACTURER_DEFINE(d_name, d_string)                 \ 
  377        USBD_DESC_STRING_DEFINE(d_name, d_string, USBD_DUT_STRING_MANUFACTURER) 
  390#define USBD_DESC_PRODUCT_DEFINE(d_name, d_string)                      \ 
  391        USBD_DESC_STRING_DEFINE(d_name, d_string, USBD_DUT_STRING_PRODUCT) 
  405#define USBD_DESC_SERIAL_NUMBER_DEFINE(d_name, d_string)                \ 
  406        USBD_DESC_STRING_DEFINE(d_name, d_string, USBD_DUT_STRING_SERIAL_NUMBER) 
  408#define USBD_DEFINE_CLASS(class_name, class_api, class_data)            \ 
  409        static STRUCT_SECTION_ITERABLE(usbd_class_node, class_name) = { \ 
  410                .name = STRINGIFY(class_name),                          \ 
  412                .data = class_data,                                     \ 
  420#define VENDOR_REQ_DEFINE(_reqs, _len) \ 
  422                .reqs = (const uint8_t *)(_reqs), \ 
  430#define USBD_VENDOR_REQ(_reqs...) \ 
  431        VENDOR_REQ_DEFINE(((uint8_t []) { _reqs }), \ 
  432                          sizeof((uint8_t []) { _reqs })) 
  746                            const uint8_t cfg, 
const bool enable);
 
  758                            const uint8_t cfg, 
const bool enable);
 
long atomic_t
Definition: atomic.h:22
 
struct _dnode sys_dnode_t
Definition: dlist.h:49
 
struct _dnode sys_dlist_t
Definition: dlist.h:48
 
int usbd_add_descriptor(struct usbd_contex *uds_ctx, struct usbd_desc_node *dn)
Add common USB descriptor.
 
int usbd_ep_set_halt(struct usbd_contex *uds_ctx, uint8_t ep)
Halt endpoint.
 
int usbd_ep_dequeue(struct usbd_contex *uds_ctx, const uint8_t ep)
Remove all USB device controller requests from endpoint queue.
 
int usbd_ep_clear_halt(struct usbd_contex *uds_ctx, uint8_t ep)
Clear endpoint halt.
 
int usbd_ep_enqueue(const struct usbd_class_node *const c_nd, struct net_buf *const buf)
Queue USB device request.
 
int usbd_ep_buf_free(struct usbd_contex *uds_ctx, struct net_buf *buf)
Free USB device request buffer.
 
int usbd_register_class(struct usbd_contex *uds_ctx, const char *name, uint8_t cfg)
Register an USB class instance.
 
int usbd_wakeup_request(struct usbd_contex *uds_ctx)
Initiate the USB remote wakeup (TBD)
 
int usbd_ep_ctrl_enqueue(struct usbd_contex *const uds_ctx, struct net_buf *const buf)
Queue USB device control request.
 
struct net_buf * usbd_ep_ctrl_buf_alloc(struct usbd_contex *const uds_ctx, const uint8_t ep, const size_t size)
Allocate buffer for USB device control request.
 
int usbd_config_attrib_rwup(struct usbd_contex *const uds_ctx, const uint8_t cfg, const bool enable)
Setup USB device configuration attribute Remote Wakeup.
 
int usbd_device_set_class(struct usbd_contex *const uds_ctx, const uint8_t value)
Set USB device descriptor value bDeviceClass.
 
int usbd_device_set_proto(struct usbd_contex *const uds_ctx, const uint8_t value)
Set USB device descriptor value bDeviceProtocol.
 
int usbd_device_set_vid(struct usbd_contex *const uds_ctx, const uint16_t vid)
Set USB device descriptor value idVendor.
 
int usbd_config_attrib_self(struct usbd_contex *const uds_ctx, const uint8_t cfg, const bool enable)
Setup USB device configuration attribute Self-powered.
 
bool usbd_is_suspended(struct usbd_contex *uds_ctx)
Checks whether the USB device controller is suspended.
 
bool usbd_ep_is_halted(struct usbd_contex *uds_ctx, uint8_t ep)
Checks whether the endpoint is halted.
 
struct net_buf * usbd_ep_buf_alloc(const struct usbd_class_node *const c_nd, const uint8_t ep, const size_t size)
Allocate buffer for USB device request.
 
usbd_ch9_state
Definition: usbd.h:116
 
int usbd_device_set_bcd(struct usbd_contex *const uds_ctx, const uint16_t bcd)
Set USB device descriptor value bcdUSB.
 
int usbd_disable(struct usbd_contex *uds_ctx)
Disable the USB device support.
 
int usbd_shutdown(struct usbd_contex *const uds_ctx)
Shutdown the USB device support.
 
usbd_desc_usage_type
Definition: usbd.h:61
 
int usbd_enable(struct usbd_contex *uds_ctx)
Enable the USB device support and registered class instances.
 
int usbd_config_maxpower(struct usbd_contex *const uds_ctx, const uint8_t cfg, const uint8_t power)
Setup USB device configuration power consumption.
 
int usbd_device_set_subclass(struct usbd_contex *const uds_ctx, const uint8_t value)
Set USB device descriptor value bDeviceSubClass.
 
int usbd_device_set_pid(struct usbd_contex *const uds_ctx, const uint16_t pid)
Set USB device descriptor value idProduct.
 
int usbd_unregister_class(struct usbd_contex *uds_ctx, const char *name, uint8_t cfg)
Unregister an USB class instance.
 
int usbd_add_configuration(struct usbd_contex *uds_ctx, struct usbd_config_node *cd)
Add a USB device configuration.
 
int usbd_init(struct usbd_contex *uds_ctx)
Initialize USB device.
 
#define USBD_NUMOF_INTERFACES_MAX
Definition: usbd.h:108
 
@ USBD_STATE_CONFIGURED
Definition: usbd.h:119
 
@ USBD_STATE_DEFAULT
Definition: usbd.h:117
 
@ USBD_STATE_ADDRESS
Definition: usbd.h:118
 
@ USBD_DUT_STRING_MANUFACTURER
Definition: usbd.h:63
 
@ USBD_DUT_STRING_PRODUCT
Definition: usbd.h:64
 
@ USBD_DUT_STRING_LANG
Definition: usbd.h:62
 
@ USBD_DUT_STRING_INTERFACE
Definition: usbd.h:66
 
@ USBD_DUT_STRING_SERIAL_NUMBER
Definition: usbd.h:65
 
Single-linked list implementation.
 
struct _slist sys_slist_t
Definition: slist.h:40
 
struct _snode sys_snode_t
Definition: slist.h:33
 
__UINT32_TYPE__ uint32_t
Definition: stdint.h:90
 
__UINT8_TYPE__ uint8_t
Definition: stdint.h:88
 
__UINT16_TYPE__ uint16_t
Definition: stdint.h:89
 
Runtime device structure (in ROM) per driver instance.
Definition: device.h:380
 
Definition: kernel.h:2822
 
Network buffer representation.
Definition: buf.h:906
 
uint16_t size
Definition: buf.h:938
 
Vendor Requests Table.
Definition: usbd.h:185
 
const uint8_t * reqs
Definition: usbd.h:187
 
uint8_t len
Definition: usbd.h:189
 
int ctrl_type
Definition: usbd.h:130
 
uint8_t configuration
Definition: usbd.h:136
 
uint32_t ep_halt
Definition: usbd.h:134
 
enum usbd_ch9_state state
Definition: usbd.h:132
 
struct usb_setup_packet setup
Definition: usbd.h:128
 
uint8_t alternate[16U]
Definition: usbd.h:140
 
bool new_address
Definition: usbd.h:138
 
USB device support class instance API.
Definition: usbd.h:200
 
void(* enable)(struct usbd_class_node *const node)
Definition: usbd.h:230
 
void(* shutdown)(struct usbd_class_node *const node)
Definition: usbd.h:239
 
int(* init)(struct usbd_class_node *const node)
Definition: usbd.h:236
 
void(* resumed)(struct usbd_class_node *const node)
Definition: usbd.h:227
 
void(* suspended)(struct usbd_class_node *const node)
Definition: usbd.h:224
 
void(* disable)(struct usbd_class_node *const node)
Definition: usbd.h:233
 
int(* control_to_dev)(struct usbd_class_node *const node, const struct usb_setup_packet *const setup, const struct net_buf *const buf)
Definition: usbd.h:210
 
int(* control_to_host)(struct usbd_class_node *const node, const struct usb_setup_packet *const setup, struct net_buf *const buf)
Definition: usbd.h:215
 
void(* feature_halt)(struct usbd_class_node *const node, uint8_t ep, bool halted)
Definition: usbd.h:202
 
void(* update)(struct usbd_class_node *const node, uint8_t iface, uint8_t alternate)
Definition: usbd.h:206
 
int(* request)(struct usbd_class_node *const node, struct net_buf *buf, int err)
Definition: usbd.h:220
 
USB device support class data.
Definition: usbd.h:245
 
void * priv
Definition: usbd.h:267
 
const struct usbd_cctx_vendor_req * v_reqs
Definition: usbd.h:253
 
atomic_t state
Definition: usbd.h:265
 
void * desc
Definition: usbd.h:251
 
uint32_t ep_active
Definition: usbd.h:261
 
uint32_t iface_bm
Definition: usbd.h:263
 
uint32_t ep_assigned
Definition: usbd.h:257
 
struct usbd_contex * uds_ctx
Definition: usbd.h:247
 
const char * name
Definition: usbd.h:274
 
sys_snode_t node
Definition: usbd.h:272
 
const struct usbd_class_api * api
Definition: usbd.h:276
 
struct usbd_class_data * data
Definition: usbd.h:278
 
sys_snode_t node
Definition: usbd.h:100
 
sys_slist_t class_list
Definition: usbd.h:104
 
void * desc
Definition: usbd.h:102
 
sys_dlist_t descriptors
Definition: usbd.h:173
 
struct usbd_ch9_data ch9_data
Definition: usbd.h:171
 
const char * name
Definition: usbd.h:165
 
sys_slist_t configs
Definition: usbd.h:175
 
const struct device * dev
Definition: usbd.h:169
 
struct k_mutex mutex
Definition: usbd.h:167
 
void * desc
Definition: usbd.h:179
 
struct usbd_status status
Definition: usbd.h:177
 
unsigned int idx
Definition: usbd.h:79
 
unsigned int utf16le
Definition: usbd.h:83
 
unsigned int custom_sn
Definition: usbd.h:85
 
void * desc
Definition: usbd.h:87
 
unsigned int utype
Definition: usbd.h:81
 
sys_dnode_t node
Definition: usbd.h:77
 
unsigned int rwup
Definition: usbd.h:154
 
unsigned int enabled
Definition: usbd.h:150
 
unsigned int initialized
Definition: usbd.h:148
 
unsigned int suspended
Definition: usbd.h:152
 
USB Chapter 9 structures and definitions.