Lightweight USB stack  1.0
usbd_core.h
1 /* This file is the part of the Lightweight USB device Stack for STM32 microcontrollers
2  *
3  * Copyright ©2016 Dmitry Filimonchuk <dmitrystu[at]gmail[dot]com>
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  * http://www.apache.org/licenses/LICENSE-2.0
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14 .*/
15 
16 #ifndef _USBD_CORE_H_
17 #define _USBD_CORE_H_
18 #if defined(__cplusplus)
19  extern "C" {
20 #endif
21 
24 #if defined(__DOXYGEN__)
25 
27 #define USBD_PINS_REMAP
28 #define USBD_SOF_DISABLED
29 #define USBD_VBUS_DETECT
30 #define USBD_DP_PORT
31 #define USBD_DP_PIN
32 #define USBD_SOF_OUT
33 #define USBD_PRIMARY_OTGHS
34 #define USBD_USE_EXT_ULPI
35 #define USB_PMA_SIZE
39 #endif
40 
47 #define usbd_evt_reset 0
48 #define usbd_evt_sof 1
49 #define usbd_evt_susp 2
50 #define usbd_evt_wkup 3
51 #define usbd_evt_eptx 4
52 #define usbd_evt_eprx 5
53 #define usbd_evt_epsetup 6
54 #define usbd_evt_error 7
55 #define usbd_evt_count 8
56 
61 #define usbd_lane_unk 0
62 #define usbd_lane_dsc 1
63 #define usbd_lane_sdp 2
64 #define usbd_lane_cdp 3
65 #define usbd_lane_dcp 4
71 #define USBD_HW_ADDRFST (1 << 0)
72 #define USBD_HW_BC (1 << 1)
73 #define USND_HW_HS (1 << 2)
74 #define USBD_HW_ENABLED (1 << 3)
75 #define USBD_HW_ENUMSPEED (2 << 4)
76 #define USBD_HW_SPEED_NC (0 << 4)
77 #define USBD_HW_SPEED_LS (1 << 4)
78 #define USBD_HW_SPEED_FS (2 << 4)
79 #define USBD_HW_SPEED_HS (3 << 4)
87 #define USB_EPTYPE_DBLBUF 0x04
91 #define USB_REQ_DIRECTION (1 << 7)
92 #define USB_REQ_HOSTTODEV (0 << 7)
93 #define USB_REQ_DEVTOHOST (1 << 7)
94 #define USB_REQ_TYPE (3 << 5)
95 #define USB_REQ_STANDARD (0 << 5)
96 #define USB_REQ_CLASS (1 << 5)
97 #define USB_REQ_VENDOR (2 << 5)
98 #define USB_REQ_RECIPIENT (3 << 0)
99 #define USB_REQ_DEVICE (0 << 0)
100 #define USB_REQ_INTERFACE (1 << 0)
101 #define USB_REQ_ENDPOINT (2 << 0)
102 #define USB_REQ_OTHER (3 << 0)
106 #if !defined(__ASSEMBLER__)
107 #include <stdbool.h>
108 
111 enum usbd_machine_state {
112  usbd_state_disabled,
113  usbd_state_disconnected,
117 };
120 enum usbd_ctl_state {
121  usbd_ctl_idle,
130 };
133 typedef enum _usbd_respond {
134  usbd_fail,
139 typedef struct _usbd_device usbd_device;
140 
142 typedef struct {
143  uint8_t bmRequestType;
145  uint8_t bRequest;
146  uint16_t wValue;
148  uint16_t wIndex;
150  uint16_t wLength;
152  uint8_t data[];
153 } usbd_ctlreq;
156 typedef struct {
157  void *data_buf;
158  void *data_ptr;
159  uint16_t data_count;
160  uint16_t data_maxsize;
161  uint8_t ep0size;
162  uint8_t device_cfg;
163  uint8_t device_state;
164  uint8_t control_state;
173 typedef void (*usbd_evt_callback)(usbd_device *dev, uint8_t event, uint8_t ep);
174 
180 typedef void (*usbd_rqc_callback)(usbd_device *dev, usbd_ctlreq *req);
181 
197 typedef usbd_respond (*usbd_ctl_callback)(usbd_device *dev, usbd_ctlreq *req, usbd_rqc_callback *callback);
198 
207 typedef usbd_respond (*usbd_dsc_callback)(usbd_ctlreq *req, void **address, uint16_t *dsize);
208 
216 typedef usbd_respond (*usbd_cfg_callback)(usbd_device *dev, uint8_t cfg);
217 
225 typedef uint32_t (*usbd_hw_getinfo)(void);
226 
230 typedef void (*usbd_hw_enable)(bool enable);
231 
236 typedef uint8_t (*usbd_hw_connect)(bool connect);
237 
241 typedef void (*usbd_hw_setaddr)(uint8_t address);
242 
249 typedef bool (*usbd_hw_ep_config)(uint8_t ep, uint8_t eptype, uint16_t epsize);
250 
256 typedef void (*usbd_hw_ep_deconfig)(uint8_t ep);
257 
265 typedef int32_t (*usbd_hw_ep_read)(uint8_t ep, void *buf, uint16_t blen);
266 
273 typedef int32_t (*usbd_hw_ep_write)(uint8_t ep, void *buf, uint16_t blen);
274 
280 typedef void (*usbd_hw_ep_setstall)(uint8_t ep, bool stall);
281 
286 typedef bool (*usbd_hw_ep_isstalled)(uint8_t ep);
287 
292 typedef void (*usbd_hw_poll)(usbd_device *dev, usbd_evt_callback callback);
293 
295 typedef uint16_t (*usbd_hw_get_frameno)(void);
296 
302 typedef uint16_t (*usbd_hw_get_serialno)(void *buffer);
303 
305 struct usbd_driver {
306  usbd_hw_getinfo getinfo;
307  usbd_hw_enable enable;
308  usbd_hw_connect connect;
309  usbd_hw_setaddr setaddr;
310  usbd_hw_ep_config ep_config;
311  usbd_hw_ep_deconfig ep_deconfig;
312  usbd_hw_ep_read ep_read;
313  usbd_hw_ep_write ep_write;
314  usbd_hw_ep_setstall ep_setstall;
315  usbd_hw_ep_isstalled ep_isstalled;
318  usbd_hw_get_serialno get_serialno_desc;
319 };
327 struct _usbd_device {
328  const struct usbd_driver *driver;
333  usbd_evt_callback events[usbd_evt_count];
336 };
345 inline static void usbd_init(usbd_device *dev, const struct usbd_driver *drv,
346  const uint8_t ep0size, uint32_t *buffer, const uint16_t bsize) {
347  dev->driver = drv;
348  dev->status.ep0size = ep0size;
349  dev->status.data_ptr = buffer;
350  dev->status.data_buf = buffer;
351  dev->status.data_maxsize = bsize - __builtin_offsetof(usbd_ctlreq, data);
352 }
353 
358 void usbd_poll(usbd_device *dev);
359 
364 inline static void usbd_reg_control(usbd_device *dev, usbd_ctl_callback callback) {
365  dev->control_callback = callback;
366 }
367 
372 inline static void usbd_reg_config(usbd_device *dev, usbd_cfg_callback callback) {
373  dev->config_callback = callback;
374 }
375 
380 inline static void usbd_reg_descr(usbd_device *dev, usbd_dsc_callback callback) {
381  dev->descriptor_callback = callback;
382 }
383 
388 inline static bool usbd_ep_config(usbd_device *dev, uint8_t ep, uint8_t eptype, uint16_t epsize) {
389  return dev->driver->ep_config(ep, eptype, epsize);
390 }
391 
396 inline static void usbd_ep_deconfig(usbd_device *dev, uint8_t ep) {
397  dev->driver->ep_deconfig(ep);
398 }
399 
405 inline static void usbd_reg_endpoint(usbd_device *dev, uint8_t ep, usbd_evt_callback callback) {
406  dev->endpoint[ep & 0x07] = callback;
407 }
408 
414 inline static void usbd_reg_event(usbd_device *dev, uint8_t evt, usbd_evt_callback callback) {
415  dev->events[evt] = callback;
416 }
417 
422 inline static int32_t usbd_ep_write(usbd_device *dev, uint8_t ep, void *buf, uint16_t blen) {
423  return dev->driver->ep_write(ep, buf, blen);
424 }
425 
430 inline static int32_t usbd_ep_read(usbd_device *dev, uint8_t ep, void *buf, uint16_t blen) {
431  return dev->driver->ep_read(ep, buf, blen);
432 }
433 
438 inline static void usbd_ep_stall(usbd_device *dev, uint8_t ep) {
439  dev->driver->ep_setstall(ep, 1);
440 }
441 
446 inline static void usbd_ep_unstall(usbd_device *dev, uint8_t ep) {
447  dev->driver->ep_setstall(ep, 0);
448 }
449 
454 inline static void usbd_enable(usbd_device *dev, bool enable) {
455  dev->driver->enable(enable);
456 }
457 
463 inline static uint8_t usbd_connect(usbd_device *dev, bool connect) {
464  return dev->driver->connect(connect);
465 }
466 
469 inline static uint32_t usbd_getinfo(usbd_device *dev) {
470  return dev->driver->getinfo();
471 }
472 
473 #endif //(__ASSEMBLER__)
474 
477 #if defined(__cplusplus)
478  }
479 #endif
480 #endif //_USBD_STD_H_
static void usbd_reg_control(usbd_device *dev, usbd_ctl_callback callback)
Register callback for all control requests.
Definition: usbd_core.h:366
static void usbd_ep_deconfig(usbd_device *dev, uint8_t ep)
Deconfigure endpoint.
Definition: usbd_core.h:398
static void usbd_reg_config(usbd_device *dev, usbd_cfg_callback callback)
Register callback for SET_CONFIG control request.
Definition: usbd_core.h:374
TX stage. Transmitting DATA-IN payload. Zero length packet maybe required..
Definition: usbd_core.h:126
static void usbd_reg_descr(usbd_device *dev, usbd_dsc_callback callback)
Register callback for GET_DESCRIPTOR control request.
Definition: usbd_core.h:382
usbd_machine_state
USB device machine states.
Definition: usbd_core.h:113
uint16_t(* usbd_hw_get_serialno)(void *buffer)
Makes a string descriptor contains unique serial number from hardware ID&#39;s.
Definition: usbd_core.h:304
usbd_rqc_callback complete_callback
USB control transfer completed callback function.
Definition: usbd_core.h:332
uint32_t(* usbd_hw_getinfo)(void)
Get USB device status and capabilities.
Definition: usbd_core.h:227
usbd_status status
Definition: usbd_core.h:337
RX stage. Receiving DATA-OUT payload.
Definition: usbd_core.h:124
static uint32_t usbd_getinfo(usbd_device *dev)
Retrieves status and capabilities.
Definition: usbd_core.h:471
STATUS-IN stage.
Definition: usbd_core.h:130
void usbd_poll(usbd_device *dev)
Polls USB for events.
usbd_respond(* usbd_dsc_callback)(usbd_ctlreq *req, void **address, uint16_t *dsize)
USB get descriptor callback function.
Definition: usbd_core.h:209
STATUS-OUT stage.
Definition: usbd_core.h:131
void(* usbd_rqc_callback)(usbd_device *dev, usbd_ctlreq *req)
USB control transfer completed callback function.
Definition: usbd_core.h:182
Represents generic USB control request.
Definition: usbd_core.h:144
const struct usbd_driver * driver
Represents a hardware USB driver call table.
Definition: usbd_core.h:330
Function has an error, STALLPID will be issued.
Definition: usbd_core.h:136
usbd_respond
Reporting status results.
Definition: usbd_core.h:135
static int32_t usbd_ep_read(usbd_device *dev, uint8_t ep, void *buf, uint16_t blen)
Read data from endpoint.
Definition: usbd_core.h:432
int32_t(* usbd_hw_ep_read)(uint8_t ep, void *buf, uint16_t blen)
Reads data from OUT or control endpoint.
Definition: usbd_core.h:267
usbd_hw_enable enable
Enables or disables USB hardware.
Definition: usbd_core.h:309
Idle stage. Awaiting for SETUP packet.
Definition: usbd_core.h:123
Function is busy. NAK handshake.
Definition: usbd_core.h:138
int32_t(* usbd_hw_ep_write)(uint8_t ep, void *buf, uint16_t blen)
Writes data to IN or control endpoint.
Definition: usbd_core.h:275
bool(* usbd_hw_ep_config)(uint8_t ep, uint8_t eptype, uint16_t epsize)
Configures endpoint.
Definition: usbd_core.h:251
static void usbd_ep_unstall(usbd_device *dev, uint8_t ep)
Unstall endpoint.
Definition: usbd_core.h:448
TX stage. Last DATA-IN packed passed to buffer. Awaiting for the TX completion.
Definition: usbd_core.h:128
usbd_ctl_state
USB device control endpoint machine state.
Definition: usbd_core.h:122
static uint8_t usbd_connect(usbd_device *dev, bool connect)
Connects or disconnects USB hardware to/from usb host.
Definition: usbd_core.h:465
static void usbd_enable(usbd_device *dev, bool enable)
Enables or disables USB hardware.
Definition: usbd_core.h:456
usbd_evt_callback events[usbd_evt_count]
array of the event callbacks.
Definition: usbd_core.h:335
void(* usbd_hw_poll)(usbd_device *dev, usbd_evt_callback callback)
Polls USB hardware for the events.
Definition: usbd_core.h:294
bool(* usbd_hw_ep_isstalled)(uint8_t ep)
Checks endpoint for stalled state.
Definition: usbd_core.h:288
usbd_respond(* usbd_cfg_callback)(usbd_device *dev, uint8_t cfg)
USB set configuration callback function.
Definition: usbd_core.h:218
void(* usbd_hw_ep_deconfig)(uint8_t ep)
De-configures, cleans and disables endpoint.
Definition: usbd_core.h:258
TX stage. Transmitting DATA-IN payload.
Definition: usbd_core.h:125
static void usbd_reg_event(usbd_device *dev, uint8_t evt, usbd_evt_callback callback)
Registers event callback.
Definition: usbd_core.h:416
static void usbd_init(usbd_device *dev, const struct usbd_driver *drv, const uint8_t ep0size, uint32_t *buffer, const uint16_t bsize)
Initializes device structure.
Definition: usbd_core.h:347
Represents a USB device data.
Definition: usbd_core.h:329
static void usbd_reg_endpoint(usbd_device *dev, uint8_t ep, usbd_evt_callback callback)
Register endpoint callback.
Definition: usbd_core.h:407
usbd_hw_connect connect
Definition: usbd_core.h:310
usbd_respond(* usbd_ctl_callback)(usbd_device *dev, usbd_ctlreq *req, usbd_rqc_callback *callback)
USB control callback function.
Definition: usbd_core.h:199
static bool usbd_ep_config(usbd_device *dev, uint8_t ep, uint8_t eptype, uint16_t epsize)
Configure endpoint.
Definition: usbd_core.h:390
usbd_ctl_callback control_callback
USB control callback function.
Definition: usbd_core.h:331
static int32_t usbd_ep_write(usbd_device *dev, uint8_t ep, void *buf, uint16_t blen)
Write data to endpoint.
Definition: usbd_core.h:424
static void usbd_ep_stall(usbd_device *dev, uint8_t ep)
Stall endpoint.
Definition: usbd_core.h:440
Represents a hardware USB driver call table.
Definition: usbd_core.h:307
void(* usbd_hw_enable)(bool enable)
Enables or disables USB hardware.
Definition: usbd_core.h:232
usbd_evt_callback endpoint[8]
array of the endpoint callbacks.
Definition: usbd_core.h:336
void(* usbd_evt_callback)(usbd_device *dev, uint8_t event, uint8_t ep)
Generic USB device event callback for events and endpoints processing.
Definition: usbd_core.h:175
usbd_cfg_callback config_callback
USB set configuration callback function.
Definition: usbd_core.h:333
uint16_t(* usbd_hw_get_frameno)(void)
Gets frame number from usb hardware.
Definition: usbd_core.h:297
void(* usbd_hw_setaddr)(uint8_t address)
Sets USB hardware address.
Definition: usbd_core.h:243
uint8_t(* usbd_hw_connect)(bool connect)
Definition: usbd_core.h:238
Function completes request accepted ZLP or data will be send.
Definition: usbd_core.h:137
usbd_dsc_callback descriptor_callback
USB get descriptor callback function.
Definition: usbd_core.h:334
void(* usbd_hw_ep_setstall)(uint8_t ep, bool stall)
Definition: usbd_core.h:282