max4146x_comp

Dependencies:   MAX14690

Committer:
sdivarci
Date:
Sun Oct 25 20:10:02 2020 +0000
Revision:
0:0061165683ee
sdivarci

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sdivarci 0:0061165683ee 1 /***************************************************************************//**
sdivarci 0:0061165683ee 2 * @file em_usb.h
sdivarci 0:0061165683ee 3 * @brief USB protocol stack library API for EFM32.
sdivarci 0:0061165683ee 4 * @version 3.20.14
sdivarci 0:0061165683ee 5 *******************************************************************************
sdivarci 0:0061165683ee 6 * @section License
sdivarci 0:0061165683ee 7 * <b>(C) Copyright 2014 Silicon Labs, http://www.silabs.com</b>
sdivarci 0:0061165683ee 8 *******************************************************************************
sdivarci 0:0061165683ee 9 *
sdivarci 0:0061165683ee 10 * Licensed under the Apache License, Version 2.0 (the "License");
sdivarci 0:0061165683ee 11 * you may not use this file except in compliance with the License.
sdivarci 0:0061165683ee 12 * You may obtain a copy of the License at
sdivarci 0:0061165683ee 13 *
sdivarci 0:0061165683ee 14 * http://www.apache.org/licenses/LICENSE-2.0
sdivarci 0:0061165683ee 15 *
sdivarci 0:0061165683ee 16 * Unless required by applicable law or agreed to in writing, software
sdivarci 0:0061165683ee 17 * distributed under the License is distributed on an "AS IS" BASIS,
sdivarci 0:0061165683ee 18 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
sdivarci 0:0061165683ee 19 * See the License for the specific language governing permissions and
sdivarci 0:0061165683ee 20 * limitations under the License.
sdivarci 0:0061165683ee 21 *
sdivarci 0:0061165683ee 22 ******************************************************************************/
sdivarci 0:0061165683ee 23
sdivarci 0:0061165683ee 24 #ifndef __EM_USB_H
sdivarci 0:0061165683ee 25 #define __EM_USB_H
sdivarci 0:0061165683ee 26
sdivarci 0:0061165683ee 27 #include "em_device.h"
sdivarci 0:0061165683ee 28 #include "em_assert.h"
sdivarci 0:0061165683ee 29 #if defined( USB_PRESENT ) && ( USB_COUNT == 1 )
sdivarci 0:0061165683ee 30 #include "usbconfig.h"
sdivarci 0:0061165683ee 31 #if defined( USB_DEVICE ) || defined( USB_HOST )
sdivarci 0:0061165683ee 32
sdivarci 0:0061165683ee 33 #include <string.h>
sdivarci 0:0061165683ee 34 #include <stddef.h>
sdivarci 0:0061165683ee 35 #include "em_common.h"
sdivarci 0:0061165683ee 36 #include "em_int.h"
sdivarci 0:0061165683ee 37
sdivarci 0:0061165683ee 38 #if defined( USB_USE_PRINTF )
sdivarci 0:0061165683ee 39 #include <stdio.h>
sdivarci 0:0061165683ee 40 #endif
sdivarci 0:0061165683ee 41
sdivarci 0:0061165683ee 42 #ifdef __cplusplus
sdivarci 0:0061165683ee 43 extern "C" {
sdivarci 0:0061165683ee 44 #endif
sdivarci 0:0061165683ee 45
sdivarci 0:0061165683ee 46 #ifdef __CC_ARM
sdivarci 0:0061165683ee 47 #pragma anon_unions
sdivarci 0:0061165683ee 48 #endif
sdivarci 0:0061165683ee 49
sdivarci 0:0061165683ee 50 /***************************************************************************//**
sdivarci 0:0061165683ee 51 * @addtogroup USB
sdivarci 0:0061165683ee 52 * @brief USB HOST and DEVICE protocol stacks.
sdivarci 0:0061165683ee 53 * @{
sdivarci 0:0061165683ee 54 ******************************************************************************/
sdivarci 0:0061165683ee 55
sdivarci 0:0061165683ee 56 /***************************************************************************//**
sdivarci 0:0061165683ee 57 * @addtogroup USB_COMMON
sdivarci 0:0061165683ee 58 * @brief Common parts for both HOST and DEVICE USB stacks, see @ref usb_device
sdivarci 0:0061165683ee 59 * and @ref usb_host pages for device and host library documentation.
sdivarci 0:0061165683ee 60 * @{
sdivarci 0:0061165683ee 61 ******************************************************************************/
sdivarci 0:0061165683ee 62
sdivarci 0:0061165683ee 63 #define SILABS_USB_VID 0x10C4 /**< Silicon Labs Vendor ID, supplied by USB-IF. */
sdivarci 0:0061165683ee 64
sdivarci 0:0061165683ee 65 /* SETUP request, direction of data stage */
sdivarci 0:0061165683ee 66 #define USB_SETUP_DIR_OUT 0 /**< Setup request data stage OUT direction value. */
sdivarci 0:0061165683ee 67 #define USB_SETUP_DIR_IN 1 /**< Setup request data stage IN direction value. */
sdivarci 0:0061165683ee 68 #define USB_SETUP_DIR_MASK 0x80 /**< Setup request data stage direction mask. */
sdivarci 0:0061165683ee 69 #define USB_SETUP_DIR_D2H 0x80 /**< Setup request data stage IN direction mask. */
sdivarci 0:0061165683ee 70 #define USB_SETUP_DIR_H2D 0x00 /**< Setup request data stage OUT direction mask. */
sdivarci 0:0061165683ee 71
sdivarci 0:0061165683ee 72 /* SETUP request type */
sdivarci 0:0061165683ee 73 #define USB_SETUP_TYPE_STANDARD 0 /**< Standard setup request value. */
sdivarci 0:0061165683ee 74 #define USB_SETUP_TYPE_CLASS 1 /**< Class setup request value. */
sdivarci 0:0061165683ee 75 #define USB_SETUP_TYPE_VENDOR 2 /**< Vendor setup request value. */
sdivarci 0:0061165683ee 76 #define USB_SETUP_TYPE_STANDARD_MASK 0x00 /**< Standard setup request mask. */
sdivarci 0:0061165683ee 77 #define USB_SETUP_TYPE_CLASS_MASK 0x20 /**< Class setup request mask. */
sdivarci 0:0061165683ee 78 #define USB_SETUP_TYPE_VENDOR_MASK 0x40 /**< Vendor setup request mask. */
sdivarci 0:0061165683ee 79
sdivarci 0:0061165683ee 80 /* SETUP request recipient */
sdivarci 0:0061165683ee 81 #define USB_SETUP_RECIPIENT_DEVICE 0 /**< Setup request device recipient value. */
sdivarci 0:0061165683ee 82 #define USB_SETUP_RECIPIENT_INTERFACE 1 /**< Setup request interface recipient value. */
sdivarci 0:0061165683ee 83 #define USB_SETUP_RECIPIENT_ENDPOINT 2 /**< Setup request endpoint recipient value. */
sdivarci 0:0061165683ee 84 #define USB_SETUP_RECIPIENT_OTHER 3 /**< Setup request other recipient value. */
sdivarci 0:0061165683ee 85
sdivarci 0:0061165683ee 86 /* SETUP standard request codes for Full Speed devices */
sdivarci 0:0061165683ee 87 #define GET_STATUS 0 /**< Standard setup request GET_STATUS. */
sdivarci 0:0061165683ee 88 #define CLEAR_FEATURE 1 /**< Standard setup request CLEAR_FEATURE. */
sdivarci 0:0061165683ee 89 #define SET_FEATURE 3 /**< Standard setup request SET_FEATURE. */
sdivarci 0:0061165683ee 90 #define SET_ADDRESS 5 /**< Standard setup request SET_ADDRESS. */
sdivarci 0:0061165683ee 91 #define GET_DESCRIPTOR 6 /**< Standard setup request GET_DESCRIPTOR. */
sdivarci 0:0061165683ee 92 #define SET_DESCRIPTOR 7 /**< Standard setup request SET_DESCRIPTOR. */
sdivarci 0:0061165683ee 93 #define GET_CONFIGURATION 8 /**< Standard setup request GET_CONFIGURATION. */
sdivarci 0:0061165683ee 94 #define SET_CONFIGURATION 9 /**< Standard setup request SET_CONFIGURATION. */
sdivarci 0:0061165683ee 95 #define GET_INTERFACE 10 /**< Standard setup request GET_INTERFACE. */
sdivarci 0:0061165683ee 96 #define SET_INTERFACE 11 /**< Standard setup request SET_INTERFACE. */
sdivarci 0:0061165683ee 97 #define SYNCH_FRAME 12 /**< Standard setup request SYNCH_FRAME. */
sdivarci 0:0061165683ee 98
sdivarci 0:0061165683ee 99 /* SETUP class request codes */
sdivarci 0:0061165683ee 100 #define USB_HID_GET_REPORT 0x01 /**< HID class setup request GET_REPORT. */
sdivarci 0:0061165683ee 101 #define USB_HID_GET_IDLE 0x02 /**< HID class setup request GET_IDLE. */
sdivarci 0:0061165683ee 102 #define USB_HID_SET_REPORT 0x09 /**< HID class setup request SET_REPORT. */
sdivarci 0:0061165683ee 103 #define USB_HID_SET_IDLE 0x0A /**< HID class setup request SET_IDLE. */
sdivarci 0:0061165683ee 104 #define USB_HID_SET_PROTOCOL 0x0B /**< HID class setup request SET_PROTOCOL. */
sdivarci 0:0061165683ee 105 #define USB_CDC_SETLINECODING 0x20 /**< CDC class setup request SET_LINE_CODING. */
sdivarci 0:0061165683ee 106 #define USB_CDC_GETLINECODING 0x21 /**< CDC class setup request GET_LINE_CODING. */
sdivarci 0:0061165683ee 107 #define USB_CDC_SETCTRLLINESTATE 0x22 /**< CDC class setup request SET_CONTROL_LINE_STATE. */
sdivarci 0:0061165683ee 108 #define USB_MSD_BOTRESET 0xFF /**< MSD class setup request Bulk only transfer reset. */
sdivarci 0:0061165683ee 109 #define USB_MSD_GETMAXLUN 0xFE /**< MSD class setup request Get Max LUN. */
sdivarci 0:0061165683ee 110 #define USB_AUDIO_GET_CUR 0x81 /**< Audio class setup request GET_CUR. */
sdivarci 0:0061165683ee 111 #define USB_AUDIO_SET_CUR 0x01 /**< Audio class setup request SET_CUR. */
sdivarci 0:0061165683ee 112 #define USB_AUDIO_GET_CUR 0x81 /**< Audio class setup request GET_CUR. */
sdivarci 0:0061165683ee 113 #define USB_AUDIO_SET_MIN 0x02 /**< Audio class setup request SET_MIN. */
sdivarci 0:0061165683ee 114 #define USB_AUDIO_GET_MIN 0x82 /**< Audio class setup request GET_MIN. */
sdivarci 0:0061165683ee 115 #define USB_AUDIO_SET_MAX 0x03 /**< Audio class setup request SET_MAX. */
sdivarci 0:0061165683ee 116 #define USB_AUDIO_GET_MAX 0x83 /**< Audio class setup request GET_MAX. */
sdivarci 0:0061165683ee 117 #define USB_AUDIO_SET_RES 0x04 /**< Audio class setup request SET_RES. */
sdivarci 0:0061165683ee 118 #define USB_AUDIO_GET_RES 0x84 /**< Audio class setup request GET_RES. */
sdivarci 0:0061165683ee 119 #define USB_AUDIO_SET_MEM 0x05 /**< Audio class setup request SET_MEM. */
sdivarci 0:0061165683ee 120 #define USB_AUDIO_GET_MEM 0x85 /**< Audio class setup request GET_MEM. */
sdivarci 0:0061165683ee 121 #define USB_AUDIO_GET_STAT 0xFF /**< Audio class setup request GET_STAT. */
sdivarci 0:0061165683ee 122
sdivarci 0:0061165683ee 123 /* SETUP command GET/SET_DESCRIPTOR decriptor types */
sdivarci 0:0061165683ee 124 #define USB_DEVICE_DESCRIPTOR 1 /**< DEVICE descriptor value. */
sdivarci 0:0061165683ee 125 #define USB_CONFIG_DESCRIPTOR 2 /**< CONFIGURATION descriptor value. */
sdivarci 0:0061165683ee 126 #define USB_STRING_DESCRIPTOR 3 /**< STRING descriptor value. */
sdivarci 0:0061165683ee 127 #define USB_MAX_STRING_DESCRIPTOR_CHARS 126 /**< Maximum STRING descriptor bString length. */
sdivarci 0:0061165683ee 128 #define USB_INTERFACE_DESCRIPTOR 4 /**< INTERFACE descriptor value. */
sdivarci 0:0061165683ee 129 #define USB_ENDPOINT_DESCRIPTOR 5 /**< ENDPOINT descriptor value. */
sdivarci 0:0061165683ee 130 #define USB_DEVICE_QUALIFIER_DESCRIPTOR 6 /**< DEVICE_QUALIFIER descriptor value. */
sdivarci 0:0061165683ee 131 #define USB_OTHER_SPEED_CONFIG_DESCRIPTOR 7 /**< OTHER_SPEED_CONFIGURATION descriptor value. */
sdivarci 0:0061165683ee 132 #define USB_INTERFACE_POWER_DESCRIPTOR 8 /**< INTERFACE_POWER descriptor value. */
sdivarci 0:0061165683ee 133 #define USB_INTERFACE_ASSOCIATION_DESCRIPTOR 11 /**< INTERFACE_ASSOCIATION descriptor value. */
sdivarci 0:0061165683ee 134 #define USB_HID_DESCRIPTOR 0x21 /**< HID descriptor value. */
sdivarci 0:0061165683ee 135 #define USB_SMARTCARD_DESCRIPTOR 0x21 /**< Smartcard usb-ccid-specific Descriptor Type. */
sdivarci 0:0061165683ee 136 #define USB_HID_REPORT_DESCRIPTOR 0x22 /**< HID REPORT descriptor value. */
sdivarci 0:0061165683ee 137 #define USB_CS_INTERFACE_DESCRIPTOR 0x24 /**< Audio Class-specific interface Descriptor Type. */
sdivarci 0:0061165683ee 138 #define USB_CS_ENDPOINT_DESCRIPTOR 0x25 /**< Audio Class-specific endpoint Descriptor Type. */
sdivarci 0:0061165683ee 139 #define USB_HUB_DESCRIPTOR 0x29 /**< HUB descriptor value. */
sdivarci 0:0061165683ee 140 #define USB_CA_HEADER_DESCRIPTOR 1 /**< Audio Class-Specific AC Interface Header descriptor.*/
sdivarci 0:0061165683ee 141 #define USB_CA_INPUT_TERMINAL_DESCRIPTOR 2 /**< Audio Class-Specific AC Interface Input Terminal desc. */
sdivarci 0:0061165683ee 142 #define USB_CA_OUTPUT_TERMINAL_DESCRIPTOR 3 /**< Audio Class-Specific AC Interface Output Terminal desc.*/
sdivarci 0:0061165683ee 143 #define USB_CA_MIXER_UNIT_DESCRIPTOR 4 /**< Audio Class-Specific AC Interface Mixer descriptor.*/
sdivarci 0:0061165683ee 144 #define USB_CA_SELECTOR_UNIT_DESCRIPTOR 5 /**< Audio Class-Specific AC Interface Selector desc. */
sdivarci 0:0061165683ee 145 #define USB_CA_FEATURE_UNIT_DESCRIPTOR 6 /**< Audio Class-Specific AC Interface Feature desc. */
sdivarci 0:0061165683ee 146 #define USB_CA_PROCESSING_UNIT_DESCRIPTOR 7 /**< Audio Class-Specific AC Interface Processing desc.*/
sdivarci 0:0061165683ee 147 #define USB_CA_EXTENSION_UNIT_DESCRIPTOR 8 /**< Audio Class-Specific AC Interface Extension desc. */
sdivarci 0:0061165683ee 148 #define USB_CA_EP_GENERAL_DESCRIPTOR 1 /**< Audio Class-Specific general descriptor subtype code.*/
sdivarci 0:0061165683ee 149 #define USB_CA_AS_GENERAL_DESCRIPTOR 1 /**< Audio Class-Specific AS Interface General descriptor.*/
sdivarci 0:0061165683ee 150 #define USB_CA_FORMAT_TYPE_DESCRIPTOR 2 /**< Audio Class-Specific AS Interface Format Type desc. */
sdivarci 0:0061165683ee 151
sdivarci 0:0061165683ee 152 #define USB_DEVICE_DESCSIZE 18 /**< Device descriptor size. */
sdivarci 0:0061165683ee 153 #define USB_CONFIG_DESCSIZE 9 /**< Configuration descriptor size. */
sdivarci 0:0061165683ee 154 #define USB_INTERFACE_DESCSIZE 9 /**< Interface descriptor size. */
sdivarci 0:0061165683ee 155 #define USB_ENDPOINT_DESCSIZE 7 /**< Endpoint descriptor size. */
sdivarci 0:0061165683ee 156 #define USB_DEVICE_QUALIFIER_DESCSIZE 10 /**< Device qualifier descriptor size. */
sdivarci 0:0061165683ee 157 #define USB_OTHER_SPEED_CONFIG_DESCSIZE 9 /**< Device other speed configuration descriptor size. */
sdivarci 0:0061165683ee 158 #define USB_INTERFACE_ASSOCIATION_DESCSIZE 8 /**< INTERFACE_ASSOCIATION descriptor size. */
sdivarci 0:0061165683ee 159 #define USB_HID_DESCSIZE 9 /**< HID descriptor size. */
sdivarci 0:0061165683ee 160 #define USB_SMARTCARD_DESCSIZE 54 /**< CCID descriptor size. */
sdivarci 0:0061165683ee 161 #define USB_CDC_HEADER_FND_DESCSIZE 5 /**< CDC Header functional descriptor size. */
sdivarci 0:0061165683ee 162 #define USB_CDC_CALLMNG_FND_DESCSIZE 5 /**< CDC Call Management functional descriptor size. */
sdivarci 0:0061165683ee 163 #define USB_CDC_ACM_FND_DESCSIZE 4 /**< CDC Abstract Control Management functional descriptor size.*/
sdivarci 0:0061165683ee 164 #define USB_CA_INPUT_TERMINAL_DESCSIZE 12 /**< Audio Input Terminal descriptor size. */
sdivarci 0:0061165683ee 165 #define USB_CA_OUTPUT_TERMINAL_DESCSIZE 9 /**< Audio Output Terminal descriptor size. */
sdivarci 0:0061165683ee 166 #define USB_CA_EP_GENERAL_DESCSIZE 7 /**< Audio Class-Specific general descriptor subtype size.*/
sdivarci 0:0061165683ee 167 #define USB_CA_AS_GENERAL_DESCSIZE 7 /**< Audio Class-Specific AS Interface General desc size.*/
sdivarci 0:0061165683ee 168 #define USB_CA_STD_AS_ENDPOINT_DESCSZIE 9 /**< Audio-class standard audio stream descriptor size.*/
sdivarci 0:0061165683ee 169
sdivarci 0:0061165683ee 170 /* Misc. USB definitions */
sdivarci 0:0061165683ee 171 #define USB_LS_CTRL_EP_MAXSIZE 8 /**< The max size of low speed control endpoints. */
sdivarci 0:0061165683ee 172 #define USB_LS_INTR_EP_MAXSIZE 8 /**< The max size of low speed interrupt endpoints. */
sdivarci 0:0061165683ee 173 #define USB_FS_CTRL_EP_MAXSIZE 64 /**< The max size of full speed control endpoints. */
sdivarci 0:0061165683ee 174 #define USB_FS_INTR_EP_MAXSIZE 64 /**< The max size of full speed interrupt endpoints. */
sdivarci 0:0061165683ee 175 #define USB_FS_BULK_EP_MAXSIZE 64 /**< The max size of full speed bulk endpoints. */
sdivarci 0:0061165683ee 176 #define USB_FS_ISOC_EP_MAXSIZE 1023 /**< The max size of full speed isochronous endpoints. */
sdivarci 0:0061165683ee 177 #define USB_EPTYPE_CTRL 0 /**< Endpoint type control. */
sdivarci 0:0061165683ee 178 #define USB_EPTYPE_ISOC 1 /**< Endpoint type isochron. */
sdivarci 0:0061165683ee 179 #define USB_EPTYPE_BULK 2 /**< Endpoint type bulk. */
sdivarci 0:0061165683ee 180 #define USB_EPTYPE_INTR 3 /**< Endpoint type interrupt. */
sdivarci 0:0061165683ee 181 #define USB_EPSYNC_NO (0 << 2) /**< Endpoint synchronization type, none. */
sdivarci 0:0061165683ee 182 #define USB_EPSYNC_ASYNC (1 << 2) /**< Endpoint synchronization type, asynchronous. */
sdivarci 0:0061165683ee 183 #define USB_EPSYNC_ADAPTIVE (2 << 2) /**< Endpoint synchronization type, adaptive. */
sdivarci 0:0061165683ee 184 #define USB_EPSYNC_SYNC (3 << 2) /**< Endpoint synchronization type, synchronous. */
sdivarci 0:0061165683ee 185 #define USB_EP_DIR_IN 0x80 /**< Endpoint direction mask. */
sdivarci 0:0061165683ee 186 #define USB_SETUP_PKT_SIZE 8 /**< Setup request packet size. */
sdivarci 0:0061165683ee 187 #define USB_EPNUM_MASK 0x0F /**< Endpoint number mask. */
sdivarci 0:0061165683ee 188 #define USB_LANGID_ENUS 0x0409 /**< English-United States language id. */
sdivarci 0:0061165683ee 189 #define USB_MAX_DEVICE_ADDRESS 127 /**< Maximum allowable device address. */
sdivarci 0:0061165683ee 190
sdivarci 0:0061165683ee 191 #define CONFIG_DESC_BM_REMOTEWAKEUP 0x20 /**< Configuration descriptor attribute macro. */
sdivarci 0:0061165683ee 192 #define CONFIG_DESC_BM_SELFPOWERED 0x40 /**< Configuration descriptor attribute macro. */
sdivarci 0:0061165683ee 193 #define CONFIG_DESC_BM_RESERVED_D7 0x80 /**< Configuration descriptor attribute macro. */
sdivarci 0:0061165683ee 194 #define CONFIG_DESC_BM_TRANSFERTYPE 0x03 /**< Configuration descriptor transfer type bitmask. */
sdivarci 0:0061165683ee 195 #define CONFIG_DESC_MAXPOWER_mA(x) (((x)+1)/2) /**< Configuration descriptor power macro. */
sdivarci 0:0061165683ee 196
sdivarci 0:0061165683ee 197 #define DEVICE_IS_SELFPOWERED 0x0001 /**< Standard request GET_STATUS bitmask. */
sdivarci 0:0061165683ee 198 #define REMOTE_WAKEUP_ENABLED 0x0002 /**< Standard request GET_STATUS bitmask. */
sdivarci 0:0061165683ee 199 #define USB_FEATURE_ENDPOINT_HALT 0 /**< Standard request CLEAR/SET_FEATURE bitmask. */
sdivarci 0:0061165683ee 200 #define USB_FEATURE_DEVICE_REMOTE_WAKEUP 1 /**< Standard request CLEAR/SET_FEATURE bitmask. */
sdivarci 0:0061165683ee 201
sdivarci 0:0061165683ee 202 #define HUB_FEATURE_PORT_RESET 4 /**< HUB class request CLEAR/SET_PORT_FEATURE feature selector. */
sdivarci 0:0061165683ee 203 #define HUB_FEATURE_PORT_POWER 8 /**< HUB class request CLEAR/SET_PORT_FEATURE feature selector. */
sdivarci 0:0061165683ee 204 #define HUB_FEATURE_C_PORT_CONNECTION 16 /**< HUB class request CLEAR/SET_PORT_FEATURE feature selector. */
sdivarci 0:0061165683ee 205 #define HUB_FEATURE_C_PORT_RESET 20 /**< HUB class request CLEAR/SET_PORT_FEATURE feature selector. */
sdivarci 0:0061165683ee 206 #define HUB_FEATURE_PORT_INDICATOR 22 /**< HUB class request CLEAR/SET_PORT_FEATURE feature selector. */
sdivarci 0:0061165683ee 207
sdivarci 0:0061165683ee 208 #define USB_CLASS_CDC 2 /**< CDC device/interface class code. */
sdivarci 0:0061165683ee 209 #define USB_CLASS_CDC_DATA 0x0A /**< CDC Data interface class code. */
sdivarci 0:0061165683ee 210 #define USB_CLASS_CDC_ACM 2 /**< CDC Abstract Control Model interface subclass code. */
sdivarci 0:0061165683ee 211 #define USB_CLASS_CDC_HFN 0 /**< CDC class Header Functional Descriptor subtype. */
sdivarci 0:0061165683ee 212 #define USB_CLASS_CDC_CMNGFN 1 /**< CDC class Call Management Functional Descriptor subtype.*/
sdivarci 0:0061165683ee 213 #define USB_CLASS_CDC_ACMFN 2 /**< CDC class Abstract Control Management Functional Descriptor subtype.*/
sdivarci 0:0061165683ee 214 #define USB_CLASS_CDC_UNIONFN 6 /**< CDC class Union Functional Descriptor subtype. */
sdivarci 0:0061165683ee 215
sdivarci 0:0061165683ee 216 #define USB_CLASS_HID 3 /**< HID device/interface class code. */
sdivarci 0:0061165683ee 217 #define USB_CLASS_HID_KEYBOARD 1 /**< HID keyboard interface protocol code. */
sdivarci 0:0061165683ee 218 #define USB_CLASS_HID_MOUSE 2 /**< HID mouse interface protocol code. */
sdivarci 0:0061165683ee 219
sdivarci 0:0061165683ee 220 #define USB_CLASS_HUB 9 /**< HUB device/interface class code. */
sdivarci 0:0061165683ee 221
sdivarci 0:0061165683ee 222 #define USB_CLASS_MSD 8 /**< MSD device/interface class code. */
sdivarci 0:0061165683ee 223 #define USB_CLASS_MSD_BOT_TRANSPORT 0x50 /**< MSD Bulk Only Transport protocol. */
sdivarci 0:0061165683ee 224 #define USB_CLASS_MSD_SCSI_CMDSET 6 /**< MSD Subclass SCSI transparent command set. */
sdivarci 0:0061165683ee 225 #define USB_CLASS_MSD_CSW_CMDPASSED 0 /**< MSD BOT Command status wrapper command passed code. */
sdivarci 0:0061165683ee 226 #define USB_CLASS_MSD_CSW_CMDFAILED 1 /**< MSD BOT Command status wrapper command failed code. */
sdivarci 0:0061165683ee 227 #define USB_CLASS_MSD_CSW_PHASEERROR 2 /**< MSD BOT Command status wrapper cmd phase error code.*/
sdivarci 0:0061165683ee 228
sdivarci 0:0061165683ee 229 #define USB_CLASS_AUDIO 1 /**< Audio interface class code. */
sdivarci 0:0061165683ee 230 #define USB_CLASS_AUDIO_CONTROL 1 /**< Audio subclass code for control interface. */
sdivarci 0:0061165683ee 231 #define USB_CLASS_AUDIO_STREAMING 2 /**< Audio subclass code for streaming interface. */
sdivarci 0:0061165683ee 232 #define USB_CLASS_AUDIO_MIDISTREAMING 3 /**< Audio subclass code for midi streaming interface. */
sdivarci 0:0061165683ee 233
sdivarci 0:0061165683ee 234 /*** Triplet for the device descriptor of a composite device using IAD descriptors. ***/
sdivarci 0:0061165683ee 235 #define USB_CLASS_MISCELLANEOUS 0xEF /**< MISCELLANEOUS device class code. */
sdivarci 0:0061165683ee 236 #define USB_CLASS_MISC_COMMON_SUBCLASS 2 /**< MISCELLANEOUS Common sub class code. */
sdivarci 0:0061165683ee 237 #define USB_CLASS_MISC_IAD_PROTOCOL 1 /**< MISCELLANEOUS Interface Association Descriptor protocol code. */
sdivarci 0:0061165683ee 238
sdivarci 0:0061165683ee 239 #define PORT_FULL_SPEED 1 /**< Full speed return value for USBH_GetPortSpeed(). */
sdivarci 0:0061165683ee 240 #define PORT_LOW_SPEED 2 /**< Low speed return value for USBH_GetPortSpeed(). */
sdivarci 0:0061165683ee 241
sdivarci 0:0061165683ee 242 #if defined( __GNUC__ ) /* GCC compilers */
sdivarci 0:0061165683ee 243 #if defined( __CHAR16_TYPE__ )
sdivarci 0:0061165683ee 244 typedef __CHAR16_TYPE__ char16_t;
sdivarci 0:0061165683ee 245 #else
sdivarci 0:0061165683ee 246 typedef unsigned short char16_t;
sdivarci 0:0061165683ee 247 #endif
sdivarci 0:0061165683ee 248
sdivarci 0:0061165683ee 249 #elif defined( __ICCARM__ ) /* IAR compiler */
sdivarci 0:0061165683ee 250 #include <uchar.h>
sdivarci 0:0061165683ee 251
sdivarci 0:0061165683ee 252 #elif defined( __CC_ARM ) /* MDK-ARM compiler */
sdivarci 0:0061165683ee 253 typedef unsigned short char16_t;
sdivarci 0:0061165683ee 254 #endif
sdivarci 0:0061165683ee 255
sdivarci 0:0061165683ee 256 /** Macro for creating USB compliant UTF-16LE UNICODE string descriptors.
sdivarci 0:0061165683ee 257 * @n Example: STATIC_CONST_STRING_DESC( iManufacturer, 'E','n','e','r','g','y',' ','M','i','c','r','o',' ','A','S' );
sdivarci 0:0061165683ee 258 * @note The size of the resulting struct will be two byte larger than a USB string
sdivarci 0:0061165683ee 259 * descriptor. This is to accommodate a terminating null char for the string.
sdivarci 0:0061165683ee 260 * The value assigned to the 'len' member does not take this into account
sdivarci 0:0061165683ee 261 * and is therefore correct usb wise.
sdivarci 0:0061165683ee 262 */
sdivarci 0:0061165683ee 263 #define STATIC_CONST_STRING_DESC( _name, ... ) \
sdivarci 0:0061165683ee 264 EFM32_PACK_START( 1 ) \
sdivarci 0:0061165683ee 265 typedef struct \
sdivarci 0:0061165683ee 266 { \
sdivarci 0:0061165683ee 267 uint8_t len; \
sdivarci 0:0061165683ee 268 uint8_t type; \
sdivarci 0:0061165683ee 269 char16_t name[ 1 + sizeof( (char16_t[]){__VA_ARGS__} ) / 2]; \
sdivarci 0:0061165683ee 270 } __attribute__ ((packed)) _##_name; \
sdivarci 0:0061165683ee 271 EFM32_PACK_END() \
sdivarci 0:0061165683ee 272 EFM32_ALIGN( 4 ) \
sdivarci 0:0061165683ee 273 EFM32_PACK_START( 1 ) \
sdivarci 0:0061165683ee 274 static const _##_name _name __attribute__ ((aligned(4)))= \
sdivarci 0:0061165683ee 275 { \
sdivarci 0:0061165683ee 276 .len = sizeof( _##_name ) - 2, \
sdivarci 0:0061165683ee 277 .type = USB_STRING_DESCRIPTOR, \
sdivarci 0:0061165683ee 278 .name = {__VA_ARGS__}, \
sdivarci 0:0061165683ee 279 .name[ ( ( sizeof( _##_name ) - 2 ) / 2 ) - 1 ] = '\0' \
sdivarci 0:0061165683ee 280 } \
sdivarci 0:0061165683ee 281 EFM32_PACK_END()
sdivarci 0:0061165683ee 282
sdivarci 0:0061165683ee 283 /** Macro for creating USB compliant language string descriptors.
sdivarci 0:0061165683ee 284 * @n Example: STATIC_CONST_STRING_DESC_LANGID( langID, 0x04, 0x09 );
sdivarci 0:0061165683ee 285 */
sdivarci 0:0061165683ee 286 #define STATIC_CONST_STRING_DESC_LANGID( _name, x, y ) \
sdivarci 0:0061165683ee 287 EFM32_PACK_START( 1 ) \
sdivarci 0:0061165683ee 288 typedef struct \
sdivarci 0:0061165683ee 289 { \
sdivarci 0:0061165683ee 290 uint8_t len; \
sdivarci 0:0061165683ee 291 uint8_t type; \
sdivarci 0:0061165683ee 292 uint8_t name[ 2 ]; \
sdivarci 0:0061165683ee 293 } __attribute__ ((packed)) _##_name; \
sdivarci 0:0061165683ee 294 EFM32_PACK_END() \
sdivarci 0:0061165683ee 295 EFM32_ALIGN( 4 ) \
sdivarci 0:0061165683ee 296 EFM32_PACK_START( 1 ) \
sdivarci 0:0061165683ee 297 static const _##_name _name __attribute__ ((aligned(4)))= \
sdivarci 0:0061165683ee 298 { \
sdivarci 0:0061165683ee 299 .len = 4, \
sdivarci 0:0061165683ee 300 .type = USB_STRING_DESCRIPTOR, \
sdivarci 0:0061165683ee 301 .name = { y, x } \
sdivarci 0:0061165683ee 302 } \
sdivarci 0:0061165683ee 303 EFM32_PACK_END()
sdivarci 0:0061165683ee 304
sdivarci 0:0061165683ee 305 /** Macro for creating WORD (4 byte) aligned uint8_t array with size which
sdivarci 0:0061165683ee 306 * is a multiple of WORD size.
sdivarci 0:0061165683ee 307 * @n Example: @n UBUF( rxBuffer, 37 ); => uint8_t rxBuffer[ 40 ];
sdivarci 0:0061165683ee 308 */
sdivarci 0:0061165683ee 309 #if !defined(__GNUC__)
sdivarci 0:0061165683ee 310 #define UBUF( x, y ) EFM32_ALIGN( 4 ) uint8_t x[((y)+3)&~3]
sdivarci 0:0061165683ee 311 #define STATIC_UBUF( x, y ) EFM32_ALIGN( 4 ) static uint8_t x[((y)+3)&~3]
sdivarci 0:0061165683ee 312 #else
sdivarci 0:0061165683ee 313 #define UBUF( x, y ) uint8_t x[((y)+3)&~3] __attribute__ ((aligned(4)))
sdivarci 0:0061165683ee 314
sdivarci 0:0061165683ee 315 /** Macro for creating WORD (4 byte) aligned static uint8_t arrays with size which
sdivarci 0:0061165683ee 316 * is a multiple of WORD size.
sdivarci 0:0061165683ee 317 * @n Example: @n STATIC_UBUF( rxBuffer, 37 ); => static uint8_t rxBuffer[ 40 ];
sdivarci 0:0061165683ee 318 */
sdivarci 0:0061165683ee 319 #define STATIC_UBUF( x, y ) static uint8_t x[((y)+3)&~3] __attribute__ ((aligned(4)))
sdivarci 0:0061165683ee 320 #endif
sdivarci 0:0061165683ee 321
sdivarci 0:0061165683ee 322
sdivarci 0:0061165683ee 323 /** @brief USB transfer status enumerator. */
sdivarci 0:0061165683ee 324 typedef enum
sdivarci 0:0061165683ee 325 {
sdivarci 0:0061165683ee 326 /* NOTE: Please keep in sync with table errMsg[] in em_usbhal.c */
sdivarci 0:0061165683ee 327 USB_STATUS_OK = 0, /**< No errors detected. */
sdivarci 0:0061165683ee 328 USB_STATUS_REQ_ERR = -1, /**< Setup request error. */
sdivarci 0:0061165683ee 329 USB_STATUS_EP_BUSY = -2, /**< Endpoint is busy. */
sdivarci 0:0061165683ee 330 USB_STATUS_REQ_UNHANDLED = -3, /**< Setup request not handled. */
sdivarci 0:0061165683ee 331 USB_STATUS_ILLEGAL = -4, /**< Illegal operation attempted. */
sdivarci 0:0061165683ee 332 USB_STATUS_EP_STALLED = -5, /**< Endpoint is stalled. */
sdivarci 0:0061165683ee 333 USB_STATUS_EP_ABORTED = -6, /**< Endpoint transfer was aborted. */
sdivarci 0:0061165683ee 334 USB_STATUS_EP_ERROR = -7, /**< Endpoint transfer error. */
sdivarci 0:0061165683ee 335 USB_STATUS_EP_NAK = -8, /**< Endpoint NAK'ed transfer request. */
sdivarci 0:0061165683ee 336 USB_STATUS_DEVICE_UNCONFIGURED = -9, /**< Device is unconfigured. */
sdivarci 0:0061165683ee 337 USB_STATUS_DEVICE_SUSPENDED = -10, /**< Device is suspended. */
sdivarci 0:0061165683ee 338 USB_STATUS_DEVICE_RESET = -11, /**< Device is/was reset. */
sdivarci 0:0061165683ee 339 USB_STATUS_TIMEOUT = -12, /**< Transfer timeout. */
sdivarci 0:0061165683ee 340 USB_STATUS_DEVICE_REMOVED = -13, /**< Device was removed. */
sdivarci 0:0061165683ee 341 USB_STATUS_HC_BUSY = -14, /**< Host channel is busy. */
sdivarci 0:0061165683ee 342 USB_STATUS_DEVICE_MALFUNCTION = -15, /**< Malfunctioning device attached. */
sdivarci 0:0061165683ee 343 USB_STATUS_PORT_OVERCURRENT = -16, /**< VBUS shortcircuit/overcurrent failure. */
sdivarci 0:0061165683ee 344 } USB_Status_TypeDef;
sdivarci 0:0061165683ee 345 /** @} (end addtogroup USB_COMMON) */
sdivarci 0:0061165683ee 346
sdivarci 0:0061165683ee 347
sdivarci 0:0061165683ee 348 #if defined( USB_DEVICE )
sdivarci 0:0061165683ee 349 /***************************************************************************//**
sdivarci 0:0061165683ee 350 * @addtogroup USB_DEVICE
sdivarci 0:0061165683ee 351 * @brief USB DEVICE protocol stack, see @ref usb_device page for detailed documentation.
sdivarci 0:0061165683ee 352 * @{
sdivarci 0:0061165683ee 353 ******************************************************************************/
sdivarci 0:0061165683ee 354
sdivarci 0:0061165683ee 355 #define USB_PWRSAVE_MODE_OFF 0 /**< No energy saving mode selected. */
sdivarci 0:0061165683ee 356 #define USB_PWRSAVE_MODE_ONSUSPEND 1 /**< Enter USB power-save mode on suspend. */
sdivarci 0:0061165683ee 357 #define USB_PWRSAVE_MODE_ONVBUSOFF 2 /**< Enter USB power-save mode when not attached to host. */
sdivarci 0:0061165683ee 358 #define USB_PWRSAVE_MODE_ENTEREM2 4 /**< Enter EM2 while in power-save mode. */
sdivarci 0:0061165683ee 359
sdivarci 0:0061165683ee 360 #define USB_USBC_32kHz_CLK_LFXO 0 /**< Use 32kHz LFXO clock while in powersave mode. */
sdivarci 0:0061165683ee 361 #define USB_USBC_32kHz_CLK_LFRCO 1 /**< Use 32kHz LFRCO clock while in powersave mode. */
sdivarci 0:0061165683ee 362
sdivarci 0:0061165683ee 363 /** @brief USB device state enumerator. */
sdivarci 0:0061165683ee 364 typedef enum
sdivarci 0:0061165683ee 365 {
sdivarci 0:0061165683ee 366 USBD_STATE_NONE = 0, /**< Device state is undefined/unknown. */
sdivarci 0:0061165683ee 367 USBD_STATE_ATTACHED = 1, /**< Device state is ATTACHED. */
sdivarci 0:0061165683ee 368 USBD_STATE_POWERED = 2, /**< Device state is POWERED. */
sdivarci 0:0061165683ee 369 USBD_STATE_DEFAULT = 3, /**< Device state is DEFAULT. */
sdivarci 0:0061165683ee 370 USBD_STATE_ADDRESSED = 4, /**< Device state is ADDRESSED. */
sdivarci 0:0061165683ee 371 USBD_STATE_CONFIGURED = 5, /**< Device state is CONFIGURED. */
sdivarci 0:0061165683ee 372 USBD_STATE_SUSPENDED = 6, /**< Device state is SUSPENDED. */
sdivarci 0:0061165683ee 373 USBD_STATE_LASTMARKER = 7, /**< Device state enum end marker. */
sdivarci 0:0061165683ee 374 } USBD_State_TypeDef;
sdivarci 0:0061165683ee 375 /** @} (end addtogroup USB_DEVICE) */
sdivarci 0:0061165683ee 376 #endif /* defined( USB_DEVICE ) */
sdivarci 0:0061165683ee 377
sdivarci 0:0061165683ee 378 /** @addtogroup USB_COMMON
sdivarci 0:0061165683ee 379 * @{*/
sdivarci 0:0061165683ee 380
sdivarci 0:0061165683ee 381 /** @brief USB Setup request package. */
sdivarci 0:0061165683ee 382 EFM32_PACK_START( 1 )
sdivarci 0:0061165683ee 383 typedef struct
sdivarci 0:0061165683ee 384 {
sdivarci 0:0061165683ee 385 union
sdivarci 0:0061165683ee 386 {
sdivarci 0:0061165683ee 387 struct
sdivarci 0:0061165683ee 388 {
sdivarci 0:0061165683ee 389 union
sdivarci 0:0061165683ee 390 {
sdivarci 0:0061165683ee 391 struct
sdivarci 0:0061165683ee 392 {
sdivarci 0:0061165683ee 393 uint8_t Recipient : 5; /**< Request recipient (device, interface, endpoint or other).*/
sdivarci 0:0061165683ee 394 uint8_t Type : 2; /**< Request type (standard, class or vendor). */
sdivarci 0:0061165683ee 395 uint8_t Direction : 1; /**< Transfer direction of SETUP data phase. */
sdivarci 0:0061165683ee 396 };
sdivarci 0:0061165683ee 397 uint8_t bmRequestType; /**< Request characteristics. */
sdivarci 0:0061165683ee 398 };
sdivarci 0:0061165683ee 399 uint8_t bRequest; /**< Request code. */
sdivarci 0:0061165683ee 400 uint16_t wValue; /**< Varies according to request. */
sdivarci 0:0061165683ee 401 uint16_t wIndex; /**< Index or offset, varies according to request. */
sdivarci 0:0061165683ee 402 uint16_t wLength; /**< Number of bytes to transfer if there is a data stage.*/
sdivarci 0:0061165683ee 403 };
sdivarci 0:0061165683ee 404 uint32_t dw[2];
sdivarci 0:0061165683ee 405 };
sdivarci 0:0061165683ee 406 } __attribute__ ((packed)) USB_Setup_TypeDef;
sdivarci 0:0061165683ee 407 EFM32_PACK_END()
sdivarci 0:0061165683ee 408
sdivarci 0:0061165683ee 409
sdivarci 0:0061165683ee 410 /** @brief USB Device Descriptor. */
sdivarci 0:0061165683ee 411 EFM32_PACK_START( 1 )
sdivarci 0:0061165683ee 412 typedef struct
sdivarci 0:0061165683ee 413 {
sdivarci 0:0061165683ee 414 uint8_t bLength; /**< Size of this descriptor in bytes */
sdivarci 0:0061165683ee 415 uint8_t bDescriptorType; /**< Constant DEVICE Descriptor Type */
sdivarci 0:0061165683ee 416 uint16_t bcdUSB; /**< USB Specification Release Number in Binary-Coded
sdivarci 0:0061165683ee 417 Decimal */
sdivarci 0:0061165683ee 418 uint8_t bDeviceClass; /**< Class code (assigned by the USB-IF) */
sdivarci 0:0061165683ee 419 uint8_t bDeviceSubClass; /**< Subclass code (assigned by the USB-IF) */
sdivarci 0:0061165683ee 420 uint8_t bDeviceProtocol; /**< Protocol code (assigned by the USB-IF) */
sdivarci 0:0061165683ee 421 uint8_t bMaxPacketSize0; /**< Maximum packet size for endpoint zero */
sdivarci 0:0061165683ee 422 uint16_t idVendor; /**< Vendor ID (assigned by the USB-IF) */
sdivarci 0:0061165683ee 423 uint16_t idProduct; /**< Product ID (assigned by the manufacturer) */
sdivarci 0:0061165683ee 424 uint16_t bcdDevice; /**< Device release number in binary-coded decimal */
sdivarci 0:0061165683ee 425 uint8_t iManufacturer; /**< Index of string descriptor describing manufacturer*/
sdivarci 0:0061165683ee 426 uint8_t iProduct; /**< Index of string descriptor describing product */
sdivarci 0:0061165683ee 427 uint8_t iSerialNumber; /**< Index of string descriptor describing the device
sdivarci 0:0061165683ee 428 serialnumber */
sdivarci 0:0061165683ee 429 uint8_t bNumConfigurations; /**< Number of possible configurations */
sdivarci 0:0061165683ee 430 } __attribute__ ((packed)) USB_DeviceDescriptor_TypeDef;
sdivarci 0:0061165683ee 431 EFM32_PACK_END()
sdivarci 0:0061165683ee 432
sdivarci 0:0061165683ee 433
sdivarci 0:0061165683ee 434 /** @brief USB Configuration Descriptor. */
sdivarci 0:0061165683ee 435 EFM32_PACK_START( 1 )
sdivarci 0:0061165683ee 436 typedef struct
sdivarci 0:0061165683ee 437 {
sdivarci 0:0061165683ee 438 uint8_t bLength; /**< Size of this descriptor in bytes */
sdivarci 0:0061165683ee 439 uint8_t bDescriptorType; /**< Constant CONFIGURATION Descriptor Type */
sdivarci 0:0061165683ee 440 uint16_t wTotalLength; /**< Total length of data returned for this
sdivarci 0:0061165683ee 441 configuration. Includes the combined length of all
sdivarci 0:0061165683ee 442 descriptors (configuration, interface, endpoint,
sdivarci 0:0061165683ee 443 and class- or vendor-specific) returned for this
sdivarci 0:0061165683ee 444 configuration. */
sdivarci 0:0061165683ee 445 uint8_t bNumInterfaces; /**< Number of interfaces supported by this
sdivarci 0:0061165683ee 446 configuration */
sdivarci 0:0061165683ee 447 uint8_t bConfigurationValue; /**< Value to use as an argument to the
sdivarci 0:0061165683ee 448 SetConfiguration request to select this
sdivarci 0:0061165683ee 449 configuration. */
sdivarci 0:0061165683ee 450 uint8_t iConfiguration; /**< Index of string descriptor describing this
sdivarci 0:0061165683ee 451 configuration. */
sdivarci 0:0061165683ee 452 uint8_t bmAttributes; /**< Configuration characteristics.
sdivarci 0:0061165683ee 453 @n D7: Reserved (set to one)
sdivarci 0:0061165683ee 454 @n D6: Self-powered
sdivarci 0:0061165683ee 455 @n D5: Remote Wakeup
sdivarci 0:0061165683ee 456 @n D4...0: Reserved (reset to zero) */
sdivarci 0:0061165683ee 457 uint8_t bMaxPower; /**< Maximum power consumption of the USB device, unit
sdivarci 0:0061165683ee 458 is 2mA per LSB */
sdivarci 0:0061165683ee 459 } __attribute__ ((packed)) USB_ConfigurationDescriptor_TypeDef;
sdivarci 0:0061165683ee 460 EFM32_PACK_END()
sdivarci 0:0061165683ee 461
sdivarci 0:0061165683ee 462
sdivarci 0:0061165683ee 463 /** @brief USB Interface Descriptor. */
sdivarci 0:0061165683ee 464 EFM32_PACK_START( 1 )
sdivarci 0:0061165683ee 465 typedef struct
sdivarci 0:0061165683ee 466 {
sdivarci 0:0061165683ee 467 uint8_t bLength; /**< Size of this descriptor in bytes. */
sdivarci 0:0061165683ee 468 uint8_t bDescriptorType; /**< Constant INTERFACE Descriptor Type. */
sdivarci 0:0061165683ee 469 uint8_t bInterfaceNumber; /**< Number of this interface. Zero-based value
sdivarci 0:0061165683ee 470 identifying the index in the array of concurrent
sdivarci 0:0061165683ee 471 interfaces supported by this configuration. */
sdivarci 0:0061165683ee 472 uint8_t bAlternateSetting; /**< Value used to select this alternate setting for
sdivarci 0:0061165683ee 473 the interface identified in the prior field. */
sdivarci 0:0061165683ee 474 uint8_t bNumEndpoints; /**< Number of endpoints used by this interface
sdivarci 0:0061165683ee 475 (excluding endpoint zero). If this value is zero,
sdivarci 0:0061165683ee 476 this interface only uses the Default Control Pipe.*/
sdivarci 0:0061165683ee 477 uint8_t bInterfaceClass; /**< Class code (assigned by the USB-IF). A value
sdivarci 0:0061165683ee 478 of zero is reserved for future standardization. If
sdivarci 0:0061165683ee 479 this field is set to FFH, the interface class is
sdivarci 0:0061165683ee 480 vendor-specific. All other values are reserved for
sdivarci 0:0061165683ee 481 assignment by the USB-IF. */
sdivarci 0:0061165683ee 482 uint8_t bInterfaceSubClass; /**< Subclass code (assigned by the USB-IF). These codes
sdivarci 0:0061165683ee 483 are qualified by the value of the bInterfaceClass
sdivarci 0:0061165683ee 484 field. If the bInterfaceClass field is reset to
sdivarci 0:0061165683ee 485 zero, this field must also be reset to zero. If
sdivarci 0:0061165683ee 486 the bInterfaceClass field is not set to FFH, all
sdivarci 0:0061165683ee 487 values are reserved forassignment by the USB-IF. */
sdivarci 0:0061165683ee 488 uint8_t bInterfaceProtocol; /**< Protocol code (assigned by the USB). These codes
sdivarci 0:0061165683ee 489 are qualified by the value of the bInterfaceClass
sdivarci 0:0061165683ee 490 and the bInterfaceSubClass fields. If an interface
sdivarci 0:0061165683ee 491 supports class-specific requests, this code
sdivarci 0:0061165683ee 492 identifies the protocols that the device uses as
sdivarci 0:0061165683ee 493 defined by the specification of the device class.
sdivarci 0:0061165683ee 494 If this field is reset to zero, the device does
sdivarci 0:0061165683ee 495 not use a class-specific protocol on this
sdivarci 0:0061165683ee 496 interface. If this field is set to FFH, the device
sdivarci 0:0061165683ee 497 uses a vendor-specific protocol for this interface*/
sdivarci 0:0061165683ee 498 uint8_t iInterface; /**< Index of string descriptor describing this
sdivarci 0:0061165683ee 499 interface. */
sdivarci 0:0061165683ee 500 } __attribute__ ((packed)) USB_InterfaceDescriptor_TypeDef;
sdivarci 0:0061165683ee 501 EFM32_PACK_END()
sdivarci 0:0061165683ee 502
sdivarci 0:0061165683ee 503
sdivarci 0:0061165683ee 504 /** @brief USB Endpoint Descriptor. */
sdivarci 0:0061165683ee 505 EFM32_PACK_START( 1 )
sdivarci 0:0061165683ee 506 typedef struct
sdivarci 0:0061165683ee 507 {
sdivarci 0:0061165683ee 508 uint8_t bLength; /**< Size of this descriptor in bytes */
sdivarci 0:0061165683ee 509 uint8_t bDescriptorType; /**< Constant ENDPOINT Descriptor Type */
sdivarci 0:0061165683ee 510 uint8_t bEndpointAddress; /**< The address of the endpoint */
sdivarci 0:0061165683ee 511 uint8_t bmAttributes; /**< This field describes the endpoint attributes */
sdivarci 0:0061165683ee 512 uint16_t wMaxPacketSize; /**< Maximum packet size for the endpoint */
sdivarci 0:0061165683ee 513 uint8_t bInterval; /**< Interval for polling EP for data transfers */
sdivarci 0:0061165683ee 514 } __attribute__ ((packed)) USB_EndpointDescriptor_TypeDef;
sdivarci 0:0061165683ee 515 EFM32_PACK_END()
sdivarci 0:0061165683ee 516
sdivarci 0:0061165683ee 517
sdivarci 0:0061165683ee 518 /** @brief USB String Descriptor. */
sdivarci 0:0061165683ee 519 EFM32_PACK_START( 1 )
sdivarci 0:0061165683ee 520 typedef struct
sdivarci 0:0061165683ee 521 {
sdivarci 0:0061165683ee 522 uint8_t len; /**< Size of this descriptor in bytes. */
sdivarci 0:0061165683ee 523 uint8_t type; /**< Constant STRING Descriptor Type. */
sdivarci 0:0061165683ee 524 char16_t name[]; /**< The string encoded with UTF-16LE UNICODE charset. */
sdivarci 0:0061165683ee 525 } __attribute__ ((packed)) USB_StringDescriptor_TypeDef;
sdivarci 0:0061165683ee 526 EFM32_PACK_END()
sdivarci 0:0061165683ee 527
sdivarci 0:0061165683ee 528 /** @} (end addtogroup USB_COMMON) */
sdivarci 0:0061165683ee 529
sdivarci 0:0061165683ee 530 /*** -------------------- Serial port debug configuration ---------------- ***/
sdivarci 0:0061165683ee 531
sdivarci 0:0061165683ee 532 #if defined( DOXY_DOC_ONLY )
sdivarci 0:0061165683ee 533 /** @addtogroup USB_COMMON
sdivarci 0:0061165683ee 534 * @{*/
sdivarci 0:0061165683ee 535
sdivarci 0:0061165683ee 536 /***************************************************************************//**
sdivarci 0:0061165683ee 537 * @brief
sdivarci 0:0061165683ee 538 * Transmit a single char on the debug serial port.
sdivarci 0:0061165683ee 539 *
sdivarci 0:0061165683ee 540 * @note
sdivarci 0:0061165683ee 541 * This function is enabled with \#define DEBUG_USB_API when configuring the
sdivarci 0:0061165683ee 542 * protocol stack in "usbconfig.h".
sdivarci 0:0061165683ee 543 * This is convenient when debugging code, no need to remove use of this
sdivarci 0:0061165683ee 544 * function when debugging has completed.
sdivarci 0:0061165683ee 545 *
sdivarci 0:0061165683ee 546 * @param[in] c
sdivarci 0:0061165683ee 547 * Char to transmit.
sdivarci 0:0061165683ee 548 *
sdivarci 0:0061165683ee 549 * @return
sdivarci 0:0061165683ee 550 * The char transmitted.
sdivarci 0:0061165683ee 551 ******************************************************************************/
sdivarci 0:0061165683ee 552 int USB_PUTCHAR( char c );
sdivarci 0:0061165683ee 553
sdivarci 0:0061165683ee 554 /***************************************************************************//**
sdivarci 0:0061165683ee 555 * @brief
sdivarci 0:0061165683ee 556 * Transmit a zero terminated string on the debug serial port.
sdivarci 0:0061165683ee 557 *
sdivarci 0:0061165683ee 558 * @note
sdivarci 0:0061165683ee 559 * This function is enabled with \#define DEBUG_USB_API when configuring the
sdivarci 0:0061165683ee 560 * protocol stack in "usbconfig.h".
sdivarci 0:0061165683ee 561 * This is convenient when debugging code, no need to remove use of this
sdivarci 0:0061165683ee 562 * function when debugging has completed.
sdivarci 0:0061165683ee 563 *
sdivarci 0:0061165683ee 564 * @param[in] p
sdivarci 0:0061165683ee 565 * Pointer to string to transmit.
sdivarci 0:0061165683ee 566 ******************************************************************************/
sdivarci 0:0061165683ee 567 void USB_PUTS( const char *p );
sdivarci 0:0061165683ee 568
sdivarci 0:0061165683ee 569 /***************************************************************************//**
sdivarci 0:0061165683ee 570 * @brief
sdivarci 0:0061165683ee 571 * Transmit "printf" formated data on the debug serial port.
sdivarci 0:0061165683ee 572 *
sdivarci 0:0061165683ee 573 * @note
sdivarci 0:0061165683ee 574 * This function is enabled with \#define USB_USE_PRINTF when configuring the
sdivarci 0:0061165683ee 575 * protocol stack in "usbconfig.h".
sdivarci 0:0061165683ee 576 * This is convenient when debugging code, no need to remove use of this
sdivarci 0:0061165683ee 577 * function when debugging has completed.
sdivarci 0:0061165683ee 578 *
sdivarci 0:0061165683ee 579 * @param[in] format
sdivarci 0:0061165683ee 580 * Format string (as in printf). No floating point format support.
sdivarci 0:0061165683ee 581 ******************************************************************************/
sdivarci 0:0061165683ee 582 int USB_PRINTF( const char *format, ... );
sdivarci 0:0061165683ee 583
sdivarci 0:0061165683ee 584 /** @} (end addtogroup USB_COMMON) */
sdivarci 0:0061165683ee 585 #endif /* defined( DOXY_DOC_ONLY ) */
sdivarci 0:0061165683ee 586
sdivarci 0:0061165683ee 587 /** @cond DO_NOT_INCLUDE_WITH_DOXYGEN */
sdivarci 0:0061165683ee 588
sdivarci 0:0061165683ee 589 /* Hardware constraint, do not change. */
sdivarci 0:0061165683ee 590 #define MAX_NUM_HOSTCHANNELS 14
sdivarci 0:0061165683ee 591
sdivarci 0:0061165683ee 592 /* The DMA engine use one FIFO ram word for each host channel. */
sdivarci 0:0061165683ee 593 #define MAX_HOST_FIFO_SIZE_INWORDS (512-MAX_NUM_HOSTCHANNELS)/*Unit is 4 bytes*/
sdivarci 0:0061165683ee 594
sdivarci 0:0061165683ee 595 #if defined ( USER_PUTCHAR )
sdivarci 0:0061165683ee 596 void USB_Puts( const char *p );
sdivarci 0:0061165683ee 597 #define USB_PUTS( s ) USB_Puts( s )
sdivarci 0:0061165683ee 598 #define USB_PUTCHAR( c ) USER_PUTCHAR( c )
sdivarci 0:0061165683ee 599 #else
sdivarci 0:0061165683ee 600 #define USB_PUTS( s )
sdivarci 0:0061165683ee 601 #define USB_PUTCHAR( c )
sdivarci 0:0061165683ee 602 #endif
sdivarci 0:0061165683ee 603
sdivarci 0:0061165683ee 604 #if defined( USB_USE_PRINTF )
sdivarci 0:0061165683ee 605 /* Use a printf which don't support floating point formatting */
sdivarci 0:0061165683ee 606 #if defined(__ICCARM__) || defined (__CC_ARM) || defined (__CROSSWORKS_ARM)
sdivarci 0:0061165683ee 607 #define USB_PRINTF printf
sdivarci 0:0061165683ee 608 #else
sdivarci 0:0061165683ee 609 #define USB_PRINTF iprintf
sdivarci 0:0061165683ee 610 #endif
sdivarci 0:0061165683ee 611 #else
sdivarci 0:0061165683ee 612 #define USB_PRINTF(...)
sdivarci 0:0061165683ee 613 #endif /* defined( USB_USE_PRINTF ) */
sdivarci 0:0061165683ee 614
sdivarci 0:0061165683ee 615 #if defined( DEBUG_USB_API )
sdivarci 0:0061165683ee 616 #define DEBUG_USB_API_PUTS( s ) USB_PUTS( s )
sdivarci 0:0061165683ee 617 #define DEBUG_USB_API_PUTCHAR( c ) USB_PUTCHAR( c )
sdivarci 0:0061165683ee 618 #else
sdivarci 0:0061165683ee 619 #define DEBUG_USB_API_PUTS( s )
sdivarci 0:0061165683ee 620 #define DEBUG_USB_API_PUTCHAR( c )
sdivarci 0:0061165683ee 621 #endif /* defined( DEBUG_USB_API ) */
sdivarci 0:0061165683ee 622
sdivarci 0:0061165683ee 623 /** @endcond */
sdivarci 0:0061165683ee 624
sdivarci 0:0061165683ee 625 /*** -------------------- Common API definitions ------------------------- ***/
sdivarci 0:0061165683ee 626
sdivarci 0:0061165683ee 627 /** @cond DO_NOT_INCLUDE_WITH_DOXYGEN */
sdivarci 0:0061165683ee 628
sdivarci 0:0061165683ee 629 #if defined( USB_HOST )
sdivarci 0:0061165683ee 630 #if defined( NUM_APP_TIMERS )
sdivarci 0:0061165683ee 631 #define NUM_QTIMERS ( NUM_HC_USED + 2 + NUM_APP_TIMERS + 1 )
sdivarci 0:0061165683ee 632 #else
sdivarci 0:0061165683ee 633 #define NUM_QTIMERS ( NUM_HC_USED + 2 + 1 )
sdivarci 0:0061165683ee 634 #endif
sdivarci 0:0061165683ee 635 /* + 2 for default ctrl. host ch. 0 & 1, + 1 for host port timer */
sdivarci 0:0061165683ee 636 #else
sdivarci 0:0061165683ee 637 #if defined( NUM_APP_TIMERS )
sdivarci 0:0061165683ee 638 #define NUM_QTIMERS ( NUM_APP_TIMERS )
sdivarci 0:0061165683ee 639 #else
sdivarci 0:0061165683ee 640 #define NUM_QTIMERS 0
sdivarci 0:0061165683ee 641 #endif
sdivarci 0:0061165683ee 642 #endif /* defined( USB_HOST ) */
sdivarci 0:0061165683ee 643 /** @endcond */
sdivarci 0:0061165683ee 644
sdivarci 0:0061165683ee 645 /** @addtogroup USB_COMMON
sdivarci 0:0061165683ee 646 * @{*/
sdivarci 0:0061165683ee 647
sdivarci 0:0061165683ee 648 /***************************************************************************//**
sdivarci 0:0061165683ee 649 * @brief
sdivarci 0:0061165683ee 650 * USB transfer callback function.
sdivarci 0:0061165683ee 651 *
sdivarci 0:0061165683ee 652 * @details
sdivarci 0:0061165683ee 653 * The callback function is called when a transfer has completed. An application
sdivarci 0:0061165683ee 654 * should check the status, xferred and optionally the remaining parameters
sdivarci 0:0061165683ee 655 * before deciding if the transfer is usable. In the case where the transfer
sdivarci 0:0061165683ee 656 * is part of a control request data stage, the callback function should
sdivarci 0:0061165683ee 657 * return an appropriate @ref USB_Status_TypeDef status.
sdivarci 0:0061165683ee 658 *
sdivarci 0:0061165683ee 659 * @param[in] status
sdivarci 0:0061165683ee 660 * The transfer status. See @ref USB_Status_TypeDef.
sdivarci 0:0061165683ee 661 *
sdivarci 0:0061165683ee 662 * @param[in] xferred
sdivarci 0:0061165683ee 663 * Number of bytes actually transferred.
sdivarci 0:0061165683ee 664 *
sdivarci 0:0061165683ee 665 * @param[in] remaining
sdivarci 0:0061165683ee 666 * Number of bytes not transferred.
sdivarci 0:0061165683ee 667 *
sdivarci 0:0061165683ee 668 * @return
sdivarci 0:0061165683ee 669 * @ref USB_STATUS_OK on success, else an appropriate error code.
sdivarci 0:0061165683ee 670 ******************************************************************************/
sdivarci 0:0061165683ee 671 typedef int (*USB_XferCompleteCb_TypeDef)( USB_Status_TypeDef status, uint32_t xferred, uint32_t remaining );
sdivarci 0:0061165683ee 672
sdivarci 0:0061165683ee 673 /***************************************************************************//**
sdivarci 0:0061165683ee 674 * @brief
sdivarci 0:0061165683ee 675 * USBTIMER callback function.
sdivarci 0:0061165683ee 676 *
sdivarci 0:0061165683ee 677 * @details
sdivarci 0:0061165683ee 678 * The callback function is called when an USBTIMER has expired. The callback
sdivarci 0:0061165683ee 679 * is done with interrupts disabled.
sdivarci 0:0061165683ee 680 ******************************************************************************/
sdivarci 0:0061165683ee 681 typedef void (*USBTIMER_Callback_TypeDef)( void );
sdivarci 0:0061165683ee 682
sdivarci 0:0061165683ee 683 char *USB_GetErrorMsgString( int error );
sdivarci 0:0061165683ee 684
sdivarci 0:0061165683ee 685 #if defined( USB_USE_PRINTF )
sdivarci 0:0061165683ee 686 void USB_PrintErrorMsgString( char *pre, int error );
sdivarci 0:0061165683ee 687 #else
sdivarci 0:0061165683ee 688 #define USB_PrintErrorMsgString( pre, error )
sdivarci 0:0061165683ee 689 #endif
sdivarci 0:0061165683ee 690
sdivarci 0:0061165683ee 691 void USBTIMER_DelayMs( uint32_t msec );
sdivarci 0:0061165683ee 692 void USBTIMER_DelayUs( uint32_t usec );
sdivarci 0:0061165683ee 693 void USBTIMER_Init( void );
sdivarci 0:0061165683ee 694
sdivarci 0:0061165683ee 695 #if ( NUM_QTIMERS > 0 )
sdivarci 0:0061165683ee 696 void USBTIMER_Start( uint32_t id, uint32_t timeout, USBTIMER_Callback_TypeDef callback );
sdivarci 0:0061165683ee 697 void USBTIMER_Stop( uint32_t id );
sdivarci 0:0061165683ee 698 #endif /* ( NUM_QTIMERS > 0 ) */
sdivarci 0:0061165683ee 699 /** @} (end addtogroup USB_COMMON) */
sdivarci 0:0061165683ee 700
sdivarci 0:0061165683ee 701 #if defined( USB_DEVICE )
sdivarci 0:0061165683ee 702 /** @addtogroup USB_DEVICE
sdivarci 0:0061165683ee 703 * @{*/
sdivarci 0:0061165683ee 704 /*** -------------------- DEVICE mode API definitions -------------------- ***/
sdivarci 0:0061165683ee 705
sdivarci 0:0061165683ee 706 /***************************************************************************//**
sdivarci 0:0061165683ee 707 * @brief
sdivarci 0:0061165683ee 708 * USB Reset callback function.
sdivarci 0:0061165683ee 709 * @details
sdivarci 0:0061165683ee 710 * Called whenever USB reset signalling is detected on the USB port.
sdivarci 0:0061165683ee 711 ******************************************************************************/
sdivarci 0:0061165683ee 712 typedef void (*USBD_UsbResetCb_TypeDef)( void );
sdivarci 0:0061165683ee 713
sdivarci 0:0061165683ee 714 /***************************************************************************//**
sdivarci 0:0061165683ee 715 * @brief
sdivarci 0:0061165683ee 716 * USB Start Of Frame (SOF) interrupt callback function.
sdivarci 0:0061165683ee 717 *
sdivarci 0:0061165683ee 718 * @details
sdivarci 0:0061165683ee 719 * Called at each SOF interrupt (if enabled),
sdivarci 0:0061165683ee 720 *
sdivarci 0:0061165683ee 721 * @param[in] sofNr
sdivarci 0:0061165683ee 722 * Current frame number. The value rolls over to 0 after 16383 (0x3FFF).
sdivarci 0:0061165683ee 723 ******************************************************************************/
sdivarci 0:0061165683ee 724 typedef void (*USBD_SofIntCb_TypeDef)( uint16_t sofNr );
sdivarci 0:0061165683ee 725
sdivarci 0:0061165683ee 726 /***************************************************************************//**
sdivarci 0:0061165683ee 727 * @brief
sdivarci 0:0061165683ee 728 * USB State change callback function.
sdivarci 0:0061165683ee 729 *
sdivarci 0:0061165683ee 730 * @details
sdivarci 0:0061165683ee 731 * Called whenever the device change state.
sdivarci 0:0061165683ee 732 *
sdivarci 0:0061165683ee 733 * @param[in] oldState
sdivarci 0:0061165683ee 734 * The device USB state just leaved. See @ref USBD_State_TypeDef.
sdivarci 0:0061165683ee 735 *
sdivarci 0:0061165683ee 736 * @param[in] newState
sdivarci 0:0061165683ee 737 * New (the current) USB device state. See @ref USBD_State_TypeDef.
sdivarci 0:0061165683ee 738 ******************************************************************************/
sdivarci 0:0061165683ee 739 typedef void (*USBD_DeviceStateChangeCb_TypeDef)( USBD_State_TypeDef oldState, USBD_State_TypeDef newState );
sdivarci 0:0061165683ee 740
sdivarci 0:0061165683ee 741 /***************************************************************************//**
sdivarci 0:0061165683ee 742 * @brief
sdivarci 0:0061165683ee 743 * USB power mode callback function.
sdivarci 0:0061165683ee 744 *
sdivarci 0:0061165683ee 745 * @details
sdivarci 0:0061165683ee 746 * Called whenever the device stack needs to query if the device is currently
sdivarci 0:0061165683ee 747 * self- or bus-powered. Typically when host has issued an @ref GET_STATUS
sdivarci 0:0061165683ee 748 * setup command.
sdivarci 0:0061165683ee 749 *
sdivarci 0:0061165683ee 750 * @return
sdivarci 0:0061165683ee 751 * True if self-powered, false otherwise.
sdivarci 0:0061165683ee 752 ******************************************************************************/
sdivarci 0:0061165683ee 753 typedef bool (*USBD_IsSelfPoweredCb_TypeDef)( void );
sdivarci 0:0061165683ee 754
sdivarci 0:0061165683ee 755 /***************************************************************************//**
sdivarci 0:0061165683ee 756 * @brief
sdivarci 0:0061165683ee 757 * USB setup request callback function.
sdivarci 0:0061165683ee 758 *
sdivarci 0:0061165683ee 759 * @details
sdivarci 0:0061165683ee 760 * Called on each setup request received from host. This gives the application a
sdivarci 0:0061165683ee 761 * possibility to extend or override standard requests, and to implement class
sdivarci 0:0061165683ee 762 * or vendor specific requests. Return @ref USB_STATUS_OK if the request is
sdivarci 0:0061165683ee 763 * handled, return @ref USB_STATUS_REQ_ERR if it is an illegal request or
sdivarci 0:0061165683ee 764 * return @ref USB_STATUS_REQ_UNHANDLED to pass the request on to the default
sdivarci 0:0061165683ee 765 * request handler.
sdivarci 0:0061165683ee 766 *
sdivarci 0:0061165683ee 767 * @param[in] setup
sdivarci 0:0061165683ee 768 * Pointer to an USB setup packet. See @ref USB_Setup_TypeDef.
sdivarci 0:0061165683ee 769 *
sdivarci 0:0061165683ee 770 * @return
sdivarci 0:0061165683ee 771 * An appropriate status/error code. See @ref USB_Status_TypeDef.
sdivarci 0:0061165683ee 772 ******************************************************************************/
sdivarci 0:0061165683ee 773 typedef int (*USBD_SetupCmdCb_TypeDef)( const USB_Setup_TypeDef *setup );
sdivarci 0:0061165683ee 774
sdivarci 0:0061165683ee 775 /** @cond DO_NOT_INCLUDE_WITH_DOXYGEN */
sdivarci 0:0061165683ee 776 struct USBD_Callbacks_TypeDef;
sdivarci 0:0061165683ee 777 typedef struct USBD_Callbacks_TypeDef const *USBD_Callbacks_TypeDef_Pointer;
sdivarci 0:0061165683ee 778 /** @endcond */
sdivarci 0:0061165683ee 779
sdivarci 0:0061165683ee 780
sdivarci 0:0061165683ee 781 /** @brief USB Device stack initialization structure.
sdivarci 0:0061165683ee 782 * @details This structure is passed to @ref USBD_Init() when starting up
sdivarci 0:0061165683ee 783 * the device. */
sdivarci 0:0061165683ee 784 typedef struct
sdivarci 0:0061165683ee 785 {
sdivarci 0:0061165683ee 786 const USB_DeviceDescriptor_TypeDef *deviceDescriptor; /**< Pointer to a device descriptor. */
sdivarci 0:0061165683ee 787 const uint8_t *configDescriptor; /**< Pointer to a configuration descriptor. */
sdivarci 0:0061165683ee 788 const void * const *stringDescriptors; /**< Pointer to an array of string descriptor pointers.*/
sdivarci 0:0061165683ee 789 const uint8_t numberOfStrings; /**< Number of strings in string descriptor array. */
sdivarci 0:0061165683ee 790 const uint8_t *bufferingMultiplier; /**< Pointer to an array defining the size of the
sdivarci 0:0061165683ee 791 endpoint buffers. The size is given in
sdivarci 0:0061165683ee 792 multiples of endpoint size. Generally a value
sdivarci 0:0061165683ee 793 of 1 (single) or 2 (double) buffering should be
sdivarci 0:0061165683ee 794 used. */
sdivarci 0:0061165683ee 795 USBD_Callbacks_TypeDef_Pointer callbacks; /**< Pointer to struct with callbacks
sdivarci 0:0061165683ee 796 (@ref USBD_Callbacks_TypeDef). These callbacks
sdivarci 0:0061165683ee 797 are used by the device stack to signal events
sdivarci 0:0061165683ee 798 to or query the application. */
sdivarci 0:0061165683ee 799 const uint32_t reserved; /**< Reserved for future use. */
sdivarci 0:0061165683ee 800 } USBD_Init_TypeDef;
sdivarci 0:0061165683ee 801
sdivarci 0:0061165683ee 802
sdivarci 0:0061165683ee 803 /** @brief USB Device stack callback structure.
sdivarci 0:0061165683ee 804 * @details Callback functions used by the device stack to signal events or
sdivarci 0:0061165683ee 805 * query status to/from the application. See @ref USBD_Init_TypeDef. Assign
sdivarci 0:0061165683ee 806 * members to NULL if your application don't need a specific callback. */
sdivarci 0:0061165683ee 807 typedef struct USBD_Callbacks_TypeDef
sdivarci 0:0061165683ee 808 {
sdivarci 0:0061165683ee 809 const USBD_UsbResetCb_TypeDef usbReset; /**< Called whenever USB reset signalling is detected
sdivarci 0:0061165683ee 810 on the USB port. */
sdivarci 0:0061165683ee 811 const USBD_DeviceStateChangeCb_TypeDef usbStateChange; /**< Called whenever the device change state. */
sdivarci 0:0061165683ee 812 const USBD_SetupCmdCb_TypeDef setupCmd; /**< Called on each setup request received from host.*/
sdivarci 0:0061165683ee 813 const USBD_IsSelfPoweredCb_TypeDef isSelfPowered; /**< Called whenever the device stack needs to query
sdivarci 0:0061165683ee 814 if the device is currently self- or bus-powered.
sdivarci 0:0061165683ee 815 Applies to devices which can operate in both modes.*/
sdivarci 0:0061165683ee 816 const USBD_SofIntCb_TypeDef sofInt; /**< Called at each SOF interrupt. If NULL, the device
sdivarci 0:0061165683ee 817 stack will not enable the SOF interrupt. */
sdivarci 0:0061165683ee 818 } USBD_Callbacks_TypeDef;
sdivarci 0:0061165683ee 819
sdivarci 0:0061165683ee 820
sdivarci 0:0061165683ee 821 /*** -------------------- DEVICE mode API -------------------------------- ***/
sdivarci 0:0061165683ee 822
sdivarci 0:0061165683ee 823 void USBD_AbortAllTransfers( void );
sdivarci 0:0061165683ee 824 int USBD_AbortTransfer( int epAddr );
sdivarci 0:0061165683ee 825 void USBD_Connect( void );
sdivarci 0:0061165683ee 826 void USBD_Disconnect( void );
sdivarci 0:0061165683ee 827 bool USBD_EpIsBusy( int epAddr );
sdivarci 0:0061165683ee 828 USBD_State_TypeDef USBD_GetUsbState( void );
sdivarci 0:0061165683ee 829 const char * USBD_GetUsbStateName( USBD_State_TypeDef state );
sdivarci 0:0061165683ee 830 int USBD_Init( const USBD_Init_TypeDef *p );
sdivarci 0:0061165683ee 831 int USBD_Read( int epAddr, void *data, int byteCount, USB_XferCompleteCb_TypeDef callback );
sdivarci 0:0061165683ee 832 int USBD_RemoteWakeup( void );
sdivarci 0:0061165683ee 833 bool USBD_SafeToEnterEM2( void );
sdivarci 0:0061165683ee 834 int USBD_StallEp( int epAddr );
sdivarci 0:0061165683ee 835 void USBD_Stop( void );
sdivarci 0:0061165683ee 836 int USBD_UnStallEp( int epAddr );
sdivarci 0:0061165683ee 837 int USBD_Write( int epAddr, void *data, int byteCount, USB_XferCompleteCb_TypeDef callback );
sdivarci 0:0061165683ee 838
sdivarci 0:0061165683ee 839 #ifdef __MBED__
sdivarci 0:0061165683ee 840 int USBD_SetAddress( uint8_t addr );
sdivarci 0:0061165683ee 841 int USBD_AddEndpoint( int epAddr, int transferType, int maxPacketSize, int bufferMult );
sdivarci 0:0061165683ee 842 int USBD_EpIsStalled( int epAddr );
sdivarci 0:0061165683ee 843 void USBD_StallEp0( void );
sdivarci 0:0061165683ee 844 #endif
sdivarci 0:0061165683ee 845
sdivarci 0:0061165683ee 846 /** @} (end addtogroup USB_DEVICE) */
sdivarci 0:0061165683ee 847 #endif /* defined( USB_DEVICE ) */
sdivarci 0:0061165683ee 848
sdivarci 0:0061165683ee 849
sdivarci 0:0061165683ee 850 #if defined( USB_HOST )
sdivarci 0:0061165683ee 851 /***************************************************************************//**
sdivarci 0:0061165683ee 852 * @addtogroup USB_HOST
sdivarci 0:0061165683ee 853 * @brief USB HOST protocol stack, see @ref usb_host page for detailed documentation.
sdivarci 0:0061165683ee 854 * @{
sdivarci 0:0061165683ee 855 ******************************************************************************/
sdivarci 0:0061165683ee 856 /*** -------------------- HOST mode API definitions ---------------------- ***/
sdivarci 0:0061165683ee 857
sdivarci 0:0061165683ee 858 #define USB_VBUSOVRCUR_PORT_NONE -1 /**< No overcurrent flag functionality. */
sdivarci 0:0061165683ee 859 #define USB_VBUSOVRCUR_POLARITY_LOW 0 /**< Overcurrent flag pin polarity is low. */
sdivarci 0:0061165683ee 860 #define USB_VBUSOVRCUR_POLARITY_HIGH 1 /**< Overcurrent flag pin polarity is high. */
sdivarci 0:0061165683ee 861
sdivarci 0:0061165683ee 862 /** USB HOST endpoint status enumerator. */
sdivarci 0:0061165683ee 863 typedef enum
sdivarci 0:0061165683ee 864 {
sdivarci 0:0061165683ee 865 H_EP_IDLE = 0, /**< The endpoint is idle. */
sdivarci 0:0061165683ee 866 H_EP_SETUP = 1, /**< The endpoint is in SETUP stage. */
sdivarci 0:0061165683ee 867 H_EP_DATA_IN = 2, /**< The endpoint is in DATA IN stage. */
sdivarci 0:0061165683ee 868 H_EP_DATA_OUT = 3, /**< The endpoint is in DATA OUT stage. */
sdivarci 0:0061165683ee 869 H_EP_STATUS_IN = 4, /**< The endpoint is in STATUS IN stage. */
sdivarci 0:0061165683ee 870 H_EP_STATUS_OUT = 5, /**< The endpoint is in STATUS OUT stage. */
sdivarci 0:0061165683ee 871 } USBH_EpState_TypeDef;
sdivarci 0:0061165683ee 872
sdivarci 0:0061165683ee 873
sdivarci 0:0061165683ee 874 /** @brief USB HOST endpoint status data.
sdivarci 0:0061165683ee 875 * @details A host application should not manipulate the contents of
sdivarci 0:0061165683ee 876 * this struct. */
sdivarci 0:0061165683ee 877 typedef struct
sdivarci 0:0061165683ee 878 {
sdivarci 0:0061165683ee 879 USB_Setup_TypeDef setup; /**< A SETUP package. */
sdivarci 0:0061165683ee 880 uint8_t setupErrCnt; /**< Error counter for SETUP transfers. */
sdivarci 0:0061165683ee 881 USB_EndpointDescriptor_TypeDef epDesc; /**< Endpoint descriptor. */
sdivarci 0:0061165683ee 882 struct USBH_Device_TypeDef *parentDevice; /**< The device the endpoint belongs to. */
sdivarci 0:0061165683ee 883 uint8_t type; /**< Endpoint type. */
sdivarci 0:0061165683ee 884 uint16_t packetSize; /**< Packet size, current transfer. */
sdivarci 0:0061165683ee 885 uint8_t hcOut; /**< Host channel number assigned for OUT transfers. */
sdivarci 0:0061165683ee 886 uint8_t hcIn; /**< Host channel number assigned for IN transfers. */
sdivarci 0:0061165683ee 887 bool in; /**< Endpoint direction. */
sdivarci 0:0061165683ee 888 uint8_t toggle; /**< Endpoint data toggle. */
sdivarci 0:0061165683ee 889 USBH_EpState_TypeDef state; /**< Endpoint state. */
sdivarci 0:0061165683ee 890 uint8_t addr; /**< Endpoint address. */
sdivarci 0:0061165683ee 891 uint8_t *buf; /**< Transfer buffer. */
sdivarci 0:0061165683ee 892 volatile bool xferCompleted; /**< Transfer completion flag. */
sdivarci 0:0061165683ee 893 USB_Status_TypeDef xferStatus; /**< Transfer status. */
sdivarci 0:0061165683ee 894 USB_XferCompleteCb_TypeDef xferCompleteCb; /**< Transfer completion callback function. */
sdivarci 0:0061165683ee 895 uint32_t xferred; /**< Number of bytes transferred. */
sdivarci 0:0061165683ee 896 uint32_t remaining; /**< Number of bytes remaining. */
sdivarci 0:0061165683ee 897 uint32_t timeout; /**< Transfer timeout. */
sdivarci 0:0061165683ee 898 } USBH_Ep_TypeDef;
sdivarci 0:0061165683ee 899
sdivarci 0:0061165683ee 900
sdivarci 0:0061165683ee 901 /** @brief USB HOST device definition.
sdivarci 0:0061165683ee 902 * @details A host application should not manipulate the contents of
sdivarci 0:0061165683ee 903 * this struct. */
sdivarci 0:0061165683ee 904 typedef struct USBH_Device_TypeDef
sdivarci 0:0061165683ee 905 {
sdivarci 0:0061165683ee 906 USB_DeviceDescriptor_TypeDef devDesc; /**< The device device descriptor. */
sdivarci 0:0061165683ee 907 USB_ConfigurationDescriptor_TypeDef confDesc; /**< The device configuration descriptor. */
sdivarci 0:0061165683ee 908 USB_InterfaceDescriptor_TypeDef itfDesc; /**< The device interface descriptor. */
sdivarci 0:0061165683ee 909 USBH_Ep_TypeDef ep0; /**< Endpoint 0 status data. */
sdivarci 0:0061165683ee 910 USBH_Ep_TypeDef *ep; /**< Array of endpoint status data. */
sdivarci 0:0061165683ee 911 int numEp; /**< Number of endpoints. */
sdivarci 0:0061165683ee 912 uint8_t addr; /**< The device address. */
sdivarci 0:0061165683ee 913 uint8_t speed; /**< The device speed (low or full speed). */
sdivarci 0:0061165683ee 914 } USBH_Device_TypeDef;
sdivarci 0:0061165683ee 915
sdivarci 0:0061165683ee 916
sdivarci 0:0061165683ee 917 /** @brief USB Host stack initialization structure.
sdivarci 0:0061165683ee 918 * @details This structure is passed to @ref USBH_Init() when starting up the
sdivarci 0:0061165683ee 919 * device. Max accumulated FIFO size is 2K bytes. */
sdivarci 0:0061165683ee 920 typedef struct
sdivarci 0:0061165683ee 921 {
sdivarci 0:0061165683ee 922 uint32_t rxFifoSize; /**< Number of FIFO bytes set aside for IN endpoints. */
sdivarci 0:0061165683ee 923 uint32_t nptxFifoSize; /**< Number of FIFO bytes set aside for OUT CTRL/BULK endoints. */
sdivarci 0:0061165683ee 924 uint32_t ptxFifoSize; /**< Number of FIFO bytes set aside for OUT INTR/ISO endoints. */
sdivarci 0:0061165683ee 925 uint32_t reserved; /**< Reserved for future use. */
sdivarci 0:0061165683ee 926 } USBH_Init_TypeDef;
sdivarci 0:0061165683ee 927
sdivarci 0:0061165683ee 928
sdivarci 0:0061165683ee 929 /** Default @ref USBH_Init_TypeDef values, provides reasonable Tx/Rx FIFO
sdivarci 0:0061165683ee 930 * partitioning. */
sdivarci 0:0061165683ee 931 /* In DMA mode the total available FIFO space is smaller. */
sdivarci 0:0061165683ee 932 /* The DMA controller use one FIFO word pr. channel for status. */
sdivarci 0:0061165683ee 933 /* The unit in the table is byte. */
sdivarci 0:0061165683ee 934 #define USBH_INIT_DEFAULT \
sdivarci 0:0061165683ee 935 { \
sdivarci 0:0061165683ee 936 MAX_HOST_FIFO_SIZE_INWORDS * 2,/* 1024 bytes Rx FIFO size. */ \
sdivarci 0:0061165683ee 937 MAX_HOST_FIFO_SIZE_INWORDS, /* 512 bytes non-periodic Tx FIFO size. */ \
sdivarci 0:0061165683ee 938 MAX_HOST_FIFO_SIZE_INWORDS, /* 512 bytes periodic Tx FIFO size. */ \
sdivarci 0:0061165683ee 939 0 /* Reserved. */ \
sdivarci 0:0061165683ee 940 }
sdivarci 0:0061165683ee 941
sdivarci 0:0061165683ee 942 /*** -------------------- HOST mode API ---------------------------------- ***/
sdivarci 0:0061165683ee 943
sdivarci 0:0061165683ee 944 int USBH_AssignHostChannel( USBH_Ep_TypeDef *ep, uint8_t hcnum );
sdivarci 0:0061165683ee 945 int USBH_ControlMsg( USBH_Ep_TypeDef *ep, uint8_t bmRequestType, uint8_t bRequest, uint16_t wValue, uint16_t wIndex, uint16_t wLength, void *data, int timeout, USB_XferCompleteCb_TypeDef callback );
sdivarci 0:0061165683ee 946 int USBH_ControlMsgB( USBH_Ep_TypeDef *ep, uint8_t bmRequestType, uint8_t bRequest, uint16_t wValue, uint16_t wIndex, uint16_t wLength, void *data, int timeout );
sdivarci 0:0061165683ee 947 bool USBH_DeviceConnected( void );
sdivarci 0:0061165683ee 948 int USBH_GetConfigurationDescriptorB( USBH_Device_TypeDef *device, void *buf, int len, uint8_t configIndex );
sdivarci 0:0061165683ee 949 int USBH_GetDeviceDescriptorB( USBH_Device_TypeDef *device, void *buf, int len );
sdivarci 0:0061165683ee 950 uint8_t USBH_GetPortSpeed( void );
sdivarci 0:0061165683ee 951 int USBH_GetStringB( USBH_Device_TypeDef *device, uint8_t *buf, int bufLen, uint8_t stringIndex, uint16_t langID );
sdivarci 0:0061165683ee 952 int USBH_Init( const USBH_Init_TypeDef *p );
sdivarci 0:0061165683ee 953 int USBH_InitDeviceData( USBH_Device_TypeDef *device, const uint8_t *buf, USBH_Ep_TypeDef *ep, int numEp, uint8_t deviceSpeed );
sdivarci 0:0061165683ee 954 int USBH_PortReset( void );
sdivarci 0:0061165683ee 955 int USBH_PortResume( void );
sdivarci 0:0061165683ee 956 void USBH_PortSuspend( void );
sdivarci 0:0061165683ee 957 void USBH_PrintString( const char *pre, const USB_StringDescriptor_TypeDef *s, const char *post );
sdivarci 0:0061165683ee 958
sdivarci 0:0061165683ee 959 #if defined( USB_USE_PRINTF )
sdivarci 0:0061165683ee 960 int USBH_PrintConfigurationDescriptor( const USB_ConfigurationDescriptor_TypeDef *config, int maxLen );
sdivarci 0:0061165683ee 961 int USBH_PrintDeviceDescriptor( const USB_DeviceDescriptor_TypeDef *device );
sdivarci 0:0061165683ee 962 int USBH_PrintEndpointDescriptor( const USB_EndpointDescriptor_TypeDef *endpoint );
sdivarci 0:0061165683ee 963 int USBH_PrintInterfaceDescriptor( const USB_InterfaceDescriptor_TypeDef *interface );
sdivarci 0:0061165683ee 964 #else
sdivarci 0:0061165683ee 965 #define USBH_PrintConfigurationDescriptor( config, maxLen )
sdivarci 0:0061165683ee 966 #define USBH_PrintDeviceDescriptor( device )
sdivarci 0:0061165683ee 967 #define USBH_PrintEndpointDescriptor( endpoint )
sdivarci 0:0061165683ee 968 #define USBH_PrintInterfaceDescriptor( interface )
sdivarci 0:0061165683ee 969 #endif /* defined( USB_USE_PRINTF ) */
sdivarci 0:0061165683ee 970
sdivarci 0:0061165683ee 971 int USBH_QueryDeviceB( uint8_t *buf, size_t bufsize, uint8_t deviceSpeed );
sdivarci 0:0061165683ee 972 USB_ConfigurationDescriptor_TypeDef* USBH_QGetConfigurationDescriptor( const uint8_t *buf, int configIndex );
sdivarci 0:0061165683ee 973 USB_DeviceDescriptor_TypeDef* USBH_QGetDeviceDescriptor( const uint8_t *buf );
sdivarci 0:0061165683ee 974 USB_EndpointDescriptor_TypeDef* USBH_QGetEndpointDescriptor( const uint8_t *buf, int configIndex, int interfaceIndex, int endpointIndex );
sdivarci 0:0061165683ee 975 USB_InterfaceDescriptor_TypeDef* USBH_QGetInterfaceDescriptor( const uint8_t *buf, int configIndex, int interfaceIndex );
sdivarci 0:0061165683ee 976
sdivarci 0:0061165683ee 977 int USBH_Read( USBH_Ep_TypeDef *ep, void *data, int byteCount, int timeout, USB_XferCompleteCb_TypeDef callback );
sdivarci 0:0061165683ee 978 int USBH_ReadB( USBH_Ep_TypeDef *ep, void *data, int byteCount, int timeout );
sdivarci 0:0061165683ee 979 int USBH_SetAddressB( USBH_Device_TypeDef *device, uint8_t deviceAddress );
sdivarci 0:0061165683ee 980 int USBH_SetAltInterfaceB( USBH_Device_TypeDef *device, uint8_t interfaceIndex, uint8_t alternateSetting );
sdivarci 0:0061165683ee 981 int USBH_SetConfigurationB( USBH_Device_TypeDef *device, uint8_t configValue );
sdivarci 0:0061165683ee 982 int USBH_StallEpB( USBH_Ep_TypeDef *ep );
sdivarci 0:0061165683ee 983 void USBH_Stop( void );
sdivarci 0:0061165683ee 984 int USBH_UnStallEpB( USBH_Ep_TypeDef *ep );
sdivarci 0:0061165683ee 985 int USBH_WaitForDeviceConnectionB( uint8_t *buf, int timeoutInSeconds );
sdivarci 0:0061165683ee 986 int USBH_Write( USBH_Ep_TypeDef *ep, void *data, int byteCount, int timeout, USB_XferCompleteCb_TypeDef callback );
sdivarci 0:0061165683ee 987 int USBH_WriteB( USBH_Ep_TypeDef *ep, void *data, int byteCount, int timeout );
sdivarci 0:0061165683ee 988
sdivarci 0:0061165683ee 989 /** @} (end addtogroup USB_HOST) */
sdivarci 0:0061165683ee 990 #endif /* defined( USB_HOST ) */
sdivarci 0:0061165683ee 991 /** @} (end addtogroup USB) */
sdivarci 0:0061165683ee 992
sdivarci 0:0061165683ee 993 #ifdef __cplusplus
sdivarci 0:0061165683ee 994 }
sdivarci 0:0061165683ee 995 #endif
sdivarci 0:0061165683ee 996
sdivarci 0:0061165683ee 997 #endif /* defined( USB_DEVICE ) || defined( USB_HOST ) */
sdivarci 0:0061165683ee 998 #endif /* defined( USB_PRESENT ) && ( USB_COUNT == 1 ) */
sdivarci 0:0061165683ee 999 #endif /* __EM_USB_H */