0% found this document useful (0 votes)
161 views60 pages

UM1734 User Manual: STM32Cube™ USB Device Library

Uploaded by

Johnny
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
161 views60 pages

UM1734 User Manual: STM32Cube™ USB Device Library

Uploaded by

Johnny
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 60

UM1734

User manual
STM32Cube™ USB device library

Introduction
The STM32Cube™ is an STMicroelectronics original initiative to make developers’ lives
easier by reducing development effort, time and cost. STM32Cube™ covers the whole
STM32 portfolio.
STM32Cube™ includes:
• STM32CubeMX, a graphical software configuration tool that allows the generation of C
initialization code using graphical wizards.
• A comprehensive embedded software platform, delivered per Series (such as
STM32CubeF4 for STM32F4 Series)
– The STM32Cube™ HAL, STM32 abstraction layer embedded software ensuring
maximized portability across the STM32 portfolio,
– A consistent set of middleware components such as RTOS, USB, TCP/IP,
Graphics,
– All embedded software utilities, delivered with a full set of examples.
The Universal Serial Bus (USB) is the most successful interconnect in the history of
personal computing which is used to connect devices like mouse, game-pads and joysticks,
scanners, digital cameras, and printers. USB has also migrated into consumer electronics
and mobile products.
This user manual describes the STM32Cube™ USB device library which is part of the
STM32Cube™ MCU Package that can be downloaded free from ST website
(http://www.st.com/stm32cube). It is intended for developers who use STM32Cube™ MCU
Package on STM32 microcontrollers. It describes how to start and implement a USB device
applications for most common USB device classes (HID, MSC, Audio, CDC…) based on the
USB device stack that supports all STM32 microcontroller Series.
Note: This document is applicable to all STM32 Series that feature an USB peripheral. However
for simplicity reason, the STM32F4xx devices and STM32CubeF4 are used as reference
platform. To know more about the examples implementation on your STM32 device, refer to
the readme file provided within the associated STM32Cube™ MCU package.

Table 1. Application products


Type Part numbers

STM32CubeF0, STM32CubeF1, STM32CubeF2, STM32CubeF3,


STM32Cube MCU
STM32CubeF4, STM32CubeF7, STM32CubeL0, STM32CubeL1,
Packages
STM32CubeL4, STM32CubeG0, STM32CubeH7, STM32CubeWB

February 2019 UM1734 Rev 4 1/60


www.st.com 1
Contents UM1734

Contents

1 Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.1 Acronyms and abbreviations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.2 General information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.3 Additional Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.4 References . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

2 USB device library description . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8


2.1 Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.2 Features . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

3 USB device library architecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10


3.1 Architecture overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

4 USB OTG Hardware Abstraction Layer . . . . . . . . . . . . . . . . . . . . . . . . . 12


4.1 Driver architecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
4.2 USB driver programming manual . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
4.2.1 Configuring USB driver structure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

5 USB device library overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16


5.1 USB device library description . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
5.1.1 USB device library flow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
5.1.2 USB device data flow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
5.1.3 Core interface with low level driver . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
5.1.4 USB device library interfacing model . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
5.1.5 Configuring the USB device firmware library . . . . . . . . . . . . . . . . . . . . . 23
5.1.6 USB control functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
5.2 USB device library functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
5.3 USB device class interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28

6 USB device library class module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31


6.1 HID class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
6.1.1 HID class implementation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
6.1.2 HID user interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32

2/60 UM1734 Rev 4


UM1734 Contents

6.1.3 HID Class Driver APIs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33


6.2 Mass storage class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
6.2.1 Mass storage class implementation . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
6.2.2 Get Max MUN (class-specific request) . . . . . . . . . . . . . . . . . . . . . . . . . 35
6.2.3 MSC Core files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
6.2.4 Disk operation structure definition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
6.2.5 Disk operation functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
6.3 Device firmware upgrade (DFU) class . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
6.3.1 Device firmware upgrade (DFU) class implementation . . . . . . . . . . . . . 40
6.3.2 Device firmware upgrade (DFU) Class core files . . . . . . . . . . . . . . . . . . 42
6.4 Audio class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
6.4.1 Audio class implementation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
6.4.2 Audio core files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
6.4.3 How to use this driver . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
6.4.4 Audio known limitations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
6.5 Communication device class (CDC) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
6.5.1 Communication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
6.5.2 Data IN transfer management (from device to host) . . . . . . . . . . . . . . . 49
6.5.3 Data OUT transfer management (from host to device) . . . . . . . . . . . . . 49
6.5.4 Command request management . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
6.5.5 Command device class (CDC) core files . . . . . . . . . . . . . . . . . . . . . . . . 49
6.5.6 How to use . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
6.5.7 CDC known limitations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
6.6 Adding a custom class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
6.7 Library footprint optimization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54

7 Frequently-asked questions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57

8 Revision history . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59

UM1734 Rev 4 3/60


3
List of tables UM1734

List of tables

Table 1. Application products . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1


Table 2. List of terms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Table 3. USB device status . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
Table 4. Standard requests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
Table 5. API description . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
Table 6. Low level Event Callback functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
Table 7. USB library configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
Table 8. USB device core files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
Table 9. Class drivers files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
Table 10. usbd_core (.c,.h) files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
Table 11. usbd_ioreq (.c,.h) files functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
Table 12. usbd_ctrlq (.c,.h) files functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
Table 13. USB device class files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
Table 14. usbd_hid.c,h files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
Table 15. SCSI commands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
Table 16. usbd_msc (.c,.h) files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
Table 17. usbd_msc_bot (.c,.h) files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
Table 18. usbd_msc_scsi (.c,.h) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
Table 19. Disk operation functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
Table 20. DFU states . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
Table 21. Supported requests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
Table 22. usbd_dfu (.c,.h) files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
Table 23. Audio control requests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
Table 24. usbd_audio_core (.c,.h) files. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
Table 25. usbd_audio_if (.c,.h) files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
Table 26. Audio player states . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
Table 27. usbd_cdc (.c,.h) files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
Table 28. Configurable CDC parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
Table 29. usbd_cdc_interface (.c,.h) files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
Table 30. Variables used by usbd_cdc_xxx_if.c/.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
Table 31. Document revision history . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59

4/60 UM1734 Rev 4


UM1734 List of figures

List of figures

Figure 1. STM32Cube USB device library . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9


Figure 2. USB device library architecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
Figure 3. Driver architecture overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
Figure 4. USBD_HandleTypedef . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Figure 5. USB device library directory structure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
Figure 6. Data structure for SETUP packet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
Figure 7. USB device library process flowchart . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
Figure 8. USB device data flow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
Figure 9. USB device library interfacing model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
Figure 10. USB Class callback structure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
Figure 11. USB device descriptors structure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
Figure 12. Example of USBD_HID_SendReport function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
Figure 13. BOT Protocol architecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
Figure 14. Disk operation structure description . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
Figure 15. Example of standard inquiry definition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
Figure 16. DFU Interface state transitions diagram . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
Figure 17. Audio core structures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
Figure 18. CDC core structures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
Figure 19. CDC interface callback structure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
Figure 20. Example of USB descriptors declared as constants . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
Figure 21. Example of dynamic memory allocation for class structure . . . . . . . . . . . . . . . . . . . . . . . . 56

UM1734 Rev 4 5/60


5
Overview UM1734

1 Overview

1.1 Acronyms and abbreviations


Table 2 gives a brief definition of acronyms and abbreviations used in this document.

Table 2. List of terms


Term Meaning

API Application programming interface


CDC Communication device class
DFU Device firmware upgrade
FS Full speed (12 Mbps)
HID Human interface device
Mbps Megabit per second
MSC Mass storage class
OTG On-The-Go: An OTG peripheral can switch Host/Device role on the fly
PID USB product identifier
SCSI Small computer system interface
SOF Start of frame
VID USB vendor identifier
USB Universal serial bus

1.2 General information


STM32Cube™ USB device middleware runs on STM32 32-bit microcontrollers based on
the Arm®(1) Cortex®-M processor.

1.3 Additional Information


In addition to this document STMicroelectronics provides several other resources related to
the USB:
• USB Host library user manual (UM1720)
• Description of STM32F4xx HAL drivers (UM1725) where you can find the two USB
generic drivers description (HCD for Host and PCD for Device)

1. Arm is a registered trademark of Arm Limited (or its subsidiaries) in the US and or elsewhere.

6/60 UM1734 Rev 4


UM1734 Overview

1.4 References
• Universal Serial Bus Specification, Revision 2.0, http: //www.usb.org
• USB device class specifications (Audio, HID, MSC, etc.): http://www.usb.org

UM1734 Rev 4 7/60


59
USB device library description UM1734

2 USB device library description

2.1 Overview
STMicroelectronics offers to its customers new USB stacks (device stack and host stack)
that support all STM32 MCUs together with many development tools such as Atollic®
TrueSTUDIO, IAR Embedded Workbench for ARM ®, and Keil uVision®.
This document focuses on USB device stack. For the host stack, please refer to the related
users manual.
The USB device library is generic for all STM32 microcontrollers, only the HAL layer is
adapted to each STM32 device.
The USB device library comes on top of the STM32Cube™ USB device HAL driver and
offers all the APIs required to develop a USB device application. The present document
describes the STM32Cube™ USB device library middleware module and illustrates how the
user can develop easily his own USB device application by using this library.
The USB device library is a part of STM32Cube™ package for each STM32 Series.
It contains:
• The USB low level driver
• Commonly used USB class drivers
• A set of applications for the most common USB device classes supporting USB Full
speed and High speed transfer types (control, interrupt, bulk and isochronous).
The USB device library aim is to provide at least one firmware demonstration per USB
transfer type:
• Human Interface Device HID
HID Joystick demonstration based on the embedded joystick on the EVAL boards and
Custom HID examples
• Audio streaming
Audio device example for streaming audio data
• Communication Device (CDC)
VCP USB-to-RS232 bridge to realize a virtual COM port.
• Mass storage
Mass storage demonstration based on the microSD card available on the EVAL
boards.
• Device Firmware Upgrade
DFU for firmware downloads and uploads
• Dual Core devices demonstration
Based on mass storage with Human interface and mass storage with CDC device
examples
Among the topics covered are:
• USB device library architecture
• USB device library description
• USB device library state machine overview
• USB device classes overview.

8/60 UM1734 Rev 4


UM1734 USB device library description

2.2 Features
The main USB device library features are:
• Support of multi packet transfer features allowing sending big amount of data without
splitting it into max packet size transfers.
• Support of up to 3 back to back transfers on control endpoints (compatible with OHCI
controllers).
• Configuration files to change the core and the library configuration without changing
the library code (Read Only).
• 32-bits aligned data structures to handle DMA based transfer in High speed modes.
• Support of multi USB OTG core instances from user level (configuration file).
Note: The USB device library can be used with or without RTOS; the CMSIS RTOS wrapper is
used to make abstraction with OS kernel.
USB device examples do not display log messages.

Figure 1. STM32Cube USB device library

8VHU$SSOLFDWLRQ

86%GHYLFH/LEUDU\

86%'HYLFH&ODVV'ULYHU
06&+,'&'&$8',2
')8

86%'HYLFH+$/'ULYHU

+DUGZDUH

069

1. The user application is shown in green, the USB library core blocks in orange and the USB Device HAL
driver in blue.

UM1734 Rev 4 9/60


59
USB device library architecture UM1734

3 USB device library architecture

3.1 Architecture overview


The USB device library is mainly divided into three layers. The applications is developed on
top of them as shown in Figure 2: USB device library architecture.
The first Layer is composed of the core and the class drivers.
• Core drivers
The library core is composed of four main blocks:
– USB core module that offers a full set of APIs to manage the internal USB device
library state machine and call back processes from USB Interrupts
– USB Requests module that handles chapter 9 requests
– USB I/O requests module: handles low level I/O requests
– USB Log and debug module that follows debug level USB_DEBUG_LEVEL,
outputs user, log, error and debug messages.
• Class drivers
The USB Device classes is composed of a set predefined class drivers ready to be
linked to the USB core through the USBD_RegisterClass () routine.
The USB device library is a USB 2.0 compatible generic USB device stack, compliant with
all the STM32 USB cores. It t can be easily linked to any USB HAL driver thanks to the
configuration wrapper file which avoids any dependency between the USB library and the
low level drivers.

10/60 UM1734 Rev 4


UM1734 USB device library architecture

Figure 2. USB device library architecture

$SSOLFDWLRQ

86%'HYLFH&RUH 86%'HYLFH&ODVV

&RUH

/RJGHEXJ
+,'06&')8$8
86% ',2HWF
5HTXHVWV
,2
5HTXHVWV

86%'HYLFH&RQILJXUDWLRQ

86%'HYLFH+$/'ULYHU

'HYLFH&RQWUROOHU'ULYHU '&'

/RZ/HYHOGULYHU&RUH

069

1. The USB library core blocks are shown in orange, the USB Device Configuration in magenta and the USB
HAL driver in blue.

UM1734 Rev 4 11/60


59
USB OTG Hardware Abstraction Layer UM1734

4 USB OTG Hardware Abstraction Layer

The low level driver can be used to connect the USB OTG core with the high level stack.

4.1 Driver architecture


Figure 3. Driver architecture overview

8SSHUOD\HUVWDFN
27* 'HYLFH DQGKLJKOHYHO
VRIWZDUH

3&'
VWPI[[[BKDOBSFGFK
/RZOHYHOGULYHU

/RZ/D\HU86%'ULYHU
VWPI[[[BOOBXVEFK

069

• The bottom layer (Low Layer USB driver) provides common APIs for device and OTG
modes. It performs the core initialization in each mode and controls of the transfer flow.
• The Peripheral controller driver (PCD) layer provides an API for device mode access
and the main interrupt routine for this mode.
• The OTG controller driver (OTG) layer provides an API for OTG mode access and the
main interrupt routine for this mode.
Note: For more details on how to use the PCD driver, please refer to UM1725 that describes all
PCD driver APIs.

12/60 UM1734 Rev 4


UM1734 USB OTG Hardware Abstraction Layer

4.2 USB driver programming manual

4.2.1 Configuring USB driver structure


Device initialization
The device is initialized using the following function contained in stm32fxxx_hal_pcd.c file:
HAL_StatusTypeDef HAL_PCD_Init(PCD_HandleTypeDef *hpcd)

Endpoint configuration
Once the USB core is initialized, the upper layer can call the low level driver to open or close
the active endpoint and start transferring data. The following two APIs can be used:
HAL_StatusTypeDef HAL_PCD_EP_Open(PCD_HandleTypeDef *hpcd, uint8_t ep_addr,
uint16_t ep_mps, uint8_t ep_type)
HAL_StatusTypeDef HAL_PCD_EP_Close(PCD_HandleTypeDef *hpcd, uint8_t ep_addr)
ep_addr, ep_mps and ep_type are respectively the endpoint address, the maximum data
transfer and transfer type.

Device core structure


The main structure used in the device library is the device handle. Its type is
“USBD_HandleTypedef” (see Figure 4 on page 14).
The USB Global device structure contains all the variables and structures used to keep all
the information related to devices in real-time, as well as store the control transfer state
machine and the endpoint information and status.
In this structure, dev_config holds the current USB device configuration and ep0_state
controls the state machine with the following states:
/* EP0 State */
#define USBD_EP0_IDLE 0
#define USBD_EP0_SETUP 1
#define USBD_EP0_DATA_IN 2
#define USBD_EP0_DATA_OUT 3
#define USBD_EP0_STATUS_IN 4
#define USBD_EP0_STATUS_OUT 5
#define USBD_EP0_STALL 6
In this structure, dev_state defines the connection, configuration and power status:
/* Device Status */
#define USBD_DEFAULT 1
#define USBD_ADDRESSED 2
#define USBD_CONFIGURED 3
#define USBD_SUSPENDED 4

UM1734 Rev 4 13/60


59
USB OTG Hardware Abstraction Layer UM1734

Note: The USB specification (see Chapter 9) defines six USB device states:
Attached: the device is attached to the USB but is not powered by the USB.
Powered: the device is attached to the USB and has been powered but has not yet received
any reset request.
Default: the device is attached to the USB. It is powered and reset, but no unique address
has been assigned to it.
Address: the device is attached to the USB, it is powered and reset and has had a unique
address assigned to it.
Configured: the device is already in address state and configured. It is not in suspend state.
Suspended: the device is attached and configured, but has not detected any activity on the
bus for at least 3 ms.

Figure 4. USBD_HandleTypedef
typedef struct _USBD_HandleTypeDef
{
uint8_t id;
uint32_t dev_config;
uint32_t dev_default_config;
uint32_t dev_config_status;
USBD_SpeedTypeDef dev_speed;
USBD_EndpointTypeDef ep_in[15];
USBD_EndpointTypeDef ep_out[15];
uint32_t ep0_state;
uint32_t ep0_data_len;
uint8_t dev_state;
uint8_t dev_old_state;
uint8_t dev_address;
uint8_t dev_connection_status;
uint8_t dev_test_mode;
uint32_t dev_remote_wakeup;
USBD_SetupReqTypedef request;
USBD_DescriptorsTypeDef *pDesc;
USBD_ClassTypeDef *pClass;
void *pClassData;
void *pUserData;
void *pData;
} USBD_HandleTypeDef;

14/60 UM1734 Rev 4


UM1734 USB OTG Hardware Abstraction Layer

USB data transfer flow


The PCD layer provides all the APIs required to start and control a transfer flow. This is
done through the following set of functions:
HAL_StatusTypeDef HAL_PCD_EP_Transmit(PCD_HandleTypeDef *hpcd, uint8_t
ep_addr, uint8_t *pBuf, uint32_t len)
HAL_StatusTypeDef HAL_PCD_EP_Receive(PCD_HandleTypeDef *hpcd, uint8_t
ep_addr, uint8_t *pBuf, uint32_t len)
HAL_StatusTypeDef HAL_PCD_EP_SetStall(PCD_HandleTypeDef *hpcd, uint8_t
ep_addr)
HAL_StatusTypeDef HAL_PCD_EP_ClrStall(PCD_HandleTypeDef *hpcd, uint8_t
ep_addr)
HAL_StatusTypeDef HAL_PCD_EP_Flush(PCD_HandleTypeDef *hpcd, uint8_t
ep_addr)
The PCD layer contains one function that must be called by the USB interrupt:
void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd)
The stm32fxxx_hal_pcd.h file contains the function prototypes called from the library core
layer to handle the USB events.

Important enumerated typedefs


• USBD_StatusTypeDef
Almost all library functions return a status of type USBD_StatusTypeDef. The user
application should always check the returned status.
typedef enum
{
USBH_OK = 0,
USBH_BUSY,
USBH_FAIL,
}USBH_StatusTypeDef;
Table 3 describes the possible returned status:

Table 3. USB device status


Status Description

USBH_OK Returned when operation is completed successfully.


USBH_BUSY Returned when operation is still not completed (busy).
Returned when operation has failed due to a low level error
USBH_FAIL
or protocol fail.

UM1734 Rev 4 15/60


59
USB device library overview UM1734

5 USB device library overview

The USB device library is based on the generic USB low level driver. It has been developed
to work in Full speed and High speed mode.
It implements the USB device library machines as defined by Universal Serial Bus
Specification revision 2.0. The library functions are covered by the files located in the Core
folder within the USB device library firmware package (see Figure 5). The USB class
module is the class layer built in compliance with the protocol specification.

Figure 5. USB device library directory structure

5.1 USB device library description

5.1.1 USB device library flow


Handling control endpoint
The USB specification defines four transfer types: control, interrupt, bulk and isochronous.
The USB host sends requests to the device through the control endpoint (in this case,
control endpoint is endpoint 0). The requests are sent to the device as SETUP packets.
These requests can be classified into three categories: standard, class-specific and vendor-
specific. Since the standard requests are generic and common to all USB devices, the
library receives and handles all the standard requests on the control endpoint 0.

16/60 UM1734 Rev 4


UM1734 USB device library overview

The format and the meaning of the class-specific requests and the vendor specific requests
are not common for all USB devices.
All SETUP requests are processed with a state machine implemented in an interrupt model.
An interrupt is generated at the end of the correct USB transfer. The library code receives
this interrupt. In the interrupt process routine, the trigger endpoint is identified. If the event is
a setup on endpoint 0, the payload of the received setup is saved and the state machine
starts.

Transactions on non-control endpoint


The class-specific core uses non-control endpoints by calling a set of functions to send or
receive data through the data IN and OUT stage callbacks.

Data structure for the SETUP packet


When a new SETUP packet arrives, all the eight bytes of the SETUP packet are copied to
an internal structure USB_SETUP_REQ req, so that the next SETUP packet cannot
overwrite the previous one during processing. This internal structure is defined as:

Figure 6. Data structure for SETUP packet


typedef struct usb_setup_req
{
uint8_t bmRequest;
uint8_t bRequest;
uint16_t wValue;
uint16_t wIndex;
uint16_t wLength;
}USBD_SetupReqTypedef;

Standard requests
Most of the requests specified in Table 4 of the USB specification are handled as standard
requests in the library. Table 4 lists all the standard requests and their valid parameters in
the library. Requests that are not in Table 4 are considered as non-standard requests.

Table 4. Standard requests


bmRequestT

High byte of

High byte of
Low byte of

Low byte of

wLength
wValue

wValue

wIndex

wIndex
State

ype

- Comments

A, C 80 00 00 00 00 2 Gets the status of the Device.


Gets the status of Interface, where N is
C 81 00 00 N 00 2
the valid interface number.
GET_STATUS Gets the status of endpoint 0 OUT
A, C 82 00 00 00 00 2
direction.
A, C 82 00 00 80 00 2 Gets the status of endpoint 0 IN direction.

C 82 00 00 EP 00 2 Gets the status of endpoint EP.

UM1734 Rev 4 17/60


59
USB device library overview UM1734

Table 4. Standard requests (continued)

bmRequestT

High byte of

High byte of
Low byte of

Low byte of

wLength
wValue

wValue

wIndex

wIndex
State

ype
- Comments

Clears the device remote wakeup


A, C 00 01 00 00 00 00
feature.
CLEAR_FEATURE
Clears the STALL condition of endpoint
C 02 00 00 EP 00 00
EP. EP does not refer to endpoint 0.
A, C 00 01 00 00 00 00 Sets the device remote wakeup feature.
SET_FEATURE Sets the STALL condition of endpoint EP.
C 02 00 00 EP 00 00
EP does not refer to endpoint 0.
Sets the device address, N is the valid
SET_ADDRESS D, A 00 N 00 00 00 00
device address.
Non-
All 80 00 01 00 00 Gets the device descriptor.
0
Non- Gets the configuration descriptor; where
All 80 N 02 00 00
0 N is the valid configuration index.
GET_DESCRIPTOR
Gets the string descriptor; where N is the
Non- valid string index. This request is valid
All 80 N 03 LangID
0 only when the string descriptor is
supported.
GET_CONFIGURATION A, C 80 00 00 00 00 1 Gets the device configuration.
Sets the device configuration; where N is
SET_CONFIGURATION A, C 80 N 00 00 00 00
the valid configuration number.
Gets the alternate setting of the interface
GET_INTERFACE C 81 00 00 N 00 1
N; where N is the valid interface number.
Sets alternate setting M of the interface
N; where N is the valid interface number
SET_INTERFACE C 01 M 00 N 00 00
and M is the valid alternate setting of the
interface N.

Note: In column State: D = Default state; A = Address state; C = Configured state; All = All states.
EP: D0-D3 = endpoint address; D4-D6 = Reserved as zero; D7= 0: OUT endpoint, 1: IN
endpoint.

18/60 UM1734 Rev 4


UM1734 USB device library overview

Non-standard requests
All the non-standard requests are passed to the class specific code through callback
functions.
• SETUP stage
The library passes all the non-standard requests to the class-specific code with the
callback pdev->pClass->Setup (pdev, req) function.
The non-standard requests include the user-interpreted requests and the invalid
requests. User-interpreted requests are class- specific requests, vendor-specific
requests or the requests that the library considers as invalid requests that the
application wants to interpret as valid requests
Invalid requests are the requests that are not standard requests and are not user-
interpreted requests. Since pdev->pClass->Setup (pdev, req) is called after the SETUP
stage and before the data stage, user code is responsible, in the pdev->pClass-
>Setup (pdev, req) to parse the content of the SETUP packet (req). If a request is
invalid, the user code has to call USBD_CtlError(pdev , req) and return to the caller of
pdev->pClass->Setup (pdev, req)
For a user-interpreted request, the user code prepares the data buffer for the following
data stage if the request has a data stage; otherwise the user code executes the
request and returns to the caller of pdev->pClass->Setup (pdev, req).
• DATA stage
The class layer uses the standard USBD_CtlSendData and USBD_CtlPrepareRx to
send or receive data. The data transfer flow is handled internally by the library and the
user does not need to split the data in ep_size packet.
• Status stage
The status stage is handled by the library after returning from the pdev->pClass->Setup
(pdev, req) callback.

Figure 7. USB device library process flowchart

86%'B+,'
+,'B'HVF 
 $8',2B'HVF $SSOLFDWLRQ 86%'B$8',2
&'&B'HVF 86%'B&'&
')8B'HVF 86%'B')8
86%'B,QLW 86%'B'HYLFH 86%'B5HJLVWHU&ODVV 86%'B'HYLFH
06&B'HVF  86%'B06&

86%/LEUDU\0RGXOH 86%'HYLFH&ODVV

+$/B3&'B,54+DQGOHU KSFG

86%+$/
069

1. The red text identifies the USB device configuration.


As shown in the Figure 7: USB device library process flowchart, only the following modules
are necessary for USB programming: USB library, USB Device class and main application.

UM1734 Rev 4 19/60


59
USB device library overview UM1734

The main application executes the user defined program. main.c, stm32fxx_it.c,
usbd_conf.c and usbd_desc.c together with their header files are the main files
(mandatory for the application) that the user needs to develop his own application. The user
can modify them according to his application requirements (class driver).
Only simple APIs are called. They allows interfacing between the application layer and the
USB library module which handles the USB initialization and getting the current status of the
USB.
To initialize the USB HAL driver, the USB device library and the hardware on the used board
(BSP) and to start the library, the user application must call these three APIs:
• USBD_Init (): This function initializes the device stack and loads the class driver.
The device descriptor is stored in the usbd_desc.c and usbd_desc.h (used for the
configuration descriptor type) files:
• USBD_RegisterClass(): This function links the class driver to the device core.
• USBD_Start(): This function allows user to start the USB device core
For example the user can add additional endpoints in the usbd_conf file, depending on the
class requirement. This is done by calling USBD_LL_Init() function. The dev_endpoints
should contain the number of required endpoints following the USB class specifications.
The USB device library provides several configurations thanks to the usbd_conf.h file (for
more details refer to Section 5.1.5: Configuring the USB device firmware library on
page 23).
Note: The HAL library initialization is done through the HAL_Init() API in the stm32fxxx_hal.c This
function performs the following operation:
- Reset of all peripherals
- Configuration of Flash prefetch, Instruction cache, Data cache
- Enabling of SysTick and configuration of 1 ms tick (default clock after Reset is HSI)

5.1.2 USB device data flow


The USB library (USB core and USB class layer) handles the data processing on endpoint 0
(EP0) through the I/O request layer when a wrapping is needed to manage the multi-packet
feature on the control endpoint, or directly from the stm32fxxx_hal_pcd layer when the other
endpoints are used since the USB OTG core supports the multi-packet feature. Figure 8
illustrates this data flow scheme.

20/60 UM1734 Rev 4


UM1734 USB device library overview

Figure 8. USB device data flow

XVEGBLRUHTF
XVEGBLRUHTF 8VEGBFODVVBFRUHF
8VEGBFODVVBFRUHF

86%'B6WDWXV7\SH'HI86%'B&WO6HQG'DWD
86%'B6WDWXV7\SH'HI86%'B&WO&RQWLQXH6HQG'DWD
86%'B6WDWXV7\SH'HI86%'B&WO3UHSDUH5[
86%'B6WDWXV7\SH'HI86%'B&WO&RQWLQXH5[
86%'B*HW5[&RXQW
86%'B6WDWXV7\SH'HI86%'B&WO6HQG6WDWXV
86%'B6WDWXV7\SH'HI86%'B&WO5HFHLYH6WDWXV
86%'B*HW5[&RXQW

XVEGBFRUHF
XVEGBFRUHF
+$/B3&'B(3B7UDQVPLW
+$/B3&'B(3B5HFHLYH
+$/B3&'B(3B2SHQ
+$/B3&'B(3B7UDQVPLW +$/B3&'B(3B&ORVH
+$/B3&'B(3B5HFHLYH

VWPI[[[BKDOBSFGF
VWPI[[[BKDOBSFGF
069

5.1.3 Core interface with low level driver


As mentioned before, the USB device library interfaces with the STM32Cube™ HAL low
layer drivers using a low level interface layer which acts as a link layer with the
STM32Cube™ HAL.
The low level interface implements low level API functions and calls some library core
callback functions following some USB events.
In the STM32Cube™ package, the implementation of the low level interface is provided as
part of the USB device examples since some parts of the low level interface are board and
system dependent.
Table 5 lists the low level API functions:
Note: These APIs are provided by the USB Device Configuration file (usbd_conf.c). They should
be implemented in the user files and adapted to the USB Device Controller Driver.
The user can start from the usbd_conf.c file provided within STM32Cube™ package. This
file can also be copied to the application folder and modified depending on the application
needs.

Table 5. API description


API Description

USBD_LL_Init Low level initialization.


USBD_LL_DeInit Low level de-initialization.
USBD_LL_Start Low level start.
USBH_LL_Stop Low level stop.
USBD_LL_OpenEP Initializes an endpoint.

UM1734 Rev 4 21/60


59
USB device library overview UM1734

Table 5. API description (continued)


API Description

USBD_LL_CloseEP Closes and de-initializes an endpoint state.


USBD_LL_FlushEP Flushes an endpoint of the Low Level Driver.
USBD_LL_StallEP Sets a Stall condition on an endpoint of the Low Level Driver.
USBD_LL_ClearStallEP Clears a Stall condition on an endpoint of the Low Level Driver.
USBD_LL_IsStallEP Returns Stall condition.
USBD_LL_SetUSBAddress Assigns an USB address to the device.
USBD_LL_Transmit Transmits data over an endpoint.
USBD_LL_PrepareReceive Prepares an endpoint for reception.
USBD_LL_GetRxDataSize Returns the last transferred packet size.

5.1.4 USB device library interfacing model


The USB device library is built around central generic and portable class modules.

Figure 9. USB device library interfacing model

8VHU)LOHV
h^ĞǀŝĐĞůĂƐƐ

86%'HYLFH/LEUDU\
ƉƉůŝĐĂƚŝŽŶ +,'06&')8
h^ĞǀŝĐĞŽƌĞ $8',2
&RUH HWF
/RJGHEXJ

86%
h^ĞƐĐƌŝƉƚŽƌ
5HTXHVWV
,2
h^ƌŝǀĞƌŽŶĨŝŐƵƌĂƚŝŽŶ UHTXHVWV

86%'HYLFH+$/'ULYHU
'ULYHU

ĞǀŝĐĞŽŶƚƌŽůůĞƌƌŝǀĞƌ;Ϳ

>Žǁ>ĞǀĞůĚƌŝǀĞƌŽƌĞ

069

22/60 UM1734 Rev 4


UM1734 USB device library overview

Table 6 shows all the device library callback functions which are called from the low level
interface following some USB events.

Table 6. Low level Event Callback functions


Callback functions Description

HAL_PCD_ConnectCallback Device connection Callback.


HAL_PCD_DataInStageCallback Data IN stage Callback.
HAL_PCD_DataInStageCallback Data OUT stage Callback.
HAL_PCD_DisconnectCallback Disconnection Callback.
HAL_PCD_ISOINIncompleteCallback ISO IN transaction Callback.
HAL_PCD_ISOINIncompleteCallback ISO OUT transaction Callback.
HAL_PCD_ResetCallback USB Reset Callback.
HAL_PCD_ResumeCallback USB Resume Callback.
HAL_PCD_SetupStageCallback Setup stage Callback.
HAL_PCD_SOFCallback Start Of Frame callback.
HAL_PCD_SuspendCallback Suspend Callback.

5.1.5 Configuring the USB device firmware library


The USB device library can be configured using the usbd_conf.h file.
The usbd_conf.h is a specific configuration file used to define some global parameters and
specific configurations. This file is used to link the upper library with the HAL drivers and the
BSP drivers.

Table 7. USB library configuration


item Parameter Description

USBD_MAX_NUM_CONFIGURAT Maximum number of supported


ION configurations [1 to 255].
Maximum number of supported
USBD_MAX_NUM_INTERFACES
Interfaces [1 to 255].

Common Maximum size of string descriptors


USBD_MAX_STR_DESC_SIZ
configuration [uint16].
USBD_SELF_POWERED Enables self power feature [0/1].
USBD_DEBUG_LEVEL Debug and log level.
USBD_SUPPORT_USER_STRIN
Enables user string support[0/1].
G
Mass Storage Media I/O buffer size multiple of 512
MSC_MEDIA_PACKET
configuration bytes [512 to 32 Kbytes].
HID Configuration NA NA.

UM1734 Rev 4 23/60


59
USB device library overview UM1734

Table 7. USB library configuration (continued)


item Parameter Description

Maximum media interface number [1 to


USBD_DFU_MAX_ITF_NUM
255].
DFU Configuration Media I/O buffer size multiple of 512
USBD_DFU_XFER_SIZE
bytes [512 to 32 Kbytes].
USBD_DFU_APP_DEFAULT_ADD Application address (0x0800C000).
CDC Configuration NA NA.
Audio Configuration USBD_AUDIO_FREQ 8 to 48 KHz.

Note: The user can start from the usbd_conf.c file provided within STM32Cube™ package. This
file could be also copied to the application folder and modified depending on the application
needs.
By default for USB device examples, library and user messages are not displayed on the
LCD.
However the user can implement his own messages. To redirect the library messages on
the LCD screen, lcd_log.c driver must be added to the application sources. He can choose
to display them or not by modifying define values in the usbd_conf.h configuration file
available under the project includes directory. For example:
0: No Log/Debug messages
1: log messages enabled
2: log and debug messages enabled

5.1.6 USB control functions


Device reset
When the device receives a reset signal from the USB, the library resets and initializes both
application software and hardware. This function is part of the interrupt routine.

Device suspend
When the device detects a suspend condition on the USB, the library stops all the ongoing
operations and puts the system in suspend state (if low power mode management is
enabled in the usbd_conf.c file).

Device resume
When the device detects a resume signal on the USB, the library restores the USB core
clock and puts the system in idle state (if low power mode management is enabled in the
usbd_conf.c file).

24/60 UM1734 Rev 4


UM1734 USB device library overview

5.2 USB device library functions


The Core folder contains the USB device library machines as defined by the Universal
Serial Bus Specification, revision 2.0.

Table 8. USB device core files


File Description

This file contains the functions for handling all USB communication
usbd_core (.c, .h)
and state machine.
This file includes the requests implementation listed in Chapter 9 of
usbd_req(.c,.h)
the specification.
usbd_ctlreq(.c,.h) This file handles the results of the USB transactions.
Template file for the low layer interface file, should be customized
usbd_conf_template(.c,.h)
by user and included with application file.
usbd_def(.c, .h) Common library defines.

The Class folder contains all the files relative to the class implementation and complies with
the specification of the protocol built in these classes.

Table 9. Class drivers files


USB class file Description

usbh_msc (.c,.h) Mass-storage class handler.


usbh_msc_bot(.c,. Bulk-only transfer protocol handler.
Mass-Storage
usbh_msc_scsi(.c,.h) SCSI commands.
usbd_msc_data (.c,.h) Vital inquiry pages and sense data.
HID Joystick mouse usbh_hid(.c,.h HID class state handler.
Audio speaker usbh_audio(.c,.h) Audio class handler.
Audio speaker usbh_cdc(.c,.h) CDC virtual comport handler.
Custom HID usbd_customhid(.c,.h) Custom HID Class Handler.
DFU Class usbd_dfu(.c,.h) DFU class handler.

Table 10. usbd_core (.c,.h) files


Functions Description

USBD_StatusTypeDef
Initializes the device library and loads
USBD_Init(USBD_HandleTypeDef *pdev, the class driver and the user call backs.
USBD_DescriptorsTypeDef *pdesc, uint8_t id)
USBD_StatusTypeDef
De-Initializes the device library.
USBD_DeInit(USBD_HandleTypeDef *pdev)
USBD_StatusTypeDef
USBD_RegisterClass(USBD_HandleTypeDef *pdev, Loads the class driver.
USBD_ClassTypeDef *pclass)

UM1734 Rev 4 25/60


59
USB device library overview UM1734

Table 10. usbd_core (.c,.h) files (continued)


Functions Description

USBD_StatusTypeDef USBD_Start
Starts the device library process.
(USBD_HandleTypeDef *pdev)
USBD_StatusTypeDef USBD_Stop Stops the device library process and
(USBD_HandleTypeDef *pdev) frees related resources.
USBD_StatusTypeDef
USBD_LL_SetupStage(USBD_HandleTypeDef *pdev, Handles setup stage from ISR.
uint8_t *psetup)
USBD_StatusTypeDef
USBD_LL_DataOutStage(USBD_HandleTypeDef *pdev , Handles data out stage from ISR.
uint8_t epnum, uint8_t *pdata)
USBD_StatusTypeDef
USBD_LL_DataInStage(USBD_HandleTypeDef *pdev Handles data IN stage.
,uint8_t epnum, uint8_t *pdata)
USBD_StatusTypeDef
Handles USB Reset from ISR.
USBD_LL_Reset(USBD_HandleTypeDef *pdev)
USBD_StatusTypeDef
USBD_LL_SetSpeed(USBD_HandleTypeDef *pdev, Sets USB Core Speed
USBD_SpeedTypeDef speed)
USBD_StatusTypeDef
Handles Suspend Event.
USBD_LL_Suspend(USBD_HandleTypeDef *pdev)
USBD_StatusTypeDef
Handles Resume event.
USBD_LL_Resume(USBD_HandleTypeDef *pdev)
USBD_StatusTypeDef
Handles Start Of Frame Event.
USBD_LL_SOF(USBD_HandleTypeDef *pdev);
USBD_StatusTypeDef
Handles Incomplete ISO IN transaction
USBD_LL_IsoINIncomplete(USBD_HandleTypeDef
Event.
*pdev, uint8_t epnum)
USBD_StatusTypeDef
Handles Incomplete ISO OUT
USBD_LL_IsoOUTIncomplete(USBD_HandleTypeDef
transaction Event.
*pdev, uint8_t epnum)
USBD_StatusTypeDef Notifies about device connection from
USBD_LL_DevConnected(USBD_HandleTypeDef *pdev) ISR.
USBD_StatusTypeDef
Notifies about device disconnection from
USBD_LL_DevDisconnected(USBD_HandleTypeDef
ISR.
*pdev)

Table 11. usbd_ioreq (.c,.h) files functions


Functions Description

USBD_StatusTypeDef
USBD_CtlSendData (USBD_HandleTypeDef *pdev, Sends the data on the control pipe.
uint8_t *pbuf,uint16_t len)

26/60 UM1734 Rev 4


UM1734 USB device library overview

Table 11. usbd_ioreq (.c,.h) files functions (continued)


Functions Description

USBD_StatusTypeDef
Continues sending data on the control
USBD_CtlContinueSendData (USBD_HandleTypeDef pipe.
*pdev, uint8_t *pbuf, uint16_t len)
USBD_StatusTypeDef
Prepares the core to receive data on the
USBD_CtlPrepareRx (USBD_HandleTypeDef control pipe.
*pdev,uint8_t *pbuf, uint16_t len)
USBD_StatusTypeDef USBD_CtlContinueRx Continues receiving data on the control
(USBD_HandleTypeDef *pdev, uint8_t *pbuf, uint16_t len) pipe.
USBD_StatusTypeDef Sends a zero length packet on the
USBD_CtlSendStatus (USBD_HandleTypeDef *pdev) control pipe.

USBD_StatusTypeDef USBD_CtlReceiveStatus Receives a zero length packet on the


(USBD_HandleTypeDef *pdev) control pipe.
uint16_t USBD_GetRxCount (USBD_HandleTypeDef
Returns the received data length.
*pdev , uint8_t ep_addr)

Table 12. usbd_ctrlq (.c,.h) files functions


Functions Description

USBD_StatusTypeDef
Handles standard USB device
USBD_StdDevReq (USBD_HandleTypeDef *pdev, requests.
USBD_SetupReqTypedef *req)
USBD_StatusTypeDef
Handles standard USB interface
USBD_StdItfReq (USBD_HandleTypeDef *pdev, requests.
USBD_SetupReqTypedef *req)
USBD_StatusTypeDef
Handles standard USB endpoint
USBD_StdEPReq (USBD_HandleTypeDef *pdev, requests.
USBD_SetupReqTypedef *req)
static void USBD_GetDescriptor(USBD_HandleTypeDef
Handles Get Descriptor requests.
*pdev ,USBD_SetupReqTypedef *req)
static void USBD_SetAddress(USBD_HandleTypeDef
Sets new USB device address.
*pdev , USBD_SetupReqTypedef *req)
static void USBD_SetConfig(USBD_HandleTypeDef *pdev, Handles Set device configuration
USBD_SetupReqTypedef *req) request.
static void USBD_GetConfig(USBD_HandleTypeDef *pdev, Handles Get device configuration
USBD_SetupReqTypedef *req) request.
static void USBD_GetStatus(USBD_HandleTypeDef *pdev,
Handles Get Status request.
USBD_SetupReqTypedef *req)
static void USBD_SetFeature(USBD_HandleTypeDef
Handles Set device feature request.
*pdev, USBD_SetupReqTypedef *req)
static void USBD_ClrFeature(USBD_HandleTypeDef
Handles Clear device feature request.
*pdev, USBD_SetupReqTypedef *req)
void USBD_CtlError( USBD_HandleTypeDef *pdev, Handles USB Errors on the control
USBD_SetupReqTypedef *req) pipe.

UM1734 Rev 4 27/60


59
USB device library overview UM1734

Table 12. usbd_ctrlq (.c,.h) files functions (continued)


Functions Description

void USBD_GetString(uint8_t *desc, uint8_t *unicode, Converts ASCII string into unicode
uint16_t *len) one.
static uint8_t USBD_GetLen(uint8_t *buf) Returns the string length.
void USBD_ParseSetupRequest Copies request buffer into setup
(USBD_SetupReqTypedef *req, uint8_t *pdata) structure.

5.3 USB device class interface


USB Class callback structure
The USB class is chosen during the USB device library initialization by selecting the
corresponding class callback structure. The class structure is defined as follows:

Figure 10. USB Class callback structure


typedef struct _Device_cb
{
uint8_t (*Init) (struct _USBD_HandleTypeDef *pdev ,
uint8_t cfgidx);
uint8_t (*DeInit) (struct _USBD_HandleTypeDef *pdev ,
uint8_t cfgidx);
/* Control Endpoints*/
uint8_t (*Setup) (struct _USBD_HandleTypeDef *pdev ,
USBD_SetupReqTypedef *req);
uint8_t (*EP0_TxSent) (struct _USBD_HandleTypeDef *pdev );
uint8_t (*EP0_RxReady) (struct _USBD_HandleTypeDef *pdev );
/* Class Specific Endpoints*/
uint8_t (*DataIn) (struct _USBD_HandleTypeDef *pdev ,
uint8_t epnum);
uint8_t (*DataOut) (struct _USBD_HandleTypeDef *pdev ,
uint8_t epnum);
uint8_t (*SOF) (struct _USBD_HandleTypeDef *pdev);
uint8_t (*IsoINIncomplete) (struct _USBD_HandleTypeDef *pdev ,
uint8_t epnum);
uint8_t (*IsoOUTIncomplete) (struct _USBD_HandleTypeDef *pdev ,
uint8_t epnum);
uint8_t *(*GetHSConfigDescriptor)(uint16_t *length);
uint8_t *(*GetFSConfigDescriptor)(uint16_t *length);
uint8_t *(*GetOtherSpeedConfigDescriptor)(uint16_t *length);
uint8_t *(*GetDeviceQualifierDescriptor)(uint16_t *length);
} USBD_ClassTypeDef;

● Init: this callback is called when the device receives the set configuration request; in this
function the endpoints used by the class interface are open.
● DeInit: This callback is called when the clear configuration request has been received;
this function closes the endpoints used by the class interface.

28/60 UM1734 Rev 4


UM1734 USB device library overview

● Setup: This callback is called to handle the specific class setup requests.
● EP0_TxSent: This callback is called when the send status is finished.
● EP0_RxSent: This callback is called when the receive status is finished.
● DataIn: This callback is called to perform the data in stage relative to the non-control
endpoints.
● DataOut: This callback is called to perform the data out stage relative to the non-control
endpoints.
● SOF: This callback is called when a SOF interrupt is received; this callback can be used to
synchronize some processes with the SOF.
● IsoINIncomplete: This callback is called when the last isochronous IN transfer is
incomplete.
● IsoOUTIncomplete: This callback is called when the last isochronous OUT transfer is
incomplete.
● GetHSConfigDescriptor: This callback returns the HS USB Configuration descriptor.
● GetFSConfigDescriptor: This callback returns the FS USB Configuration descriptor.
● GetOtherSpeedConfigDescriptor: This callback returns the other configuration
descriptor of the used class in High Speed mode.
● GetDeviceQualifierDescriptor: This callback returns the Device Qualifier Descriptor.

USB device descriptors structure


The library provides also descriptor callback structures that allow user to manage the device
and string descriptors at application run time. This descriptors structure is defined as
follows:

Figure 11. USB device descriptors structure


typedef struct
{
uint8_t *(*GetDeviceDescriptor)( USBD_SpeedTypeDef speed ,
uint16_t *length);
uint8_t *(*GetLangIDStrDescriptor)( USBD_SpeedTypeDef speed ,
uint16_t *length);
uint8_t *(*GetManufacturerStrDescriptor)( USBD_SpeedTypeDef speed
, uint16_t *length);
uint8_t *(*GetProductStrDescriptor)( USBD_SpeedTypeDef speed ,
uint16_t *length);
uint8_t *(*GetSerialStrDescriptor)( USBD_SpeedTypeDef speed ,
uint16_t *length);
uint8_t *(*GetConfigurationStrDescriptor)( USBD_SpeedTypeDef speed
, uint16_t *length);
uint8_t *(*GetInterfaceStrDescriptor)( USBD_SpeedTypeDef speed ,
uint16_t *length);
} USBD_DescriptorsTypeDef;

● GetDeviceDescriptor: This callback returns the device descriptor.


● GetLangIDStrDescriptor: This callback returns the Language ID string descriptor.

UM1734 Rev 4 29/60


59
USB device library overview UM1734

● GetManufacturerStrDescriptor: This callback returns the manufacturer string


descriptor.
● GetProductStrDescriptor: This callback returns the product string descriptor.
● GetSerialStrDescriptor: This callback returns the serial number string descriptor.
● GetConfigurationStrDescriptor: This callback returns the configuration string
descriptor.
● GetInterfaceStrDescriptor: This callback returns the interface string descriptor.
Note: The usbd_desc.c file provided within USB Device examples implements these callback
bodies.

30/60 UM1734 Rev 4


UM1734 USB device library class module

6 USB device library class module

The class module contains all the files related to the class implementation. It complies with
the specification of the protocol built in these classes. Table 13 shows the USB device class
files for the MSC, HID, DFU, Audio, CDC classes.

Table 13. USB device class files


Class Files Description

This file contains the HID class callbacks (driver) and the
HID usbd_hid (.c, .h)
configuration descriptors relative to this class.
This file contains the MSC class callbacks (driver) and
usbd_msc( .c, .h)
the configuration descriptors relative to this class.
usbd_bot (.c, .h) This file handles the bulk only transfer protocol.
usbd_scsi (.c, .h) This file handles the SCSI commands.
MSC
This file contains the vital inquiry pages and the sense
usbd_msc_data (.c,.h)
data of the mass storage devices.
usbd_msc_storage_template This file provides a template driver which allows you to
(.c,.h) implement additional functions for MSC.
This file contains the DFU class callbacks (driver) and
usbd_dfu (.c,.h)
the configuration descriptors relative to this class.
DFU
usbd_dfu_media_template_if This file provides a template driver which allows you to
(.c,.h) implement additional memory interfaces.
This file contains the AUDIO class callbacks (driver) and
usbd_audio (.c,.h)
the configuration descriptors relative to this class.
Audio
usbd_audio_if_template This file provides a template driver which allows you to
(.c,.h) implement additional functions for Audio.
This file contains the CDC class callbacks (driver) and
usbd_cdc (.c,.h)
the configuration descriptors relative to this class.
CDC
This file provides a template driver which allows you to
usbd_cdc_if_template (.c,.h)
implement low layer functions for a CDC terminal.
Custom This file contains the Custom HID class callbacks (driver)
usbd_customhid (.c,.h)
HID and the configuration descriptors relative to this class.

UM1734 Rev 4 31/60


59
USB device library class module UM1734

6.1 HID class

6.1.1 HID class implementation


This module manages the HID class V1.11 following the “Device Class Definition for Human
Interface Devices (HID) Version 1.11 June 27, 2001".
The HID specification can be found searching for “hidpage” on www.st.com.
This driver implements the following aspects of the specification:
• The boot interface subclass
• The mouse protocol
• Usage page: generic desktop
• Usage: joystick
• Collection: application

6.1.2 HID user interface


Input reports are sent only via the Interrupt In pipe (HID mouse example).
Feature and Output reports must be initiated by the host via Control pipe or an Interrupt Out
pipe (Custom HID example)
The USBD_HID_SendReport can be used by the HID mouse application to send HID
reports, the HID driver, in this release, handles only IN traffic. An example of use of this
function is shown below:

Figure 12. Example of USBD_HID_SendReport function


static __IO uint32_t counter=0;
HAL_IncTick();
/* check Joystick state every 10ms */
if (counter++ == 10)
{
GetPointerData(HID_Buffer);
/* send data though IN endpoint*/
if((HID_Buffer[1] != 0) || (HID_Buffer[2] != 0))
{
USBD_HID_SendReport(&USBD_Device, HID_Buffer, 4);
}
counter =0;
}
Toggle_Leds();
}

32/60 UM1734 Rev 4


UM1734 USB device library class module

6.1.3 HID Class Driver APIs


All HID class driver APIs are defined in usbd_hid.c and summarized in the table below.

Table 14. usbd_hid.c,h files


Functions Description

static uint8_t USBD_HID_Init Initializes the HID interface and open the used
(USBD_HandleTypeDef *pdev, uint8_t cfgidx) endpoints.
static uint8_t USBD_HID_DeInit Un-Initializes the HID layer and close the used
(USBD_HandleTypeDef *pdev, uint8_t cfgidx) endpoints.
static uint8_t USBD_HID_Setup
(USBD_HandleTypeDef *pdev, Handles the HID specific requests.
USBD_SetupReqTypedef *req)
uint8_t USBD_HID_SendReport
(USBD_HandleTypeDef *pdev, uint8_t *report, Sends HID reports.
uint16_t len)

The HID stack is initialized by calling the USBD_HID_Init(), Then the application has to
call the USBD_HID_SendReport()function to send the HID reports.
The Following HID specific requests are implemented through the endpoint 0 (Control):
#define HID_REQ_SET_PROTOCOL 0x0B
#define HID_REQ_GET_PROTOCOL 0x03
#define HID_REQ_SET_IDLE 0x0A
#define HID_REQ_GET_IDLE 0x02
#define HID_REQ_SET_REPORT 0x09
#define HID_REQ_GET_REPORT 0x01
The IN endpoint address and the maximum number of bytes that can be sent are given by
these defines:
#define HID_EPIN_ADDR 0x81
#define HID_EPIN_SIZE 0x04

6.2 Mass storage class

6.2.1 Mass storage class implementation


This module manages the MSC class V1.0 following the “Universal Serial Bus Mass Storage
Class (MSC) Bulk-Only Transport (BOT) Version 1.0 Sep. 31, 1999".
This driver implements the following aspects of the specification:
• Bulk-only transport protocol
• Subclass: SCSI transparent command set (ref. SCSI Primary Commands - 3)
The USB mass storage class is built around the Bulk Only Transfer (BOT). It uses the SCSI
transparent command set.

UM1734 Rev 4 33/60


59
USB device library class module UM1734

A general BOT transaction is based on a simple basic state machine. It begins in ready
state (idle state). If a CBW is received from the host, three cases can be managed:
• DATA-OUT-STAGE: when the direction flag is set to “0”, the device must be prepared to
receive an amount of data indicated in cbw.dDataLength in the CBW block. At the end
of data transfer, a CSW is returned with the remaining data length and the STATUS
field.
• DATA-IN-STAGE: when direction flag is set to “1”, the device must be prepared to send
an amount of data indicated in cbw.dDataLength in the CBW block. At the end of data
transfer, a CSW is returned with the remaining data length and the STATUS field.
• ZERO DATA: in this case, no data stage is required and the CSW block is sent
immediately after the CBW one.

Figure 13. BOT Protocol architecture

5HDG\

&RPPDQG7UDQVSRUW &%:

'DWD287 'DWD,1

6WDWXV7UDQVSRUW

069

34/60 UM1734 Rev 4


UM1734 USB device library class module

The following table shows the supported SCSI commands.


Table 15. SCSI commands
Command
Command Remark
specification

SCSI_PREVENT_REMOVAL,
SCSI_START_STOP_UNIT,
SCSI_TEST_UNIT_READY,
SCSI_INQUIRY,
SCSI_READ_CAPACITY10,
READ_FORMAT_CAPACITY
SCSI SCSI_READ_FORMAT_CAPACITY,
(0x23) is an UFI command.
SCSI_MODE_SENSE6,
SCSI_MODE_SENSE10
SCSI_READ10,
SCSI_WRITE10,
SCSI_VERIFY10

As required by the BOT specification, the Bulk-only mass storage reset request (class-
specific request) is implemented. This request is used to reset the mass storage device and
its associated interface. This class-specific request should prepare the device for the next
CBW from the host.
To generate the BOT Mass Storage Reset, the host must send a device request on the
default pipe of:
• bmRequestType: Class, interface, host to device
• bRequest field set to 255 (FFh)
• wValue field set to ‘0’
• wIndex field set to the interface number
• wLength field set to ‘0’

6.2.2 Get Max MUN (class-specific request)


The device can implement several logical units that share common device characteristics.
The host uses bCBWLUN to indicate which logical unit of the device is the destination of the
CBW. The Get Max LUN device request is used to determine the number of logical units
supported by the device.
To generate a Get Max LUN device request, the host sends a device request on the default
pipe of:
• bmRequestType: Class, Interface, device to host
• bRequest field set to 254 (FEh)
• wValue field set to ‘0’
• wIndex field set to the interface number
• wLength field set to ‘1’

UM1734 Rev 4 35/60


59
USB device library class module UM1734

6.2.3 MSC Core files

Table 16. usbd_msc (.c,.h) files


Functions Description

uint8_t USBD_MSC_Init (USBD_HandleTypeDef Initializes the MSC interface and opens the used
*pdev, uint8_t cfgidx) endpoints.
uint8_t USBD_MSC_DeInit De-initializes the MSC layer and close the used
(USBD_HandleTypeDef *pdev, uint8_t cfgidx) endpoints.
uint8_t USBD_MSC_Setup
(USBD_HandleTypeDef *pdev, Handles the MSC specific requests.
USBD_SetupReqTypedef *req)
uint8_t USBD_MSC_DataIn
Handles the MSC Data In stage.
(USBD_HandleTypeDef *pdev, uint8_t epnum)
uint8_t USBD_MSC_DataOut
Handles the MSC Data Out stage.
(USBD_HandleTypeDef *pdev, uint8_t epnum)

Table 17. usbd_msc_bot (.c,.h) files


Functions Description

void MSC_BOT_Init Initializes the BOT process and physical


(USBD_HandleTypeDef *pdev) media.

void MSC_BOT_Reset (USBD_HandleTypeDef


Resets the BOT Machine.
*pdev)
void MSC_BOT_DeInit (USBD_HandleTypeDef
De-Initializes the BOT process.
*pdev)
void MSC_BOT_DataIn (USBD_HandleTypeDef
Handles the BOT data IN Stage.
*pdev, uint8_t epnum)
void MSC_BOT_DataOut (USBD_HandleTypeDef
Handles the BOT data OUT Stage.
*pdev, uint8_t epnum)
static void MSC_BOT_CBW_Decode Decodes the CBW command and sets the
(USBD_HandleTypeDef *pdev) BOT state machine accordingly.
static void
MSC_BOT_SendData(USBD_HandleTypeDef Sends the requested data.
*pdev, uint8_t* buf, uint16_t len)
void MSC_BOT_SendCSW
(USBD_HandleTypeDef *pdev, uint8_t Sends the Command Status Wrapper.
CSW_Status)
static void MSC_BOT_Abort
Aborts the current transfer.
(USBD_HandleTypeDef *pdev)
void MSC_BOT_CplClrFeature
Completes the Clear Feature request.
(USBD_HandleTypeDef *pdev, uint8_t epnum)

36/60 UM1734 Rev 4


UM1734 USB device library class module

Table 18. usbd_msc_scsi (.c,.h)


Functions Description

int8_t SCSI_ProcessCmd(USBD_HandleTypeDef
Processes the SCSI commands.
*pdev, uint8_t lun, uint8_t *params)
static int8_t
Processes the SCSI Test Unit Ready
SCSI_TestUnitReady(USBD_HandleTypeDef
command.
*pdev, uint8_t lun, uint8_t *params)
static int8_t SCSI_Inquiry(USBD_HandleTypeDef
Processes the Inquiry command.
*pdev, uint8_t lun, uint8_t *params)
static int8_t
SCSI_ReadCapacity10(USBD_HandleTypeDef Processes the Read Capacity 10 command.
*pdev, uint8_t lun, uint8_t *params)
static int8_t
Processes the Read Format Capacity
SCSI_ReadFormatCapacity(USBD_HandleTypeDef
command.
*pdev, uint8_t lun, uint8_t *params)
static int8_t SCSI_ModeSense6
(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t Processes the Mode Sense 6 command.
*params)
static int8_t SCSI_ModeSense10
(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t Processes the Mode Sense 10 command.
*params)
static int8_t SCSI_RequestSense
(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t Processes the Request Sense command.
*params)
void SCSI_SenseCode
(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t Loads the last error code in the error list.
sKey, uint8_t ASC)
static int8_t SCSI_StartStopUnit
(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t Processes the Start Stop Unit command.
*params)
static int8_t SCSI_Read10
(USBD_HandleTypeDef *pdev, uint8_t lun , uint8_t Processes the Read10 command.
*params)
static int8_t SCSI_Write10
(USBD_HandleTypeDef *pdev, uint8_t lun , uint8_t Processes the Write10 command.
*params)
static int8_t SCSI_Verify10
(USBD_HandleTypeDef *pdev, uint8_t lun , uint8_t Processes the Verify10 command.
*params)
static int8_t SCSI_CheckAddressRange
(USBD_HandleTypeDef *pdev, uint8_t lun , Checks if the LBA is inside the address range.
uint32_t blk_offset , uint16_t blk_nbr)
static int8_t SCSI_ProcessRead
Handles the Burst Read process.
(USBD_HandleTypeDef *pdev, uint8_t lun)
static int8_t SCSI_ProcessWrite
Handles the Burst Write process.
(USBD_HandleTypeDef *pdev, uint8_t lun)

UM1734 Rev 4 37/60


59
USB device library class module UM1734

6.2.4 Disk operation structure definition

Figure 14. Disk operation structure description


USBD_StorageTypeDef USBD_DISK_fops = {
STORAGE_Init,
STORAGE_GetCapacity,
STORAGE_IsReady,
STORAGE_IsWriteProtected,
STORAGE_Read,
STORAGE_Write,
STORAGE_GetMaxLun,
STORAGE_Inquirydata,
};

Note: MicroSD is the default media interface provided by the library. However you can add other
media (Flash memory....) using the template file provided in usbd_msc_storage_template.c
The storage callback for MSC class is added in the user application by calling
USBD_MSC_RegisterStorage(&USBD_Device, &USBD_DISK_fops).
The standard inquiry data are given by the user inside the STORAGE_Inquiry data array.
They should be defined as shown in Figure 15.

Figure 15. Example of standard inquiry definition


int8_t STORAGE_Inquirydata[] = { /* 36 */
/* LUN 0 */
0x00,
0x80,
0x02,
0x02,
(STANDARD_INQUIRY_DATA_LEN - 5),
0x00,
0x00,
0x00,
'S', 'T', 'M', ' ', ' ', ' ', ' ', ' ', /* Manufacturer: 8 bytes */
'P', 'r', 'o', 'd', 'u', 'c', 't', ' ', /* Product : 16 Bytes */
' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
'0', '.', '0','1', /* Version : 4 Bytes */
};

38/60 UM1734 Rev 4


UM1734 USB device library class module

6.2.5 Disk operation functions

Table 19. Disk operation functions


Functions Description

int8_t STORAGE_Init (uint8_t lun) Initializes the storage medium.


int8_t STORAGE_GetCapacity (uint8_t lun,
Returns the medium capacity and block size.
uint32_t *block_num, uint16_t *block_size)
int8_t STORAGE_IsReady (uint8_t lun) Checks whether the medium is ready.
int8_t STORAGE_IsWriteProtected (uint8_t lun) Checks whether the medium is write-protected.
Reads data from the medium:
int8_t STORAGE_Read (uint8_t lun,
blk_address is given in sector unit
uint8_t *buf, uint32_t blk_addr,
blk_len is the number of the sector to be
uint16_t blk_len)
processed.
Writes data to the medium:
int8_t STORAGE_Write (uint8_t lun,
blk_address is given in sector unit
uint8_t *buf, uint32_t blk_addr,
blk_len is the number of the sector to be
uint16_t blk_len)
processed.
int8_t STORAGE_GetMaxLun (void) Returns the number of supported logical units.

6.3 Device firmware upgrade (DFU) class


The DFU core manages the DFU class V1.1 following the “Device Class Specification for
Device Firmware Upgrade Version 1.1 Aug 5, 2004".
This core implements the following aspects of the specification:
• Device descriptor management
• Configuration descriptor management
• Enumeration as DFU device (in DFU mode only)
• Request management (supporting ST DFU sub-protocol)
• Memory request management (Download / Upload / Erase / Detach / GetState /
GetStatus)
• DFU state machine implementation.
Note: ST DFU sub-protocol is compliant with DFU protocol. It uses sub-requests to manage
memory addressing, command processing, specific memory operations (that is, memory
erase, etc.)
As required by the DFU specification, only endpoint 0 is used in this application.
Other endpoints and functions may be added to the application (that is, HID, etc.).
These aspects may be enriched or modified for a specific user application.
The USB driver does not implement the Manifestation Tolerant mode defined in the
specification. However it is possible to manage this feature by modifying the driver.

UM1734 Rev 4 39/60


59
USB device library class module UM1734

6.3.1 Device firmware upgrade (DFU) class implementation


The DFU transactions are based on endpoint 0 (control endpoint) transfer. All requests and
status control are sent / received through this endpoint.
The DFU state machine is based on the following states:

Table 20. DFU states


State State code

appIDLE 0x00
appDETACH 0x01
dfuIDLE 0x02
dfuDNLOAD-SYNC 0x03
dfuDNBUSY 0x04
dfuDNLOAD-IDLE 0x05
dfuMANIFEST-SYNC 0x06
dfuMANIFEST 0x07
dfuMANIFEST-WAIT-RESET 0x08
dfuUPLOAD-IDLE 0x09
dfuERROR 0x0A

The allowed state transitions are described in the specification document.

40/60 UM1734 Rev 4


UM1734 USB device library class module

Figure 16. DFU Interface state transitions diagram


')8B'(7$&+

 
DSS,'/( DSS'(7$&+

'HWDFK7LPHRXW

$SSOLFDWLRQ3URJUDP0RGH

')83URJUDP0RGH

$Q\6WDWXV
86%5HVHW
H[FHSW2.

6WDWH  $Q\6WDWH
 GIX(5525 ([FHSWRU

')8B&/567$786 86%5HVHW
3RZHU2QUHVHW
')8B$%257

')8B83/2$' 5((QXPHUDWLRQ
&RUUXSW)LUPZDUH

')8B'1/2$'
 ZOHQJWK! ')8B*(767$786 EORFNLQ
GIX,'/( ELW&DQ'QORDG  SURJUHVV
')8B83/2$'
ELWFDQ8SORDG 


 GIX'1/2$'6
GIX'1%86<
GIX83/2$' <1&
,'/( ')8B83/2$'
6KRUW)UDPH ')8B*(767$786 6WDWXV3ROO7LPHRXW
%ORFNFRPSOHWH

')8B'1/2$'
Z/HQJWK!
')8B'1/2$'
 Z/HQJWK  
GIX0$1,)(67 GIX'1/2$'
6<1& ,'/(

6WDWXV3ROO
7LPHRXW
%LW0DQLIHVWDWLRQ7R ')8B*(767$786
OHUDQW  PDQLIHVWDWLRQLQ
SURJUHVV
6WDWH
6WDWH

 

GIX0$1,)(67 
:$,7 GIX0$1,)(67
5(6(7

6WDWXV3ROO7LPHRXW
%LW0DQLIHVWDWLRQ7ROHUD
QW 

')8B*(767$7( ')8B*(767$786
069

To protect the application from spurious accesses before initialization, the initial state of the
DFU core (after startup) is dfuERROR. The host must then clear this state by sending a
DFU_CLRSTATE request before generating another request.
The DFU core manages all supported requests (see Table 21).

UM1734 Rev 4 41/60


59
USB device library class module UM1734

Table 21. Supported requests


Request Code Details

When bit 3 in bmAttributes (bit WillDetach) is set, the


DFU_DETACH 0x00 device generates a detach-attach sequence on the bus
when it receives this request.
The firmware image is downloaded via the control-write
DFU_DNLOAD 0x01 transfers initiated by the DFU_DNLOAD class specific
request.
The purpose of the upload is to provide the capability of
DFU_UPLOAD 0x02
retrieving and archiving a device firmware.
The host employs the DFU_GETSTATUS request to
DFU_GETSTATUS 0x03
facilitate synchronization with the device.
Upon receipt of DFU_CLRSTATUS, the device sets a
DFU_CLRSTATUS 0x04
status of OK and transitions to the dfuIDLE state.
DFU_GETSTATE 0x05 This request solicits a report about the state of the device.
The DFU_ABORT request enables the host to exit from
DFU_ABORT 0x06
certain states and to return to the DFU_IDLE state.

Each transfer to the control endpoint belong to one of the two main categories:
• Data transfers: These transfers are used to
– Get some data from the device (DFU_GETSTATUS, DFU_GETSTATE and
DFU_UPLOAD).
– Or, to send data to the device (DFU_DNLOAD).
• No-Data transfers: These transfers are used to send control requests from host to
device (DFU_CLRSTATUS, DFU_ABORT and DFU_DETACH).

6.3.2 Device firmware upgrade (DFU) Class core files


usbd_dfu (.c, .h)
This driver is the main DFU core. It allows the management of all DFU requests and state
machine. It does not directly deal with memory media (managed by lower layer drivers).

Table 22. usbd_dfu (.c,.h) files


Functions Description

static uint8_t USBD_DFU_Init


Initializes the DFU interface.
(USBD_HandleTypeDef *pdev, uint8_t cfgidx);
static uint8_t USBD_DFU_DeInit
De-initializes the DFU layer.
(USBD_HandleTypeDef *pdev, uint8_t cfgidx);
static uint8_t USBD_DFU_Setup
(USBD_HandleTypeDef *pdev, Handles the DFU request parsing.
USBD_SetupReqTypedef *req);
static uint8_t USBD_DFU_EP0_TxReady
Handles the DFU control endpoint data IN stage.
(USBD_HandleTypeDef *pdev);
static uint8_t USBD_DFU_EP0_RxReady Handles the DFU control endpoint data OUT
(USBD_HandleTypeDef *pdev); stage.

42/60 UM1734 Rev 4


UM1734 USB device library class module

Table 22. usbd_dfu (.c,.h) files (continued)


Functions Description

static uint8_t* USBD_DFU_GetUsrStringDesc (


Manages the transfer of memory interfaces string
USBD_HandleTypeDef *pdev, uint8_t index ,
descriptors.
uint16_t *length);
static void DFU_Detach
(USBD_HandleTypeDef *pdev, Handles the DFU DETACH request.
USBD_SetupReqTypedef *req);
static void DFU_Download
(USBD_HandleTypeDef *pdev, Handles the DFU DNLOAD request.
USBD_SetupReqTypedef *req);
static void DFU_Upload
(USBD_HandleTypeDef *pdev, Handles the DFU UPLOAD request.
USBD_SetupReqTypedef *req);
static void DFU_GetStatus
Handles the DFU GETSTATUS request.
(USBD_HandleTypeDef *pdev);
static void DFU_ClearStatus
Handles the DFU CLRSTATUS request.
(USBD_HandleTypeDef *pdev);
static void DFU_GetState
Handles the DFU GETSTATE request.
(USBD_HandleTypeDef *pdev);
static void DFU_Abort (USBD_HandleTypeDef
Handles the DFU ABORT request.
*pdev);
Handles the sub-protocol DFU leave DFU mode
static void DFU_Leave (USBD_HandleTypeDef
request (leaves DFU mode and resets device to
*pdev);
jump to user loaded code).

Note: Internal Flash memory is the default memory provided by the library. However you can add
other memories using the usbd_dfu_media_template.c template file.
To use the driver:
1. Use the file usbd_conf.h, to configure:
– The number of media (memories) to be supported (define
USBD_DFU_MAX_ITF_NUM).
– The application default address (where the image code should be loaded): define
USBD_DFU_APP_DEFAULT_ADD.
2. Call USBD_DFU_Init() function to initialize all memory interfaces and DFU state
machine.
3. All control/request operations are performed through control endpoint 0, through the
functions: USBD_DFU_Setup() and USBD_DFU_EP0_TxReady(). These functions
can be used to call each memory interface callback (read/write/erase/get state...)
depending on the generated DFU requests. No user action is required for these
operations.
4. To close the communication, call the USBD_DFU_DeInit() function.
Note: When the DFU application starts, the default DFU state is DFU_STATE_ERROR. This state is
set to protect the application from spurious operations before having a correct configuration

UM1734 Rev 4 43/60


59
USB device library class module UM1734

6.4 Audio class


The USB driver manages the Audio Class 1.0 following the “USB Device Class Definition for
Audio Devices V1.0 Mar 18, 98".
The driver implements the following aspects of the specification:
• Device descriptor management
• Configuration descriptor management
• Standard AC Interface Descriptor management
• 1 Audio Streaming Interface (with single channel, PCM, Stereo mode)
• 1 Audio Streaming endpoint
• 1 Audio Terminal Input (1 channel)
• Audio Class-Specific AC Interfaces
• Audio Class-Specific AS Interfaces
• Audio Control Requests: only SET_CUR and GET_CUR requests are supported (for
Mute)
• Audio Feature Unit (limited to Mute control)
• Audio Synchronization type: Asynchronous
• Single fixed audio sampling rate (configurable in usbd_conf.h file)
Note: The Audio Class 1.0 is based on USB Specification 1.0 and thus supports only Low and Full
speed modes and does not allow High Speed transfers. Please refer to “USB Device Class
Definition for Audio Devices V1.0 Mar 18, 98" for more details.
These aspects can be enriched or modified for a specific user application.
This driver does not implement the following aspects of the specification (but it is possible to
manage these features with some modifications on this driver):
• Audio Control endpoint management
• Audio Control requests other than SET_CUR and GET_CUR
• Abstraction layer for Audio Control requests (only mute functionality is managed)
• Audio Synchronization type: Adaptive
• Audio Compression modules and interfaces
• MIDI interfaces and modules
• Mixer/Selector/Processing/Extension Units (featured unit is limited to Mute control)
• Any other application-specific modules
• Multiple and Variable audio sampling rates
• Audio Out Streaming Endpoint/Interface (microphone)

6.4.1 Audio class implementation


The Audio transfers are based on isochronous endpoint transactions. Audio control
requests are also managed through control endpoint (endpoint 0).
In each frame, an audio data packet is transferred and must be consumed during this frame
(before the next frame). The audio quality depends on the synchronization between data
transfer and data consumption. This driver implements simple mechanism of
synchronization relying on accuracy of the delivered I2S clock. At each start of frame, the

44/60 UM1734 Rev 4


UM1734 USB device library class module

driver checks if the consumption of the previous packet has been correctly performed and
aborts it if it is still ongoing. To prevent any data overwrite, two main protections are used:
• Using DMA for data transfer between USB buffer and output device registers (I2S).
• Using multi-buffers to store data received from USB.
Based on this mechanism, if the clock accuracy or the consumption rates are not high
enough, it will result in a bad audio quality.
This mechanism may be enhanced by implementing more flexible audio flow controls like
USB feedback mode, dynamic audio clock correction or audio clock generation/control
using SOF event.
The driver also supports basic Audio Control requests. To keep the driver simple, only two
requests have been implemented. However, other requests can be supported by slightly
modifying the audio core driver.

Table 23. Audio control requests


Request Supported Meaning

Sets Mute mode On or Off (can also be updated to set volume


SET_CUR Yes
level…).
SET_MIN No NA.
SET_MAX No NA.
SET_RES No NA.
SET_MEM No NA.
GET_CUR Yes Gets Mute mode state (can also be updated to get volume level…).
GET_MIN No NA.
GET_MAX No NA.
GET_RES No NA.
GET_MEM No NA.

6.4.2 Audio core files


usbd_audio (.c, .h)
This driver is the audio core. It manages audio data transfers and control requests. It does
not directly deal with audio hardware (which is managed by lower layer drivers).

Table 24. usbd_audio_core (.c,.h) files


Functions Description

static uint8_t USBD_AUDIO_Init


Initializes the Audio interface.
(USBD_HandleTypeDef *pdev, uint8_t cfgidx);
static uint8_t USBD_AUDIO_DeInit
De-initializes the Audio interface.
(USBD_HandleTypeDef *pdev, uint8_t cfgidx);
static uint8_t USBD_AUDIO_Setup
(USBD_HandleTypeDef *pdev, Handles the Audio control request parsing.
USBD_SetupReqTypedef *req);

UM1734 Rev 4 45/60


59
USB device library class module UM1734

Table 24. usbd_audio_core (.c,.h) files (continued)


Functions Description

static uint8_t USBD_AUDIO_EP0_RxReady


Handles audio control requests data.
(USBD_HandleTypeDef *pdev);
static uint8_t USBD_AUDIO_DataIn
Handles the Audio In data stage.
(USBD_HandleTypeDef *pdev, uint8_t epnum);
static uint8_t USBD_AUDIO_DataOut
Handles the Audio Out data stage.
(USBD_HandleTypeDef *pdev, uint8_t epnum);
static uint8_t USBD_AUDIO_SOF Handles the SOF event (data buffer update and
(USBD_HandleTypeDef *pdev); synchronization).
static void
AUDIO_REQ_GetCurrent(USBD_HandleTypeDe Handles the GET_CUR Audio control request.
f *pdev, USBD_SetupReqTypedef *req);
static void
AUDIO_REQ_SetCurrent(USBD_HandleTypeDe Handles the SET_CUR Audio control request.
f *pdev, USBD_SetupReqTypedef *req);

The low layer hardware interfaces are managed through their respective driver structure:

Figure 17. Audio core structures


typedef struct
{
int8_t (*Init) (uint32_t AudioFreq, uint32_t Volume,
uint32_t options);
int8_t (*DeInit) (uint32_t options);
int8_t (*AudioCmd) (uint8_t* pbuf, uint32_t size, uint8_t
cmd);
int8_t (*VolumeCtl) (uint8_t vol);
int8_t (*MuteCtl) (uint8_t cmd);
int8_t (*PeriodicTC) (uint8_t cmd);
int8_t (*GetState) (void);
}USBD_AUDIO_ItfTypeDef;

Each audio hardware interface driver should provide a structure pointer of type
USBD_AUDIO_ItfTypeDef. The functions and constants pointed by this structure are listed
in the following sections. If a functionality is not supported by a given memory interface, the
relative field is set as NULL value.

usbd_audio_if (.c, .h)


This driver manages the low layer audio hardware. usbd_audio_if.c/.h driver manages the
Audio Out interface (from USB to audio speaker/headphone). user can call lower layer
Codec driver (i.e. stm324xg_eval_audio.c/.h) for basic audio operations (play/pause/volume
control...).
This driver provides the structure pointer:
extern USBD_AUDIO_ItfTypeDef USBD_AUDIO_fops;

46/60 UM1734 Rev 4


UM1734 USB device library class module

Table 25. usbd_audio_if (.c,.h) files


Functions Description
static int8_t Audio_Init(uint32_t AudioFreq,
Initializes the audio interface.
uint32_t Volume, uint32_t options);
De-initializes the audio interface and free used
static int8_t Audio_DeInit(uint32_t options);
resources.
static int8_t Audio_PlaybackCmd(uint8_t* pbuf,
Handles audio player commands (play, pause…).
uint32_t size, uint8_t cmd);
static int8_t Audio_VolumeCtl(uint8_t vol); Handles audio player volume control.
static int8_t Audio_MuteCtl(uint8_t cmd); Handles audio player mute state.
Handles the end of current packet transfer (not
static int8_t Audio_PeriodicTC(uint8_t cmd);
needed for the current version of the driver).
Returns the current state of the driver audio
static int8_t Audio_GetState(void);
player (Playing/Paused/Error …).

Note: The usbd_audio_if_template (.c,.h) file provides a template driver which allows you to
implement additional functions for your Audio application
The Audio player state is managed through the following states:

Table 26. Audio player states


State Code Description
AUDIO_CMD_START 0x01 Audio player is initialized and ready.
AUDIO_CMD_PLAY 0x02 Audio player is currently playing.
AUDIO_CMD_STOP 0x04 Audio player is stopped.

6.4.3 How to use this driver


This driver uses an abstraction layer for hardware driver (i.e. HW Codec, I2S interface, I2C
control interface...). This abstraction is performed through a lower layer (i.e.
usbd_audio_if.c) which you can modify depending on the hardware available for your
application.
To use this driver:
1. Configure the audio sampling rate (define USBD_AUDIO_FREQ) through the file
usbd_conf.h,
2. Call the USBD_AUDIO_Init() function at startup to configure all necessary firmware
and hardware components (application-specific hardware configuration functions are
also called by this function). The hardware components are managed by a lower layer
interface (i.e. usbd_audio_if.c) and can be modified by user depending on the
application needs.
3. The entire transfer is managed by the following functions (no need for user to call any
function for out transfers):
– usbd_audio_DataIn() and usbd_audio_DataOut() which update the audio buffers
with the received or transmitted data. For Out transfers, when data are received,

UM1734 Rev 4 47/60


59
USB device library class module UM1734

they are directly copied into the audiobuffer and the write buffer (wr_ptr) is
incremented.
4. The Audio Control requests are managed by the functions USBD_AUDIO_Setup() and
USBD_AUDIO_EP0_RxReady(). These functions route the Audio Control requests to
the lower layer (i.e. usbd_audio_if.c). In the current version, only SET_CUR and
GET_CUR requests are managed and are used for mute control only.

6.4.4 Audio known limitations


• If a low audio sampling rate is configured (define USBD_AUDIO_FREQ below 24 kHz)
it may result in noise issue at pause/resume/stop operations. This is due to software
timing tuning between stopping I2S clock and sending mute command to the external
Codec.
• Supported audio sampling rates range from 96 kHz to 24 kHz (non-multiple of 1 kHz
values like 11.025 kHz, 22.05 kHz or 44.1 kHz are not supported by this driver). For
frequencies multiple of 1000 Hz, the Host will send integer number of bytes each frame
(1 ms). When the frequency is not multiple of 1000Hz, the Host should send non
integer number of bytes per frame. This is in fact managed by sending frames with
different sizes (i.e. for 22.05 kHz, the Host will send 19 frames of 22 bytes and one
frame of 23 bytes). This difference of sizes is not managed by the Audio core and the
extra byte will always be ignored. It is advised to set a high and standard sampling rate
in order to get best audio quality (i.e. 96 kHz or 48 kHz). Note that maximum allowed
audio frequency is 96 kHz (this limitation is due to the Codec used on the Evaluation
board. The STM32 I2S cell enables reaching 192 kHz).

6.5 Communication device class (CDC)


The USB driver manages the “Universal Serial Bus Class Definitions for Communications
Devices Revision 1.2 November 16, 2007" and the sub-protocol specification of “Universal
Serial Bus Communications Class Subclass Specification for PSTN Devices Revision 1.2
February 9, 2007".
This driver implements the following aspects of the specification:
• Device descriptor management
• Configuration descriptor management
• Enumeration as CDC device with 2 data endpoints (IN and OUT) and 1 command
endpoint (IN)
• Request management (as described in section 6.2 in specification)
• Abstract Control Model compliant
• Union Functional collection (using 1 IN endpoint for control)
• Data interface class
Note: For the Abstract Control Model, this core can only transmit the requests to the lower layer
dispatcher (i.e. usbd_cdc_vcp.c/.h) which should manage each request and perform relative
actions.
These aspects can be enriched or modified for a specific user application.

48/60 UM1734 Rev 4


UM1734 USB device library class module

This driver does not implement the following aspects of the specification (but it is possible to
manage these features with some modifications on this driver):
• Any class-specific aspect relative to communication classes should be managed by
user application.
• All communication classes other than PSTN are not managed.

6.5.1 Communication
The CDC core uses two endpoint/transfer types:
• Bulk endpoints for data transfers (1 OUT endpoint and 1 IN endpoint)
• Interrupt endpoints for communication control (CDC requests; 1 IN endpoint)
Data transfers are managed differently for IN and OUT transfers:

6.5.2 Data IN transfer management (from device to host)


The data transfer is managed periodically depending on host request (the device specifies
the interval between packet requests). For this reason, a circular static buffer is used for
storing data sent by the device terminal (i.e. USART in the case of Virtual COM Port
terminal).

6.5.3 Data OUT transfer management (from host to device)


In general, the USB is much faster than the output terminal (i.e. the USART maximum
bitrate is 115.2 Kbps while USB bitrate is 12 Mbps for Full speed mode and 480 Mbps in
High speed mode). Consequently, before sending new packets, the host has to wait until the
device has finished to process the data sent by host. Thus, there is no need for circular data
buffer when a packet is received from host: the driver calls the lower layer OUT transfer
function and waits until this function is completed before allowing new transfers on the OUT
endpoint (meanwhile, OUT packets will be NACKed).

6.5.4 Command request management


In this driver, control endpoint (endpoint 0) is used to manage control requests. But a data
interrupt endpoint may be used also for command management. If the request data size
does not exceed 64 bytes, the endpoint 0 is sufficient to manage these requests.
The CDC driver does not manage command requests parsing. Instead, it calls the lower
layer driver control management function with the request code, length and data buffer.
Then this function should parse the requests and perform the required actions.

6.5.5 Command device class (CDC) core files


usbd_cdc (.c, .h)
This driver is the CDC core. It manages CDC data transfers and control requests. It does
not directly deal with CDC hardware (which is managed by lower layer drivers).

UM1734 Rev 4 49/60


59
USB device library class module UM1734

Table 27. usbd_cdc (.c,.h) files


Functions Description

static uint8_t USBD_CDC_Init


Initializes the CDC interface.
(USBD_HandleTypeDef *pdev, uint8_t cfgidx);
static uint8_t USBD_CDC_DeInit
De-initializes the CDC interface.
(USBD_HandleTypeDef *pdev, uint8_t cfgidx);
static uint8_t USBD_CDC_Setup
(USBD_HandleTypeDef *pdev, Handles the CDC control requests.
USBD_SetupReqTypedef *req);
static uint8_t USBD_CDC_EP0_RxReady
Handles CDC control request data.
(USBD_HandleTypeDef *pdev);
static uint8_t USBD_CDC_DataIn
Handles the CDC IN data stage.
(USBD_HandleTypeDef *pdev, uint8_t epnum);
static uint8_t USBD_CDC_DataOut
Handles the CDC Out data stage.
(USBD_HandleTypeDef *pdev, uint8_t epnum);
uint8_t USBD_CDC_RegisterInterface
(USBD_HandleTypeDef *pdev, Adds CDC Interface Class.
USBD_CDC_ItfTypeDef *fops)
uint8_t USBD_CDC_SetTxBuffer
(USBD_HandleTypeDef *pdev, uint8_t *pbuff, Sets application TX Buffer.
uint16_t length)
uint8_t USBD_CDC_SetRxBuffer
Sets application RX Buffer.
(USBD_HandleTypeDef *pdev, uint8_t *pbuff)
uint8_t
USBD_CDC_TransmitPacket(USBD_HandleTyp Transmits Transfer completed callback.
eDef *pdev)
uint8_t
USBD_CDC_ReceivePacket(USBD_HandleType Receives Transfer completed callback.
Def *pdev)

The low layer hardware interfaces are managed through their respective driver structure

Figure 18. CDC core structures


typedef struct _USBD_CDC_Itf
{
int8_t (* Init) (void);
int8_t (* DeInit) (void);
int8_t (* Control) (uint8_t, uint8_t * , uint16_t);
int8_t (* Receive) (uint8_t *, uint32_t *);

}USBD_CDC_ItfTypeDef;

Each hardware interface driver should provide a structure pointer of type


USBD_CDC_ItfTypeDef. The functions pointed by this structure are listed in the following
sections.

50/60 UM1734 Rev 4


UM1734 USB device library class module

If a function is not supported by a given memory interface, the relative field is set as NULL
value.
Note: In order to get the best performance, it is advised to calculate the values needed for the
following parameters (all of them are configurable through defines in the usbd_cdc.h and
usbd_cdc_interface.h files):

Table 28. Configurable CDC parameters


Typical value
Define Parameter
Full Speed High Speed

CDC_DATA_HS_IN_PACKET_SIZE
Size of each IN data packet. 64 512
/CDC_DATA_FS_IN_PACKET_SIZE
CDC_DATA_HS_OUT_PACKET_SI
ZE/CDC_DATA_FS_OUT_PACKET Size of each OUT data packet. 64 512
_SIZE
Total size of circular temporary
APP_TX_DATA_SIZE 2048 2048
buffer for OUT data transfer.
Total size of circular temporary
APP_RX_DATA_SIZE 2048 2048
buffer for IN data transfer.

usbd_cdc_interface (.c, .h)


This driver can be part of the user application. It is not provided in the library, but a template
usbd_cdc_if_template (.c, .h) can be used to build it and an example is provided for the
USART interface. It manages the low layer CDC hardware. The usbd_cdc_interface.c/.h
driver manages the terminal interface configuration and communication (i.e. USART
interface configuration and data send/receive).
This driver provides the structure pointer:

Figure 19. CDC interface callback structure


USBD_CDC_ItfTypeDef USBD_CDC_fops =
{
CDC_Itf_Init,
CDC_Itf_DeInit,
CDC_Itf_Control,
CDC_Itf_Receive
};

Table 29. usbd_cdc_interface (.c,.h) files


Functions Description

static int8_t CDC_Itf_Init


Initializes the low layer CDC interface.
(void);
static int8_t CDC_Itf_DeInit
De-initializes the low layer CDC interface.
(void);

UM1734 Rev 4 51/60


59
USB device library class module UM1734

Table 29. usbd_cdc_interface (.c,.h) files


Functions Description

static int8_t CDC_Itf_Control Handles CDC control request parsing and


(uint8_t cmd, uint8_t* pbuf, uint16_t length); execution.

static int8_t CDC_Itf_Receive Handles CDC data reception from USB host to
(uint8_t* pbuf, uint32_t *Len); low layer terminal (OUT transfers).

In order to accelerate data management for IN/OUT transfers, the low layer driver
(usbd_cdc_interface.c/.h) use these global variables:

Table 30. Variables used by usbd_cdc_xxx_if.c/.h


Variable Usage

Writes CDC received data in this buffer from USART.


uint8_t
These data will be sent over USB IN endpoint in the
UserRxBuffer[APP_RX_DATA_SIZE] CDC core functions.
Increments this pointer or rolls it back to start the
uint32_t UserTxBufPtrOut address when writing received data in the buffer
UserRxBuffer.
Writes CDC received data in this buffer. These data
uint8_t
are received from USB OUT endpoint in the CDC
UserTxBuffer[APP_TX_DATA_SIZE] core functions.
Increments this pointer or rolls back to start address
UserTxBufPtrIn
when data are received over USART.

6.5.6 How to use


The USB driver uses an abstraction layer for hardware driver (i.e. USART control
interface...). This abstraction is performed through a lower layer (i.e. stm32fxxx_hal_msp.c)
which you can modify depending on the hardware available for your application.
To use this driver:
1. Through the file usbd_cdc.h and usbd_cdc_interface.h, configure:
– The Data IN and OUT and command packet sizes (defines
CDC_DATA_XX_IN_PACKET_SIZE, CDC_DATA_XX_OUT_PACKET_SIZE)
– The size of the temporary circular buffer for IN/OUT data transfer (define
APP_RX_DATA_SIZE and APP_TX_DATA_SIZE).
– The device string descriptors.
2. Call the function USBD_CDC_Init() at startup to configure all necessary firmware and
hardware components (application-specific hardware configuration functions are called
by this function as well). The hardware components are managed by a lower layer

52/60 UM1734 Rev 4


UM1734 USB device library class module

interface (i.e. usbd_cdc_interface.c) and can be modified by user depending on the


application needs.
3. CDC IN and OUT data transfers are managed by two functions:
– USBD_CDC_SetTxBuffer should be called by user application each time a data
(or a certain number of data) is available to be sent to the USB Host from the
hardware terminal.
– USBD_CDC_SetRxBuffer is called by the CDC core each time a buffer is sent
from the USB Host and should be transmitted to the hardware terminal. This
function should exit only when all data in the buffer are sent (the CDC core then
blocks all coming OUT packets until this function finishes processing the previous
packet).
4. CDC control requests should be handled by the function Controllability(). This function
is called each time a request is received from Host and all its relative data are available
if any. This function should parse the request and perform the needed actions.
5. To close the communication, call the function USBD_CDC_DeInit(). This closes the
used endpoints and calls lower layer de-initialization functions.

6.5.7 CDC known limitations


When using this driver with the OTG HS core, enabling DMA mode (define
USB_OTG_HS_INTERNAL_DMA_ENABLED in usb_conf.h file) results in data being sent
only by multiple of 4 bytes. This is due to the fact that USB DMA does not allow sending
data from non word-aligned addresses. For this specific application, it is advised not to
enable this option unless required.

6.6 Adding a custom class


This section explains how to create a new custom class based on an existing USB class.
To create a new custom Class, follow the steps below:
1. Add USBD_CustomClass_cb (In order to receive various USB bus Events) as
described in Section 5.3, in the usbd_template.c/.h available under Class/Template

UM1734 Rev 4 53/60


59
USB device library class module UM1734

directory. This template contains all the functions that should be adapted to the
application's needs and may be also used to implement any type of USB Device class.
2. Customizing the descriptors:
The descriptors retrieved by the host must be configured to describe a device
depending on the specifications for the application class devices. The following list is
not complete but gives an overview about the various descriptors that may be required:
– Standard device descriptor
– Standard configuration descriptor
– Standard interface descriptor for the Class that is implemented
– Standard endpoint descriptors for IN and OUT endpoints
3. The firmware must configure the STM32 to enable USB transfer (isochronous, Bulk,
Interrupt or Control) depending on the user application:
– In the DataIn and DataOut functions, the user can implement the internal protocol
or state machine
– In the Setup; the class specific requests are to be implemented. The configuration
descriptor is to be added as an array and passed to the USB device library.
– Through the GetConfigDescriptor function which should return a pointer to the
USB configuration descriptor and its length.
– Additional functions could be added as the IsoINIncomplete and
IsoOUTIncomplete could be eventually used to handle incomplete isochronous
transfers (for more information, refer to the USB audio device example).
– EP0_TxSent and EP0_RxReady could be eventually used when the application
needs to handle events occurring before the Zero Length Packets (see the DFU
example).
4. Memory allocation process: Memory is allocated to the applications using the malloc
(USBD_malloc):
– USBD_malloc(sizeof (USBD_CUSTOM_CLASS_HandleTypeDef)): this is
dynamically allocates memory for a Class structure

6.7 Library footprint optimization


In this section we review some basic tips about how to optimize the footprint of an
application developed on top of the USB device library.
Reducing the USB examples footprint is important objective especially for STM32 products
with small Flash/RAM memory size, such as STM32L0 and F0 Series.

Reduce the heap and stack size settings (in the Linker file)
The stack is the memory area where the program stores:
• Local variables
• Return addresses
• Function arguments
• Compiler temporaries
• Interrupt contexts
If your linker configuration reserves more amounts of heap and stack than necessary for
your application, you can determine accurately the appropriate sizes.

54/60 UM1734 Rev 4


UM1734 USB device library class module

Whenever possible use local instead if global variables


If a variable is used only in a function, then it should be declared inside the function as a
local variable.

Constant should be allocated in the flash


It is recommended to allocate all constant global variables, which never change, to a read-
only section. As example, the USB descriptors are declared as constant using the C
keyword “const”.

Figure 20. Example of USB descriptors declared as constants

Use static memory allocation rather than malloc


The USB device library uses dynamic memory allocation for a class handle structure to
allow multi-instance support (in case of the dual core operation), this means for example we
can have same USB class used for the two instances of the USB (HS and FS).
The secondary reason for using dynamic allocation is to allow freeing memory when USB is
no more used.
However dynamic memory allocation adds some footprint overhead, mainly for the ROM
memory. For this it’s advised to use static allocation for the low memory STM32 devices or
when multi-instance support is not needed. In that case it’s necessary to declare a static
buffer having the size of the class handle structure.

UM1734 Rev 4 55/60


59
USB device library class module UM1734

Below an example of implementation:


1. In usbd_conf.h file, define the memory static allocation and routines;
USBD_static_malloc()and USBD_static_free()

#define MAX_STATIC_ALLOC_SIZE 4 /* HID Class structure size */


#define USBD_malloc (uint32_t *)USBD_static_malloc
#define USBD_free USBD_static_free
2. The implementation is done in usbd_conf.c file as below:

Figure 21. Example of dynamic memory allocation for class structure

56/60 UM1734 Rev 4


UM1734 Frequently-asked questions

7 Frequently-asked questions

1. How can the Device and string descriptors be modified on-the-fly?


In the usbd_desc.c file, the descriptor relative to the device and the strings can be
modified using the Get Descriptor callbacks. The application can return the correct
descriptor buffer relative to the application index using a switch case statement.
2. How can the mass storage class driver support more than one logical unit
(LUN)?
In the usbd_msc_storage_template.c file, all the APIs needed to use physical media
are defined. Each function comes with the “LUN” parameter to select the addressed
media.
The number of supported LUNs can be changed using the define
STORAGE_LUN_NBR in the usbd_msc_storage_xxx.c file (where, xxx is the medium
to be used).
For the inquiry data, the STORAGE_Inquirydata buffer contains the standard inquiry
data for each LUN.
Example: 2 LUNs are used
const int8_t STORAGE_Inquirydata[] = {

/* LUN 0 */
0x00,
0x80,
0x02,
0x02,
(USBD_STD_INQUIRY_LENGTH - 5),
0x00,
0x00,
0x00,
'S', 'T', 'M', ' ', ' ', ' ', ' ', ' ', /* Manufacturer:
8 bytes */
'm', 'i', 'c', 'r', 'o', 'S', 'D', ' ', /* Product:
16 Bytes */
'F', 'l', 'a', 's', 'h', ' ', ' ', ' ',
'1', '.', '0' ,'0', /* Version: 4 Bytes */

/* LUN 0 */
0x00,
0x80,
0x02,
0x02,
(USBD_STD_INQUIRY_LENGTH - 5),
0x00,
0x00,
0x00,
'S', 'T', 'M', ' ', ' ', ' ', ' ', ' ', /* Manufacturer:
8 bytes */

UM1734 Rev 4 57/60


59
Frequently-asked questions UM1734

'N', 'a', 'n', 'd', ' ', ' ', ' ', ' ', /* Product:
16 Bytes */
'F', 'l', 'a', 's', 'h', ' ', ' ', ' ',
'1', '.', '0' ,'0', /* Version: 4 Bytes */
};
3. Where endpoints address are defined?
Endpoints address are defined in the header file of the class driver. In the case of the
MSC demo case for example, the IN/OUT endpoints address are defined in the
usbd_msc.h file as below:
#define MSC_EPIN_ADDR 0x81 For Endpoint 1 IN
#define MSC_EPOUT_ADDR 0x01 For Endpoint 1 OUT
4. Can the USB device library be configured to run in either High Speed or Full
Speed mode?
Yes, the library can handle the USB OTG HS and USB OTG FS core, if the USB OTG
FS core can only work in Full Speed mode, the USB OTG HS can work in High or Full
Speed mode.
To select the appropriate USB Core to work with, user must add the following macro
defines within the compiler preprocessor (already done in the preconfigured projects
provided with the examples):
- "USE_USB_HS" when using USB High Speed (HS) Core
- "USE_USB_FS" when using USB Full Speed (FS) Core
- "USE_USB_HS" and "USE_USB_HS_IN_FS" when using USB High Speed (HS)
Core in FS mode
5. How can the used endpoints be changed in the USB device class driver?
To change the endpoints or to add a new endpoint:
a) Perform the endpoint initialization using USBD_LL_OpenEP().
b) Configure the TX or the Rx FIFO size of the new defined endpoints in the
usb_conf.c file using these APIs in the USBD_LL_Init() function
– For STM32F2 and STM32F4 Series (FS and HS cores):
HAL_PCD_SetRxFiFo()
HAL_PCD_SetTxFiFo()
The total size of the Rx and Tx FIFOs should be lower than the total FIFO size of the
used core, that is 320 x 32 bits (1.25 Kbytes) for USB OTG FS core and 1024 x 32 bits
(4 Kbytes) for the USB OTG HS core.
– For STM32F0, STM32L0, STM32F1 and STM32F3 Series (FS core only):
HAL_PCD_PMA_Config()
6. Is the USB device library compatible with Real Time operating system (RTOS)?
Yes, The USB device library could be used with RTOS, the CMSIS RTOS wrapper is
used to make abstraction with OS kernel.

58/60 UM1734 Rev 4


UM1734 Revision history

8 Revision history

Table 31. Document revision history


Date Revision Changes

27-May-2014 1 Initial release.


Updated Section : Introduction, Figure 1: STM32Cube block diagram
and Section 2.1: Overview
All figures: added missing titles, updated figure style and clarified
color codes.
28-Nov-2014 2
updated sequence to use the driver in Section 6.3.2: Device
firmware upgrade (DFU) Class core files, Section 6.4.3: How to use
this driver, Section 6.5.6: How to use and Section 6.6: Adding a
custom class.
Introduction updated and merged with section STM32Cube
27-May-2015 3
overview.
Updated Introduction and STM32Cube logo on cover page. Added
Table 1: Application products and trademark on STM32Cube.
20-Feb-2019 4 Changed ‘STM32Cube firmware’ into ‘STM32Cube MCU Package’
in the whole document.
Added Section 1.2: General information.

UM1734 Rev 4 59/60


59
UM1734

IMPORTANT NOTICE – PLEASE READ CAREFULLY

STMicroelectronics NV and its subsidiaries (“ST”) reserve the right to make changes, corrections, enhancements, modifications, and
improvements to ST products and/or to this document at any time without notice. Purchasers should obtain the latest relevant information on
ST products before placing orders. ST products are sold pursuant to ST’s terms and conditions of sale in place at the time of order
acknowledgement.

Purchasers are solely responsible for the choice, selection, and use of ST products and ST assumes no liability for application assistance or
the design of Purchasers’ products.

No license, express or implied, to any intellectual property right is granted by ST herein.

Resale of ST products with provisions different from the information set forth herein shall void any warranty granted by ST for such product.

ST and the ST logo are trademarks of ST. All other product or service names are the property of their respective owners.

Information in this document supersedes and replaces information previously supplied in any prior versions of this document.

© 2019 STMicroelectronics – All rights reserved

60/60 UM1734 Rev 4

You might also like