Files
test/middleware/usb/uC-USBD/Source/usbd_core.h
2025-11-07 20:19:23 +08:00

1780 lines
108 KiB
C

/*
*********************************************************************************************************
* uC/USB-Device
* The Embedded USB Device Stack
*
* Copyright 2004-2021 Silicon Laboratories Inc. www.silabs.com
*
* SPDX-License-Identifier: APACHE-2.0
*
* This software is subject to an open source license and is distributed by
* Silicon Laboratories Inc. pursuant to the terms of the Apache License,
* Version 2.0 available at www.apache.org/licenses/LICENSE-2.0.
*
*********************************************************************************************************
*/
/*
*********************************************************************************************************
* NOTICE
*
* Semidrive modified this file to adapt it for ssdk platform.
* The modifications are only intended for use with Semidrive chips.
* Copyright of all the modifications belongs to Semidrive Semiconductor.
*
*********************************************************************************************************
*/
/*
*********************************************************************************************************
*
* USB DEVICE CORE OPERATIONS
*
* Filename : usbd_core.h
* Version : V4.06.01
*********************************************************************************************************
*/
/*
*********************************************************************************************************
* MODULE
*********************************************************************************************************
*/
#ifndef USBD_CORE_MODULE_PRESENT
#define USBD_CORE_MODULE_PRESENT
/*
*********************************************************************************************************
* USB DEVICE VERSION NUMBER
*
* Note(s) : (1) (a) The USB Device software version is denoted as follows :
*
* Vx.yy.zz
*
* where
* V denotes 'Version' label
* x denotes major software version revision number
* yy denotes minor software version revision number
* zz denotes sub-minor software version revision number
*
* (b) The software version label #define is formatted as follows :
*
* ver = x.yyzz * 100 * 100
*
* where
* ver denotes software version number scaled as an integer value
* x.yyzz denotes software version number, where the unscaled integer
* portion denotes the major version number & the unscaled
* fractional portion denotes the (concatenated) minor
* version numbers
*********************************************************************************************************
*/
#define USBD_VERSION 40601u /* See Note #1. */
/*
*********************************************************************************************************
* INCLUDE FILES
*********************************************************************************************************
*/
#include <cpu.h> /* CPU Configuration. */
#include <lib_def.h> /* Standard Defines. */
#include <lib_mem.h> /* Standard Memory Library. */
#include <usbd_cfg.h> /* Device Configuration file. */
/*
*********************************************************************************************************
* EXTERNS
*********************************************************************************************************
*/
#ifdef USBD_CORE_MODULE
#define USBD_CORE_EXT
#else
#define USBD_CORE_EXT extern
#endif
/*
*********************************************************************************************************
* DEFINES
*********************************************************************************************************
*/
#define USBD_SETUP_PKT_LEN 8u /* Setup packet length. */
/*
*********************************************************************************************************
* FRAME
*
* Note(s) : (1) Section 8.3.3 of USB spec 2.0 describes the frame number as:
* "The frame number field is an 11-bit field that is incremented by the host on a per-frame
* basis. The frame number field rolls over upon reaching its maximum value of 7FFH and
* is sent only in SOF tokens at the start of each (micro)frame."
*********************************************************************************************************
*/
#define USBD_MAX_FRAME_NBR 2047u /* See Note #1. */
#define USBD_FRAME_NBR_MASK DEF_BIT_FIELD_16(11u, 0u)
#define USBD_MICROFRAME_NBR_MASK DEF_BIT_FIELD_16(3u, 11u)
/*
*********************************************************************************************************
* CONFIGURATION ATTRIBUTES
*********************************************************************************************************
*/
#define USBD_DEV_ATTRIB_SELF_POWERED DEF_BIT_00
#define USBD_DEV_ATTRIB_REMOTE_WAKEUP DEF_BIT_01
/*
*********************************************************************************************************
* DEVICE DESCRIPTOR LENGTH
*********************************************************************************************************
*/
#define USBD_DESC_LEN_DEV 18u /* Device descriptor length. */
#define USBD_DESC_LEN_DEV_QUAL 10u /* Device qualifier descriptor length. */
#define USBD_DESC_LEN_HDR 2u /* Descriptor header length. */
#define USBD_DESC_LEN_CFG 9u /* Configuration descriptor length. */
#define USBD_DESC_LEN_OTHER_SPD_CFG 9u /* Configuration other speed descriptor length. */
#define USBD_DESC_LEN_IF 9u /* Interface descriptor length. */
#define USBD_DESC_LEN_IF_ASSOCIATION 8u /* Interface association descriptor length. */
#define USBD_DESC_LEN_EP 7u /* Endpoint descriptor length. */
#define USBD_DESC_LEN_OTG 3u /* On-The-Go descriptor length */
/*
*********************************************************************************************************
* REQUEST CHARACTERISTICS
*
* Note(s) : (1) Request types are defined in USB spec 2.0, section 9.3, Table 9-2, 'RequestType' field.
*********************************************************************************************************
*/
#define USBD_REQ_DIR_MASK DEF_BIT_07
#define USBD_REQ_DIR_HOST_TO_DEVICE DEF_BIT_NONE
#define USBD_REQ_DIR_DEVICE_TO_HOST DEF_BIT_07
#define USBD_REQ_DIR_BIT DEF_BIT_07
#define USBD_REQ_TYPE_MASK 0x60u
#define USBD_REQ_TYPE_STANDARD 0x00u
#define USBD_REQ_TYPE_CLASS 0x20u
#define USBD_REQ_TYPE_VENDOR 0x40u
#define USBD_REQ_TYPE_RESERVED 0x60u
#define USBD_REQ_RECIPIENT_MASK 0x1Fu
#define USBD_REQ_RECIPIENT_DEVICE 0x00u
#define USBD_REQ_RECIPIENT_INTERFACE 0x01u
#define USBD_REQ_RECIPIENT_ENDPOINT 0x02u
#define USBD_REQ_RECIPIENT_OTHER 0x03u
/*
*********************************************************************************************************
* STANDARD REQUESTS
*
* Note(s) : (1) Request types are defined in USB spec 2.0, section 9.4, Table 9-4, 'RequestType' field.
*********************************************************************************************************
*/
#define USBD_REQ_GET_STATUS 0u
#define USBD_REQ_CLEAR_FEATURE 1u
#define USBD_REQ_SET_FEATURE 3u
#define USBD_REQ_SET_ADDRESS 5u
#define USBD_REQ_GET_DESCRIPTOR 6u
#define USBD_REQ_SET_DESCRIPTOR 7u
#define USBD_REQ_GET_CONFIGURATION 8u
#define USBD_REQ_SET_CONFIGURATION 9u
#define USBD_REQ_GET_INTERFACE 10u
#define USBD_REQ_SET_INTERFACE 11u
#define USBD_REQ_SYNCH_FRAME 12u
/*
*********************************************************************************************************
* DESCRIPTOR TYPES
*
* Note(s) : (1) Descriptors types are defined in the USB spec 2.0 section 9.2.6, Table 9-5.
*********************************************************************************************************
*/
#define USBD_DESC_TYPE_DEVICE 1u
#define USBD_DESC_TYPE_CONFIGURATION 2u
#define USBD_DESC_TYPE_STRING 3u
#define USBD_DESC_TYPE_INTERFACE 4u
#define USBD_DESC_TYPE_ENDPOINT 5u
#define USBD_DESC_TYPE_DEVICE_QUALIFIER 6u
#define USBD_DESC_TYPE_OTHER_SPEED_CONFIGURATION 7u
#define USBD_DESC_TYPE_INTERFACE_POWER 8u
#define USBD_DESC_TYPE_OTG 9u
#define USBD_DESC_TYPE_IAD 11u
/*
*********************************************************************************************************
* LANGUAGE IDENTIFIERS
*
* Note(s) : (1) Languages identifier are defined in "http://www.usb.org/developers/docs/USB_LANGIDs.pdf".
*********************************************************************************************************
*/
#define USBD_LANG_ID_ARABIC_SAUDI_ARABIA 0x0401u
#define USBD_LANG_ID_CHINESE_TAIWAN 0x0404u
#define USBD_LANG_ID_ENGLISH_US 0x0409u
#define USBD_LANG_ID_ENGLISH_UK 0x0809u
#define USBD_LANG_ID_FRENCH 0x040Cu
#define USBD_LANG_ID_GERMAN 0x0407u
#define USBD_LANG_ID_GREEK 0x0408u
#define USBD_LANG_ID_ITALIAN 0x0410u
#define USBD_LANG_ID_PORTUGUESE 0x0816u
#define USBD_LANG_ID_SANSKRIT 0x044Fu
/*
*********************************************************************************************************
* CLASS CODES
*
* Note(s) : (1) Class codes are defined in "http://www.usb.org/developers/defined_class".
* https://www.usb.org/defined-class-codes is also a reference.
*
* (2) Class code information can be placed in the Device descriptor or in the Interface
* descriptor. Some defined class code are allowed to be used only in the Device
* descriptor, others can used in both Device and Interface descriptors and come can
* only be used in Interface Descriptors.
*
* (3) Subclass & protocol codes are defined in the relevant class drivers.
*********************************************************************************************************
*/
#define USBD_CLASS_CODE_USE_IF_DESC 0x00u
#define USBD_CLASS_CODE_AUDIO 0x01u
#define USBD_CLASS_CODE_CDC_CONTROL 0x02u
#define USBD_CLASS_CODE_HID 0x03u
#define USBD_CLASS_CODE_PHYSICAL 0x05u
#define USBD_CLASS_CODE_IMAGE 0x06u
#define USBD_CLASS_CODE_PRINTER 0x07u
#define USBD_CLASS_CODE_MASS_STORAGE 0x08u
#define USBD_CLASS_CODE_HUB 0x09u
#define USBD_CLASS_CODE_CDC_DATA 0x0Au
#define USBD_CLASS_CODE_SMART_CARD 0x0Bu
#define USBD_CLASS_CODE_CONTENT_SECURITY 0x0Du
#define USBD_CLASS_CODE_VIDEO 0x0Eu
#define USBD_CLASS_CODE_PERSONAL_HEALTHCARE 0x0Fu
#define USBD_CLASS_CODE_DIAGNOSTIC_DEVICE 0xDCu
#define USBD_CLASS_CODE_WIRELESS_CONTROLLER 0xE0u
#define USBD_CLASS_CODE_MISCELLANEOUS 0xEFu
#define USBD_CLASS_CODE_APPLICATION_SPECIFIC 0xFEu
#define USBD_CLASS_CODE_VENDOR_SPECIFIC 0xFFu
/*
*********************************************************************************************************
* SUB-CLASS CODES
*********************************************************************************************************
*/
#define USBD_SUBCLASS_CODE_USE_IF_DESC 0x00u
#define USBD_SUBCLASS_CODE_USE_COMMON_CLASS 0x02u
#define USBD_SUBCLASS_CODE_VENDOR_SPECIFIC 0xFFu
/*
*********************************************************************************************************
* PROTOCOL CODES
*********************************************************************************************************
*/
#define USBD_PROTOCOL_CODE_USE_IF_DESC 0x00u
#define USBD_PROTOCOL_CODE_USE_IAD 0x01u
#define USBD_PROTOCOL_CODE_VENDOR_SPECIFIC 0xFFu
/*
*********************************************************************************************************
* FEATURE SELECTORS
*********************************************************************************************************
*/
#define USBD_FEATURE_SEL_ENDPOINT_HALT 0u
#define USBD_FEATURE_SEL_DEVICE_REMOTE_WAKEUP 1u
#define USBD_FEATURE_SEL_TEST_MODE 2u
/*
*********************************************************************************************************
* DEVICE POWER CONSTRAINS
*********************************************************************************************************
*/
#define USBD_MAX_BUS_PWR_LIMIT_mA 500u
/*
*********************************************************************************************************
* ENDPOINT TYPE
*
* Note(s) : (1) Endpoint types are defined in the USB spec 2.0 section 9.6.6, Table 9-13, 'bmAttributes'
* field.
*********************************************************************************************************
*/
#define USBD_EP_TYPE_MASK 0x03u
#define USBD_EP_TYPE_CTRL 0x00u
#define USBD_EP_TYPE_ISOC 0x01u
#define USBD_EP_TYPE_BULK 0x02u
#define USBD_EP_TYPE_INTR 0x03u
#define USBD_EP_TYPE_SYNC_MASK 0x0Cu
#define USBD_EP_TYPE_SYNC_NONE 0x00u
#define USBD_EP_TYPE_SYNC_ASYNC 0x04u
#define USBD_EP_TYPE_SYNC_ADAPTIVE 0x08u
#define USBD_EP_TYPE_SYNC_SYNC 0x0Cu
#define USBD_EP_TYPE_USAGE_MASK 0x30u
#define USBD_EP_TYPE_USAGE_DATA 0x00u
#define USBD_EP_TYPE_USAGE_FEEDBACK 0x10u
#define USBD_EP_TYPE_USAGE_IMPLICIT_FEEDBACK 0x20u
/*
*********************************************************************************************************
* ENDPOINT ADDRESS
*
* Note(s) : (1) Endpoint address is defined in the USB spec 2.0, section 9.6.6, Table 9-13,
* 'bEndpointAddress' field.
*********************************************************************************************************
*/
#define USBD_EP_NBR_MASK 0x0Fu
#define USBD_EP_MAX_NBR 32u
#define USBD_EP_DIR_MASK 0x80u
#define USBD_EP_DIR_BIT DEF_BIT_07
#define USBD_EP_DIR_OUT DEF_BIT_NONE
#define USBD_EP_DIR_IN DEF_BIT_07
#define USBD_EP_TRANSACTION_PER_UFRAME_1 1u
#define USBD_EP_TRANSACTION_PER_UFRAME_2 2u
#define USBD_EP_TRANSACTION_PER_UFRAME_3 3u
#define USBD_EP_MAX_INTERVAL_VAL 32768u /* Max val is 2^(16 - 1). */
/*
*********************************************************************************************************
* MICROSOFT OS DESCRIPTOR DEFINES
*
* Note(s) : (1) For more information on Microsoft OS descriptors, see
* 'http://msdn.microsoft.com/en-us/library/windows/hardware/gg463179.aspx'.
*********************************************************************************************************
*/
/* Microsoft OS compatible IDs index. */
#define USBD_MS_OS_COMPAT_ID_NULL 0u
#define USBD_MS_OS_COMPAT_ID_RNDIS 1u
#define USBD_MS_OS_COMPAT_ID_PTP 2u
#define USBD_MS_OS_COMPAT_ID_MTP 3u
#define USBD_MS_OS_COMPAT_ID_XUSB20 4u
#define USBD_MS_OS_COMPAT_ID_BLUETOOTH 5u
#define USBD_MS_OS_COMPAT_ID_WINUSB 6u
#define USBD_MS_OS_COMPAT_ID_WINNCM 7u
#define USBD_MS_OS_COMPAT_ID_NONE 255u
/* Microsoft OS subcompatible IDs index. */
#define USBD_MS_OS_SUBCOMPAT_ID_NULL 0u
#define USBD_MS_OS_SUBCOMPAT_ID_BLUETOOTH_1_1 1u
#define USBD_MS_OS_SUBCOMPAT_ID_BLUETOOTH_1_2 2u
#define USBD_MS_OS_SUBCOMPAT_ID_BLUETOOTH_EDR 3u
/* Microsoft OS extended property types. */
#define USBD_MS_OS_PROPERTY_TYPE_REG_SZ 1u /* NULL-terminated Unicode str. */
#define USBD_MS_OS_PROPERTY_TYPE_REG_EXPAND_SZ 2u /* NULL-terminated Unicode str with environment vars. */
#define USBD_MS_OS_PROPERTY_TYPE_REG_BINARY 3u /* Free-form binary. */
#define USBD_MS_OS_PROPERTY_TYPE_REG_DWORD_LITTLE_ENDIAN 4u /* Little-endian 32-bit integer. */
#define USBD_MS_OS_PROPERTY_TYPE_REG_DWORD_BIG_ENDIAN 5u /* Big-endian 32-bit integer. */
#define USBD_MS_OS_PROPERTY_TYPE_REG_LINK 6u /* NULL-terminated Unicode str with a symbolic link. */
#define USBD_MS_OS_PROPERTY_TYPE_REG_MULTI_SZ 7u /* Multiple NULL-terminated Unicode strings. */
/*
*********************************************************************************************************
* DEVICE ERROR CODES
*********************************************************************************************************
*/
typedef enum usbd_err { /* Device error data type. */
/* ---------------- GENERIC ERROR CODES --------------- */
USBD_ERR_NONE = 0u,
USBD_ERR_FAIL = 1u,
USBD_ERR_RX = 2u,
USBD_ERR_TX = 3u,
USBD_ERR_ALLOC = 4u, /* Object/memory allocation. */
USBD_ERR_NULL_PTR = 5u, /* Ptr arg(s) passed NULL ptr(s). */
USBD_ERR_INVALID_ARG = 6u, /* Invalid argument(s). */
USBD_ERR_INVALID_CLASS_STATE = 7u, /* Invalid class state. */
/* ---------------- DEVICE ERROR CODES ---------------- */
USBD_ERR_DEV_ALLOC = 100u, /* Device allocation failed. */
USBD_ERR_DEV_INVALID_NBR = 101u, /* Invalid device number. */
USBD_ERR_DEV_INVALID_STATE = 102u, /* Invalid device state. */
USBD_ERR_DEV_INVALID_SPD = 103u, /* Invalid device speed. */
USBD_ERR_DEV_UNAVAIL_FEAT = 104u, /* Device does not support requested feature. */
/* ------------- CONFIGURATION ERROR CODES ------------ */
USBD_ERR_CFG_ALLOC = 200u, /* Configuration allocation failed. */
USBD_ERR_CFG_INVALID_NBR = 201u, /* Invalid configuration number. */
USBD_ERR_CFG_INVALID_MAX_PWR = 202u, /* Invalid maximum power. */
USBD_ERR_CFG_SET_FAIL = 203u, /* Device driver set configuration failed. */
/* --------------- INTERFACE ERROR CODES -------------- */
USBD_ERR_IF_ALLOC = 300u, /* Interface allocation failed. */
USBD_ERR_IF_INVALID_NBR = 301u, /* Invalid interface number. */
USBD_ERR_IF_ALT_ALLOC = 302u, /* Alternate interface setting allocation failed. */
USBD_ERR_IF_ALT_INVALID_NBR = 303u, /* Invalid interface alternate setting number. */
USBD_ERR_IF_GRP_ALLOC = 304u, /* Interface group allocation failed. */
USBD_ERR_IF_GRP_NBR_IN_USE = 305u, /* Interface group number already in use. */
/* --------------- ENDPOINT ERROR CODES --------------- */
USBD_ERR_EP_ALLOC = 400u, /* Endpoint allocation failed. */
USBD_ERR_EP_INVALID_ADDR = 401u, /* Invalid endpoint address. */
USBD_ERR_EP_INVALID_STATE = 402u, /* Invalid endpoint state. */
USBD_ERR_EP_INVALID_TYPE = 403u, /* Invalid endpoint type. */
USBD_ERR_EP_NONE_AVAIL = 404u, /* Physical endpoint NOT available. */
USBD_ERR_EP_ABORT = 405u, /* Device driver abort endpoint failed. */
USBD_ERR_EP_STALL = 406u, /* Device driver stall endpoint failed. */
USBD_ERR_EP_IO_PENDING = 407u, /* I/O operation pending on endpoint. */
USBD_ERR_EP_QUEUING = 408u, /* Unable to queue transfer on endpoint. */
/* --------------- OS LAYER ERROR CODES --------------- */
USBD_ERR_OS_INIT_FAIL = 500u, /* OS layer initialization failed. */
USBD_ERR_OS_SIGNAL_CREATE = 501u, /* OS signal NOT successfully created. */
USBD_ERR_OS_FAIL = 502u, /* OS object Pend/Post failed. */
USBD_ERR_OS_TIMEOUT = 503u, /* OS object timeout. */
USBD_ERR_OS_ABORT = 504u, /* OS object abort. */
USBD_ERR_OS_DEL = 505u, /* OS object delete. */
/* ------- DEVICE CONTROLLER DRIVER ERROR CODES ------- */
USBD_ERR_DRV_BUF_OVERFLOW = 700u, /* Overflow occured on Rx transfer. */
USBD_ERR_DRV_INVALID_PKT = 701u, /* Data integrity of the packet is not guaranteed. */
/* ---------------- CLASSES ERROR CODES --------------- */
USBD_ERR_CLASS_INVALID_NBR = 1000u,
USBD_ERR_CLASS_XFER_IN_PROGRESS = 1001u,
/* ------------- AUDIO CLASS ERROR CODES -------------- */
USBD_ERR_AUDIO_INSTANCE_ALLOC = 1100u,
USBD_ERR_AUDIO_AS_IF_ALLOC = 1101u,
USBD_ERR_AUDIO_IT_ALLOC = 1102u,
USBD_ERR_AUDIO_OT_ALLOC = 1103u,
USBD_ERR_AUDIO_FU_ALLOC = 1104u,
USBD_ERR_AUDIO_MU_ALLOC = 1105u,
USBD_ERR_AUDIO_SU_ALLOC = 1106u,
USBD_ERR_AUDIO_REQ_INVALID_CTRL = 1107u, /* Invalid control. */
USBD_ERR_AUDIO_REQ_INVALID_ATTRIB = 1108u, /* Invalid attribute of an audio control. */
USBD_ERR_AUDIO_REQ_INVALID_RECIPIENT = 1109u, /* Invalid request recipient. */
USBD_ERR_AUDIO_REQ = 1110u, /* Request has failed for various reasons. */
USBD_ERR_AUDIO_INVALID_SAMPLING_FRQ = 1111u, /* Sampling frequency not supported. */
USBD_ERR_AUDIO_CODEC_INIT_FAILED = 1112u, /* Audio Codec driver init failed. */
/* --------------- CDC CLASS ERROR CODES -------------- */
USBD_ERR_CDC_INSTANCE_ALLOC = 1200u,
USBD_ERR_CDC_DATA_IF_ALLOC = 1201u,
USBD_ERR_CDC_SUBCLASS_INSTANCE_ALLOC = 1250u,
/* --------------- HID CLASS ERROR CODES -------------- */
USBD_ERR_HID_INSTANCE_ALLOC = 1300u,
USBD_ERR_HID_REPORT_INVALID = 1303u,
USBD_ERR_HID_REPORT_ALLOC = 1304u,
USBD_ERR_HID_REPORT_PUSH_POP_ALLOC = 1305u,
/* --------------- MSC CLASS ERROR CODES -------------- */
USBD_ERR_MSC_INSTANCE_ALLOC = 1400u,
USBD_ERR_MSC_INVALID_CBW = 1401u, /* Invalid Command Block Wrapper. */
USBD_ERR_MSC_INVALID_DIR = 1402u, /* Mismatch between dir indicated by CBW and SCSI cmd. */
USBD_ERR_MSC_MAX_LUN_EXCEED = 1403u, /* Maximum number of logical units reached. */
USBD_ERR_MSC_MAX_VEN_ID_LEN_EXCEED = 1404u, /* Vendor ID string too long. */
USBD_ERR_MSC_MAX_PROD_ID_LEN_EXCEED = 1405u, /* Product ID string too long. */
USBD_ERR_SCSI_UNSUPPORTED_CMD = 1406u, /* SCSI cmd not supported. */
USBD_ERR_SCSI_MORE_DATA = 1407u, /* Read or write req more data to be read or written. */
USBD_ERR_SCSI_LU_NOTRDY = 1408u, /* Logical unit not ready to perform any operations. */
USBD_ERR_SCSI_LU_NOTSUPPORTED = 1409u, /* Logical unit number not supported, */
USBD_ERR_SCSI_LU_BUSY = 1410u, /* Logical unit number is busy with other operations. */
USBD_ERR_SCSI_LOG_BLOCK_ADDR = 1411u, /* Logical block address out of range. */
USBD_ERR_SCSI_MEDIUM_NOTPRESENT = 1412u, /* Medium not present. */
USBD_ERR_SCSI_MEDIUM_NOT_RDY_TO_RDY = 1413u, /* Medium transitions from not ready to ready state. */
USBD_ERR_SCSI_MEDIUM_RDY_TO_NOT_RDY = 1414u, /* Medium transitions from ready to not ready state. */
USBD_ERR_SCSI_LOCK = 1415u, /* Medium lock failed. */
USBD_ERR_SCSI_LOCK_TIMEOUT = 1416u, /* Medium lock timed out. */
USBD_ERR_SCSI_UNLOCK = 1417u, /* Medium successfully unlocked. */
/* -------------- PHDC CLASS ERROR CODES -------------- */
USBD_ERR_PHDC_INSTANCE_ALLOC = 1500u,
/* --------------- FAST BOOT CLASS ERROR CODES -------------- */
USBD_ERR_FB_INSTANCE_ALLOC = 1600u,
/* ------------- VENDOR CLASS ERROR CODES ------------- */
USBD_ERR_VENDOR_INSTANCE_ALLOC = 1700u
} USBD_ERR;
/*
*********************************************************************************************************
* USB EP INFORMATION TABLE DEFINES
*********************************************************************************************************
*/
/* ------------- ENDPOINT TYPE BIT DEFINES ------------ */
#define USBD_EP_INFO_TYPE_CTRL DEF_BIT_00
#define USBD_EP_INFO_TYPE_ISOC DEF_BIT_01
#define USBD_EP_INFO_TYPE_BULK DEF_BIT_02
#define USBD_EP_INFO_TYPE_INTR DEF_BIT_03
/* ---------- ENDPOINT DIRECTION BIT DEFINES ---------- */
#define USBD_EP_INFO_DIR_OUT DEF_BIT_04
#define USBD_EP_INFO_DIR_IN DEF_BIT_05
/*
*********************************************************************************************************
* USB OBJECT NUMBER
*********************************************************************************************************
*/
#define USBD_DEV_NBR_NONE DEF_INT_08U_MAX_VAL
#define USBD_CFG_NBR_NONE DEF_INT_08U_MAX_VAL
#define USBD_CFG_NBR_SPD_BIT DEF_BIT_07
#define USBD_IF_NBR_NONE DEF_INT_08U_MAX_VAL
#define USBD_IF_ALT_NBR_NONE DEF_INT_08U_MAX_VAL
#define USBD_IF_GRP_NBR_NONE DEF_INT_08U_MAX_VAL
#define USBD_EP_ADDR_NONE DEF_INT_08U_MAX_VAL
#define USBD_EP_PHY_NONE DEF_INT_08U_MAX_VAL
#define USBD_EP_NBR_NONE DEF_INT_08U_MAX_VAL
#define USBD_STR_IX_NONE DEF_INT_08U_MAX_VAL
#define USBD_STR_NBR_TOT (USBD_CFG_MAX_NBR_STR - 1u)
#define USBD_CLASS_NBR_NONE DEF_INT_08U_MAX_VAL
/*
*********************************************************************************************************
* USB CORE EVENTS
*
* Note(s) : (1) There are 7 possible USB callback events:
*
* USBD_EventReset(),
* USBD_EventResetCmpl(),
* USBD_EventSuspend(),
* USBD_EventResume(),
* USBD_EventConn(),
* USBD_EventDisconn(),
* USBD_EventHS().
*********************************************************************************************************
*/
#define USBD_CORE_EVENT_BUS_NBR 7u /* Number of bus events per controller. */
/* Total number of bus events. */
#define USBD_CORE_EVENT_BUS_NBR_TOTAL (USBD_CFG_MAX_NBR_DEV * USBD_CORE_EVENT_BUS_NBR)
/* Total number of USB request blocks (URB). */
#define USBD_CORE_EVENT_URB_NBR_TOTAL (USBD_CFG_MAX_NBR_DEV * (USBD_CFG_MAX_NBR_EP_OPEN + USBD_CFG_MAX_NBR_URB_EXTRA))
#define USBD_CORE_EVENT_NBR_TOTAL (USBD_CORE_EVENT_BUS_NBR_TOTAL + \
USBD_CORE_EVENT_URB_NBR_TOTAL)
/*
*********************************************************************************************************
* DATA TYPES
*********************************************************************************************************
*/
/*
*********************************************************************************************************
* FORWARD DECLARATIONS
*********************************************************************************************************
*/
typedef struct usbd_drv USBD_DRV;
typedef const struct usbd_drv_api USBD_DRV_API;
/*
*********************************************************************************************************
* USB DEVICE SPEED DATA TYPE
*
* Note(s) : (1) 'Universal Serial Bus Specification Rev 2.0', section 4.2.1 defines three data rates:
*
* (a) The USB Low-Speed (LS) signaling bit rate is 1.5 Mb/s.
*
* (b) The USB Full-Speed (FS) signaling bit rate is 12 Mb/s.
*
* (c) The USB High-Speed (HS) signaling bit rate is 480 Mb/s.
*********************************************************************************************************
*/
typedef enum usbd_dev_spd {
USBD_DEV_SPD_INVALID = 0,
USBD_DEV_SPD_LOW, /* Low-Speed (see Note #1a). */
USBD_DEV_SPD_FULL, /* Full-Speed (see Note #1b). */
USBD_DEV_SPD_HIGH /* High-Speed (see Note #1c). */
} USBD_DEV_SPD;
/*
*********************************************************************************************************
* USB DEVICE STATES DATA TYPE
*
* Note(s) : (1) 'Universal Serial Bus Specification Rev 2.0', section 9.1.1 defines seven visible device
* states:
*
* (a) USBD_DEV_STATE_INIT : Device is not attached to the USB.
*
* (b) USBD_DEV_STATE_ATTACHED : Device is attached to the USB, but not powered.
*
* (c) USBD_DEV_STATE_POWERED : Device is attached to the USB and powered, but has not
* been reset.
*
* (d) USBD_DEV_STATE_DEFAULT : Device is attached to the USB and powered and has been
* reset, but has not been assigned a unique address.
* Device responds at the default address.
*
* (e) USBD_DEV_STATE_ADDRESSED : Device is attached to the USB, powered, has been reset,
* and a unique device address has been assigned. Device
* is not configured.
*
* (f) USBD_DEV_STATE_CONFIGURED : Device is attached to the USB, powered, has been reset,
* has a unique address, is configured, and is not suspended.
* The host may now use the function provided by the device.
*
* (g) USBD_DEV_STATE_SUSPENDED : Device is, at minimum, attached to the USB and is powered
* and has not seen bus activity for 3 ms. It may also have
* a unique address and be configured for use. However,
* because the device is suspended, the host may not use the
* device's function.
*
* (2) An additional state is added (USBD_DEV_STATE_STOPPING) to signal the device controller
* has started a shutdown sequence.
*********************************************************************************************************
*/
typedef enum usbd_dev_state {
USBD_DEV_STATE_NONE = 0,
USBD_DEV_STATE_INIT,
USBD_DEV_STATE_ATTACHED,
USBD_DEV_STATE_DEFAULT,
USBD_DEV_STATE_ADDRESSED,
USBD_DEV_STATE_CONFIGURED,
USBD_DEV_STATE_SUSPENDED,
USBD_DEV_STATE_STOPPING
} USBD_DEV_STATE;
/*
*********************************************************************************************************
* DEVICE EVENT CALLBACKS
*********************************************************************************************************
*/
typedef const struct usbd_bus_fncts { /* --------- DEVICE EVENT CALLBACKS STRUCTURE --------- */
void (*Reset) (CPU_INT08U dev_nbr); /* Notify application about reset event. */
void (*Suspend)(CPU_INT08U dev_nbr); /* Notify application about suspend event. */
void (*Resume) (CPU_INT08U dev_nbr); /* Notify application about resume event. */
void (*CfgSet) (CPU_INT08U dev_nbr, /* Notify application about configured state. */
CPU_INT08U cfg_val);
void (*CfgClr) (CPU_INT08U dev_nbr, /* Notify application about de-configured state. */
CPU_INT08U cfg_val);
void (*Conn) (CPU_INT08U dev_nbr); /* Notify application about device connect. */
void (*Disconn)(CPU_INT08U dev_nbr); /* Notify application about device disconnect. */
} USBD_BUS_FNCTS;
/*
*********************************************************************************************************
* USB DEVICE CONFIGURATION DATA TYPE
*********************************************************************************************************
*/
typedef struct usbd_dev_cfg {
CPU_INT16U VendorID; /* Vendor ID. */
CPU_INT16U ProductID; /* Product ID. */
CPU_INT16U DeviceBCD; /* Device release number. */
const CPU_CHAR *ManufacturerStrPtr; /* Manufacturer string. */
CPU_CHAR *ProductStrPtr; /* Product string. */
CPU_CHAR *SerialNbrStrPtr; /* Serial Number ID. */
CPU_INT16U LangId; /* Language ID. */
} USBD_DEV_CFG;
/*
*********************************************************************************************************
* USB DEVICE MICROSOFT XTENDED PROPERTIES DATA TYPE
*********************************************************************************************************
*/
#if (USBD_CFG_MS_OS_DESC_EN == DEF_ENABLED)
typedef struct usbd_ms_os_ext_property {
CPU_INT08U PropertyType;
const CPU_INT08U *PropertyNamePtr;
CPU_INT16U PropertyNameLen;
const CPU_INT08U *PropertyPtr;
CPU_INT32U PropertyLen;
} USBD_MS_OS_EXT_PROPERTY;
#endif
/*
*********************************************************************************************************
* USB SETUP REQUEST
*********************************************************************************************************
*/
typedef struct usbd_setup_req {
CPU_INT08U bmRequestType; /* Characteristics of request. */
CPU_INT08U bRequest; /* Specific request. */
CPU_INT16U wValue; /* Varies according to request. */
CPU_INT16U wIndex; /* Varies according to request; typically used as index.*/
CPU_INT16U wLength; /* Transfer length if data stage present. */
} USBD_SETUP_REQ;
/*
*********************************************************************************************************
* USB DEVICE CONTROLLER BSP API
*********************************************************************************************************
*/
typedef const struct usbd_drv_bsp_api {
void (*Init) (USBD_DRV *p_drv); /* Initialize. */
void (*Conn) (void); /* Connect. */
void (*Disconn)(void); /* Disconnect. */
} USBD_DRV_BSP_API;
/*
*********************************************************************************************************
* ENDPOINT INFORMATION DATA TYPE
*
* Note(s) : (1) The endpoint information data type provides information about the USB device controller
* physical EPs.
*
* (a) The 'Attrib' bit-field defines the EP attributes. The EP attributes is combination
* of the following flags:
*
* USBD_EP_INFO_TYPE_CTRL Indicate control type capable.
* USBD_EP_INFO_TYPE_ISOC Indicate isochronous type capable.
* USBD_EP_INFO_TYPE_BULK Indicate bulk type capable.
* USBD_EP_INFO_TYPE_INTR Indicate interrupt type capable.
* USBD_EP_INFO_DIR_OUT Indicate OUT direction capable.
* USBD_EP_INFO_DIR_IN Indicate IN direction capable.
*********************************************************************************************************
*/
typedef const struct usbd_drv_ep_info {
CPU_INT08U Attrib; /* Endpoint attributes (see Note #1a). */
CPU_INT08U Nbr; /* Endpoint number. */
CPU_INT16U MaxPktSize; /* Endpoint maximum packet size. */
} USBD_DRV_EP_INFO;
/*
*********************************************************************************************************
* USB DEVICE DRIVER CONFIGURATION DATA TYPE
*********************************************************************************************************
*/
typedef const struct usbd_drv_cfg {
CPU_ADDR BaseAddr; /* Base address of device controller hardware registers.*/
CPU_ADDR MemAddr; /* Base address of device controller dedicated memory. */
CPU_ADDR MemSize; /* Size of device controller dedicated memory. */
USBD_DEV_SPD Spd; /* Speed of device controller. */
USBD_DRV_EP_INFO *EP_InfoTbl; /* Device controller EP information table. */
} USBD_DRV_CFG;
/*
*********************************************************************************************************
* USB DEVICE DRIVER DATA TYPE
*********************************************************************************************************
*/
struct usbd_drv {
CPU_INT08U DevNbr;
USBD_DRV_API *API_Ptr; /* Device controller API. */
USBD_DRV_CFG *CfgPtr; /* Device controller configuration. */
void *DataPtr; /* Device controller local data. */
USBD_DRV_BSP_API *BSP_API_Ptr; /* Device controller board specific API. */
};
/*
*********************************************************************************************************
* INTERFACE CLASS DRIVER
*********************************************************************************************************
*/
typedef const struct usbd_class_drv {
/* Notify class that cfg is active. */
void (*Conn) ( CPU_INT08U dev_nbr,
CPU_INT08U cfg_nbr,
void *p_if_class_arg);
/* Notify class that cfg is not active. */
void (*Disconn) ( CPU_INT08U dev_nbr,
CPU_INT08U cfg_nbr,
void *p_if_class_arg);
/* Notify class that alt setting has been updated. */
void (*AltSettingUpdate)( CPU_INT08U dev_nbr,
CPU_INT08U cfg_nbr,
CPU_INT08U if_nbr,
CPU_INT08U if_alt_nbr,
void *p_if_class_arg,
void *p_if_alt_class_arg);
/* Notify class that EP state has been updated. */
void (*EP_StateUpdate) ( CPU_INT08U dev_nbr,
CPU_INT08U cfg_nbr,
CPU_INT08U if_nbr,
CPU_INT08U if_alt_nbr,
CPU_INT08U ep_addr,
void *p_if_class_arg,
void *p_if_alt_class_arg);
/* Construct IF functional descriptor. */
void (*IF_Desc) ( CPU_INT08U dev_nbr,
CPU_INT08U cfg_nbr,
CPU_INT08U if_nbr,
CPU_INT08U if_alt_nbr,
void *p_if_class_arg,
void *p_if_alt_class_arg);
/* Get size of IF functional descriptor. */
CPU_INT16U (*IF_DescSizeGet) ( CPU_INT08U dev_nbr,
CPU_INT08U cfg_nbr,
CPU_INT08U if_nbr,
CPU_INT08U if_alt_nbr,
void *p_if_class_arg,
void *p_if_alt_class_arg);
/* Construct EP functional descriptor. */
void (*EP_Desc) ( CPU_INT08U dev_nbr,
CPU_INT08U cfg_nbr,
CPU_INT08U if_nbr,
CPU_INT08U if_alt_nbr,
CPU_INT08U ep_addr,
void *p_if_class_arg,
void *p_if_alt_class_arg);
/* Get size of EP functional descriptor. */
CPU_INT16U (*EP_DescSizeGet) ( CPU_INT08U dev_nbr,
CPU_INT08U cfg_nbr,
CPU_INT08U if_nbr,
CPU_INT08U if_alt_nbr,
CPU_INT08U ep_addr,
void *p_if_class_arg,
void *p_if_alt_class_arg);
/* Interface request callback. */
CPU_BOOLEAN (*IF_Req) ( CPU_INT08U dev_nbr,
const USBD_SETUP_REQ *p_setup_req,
void *p_if_class_arg);
/* Class-specific request callback. */
CPU_BOOLEAN (*ClassReq) ( CPU_INT08U dev_nbr,
const USBD_SETUP_REQ *p_setup_req,
void *p_if_class_arg);
/* Vendor-specific request callback. */
CPU_BOOLEAN (*VendorReq) ( CPU_INT08U dev_nbr,
const USBD_SETUP_REQ *p_setup_req,
void *p_if_class_arg);
#if (USBD_CFG_MS_OS_DESC_EN == DEF_ENABLED)
/* Get MS compatible ID nbr. */
CPU_INT08U (*MS_GetCompatID) ( CPU_INT08U dev_nbr,
CPU_INT08U *p_sub_compat_id_ix,
void *p_if_class_arg);
/* Get MS ext properties. */
CPU_INT08U (*MS_GetExtPropertyTbl)( CPU_INT08U dev_nbr,
USBD_MS_OS_EXT_PROPERTY **pp_ext_property_tbl,
void *p_if_class_arg);
#endif
} USBD_CLASS_DRV;
/*
*********************************************************************************************************
* EP ASYNCHRONOUS CALLBACK API
*********************************************************************************************************
*/
typedef void (*USBD_ASYNC_FNCT)(CPU_INT08U dev_nbr, /* Device number. */
CPU_INT08U ep_addr, /* Endpoint address. */
void *p_buf, /* Pointer to the buffer. */
CPU_INT32U buf_len, /* Buffer length. */
CPU_INT32U xfer_len, /* Transfer length. */
void *p_arg, /* Function argument. */
USBD_ERR err); /* Error status. */
/*
*********************************************************************************************************
* USB DEVICE DRIVER API
*********************************************************************************************************
*/
struct usbd_drv_api {
void (*Init) (USBD_DRV *p_drv, /* Initialize. */
USBD_ERR *p_err);
void (*Start) (USBD_DRV *p_drv, /* Start. */
USBD_ERR *p_err);
void (*Stop) (USBD_DRV *p_drv); /* Stop. */
CPU_BOOLEAN (*AddrSet) (USBD_DRV *p_drv, /* Set Address. */
CPU_INT08U dev_addr);
void (*AddrEn) (USBD_DRV *p_drv, /* Enable Address. */
CPU_INT08U dev_addr);
CPU_BOOLEAN (*CfgSet) (USBD_DRV *p_drv, /* Set Configuration. */
CPU_INT08U cfg_val);
void (*CfgClr) (USBD_DRV *p_drv, /* Clear Configuration. */
CPU_INT08U cfg_val);
CPU_INT16U (*FrameNbrGet)(USBD_DRV *p_drv); /* Get Frame number. */
void (*EP_Open) (USBD_DRV *p_drv, /* EP open. */
CPU_INT08U ep_addr,
CPU_INT08U ep_type,
CPU_INT16U max_pkt_size,
CPU_INT08U transaction_frame,
USBD_ERR *p_err);
void (*EP_Close) (USBD_DRV *p_drv, /* EP close. */
CPU_INT08U ep_addr);
CPU_INT32U (*EP_RxStart) (USBD_DRV *p_drv, /* EP receive start. */
CPU_INT08U ep_addr,
CPU_INT08U *p_buf,
CPU_INT32U buf_len,
USBD_ERR *p_err);
CPU_INT32U (*EP_Rx) (USBD_DRV *p_drv, /* EP receive/read data. */
CPU_INT08U ep_addr,
CPU_INT08U *p_buf,
CPU_INT32U buf_len,
USBD_ERR *p_err);
void (*EP_RxZLP) (USBD_DRV *p_drv, /* EP receive zero-length packet. */
CPU_INT08U ep_addr,
USBD_ERR *p_err);
CPU_INT32U (*EP_Tx) (USBD_DRV *p_drv, /* EP transmit/write data. */
CPU_INT08U ep_addr,
CPU_INT08U *p_buf,
CPU_INT32U buf_len,
USBD_ERR *p_err);
void (*EP_TxStart) (USBD_DRV *p_drv, /* EP transmit start. */
CPU_INT08U ep_addr,
CPU_INT08U *p_buf,
CPU_INT32U buf_len,
USBD_ERR *p_err);
void (*EP_TxZLP) (USBD_DRV *p_drv, /* EP transmit zero-length packet. */
CPU_INT08U ep_addr,
USBD_ERR *p_err);
CPU_BOOLEAN (*EP_Abort) (USBD_DRV *p_drv, /* EP abort. */
CPU_INT08U ep_addr);
CPU_BOOLEAN (*EP_Stall) (USBD_DRV *p_drv, /* EP stall. */
CPU_INT08U ep_addr,
CPU_BOOLEAN state);
void (*ISR_Handler)(USBD_DRV *p_drv); /* ISR handler. */
};
/*
*********************************************************************************************************
* GLOBAL VARIABLES
*********************************************************************************************************
*/
/*
*********************************************************************************************************
* MACROS
*********************************************************************************************************
*/
/*
*********************************************************************************************************
* FRAME MACROS
*
* Note(s) : (1) This macro takes into account when the frame number rolls over upon reaching the maximum
* value of 2047.
*********************************************************************************************************
*/
#define USBD_FRAME_NBR_GET(frame_nbr) ((frame_nbr) & USBD_FRAME_NBR_MASK)
#define USBD_MICROFRAME_NBR_GET(microframe_nbr) ((microframe_nbr) >> 11u)
/* See Note #1. */
#define USBD_FRAME_NBR_DIFF_GET(frame_nbr1, frame_nbr2) (((frame_nbr2) >= (frame_nbr1)) ? \
((frame_nbr2) - (frame_nbr1)) : \
((USBD_MAX_FRAME_NBR + 1u + (frame_nbr2)) - (frame_nbr1)))
/*
*********************************************************************************************************
* ENDPOINT CONVERSION MACROS
*********************************************************************************************************
*/
#define USBD_EP_PHY_TO_ADDR(ep_phy_nbr) ( ((ep_phy_nbr) / 2u) | \
(((ep_phy_nbr) % 2u) ? USBD_EP_DIR_BIT : DEF_BIT_NONE))
#define USBD_EP_ADDR_TO_PHY(ep_addr) ((((ep_addr) & USBD_EP_NBR_MASK) * 2u) + \
((((ep_addr) & USBD_EP_DIR_MASK) != 0u) ? 1u : 0u))
#define USBD_EP_ADDR_TO_LOG(ep_addr) (CPU_INT08U)((ep_addr) & USBD_EP_NBR_MASK)
#define USBD_EP_PHY_TO_LOG(ep_phy_nbr) (ep_phy_nbr / 2u)
#define USBD_EP_LOG_TO_ADDR_IN(ep_log_nbr) ((ep_log_nbr) | USBD_EP_DIR_IN)
#define USBD_EP_LOG_TO_ADDR_OUT(ep_log_nbr) ((ep_log_nbr) | USBD_EP_DIR_OUT)
#define USBD_EP_IS_IN(ep_addr) ((((ep_addr) & USBD_EP_DIR_MASK) != 0u) ? DEF_YES: DEF_NO)
/*
*********************************************************************************************************
* DEBUG TRACE MACROS
*********************************************************************************************************
*/
#if (USBD_CFG_DBG_TRACE_EN == DEF_ENABLED)
#define USBD_DBG_GENERIC(msg, ep_addr, if_nbr) USBD_Dbg((msg), \
(ep_addr), \
(if_nbr), \
USBD_ERR_NONE)
#define USBD_DBG_GENERIC_ERR(msg, ep_addr, if_nbr, err) USBD_Dbg((msg), \
(ep_addr), \
(if_nbr), \
(err))
#define USBD_DBG_GENERIC_ARG(msg, ep_addr, if_nbr, arg) USBD_DbgArg((msg), \
(ep_addr), \
(if_nbr), \
(CPU_INT32U)(arg), \
(USBD_ERR_NONE))
#define USBD_DBG_GENERIC_ARG_ERR(msg, ep_addr, if_nbr, arg, err) USBD_DbgArg((msg), \
(ep_addr), \
(if_nbr), \
(CPU_INT32U)(arg), \
(err))
#else
#define USBD_DBG_GENERIC(msg, epp_addr, if_nbr)
#define USBD_DBG_GENERIC_ERR(msg, epp_addr, if_nbr, err)
#define USBD_DBG_GENERIC_ARG(msg, epp_addr, if_nbr, arg)
#define USBD_DBG_GENERIC_ARG_ERR(msg, epp_addr, if_nbr, arg, err)
#endif
/*
*********************************************************************************************************
* DEBUG STATS
*********************************************************************************************************
*/
#if (USBD_CFG_DBG_STATS_EN == DEF_ENABLED)
typedef USBD_CFG_DBG_STATS_CNT_TYPE USBD_DBG_STATS_CNT; /* Adjust size of the stats cntrs. */
typedef struct usbd_dev_stats { /* ------------------- DEVICE STATS ------------------- */
CPU_INT08U DevNbr; /* Dev nbr associated with stat struct. */
USBD_DBG_STATS_CNT DevResetEventNbr; /* Nbr of reset events. */
USBD_DBG_STATS_CNT DevSuspendEventNbr; /* Nbr of suspend events. */
USBD_DBG_STATS_CNT DevResumeEventNbr; /* Nbr of resume events. */
USBD_DBG_STATS_CNT DevConnEventNbr; /* Nbr of conn events. */
USBD_DBG_STATS_CNT DevDisconnEventNbr; /* Nbr of disconn events. */
USBD_DBG_STATS_CNT DevSetupEventNbr; /* Nbr of setup events. */
USBD_DBG_STATS_CNT StdReqDevNbr; /* Nbr of std req with a recipient of 'dev'. */
USBD_DBG_STATS_CNT StdReqDevStallNbr; /* Nbr of stalled std req with a recipient of 'dev'. */
USBD_DBG_STATS_CNT StdReqIF_Nbr; /* Nbr of std req with a recipient of 'IF'. */
USBD_DBG_STATS_CNT StdReqIF_StallNbr; /* Nbr of stalled std req with a recipient of 'IF'. */
USBD_DBG_STATS_CNT StdReqEP_Nbr; /* Nbr of std req with a recipient of 'EP'. */
USBD_DBG_STATS_CNT StdReqEP_StallNbr; /* Nbr of stalled std req with a recipient of 'EP'. */
USBD_DBG_STATS_CNT StdReqClassNbr; /* Nbr of std req with a recipient of 'class'. */
USBD_DBG_STATS_CNT StdReqClassStallNbr; /* Nbr of stalled std req with a recipient of 'class'. */
USBD_DBG_STATS_CNT StdReqSetAddrNbr; /* Nbr of SET_ADDRESS std req. */
USBD_DBG_STATS_CNT StdReqSetCfgNbr; /* Nbr of SET_CONFIGURATION std req. */
USBD_DBG_STATS_CNT CtrlRxSyncExecNbr; /* Nbr of sync ctrl rx exec'd. */
USBD_DBG_STATS_CNT CtrlRxSyncSuccessNbr; /* Nbr of sync ctrl rx exec'd successfully. */
USBD_DBG_STATS_CNT CtrlTxSyncExecNbr; /* Nbr of sync ctrl tx exec'd. */
USBD_DBG_STATS_CNT CtrlTxSyncSuccessNbr; /* Nbr of sync ctrl tx exec'd successfully. */
USBD_DBG_STATS_CNT CtrlRxStatusExecNbr; /* Nbr of sync ctrl rx status exec'd. */
USBD_DBG_STATS_CNT CtrlRxStatusSuccessNbr; /* Nbr of sync ctrl rx status exec'd successfully. */
USBD_DBG_STATS_CNT CtrlTxStatusExecNbr; /* Nbr of sync ctrl tx status exec'd. */
USBD_DBG_STATS_CNT CtrlTxStatusSuccessNbr; /* Nbr of sync ctrl tx status exec'd successfully. */
USBD_DBG_STATS_CNT BulkRxSyncExecNbr; /* Nbr of sync bulk rx exec'd. */
USBD_DBG_STATS_CNT BulkRxSyncSuccessNbr; /* Nbr of sync bulk rx exec'd successfully. */
USBD_DBG_STATS_CNT BulkRxAsyncExecNbr; /* Nbr of async bulk rx exec'd. */
USBD_DBG_STATS_CNT BulkRxAsyncSuccessNbr; /* Nbr of async bulk rx exec'd successfully. */
USBD_DBG_STATS_CNT BulkTxSyncExecNbr; /* Nbr of sync bulk tx exec'd. */
USBD_DBG_STATS_CNT BulkTxSyncSuccessNbr; /* Nbr of sync bulk tx exec'd successfully. */
USBD_DBG_STATS_CNT BulkTxAsyncExecNbr; /* Nbr of async bulk tx exec'd. */
USBD_DBG_STATS_CNT BulkTxAsyncSuccessNbr; /* Nbr of async bulk tx exec'd successfully. */
USBD_DBG_STATS_CNT IntrRxSyncExecNbr; /* Nbr of sync intr rx exec'd. */
USBD_DBG_STATS_CNT IntrRxSyncSuccessNbr; /* Nbr of sync intr rx exec'd successfully. */
USBD_DBG_STATS_CNT IntrRxAsyncExecNbr; /* Nbr of async intr rx exec'd. */
USBD_DBG_STATS_CNT IntrRxAsyncSuccessNbr; /* Nbr of async intr rx exec'd successfully. */
USBD_DBG_STATS_CNT IntrTxSyncExecNbr; /* Nbr of sync intr tx exec'd. */
USBD_DBG_STATS_CNT IntrTxSyncSuccessNbr; /* Nbr of sync intr tx exec'd successfully. */
USBD_DBG_STATS_CNT IntrTxAsyncExecNbr; /* Nbr of async intr tx exec'd. */
USBD_DBG_STATS_CNT IntrTxAsyncSuccessNbr; /* Nbr of async intr tx exec'd successfully. */
#if (USBD_CFG_EP_ISOC_EN == DEF_ENABLED)
USBD_DBG_STATS_CNT IsocRxAsyncExecNbr; /* Nbr of async isoc rx exec'd. */
USBD_DBG_STATS_CNT IsocRxAsyncSuccessNbr; /* Nbr of async isoc rx exec'd successfully. */
USBD_DBG_STATS_CNT IsocTxAsyncExecNbr; /* Nbr of async isoc tx exec'd. */
USBD_DBG_STATS_CNT IsocTxAsyncSuccessNbr; /* Nbr of async isoc tx exec'd successfully. */
#endif
} USBD_DBG_STATS_DEV;
typedef struct usbd_ep_stats { /* --------------------- EP STATS --------------------- */
CPU_INT08U Addr; /* EP address. */
USBD_DBG_STATS_CNT EP_OpenNbr; /* Nbr of times this EP addr has been opened. */
USBD_DBG_STATS_CNT EP_AbortExecNbr; /* Nbr of times EP has been aborted. */
USBD_DBG_STATS_CNT EP_AbortSuccessNbr; /* Nbr of times EP has been aborted successfully. */
USBD_DBG_STATS_CNT EP_CloseExecNbr; /* Nbr of times EP has been closed. */
USBD_DBG_STATS_CNT EP_CloseSuccessNbr; /* Nbr of times EP has been closed successfully. */
USBD_DBG_STATS_CNT RxSyncExecNbr; /* Nbr of sync rx exec'd. */
USBD_DBG_STATS_CNT RxSyncSuccessNbr; /* Nbr of sync rx exec'd successfully. */
USBD_DBG_STATS_CNT RxSyncTimeoutErrNbr; /* Nbr of sync rx that timed-out. */
USBD_DBG_STATS_CNT RxAsyncExecNbr; /* Nbr of async rx exec'd. */
USBD_DBG_STATS_CNT RxAsyncSuccessNbr; /* Nbr of async rx exec'd successfully. */
USBD_DBG_STATS_CNT RxZLP_ExecNbr; /* Nbr of sync rx ZLP exec'd. */
USBD_DBG_STATS_CNT RxZLP_SuccessNbr; /* Nbr of sync rx ZLP exec'd successfully. */
USBD_DBG_STATS_CNT TxSyncExecNbr; /* Nbr of sync tx exec'd. */
USBD_DBG_STATS_CNT TxSyncSuccessNbr; /* Nbr of sync tx exec'd successfully. */
USBD_DBG_STATS_CNT TxSyncTimeoutErrNbr; /* Nbr of sync tx that timed-out. */
USBD_DBG_STATS_CNT TxAsyncExecNbr; /* Nbr of async tx exec'd. */
USBD_DBG_STATS_CNT TxAsyncSuccessNbr; /* Nbr of async tx exec'd successfully. */
USBD_DBG_STATS_CNT TxZLP_ExecNbr; /* Nbr of sync tx ZLP exec'd. */
USBD_DBG_STATS_CNT TxZLP_SuccessNbr; /* Nbr of sync tx ZLP exec'd successfully. */
USBD_DBG_STATS_CNT DrvRxStartNbr; /* Nbr of call to drv's RxStart(). */
USBD_DBG_STATS_CNT DrvRxStartSuccessNbr; /* Nbr of successful call to drv's RxStart(). */
USBD_DBG_STATS_CNT DrvRxNbr; /* Nbr of call to drv's Rx(). */
USBD_DBG_STATS_CNT DrvRxSuccessNbr; /* Nbr of successful call to drv's Rx(). */
USBD_DBG_STATS_CNT DrvRxZLP_Nbr; /* Nbr of call to drv's RxZLP(). */
USBD_DBG_STATS_CNT DrvRxZLP_SuccessNbr; /* Nbr of successful call to drv's RxZLP(). */
USBD_DBG_STATS_CNT RxCmplNbr; /* Nbr of call to RxCmpl(). */
USBD_DBG_STATS_CNT RxCmplErrNbr; /* Nbr of successful call to RxCmpl(). */
USBD_DBG_STATS_CNT DrvTxNbr; /* Nbr of call to drv's Tx(). */
USBD_DBG_STATS_CNT DrvTxSuccessNbr; /* Nbr of successful call to drv's Tx(). */
USBD_DBG_STATS_CNT DrvTxStartNbr; /* Nbr of call to drv's TxStart(). */
USBD_DBG_STATS_CNT DrvTxStartSuccessNbr; /* Nbr of successful call to drv's TxStart(). */
USBD_DBG_STATS_CNT DrvTxZLP_Nbr; /* Nbr of call to drv's TxZLP(). */
USBD_DBG_STATS_CNT DrvTxZLP_SuccessNbr; /* Nbr of successful call to drv's TxZLP(). */
USBD_DBG_STATS_CNT TxCmplNbr; /* Nbr of call to TxCmpl(). */
USBD_DBG_STATS_CNT TxCmplErrNbr; /* Nbr of successful call to TxCmpl(). */
} USBD_DBG_STATS_EP;
extern USBD_DBG_STATS_DEV USBD_DbgStatsDevTbl[USBD_CFG_MAX_NBR_DEV];
extern USBD_DBG_STATS_EP USBD_DbgStatsEP_Tbl[USBD_CFG_MAX_NBR_DEV][USBD_CFG_MAX_NBR_EP_OPEN];
#define USBD_DBG_STATS_DEV_RESET(dev_nbr) { \
Mem_Clr((void *)&USBD_DbgStatsDevTbl[dev_nbr], \
(CPU_SIZE_T) sizeof(USBD_DBG_STATS_DEV)); \
}
#define USBD_DBG_STATS_DEV_SET_DEV_NBR(dev_nbr) { \
USBD_DbgStatsDevTbl[dev_nbr].DevNbr = dev_nbr; \
}
#define USBD_DBG_STATS_DEV_SET(dev_nbr, stat, val) { \
USBD_DbgStatsDevTbl[dev_nbr].stat = val; \
}
#define USBD_DBG_STATS_DEV_GET(dev_nbr, stat) { \
USBD_DbgStatsDevTbl[dev_nbr].stat; \
}
#define USBD_DBG_STATS_DEV_INC(dev_nbr, stat) { \
USBD_DbgStatsDevTbl[dev_nbr].stat++; \
}
#define USBD_DBG_STATS_DEV_INC_IF_TRUE(dev_nbr, stat, bool) { \
if (bool == DEF_TRUE) { \
USBD_DBG_STATS_DEV_INC(dev_nbr, stat); \
} \
}
#define USBD_DBG_STATS_EP_RESET(dev_nbr, ep_ix) { \
Mem_Clr((void *)&USBD_DbgStatsEP_Tbl[dev_nbr][ep_ix], \
(CPU_SIZE_T) sizeof(USBD_DBG_STATS_EP)); \
}
#define USBD_DBG_STATS_EP_SET_ADDR(dev_nbr, ep_ix, addr) { \
USBD_DbgStatsEP_Tbl[dev_nbr][ep_ix].Addr = addr; \
}
#define USBD_DBG_STATS_EP_SET(dev_nbr, ep_ix, stat, val) { \
USBD_DbgStatsEP_Tbl[dev_nbr][ep_ix].stat = val; \
}
#define USBD_DBG_STATS_EP_GET(dev_nbr, ep_ix, stat) USBD_DbgStatsEP_Tbl[dev_nbr][ep_ix].stat
#define USBD_DBG_STATS_EP_INC(dev_nbr, ep_ix, stat) { \
USBD_DbgStatsEP_Tbl[dev_nbr][ep_ix].stat++; \
}
#define USBD_DBG_STATS_EP_INC_IF_TRUE(dev_nbr, ep_ix, stat, bool) { \
if (bool == DEF_TRUE) { \
USBD_DBG_STATS_EP_INC(dev_nbr, ep_ix, stat); \
} \
}
#else
#define USBD_DBG_STATS_DEV_RESET(dev_nbr)
#define USBD_DBG_STATS_DEV_SET_DEV_NBR(dev_nbr)
#define USBD_DBG_STATS_DEV_SET(dev_nbr, stat, val)
#define USBD_DBG_STATS_DEV_GET(dev_nbr, stat)
#define USBD_DBG_STATS_DEV_INC(dev_nbr, stat)
#define USBD_DBG_STATS_DEV_INC_IF_TRUE(dev_nbr, stat, bool)
#define USBD_DBG_STATS_EP_RESET(dev_nbr, ep_ix)
#define USBD_DBG_STATS_EP_SET_ADDR(dev_nbr, ep_ix, addr)
#define USBD_DBG_STATS_EP_SET(dev_nbr, ep_ix, stat, val)
#define USBD_DBG_STATS_EP_GET(dev_nbr, ep_ix, stat)
#define USBD_DBG_STATS_EP_INC(dev_nbr, ep_ix, stat)
#define USBD_DBG_STATS_EP_INC_IF_TRUE(dev_nbr, ep_ix, stat, bool)
#endif
/*
*********************************************************************************************************
* FUNCTION PROTOTYPES
*
* Note(s) : (1) USB Spec 2.0, Section 5.5 states "Control transfers allow access to different parts of
* a device. Control transfers are intended to support configuration/command/status type
* communication flows between client software and its function".
*
* (a) "Each USB device is required to implement the Default Control Pipe as a message
* pipe. This pipe is used by the USB System Software. The Default Control Pipe
* provides access to the USB device's configuration, status, and control information".
*
* The 'USBD_EP_CtrlXXXX()' functions perform operations in the default endpoint.
* Class drivers should use 'USBD_EP_CtrlXXXX()' to send/receive class specific requests.
*********************************************************************************************************
*/
void USBD_Init ( USBD_ERR *p_err);
#if !CONFIG_OS
void USBD_CoreTaskHandler ( void );
#endif
CPU_INT16U USBD_VersionGet ( void );
/* ----------------- DEVICE OPERATIONS ---------------- */
void USBD_DevStart ( CPU_INT08U dev_nbr,
USBD_ERR *p_err);
void USBD_DevStop ( CPU_INT08U dev_nbr,
USBD_ERR *p_err);
USBD_DEV_STATE USBD_DevStateGet ( CPU_INT08U dev_nbr,
USBD_ERR *p_err);
USBD_DEV_SPD USBD_DevSpdGet ( CPU_INT08U dev_nbr,
USBD_ERR *p_err);
void USBD_DevSelfPwrSet ( CPU_INT08U dev_nbr,
CPU_BOOLEAN self_pwr,
USBD_ERR *p_err);
void USBD_DevSetMS_VendorCode( CPU_INT08U dev_nbr,
CPU_INT08U vendor_code,
USBD_ERR *p_err);
USBD_DEV_CFG *USBD_DevCfgGet ( CPU_INT08U dev_nbr,
USBD_ERR *p_err);
#if 0
void USBD_DevWaitForCfg ( CPU_INT08U dev_nbr,
CPU_INT16U retry_max,
CPU_INT32U time_dly_ms,
USBD_ERR *p_err);
#endif
CPU_INT08U USBD_DevAdd ( USBD_DEV_CFG *p_dev_cfg,
USBD_BUS_FNCTS *p_bus_fnct,
USBD_DRV_API *p_drv_api,
USBD_DRV_CFG *p_drv_cfg,
USBD_DRV_BSP_API *p_bsp_api,
USBD_ERR *p_err);
CPU_INT16U USBD_DevFrameNbrGet ( CPU_INT08U dev_nbr,
USBD_ERR *p_err);
/* ------------- CONFIGUARTION OPERATIONS ------------- */
CPU_INT08U USBD_CfgAdd ( CPU_INT08U dev_nbr,
CPU_INT08U attrib,
CPU_INT16U max_pwr,
USBD_DEV_SPD spd,
const CPU_CHAR *p_name,
USBD_ERR *p_err);
#if (USBD_CFG_HS_EN == DEF_ENABLED)
void USBD_CfgOtherSpeed ( CPU_INT08U dev_nbr,
CPU_INT08U cfg_nbr,
CPU_INT08U cfg_other,
USBD_ERR *p_err);
#endif
/* --------------- INTERFACE OPERATIONS --------------- */
CPU_INT08U USBD_IF_Add ( CPU_INT08U dev_nbr,
CPU_INT08U cfg_nbr,
USBD_CLASS_DRV *p_class_drv,
void *p_if_class_arg,
void *p_if_alt_class_arg,
CPU_INT08U class_code,
CPU_INT08U class_sub_code,
CPU_INT08U class_protocol_code,
const CPU_CHAR *p_name,
USBD_ERR *p_err);
CPU_INT08U USBD_IF_AltAdd ( CPU_INT08U dev_nbr,
CPU_INT08U cfg_nbr,
CPU_INT08U if_nbr,
void *p_class_arg,
const CPU_CHAR *p_name,
USBD_ERR *p_err);
#if (USBD_CFG_MAX_NBR_IF_GRP > 0)
CPU_INT08U USBD_IF_Grp ( CPU_INT08U dev_nbr,
CPU_INT08U cfg_nbr,
CPU_INT08U class_code,
CPU_INT08U class_sub_code,
CPU_INT08U class_protocol_code,
CPU_INT08U if_start,
CPU_INT08U if_cnt,
const CPU_CHAR *p_name,
USBD_ERR *p_err);
#endif
CPU_INT08U USBD_DescDevGet ( USBD_DRV *p_drv,
CPU_INT08U *p_buf,
CPU_INT08U max_len,
USBD_ERR *p_err);
CPU_INT16U USBD_DescCfgGet ( USBD_DRV *p_drv,
CPU_INT08U *p_buf,
CPU_INT16U max_len,
CPU_INT08U cfg_ix,
USBD_ERR *p_err);
CPU_INT08U USBD_DescStrGet ( USBD_DRV *p_drv,
CPU_INT08U *p_buf,
CPU_INT08U max_len,
CPU_INT08U str_ix,
USBD_ERR *p_err);
/* ---------------- STRING OPERATIONS ----------------- */
void USBD_StrAdd ( CPU_INT08U dev_nbr,
const CPU_CHAR *p_str,
USBD_ERR *p_err);
CPU_INT08U USBD_StrIxGet ( CPU_INT08U dev_nbr,
const CPU_CHAR *p_str);
/* ----------- DESCRIPTOR BUFFER OPERATIONS ----------- */
void USBD_DescWr08 ( CPU_INT08U dev_nbr,
CPU_INT08U val);
void USBD_DescWr16 ( CPU_INT08U dev_nbr,
CPU_INT16U val);
void USBD_DescWr24 ( CPU_INT08U dev_nbr,
CPU_INT32U val);
void USBD_DescWr32 ( CPU_INT08U dev_nbr,
CPU_INT32U val);
void USBD_DescWr ( CPU_INT08U dev_nbr,
const CPU_INT08U *p_buf,
CPU_INT16U len);
/* ---------------- ENDPOINT OPERATIONS --------------- */
CPU_INT32U USBD_CtrlTx ( CPU_INT08U dev_nbr,
void *p_buf,
CPU_INT32U buf_len,
CPU_INT16U timeout_ms,
CPU_BOOLEAN end,
USBD_ERR *p_err);
CPU_INT32U USBD_CtrlRx ( CPU_INT08U dev_nbr,
void *p_buf,
CPU_INT32U buf_len,
CPU_INT16U timeout_ms,
USBD_ERR *p_err);
/* -------------- BULK TRANFER FUNCTIONS -------------- */
CPU_INT08U USBD_BulkAdd ( CPU_INT08U dev_nbr,
CPU_INT08U cfg_nbr,
CPU_INT08U if_nbr,
CPU_INT08U if_alt_nbr,
CPU_BOOLEAN dir_in,
CPU_INT16U max_pkt_len,
USBD_ERR *p_err);
CPU_INT32U USBD_BulkRx ( CPU_INT08U dev_nbr,
CPU_INT08U ep_addr,
void *p_buf,
CPU_INT32U buf_len,
CPU_INT16U timeout_ms,
USBD_ERR *p_err);
void USBD_BulkRxAsync ( CPU_INT08U dev_nbr,
CPU_INT08U ep_addr,
void *p_buf,
CPU_INT32U buf_len,
USBD_ASYNC_FNCT async_fnct,
void *p_async_arg,
USBD_ERR *p_err);
CPU_INT32U USBD_BulkTx ( CPU_INT08U dev_nbr,
CPU_INT08U ep_addr,
void *p_buf,
CPU_INT32U buf_len,
CPU_INT16U timeout_ms,
CPU_BOOLEAN end,
USBD_ERR *p_err);
void USBD_BulkTxAsync ( CPU_INT08U dev_nbr,
CPU_INT08U ep_addr,
void *p_buf,
CPU_INT32U buf_len,
USBD_ASYNC_FNCT async_fnct,
void *p_async_arg,
CPU_BOOLEAN end,
USBD_ERR *p_err);
/* ------------ INTERRUPT TRANFER FUNCTIONS ----------- */
CPU_INT08U USBD_IntrAdd ( CPU_INT08U dev_nbr,
CPU_INT08U cfg_nbr,
CPU_INT08U if_nbr,
CPU_INT08U if_alt_nbr,
CPU_BOOLEAN dir_in,
CPU_INT16U max_pkt_len,
CPU_INT16U interval,
USBD_ERR *p_err);
CPU_INT32U USBD_IntrRx ( CPU_INT08U dev_nbr,
CPU_INT08U ep_addr,
void *p_buf,
CPU_INT32U buf_len,
CPU_INT16U timeout_ms,
USBD_ERR *p_err);
void USBD_IntrRxAsync ( CPU_INT08U dev_nbr,
CPU_INT08U ep_addr,
void *p_buf,
CPU_INT32U buf_len,
USBD_ASYNC_FNCT async_fnct,
void *p_async_arg,
USBD_ERR *p_err);
CPU_INT32U USBD_IntrTx ( CPU_INT08U dev_nbr,
CPU_INT08U ep_addr,
void *p_buf,
CPU_INT32U buf_len,
CPU_INT16U timeout_ms,
CPU_BOOLEAN end,
USBD_ERR *p_err);
void USBD_IntrTxAsync ( CPU_INT08U dev_nbr,
CPU_INT08U ep_addr,
void *p_buf,
CPU_INT32U buf_len,
USBD_ASYNC_FNCT async_fnct,
void *p_async_arg,
CPU_BOOLEAN end,
USBD_ERR *p_err);
#if (USBD_CFG_EP_ISOC_EN == DEF_ENABLED)
/* ----------- ISOCHRONOUS TRANFER FUNCTIONS ---------- */
CPU_INT08U USBD_IsocAdd ( CPU_INT08U dev_nbr,
CPU_INT08U cfg_nbr,
CPU_INT08U if_nbr,
CPU_INT08U if_alt_nbr,
CPU_BOOLEAN dir_in,
CPU_INT08U attrib,
CPU_INT16U max_pkt_len,
CPU_INT08U transaction_frame,
CPU_INT16U interval,
USBD_ERR *p_err);
void USBD_IsocRxAsync ( CPU_INT08U dev_nbr,
CPU_INT08U ep_addr,
void *p_buf,
CPU_INT32U buf_len,
USBD_ASYNC_FNCT async_fnct,
void *p_async_arg,
USBD_ERR *p_err);
void USBD_IsocTxAsync ( CPU_INT08U dev_nbr,
CPU_INT08U ep_addr,
void *p_buf,
CPU_INT32U buf_len,
USBD_ASYNC_FNCT async_fnct,
void *p_async_arg,
USBD_ERR *p_err);
void USBD_IsocSyncRefreshSet ( CPU_INT08U dev_nbr,
CPU_INT08U cfg_nbr,
CPU_INT08U if_nbr,
CPU_INT08U if_alt_nbr,
CPU_INT08U synch_ep_addr,
CPU_INT08U sync_refresh,
USBD_ERR *p_err);
void USBD_IsocSyncAddrSet ( CPU_INT08U dev_nbr,
CPU_INT08U cfg_nbr,
CPU_INT08U if_nbr,
CPU_INT08U if_alt_nbr,
CPU_INT08U data_ep_addr,
CPU_INT08U sync_addr,
USBD_ERR *p_err);
#endif
/* ------------ STANDARD ENDPOINT FUNCTIONS ----------- */
void USBD_EP_TxZLP ( CPU_INT08U dev_nbr,
CPU_INT08U ep_addr,
CPU_INT16U timeout_ms,
USBD_ERR *p_err);
void USBD_EP_RxZLP ( CPU_INT08U dev_nbr,
CPU_INT08U ep_addr,
CPU_INT16U timeout_ms,
USBD_ERR *p_err);
void USBD_EP_Abort ( CPU_INT08U dev_nbr,
CPU_INT08U ep_addr,
USBD_ERR *p_err);
void USBD_EP_RxCmpl ( USBD_DRV *p_drv,
CPU_INT08U ep_log_nbr);
void USBD_EP_TxCmpl ( USBD_DRV *p_drv,
CPU_INT08U ep_log_nbr);
void USBD_EP_TxCmplExt ( USBD_DRV *p_drv,
CPU_INT08U ep_log_nbr,
USBD_ERR xfer_err);
void USBD_EP_Stall ( CPU_INT08U dev_nbr,
CPU_INT08U ep_addr,
CPU_BOOLEAN state,
USBD_ERR *p_err);
CPU_BOOLEAN USBD_EP_IsStalled ( CPU_INT08U dev_nbr,
CPU_INT08U ep_addr,
USBD_ERR *p_err);
CPU_INT16U USBD_EP_MaxPktSizeGet ( CPU_INT08U dev_nbr,
CPU_INT08U ep_addr,
USBD_ERR *p_err);
CPU_INT08U USBD_EP_MaxPhyNbrGet ( CPU_INT08U dev_nbr);
CPU_INT08U USBD_EP_MaxNbrOpenGet ( CPU_INT08U dev_nbr);
/* -------------- DEVICE DRIVER CALLBACKS ------------- */
void USBD_EventConn ( USBD_DRV *p_drv);
void USBD_EventDisconn ( USBD_DRV *p_drv);
void USBD_EventHS ( USBD_DRV *p_drv);
void USBD_EventReset ( USBD_DRV *p_drv);
void USBD_EventSuspend ( USBD_DRV *p_drv);
void USBD_EventResume ( USBD_DRV *p_drv);
void USBD_EventSetup ( USBD_DRV *p_drv,
void *p_buf);
/* ------------------- OS FUNCTIONS ------------------- */
void USBD_OS_DlyMs ( CPU_INT32U ms);
#if (USBD_CFG_DBG_TRACE_EN == DEF_ENABLED)
void USBD_Dbg (const CPU_CHAR *p_msg,
CPU_INT08U ep_addr,
CPU_INT08U if_nbr,
USBD_ERR err);
void USBD_DbgArg (const CPU_CHAR *p_msg,
CPU_INT08U ep_addr,
CPU_INT08U if_nbr,
CPU_INT32U arg,
USBD_ERR err);
void USBD_Trace (const CPU_CHAR *p_str);
#endif
/*
*********************************************************************************************************
* CONFIGURATION ERRORS
*********************************************************************************************************
*/
#ifndef USBD_CFG_CTRL_REQ_TIMEOUT_mS
#error "USBD_CFG_CTRL_REQ_TIMEOUT_mS not #define'd in 'usbd_cfg.h' [MUST be > 0]"
#elif (USBD_CFG_CTRL_REQ_TIMEOUT_mS < 1u)
#error "USBD_CFG_CTRL_REQ_TIMEOUT_mS illegally #define'd in 'usbd_cfg.h' [MUST be > 0 && <= 65535]"
#elif (USBD_CFG_CTRL_REQ_TIMEOUT_mS > DEF_INT_16U_MAX_VAL)
#error "USBD_CFG_CTRL_REQ_TIMEOUT_mS illegally #define'd in 'usbd_cfg.h' [MUST be > 0 && <= 65535]"
#endif
#ifndef USBD_CFG_MAX_NBR_DEV
#error "USBD_CFG_MAX_NBR_DEV not #define'd in 'usbd_cfg.h' [MUST be > 0]"
#elif (USBD_CFG_MAX_NBR_DEV < 1u)
#error "USBD_CFG_MAX_NBR_DEV illegally #define'd in 'usbd_cfg.h' [MUST be > 0 && < USBD_DEV_NBR_TOT]"
#elif (USBD_CFG_MAX_NBR_DEV > DEF_INT_08U_MAX_VAL - 1u)
#error "USBD_CFG_MAX_NBR_DEV illegally #define'd in 'usbd_cfg.h' [MUST be > 0 && < USBD_DEV_NBR_TOT]"
#endif
#ifndef USBD_CFG_MAX_NBR_CFG
#error "USBD_CFG_MAX_NBR_CFG not #define'd in 'usbd_cfg.h' [MUST be > 0]"
#elif (USBD_CFG_MAX_NBR_CFG < 1u)
#error "USBD_CFG_MAX_NBR_CFG illegally #define'd in 'usbd_cfg.h' [MUST be > 0]"
#endif
#ifndef USBD_CFG_BUF_ALIGN_OCTETS
#error "USBD_CFG_BUF_ALIGN_OCTETS not #define'd in 'usbd_cfg.h' [MUST be > 0]"
#endif
#ifndef USBD_CFG_MAX_NBR_IF
#error "USBD_CFG_MAX_NBR_IF not #define'd in 'usbd_cfg.h' [MUST be > 0]"
#elif (USBD_CFG_MAX_NBR_IF < USBD_CFG_MAX_NBR_CFG)
#error "USBD_CFG_MAX_NBR_IF illegally #define'd in 'usbd_cfg.h' [MUST be >= USBD_CFG_MAX_NBR_CFG]"
#endif
#ifndef USBD_CFG_MAX_NBR_IF_ALT
#error "USBD_CFG_MAX_NBR_IF_ALT not #define'd in 'usbd_cfg.h' [MUST be > 0]"
#elif (USBD_CFG_MAX_NBR_IF_ALT < USBD_CFG_MAX_NBR_IF)
#error "USBD_CFG_MAX_NBR_IF_ALT illegally #define'd in 'usbd_cfg.h' [MUST be >= USBD_CFG_MAX_NBR_IF]"
#endif
#ifndef USBD_CFG_MAX_NBR_IF_GRP
#error "USBD_CFG_MAX_NBR_IF_GRP not #define'd in 'usbd_cfg.h' [MUST be >= 0]"
#elif (USBD_CFG_MAX_NBR_IF_GRP < 0u)
#error "USBD_CFG_MAX_NBR_IF_GRP illegally #define'd in 'usbd_cfg.h' [MUST be >= 0]"
#endif
#ifndef USBD_CFG_MAX_NBR_EP_DESC
#error "USBD_CFG_MAX_NBR_EP_DESC not #define'd in 'usbd_cfg.h' [MUST be > 0]"
#endif
#ifndef USBD_CFG_MAX_NBR_EP_OPEN
#error "USBD_CFG_MAX_NBR_EP_OPEN not #define'd in 'usbd_cfg.h' [MUST be >= 2]"
#elif (USBD_CFG_MAX_NBR_EP_OPEN < 2u)
#error "USBD_CFG_MAX_NBR_EP_OPEN illegally #define'd in 'usbd_cfg.h' [MUST be >= 2]"
#endif
#ifndef USBD_CFG_MAX_NBR_URB_EXTRA
#error "USBD_CFG_MAX_NBR_URB_EXTRA not #define'd in 'usbd_cfg.h' [MUST be >= 0]"
#endif
#ifndef USBD_CFG_MAX_NBR_STR
#error "USBD_CFG_MAX_NBR_STR not #define'd in 'usbd_cfg.h' [MUST be >= 0]"
#elif (USBD_CFG_MAX_NBR_STR < 0u)
#error "USBD_CFG_MAX_NBR_STR illegally #define'd in 'usbd_cfg.h' [MUST be >= 0]"
#elif (USBD_CFG_MAX_NBR_STR > 100u)
#error "USBD_CFG_MAX_NBR_STR illegally #define'd in 'usbd_cfg.h' [MUST be < 100]"
#endif
#ifndef USBD_CFG_DBG_TRACE_EN
#error "USBD_CFG_DBG_TRACE_EN not #define'd in 'usbd_cfg.h' [MUST be DEF_DISABLED || DEF_ENABLED]"
#elif ((USBD_CFG_DBG_TRACE_EN != DEF_DISABLED) && \
(USBD_CFG_DBG_TRACE_EN != DEF_ENABLED ))
#error "USBD_CFG_DBG_TRACE_EN illegally #define'd in 'usbd_cfg.h' [MUST be DEF_DISABLED || DEF_ENABLED]"
#endif
#ifndef USBD_CFG_ERR_ARG_CHK_EXT_EN
#error "USBD_CFG_ERR_ARG_CHK_EXT_EN not #define'd in 'usbd_cfg.h' [MUST be DEF_DISABLED || DEF_ENABLED]"
#elif ((USBD_CFG_ERR_ARG_CHK_EXT_EN != DEF_DISABLED) && \
(USBD_CFG_ERR_ARG_CHK_EXT_EN != DEF_ENABLED ))
#error "USBD_CFG_ERR_ARG_CHK_EXT_EN illegally #define'd in 'usbd_cfg.h' [MUST be DEF_DISABLED || DEF_ENABLED]"
#endif
#ifndef USBD_CFG_MS_OS_DESC_EN
#error "USBD_CFG_MS_OS_DESC_EN not #define'd in 'usbd_cfg.h' [MUST be DEF_DISABLED || DEF_ENABLED]"
#elif ((USBD_CFG_MS_OS_DESC_EN != DEF_DISABLED) && \
(USBD_CFG_MS_OS_DESC_EN != DEF_ENABLED ))
#error "USBD_CFG_MS_OS_DESC_EN illegally #define'd in 'usbd_cfg.h' [MUST be DEF_DISABLED || DEF_ENABLED]"
#endif
#if (USBD_CFG_DBG_TRACE_EN == DEF_ENABLED)
#ifndef USBD_CFG_DBG_TRACE_NBR_EVENTS
#error "USBD_CFG_DBG_TRACE_NBR_EVENTS not #define'd in 'usbd_cfg.h' [MUST be > 0]"
#elif (USBD_CFG_DBG_TRACE_NBR_EVENTS < 1u)
#error "USBD_CFG_DBG_TRACE_NBR_EVENTS not #define'd in 'usbd_cfg.h' [MUST be > 0]"
#endif
#endif
/*
*********************************************************************************************************
* MODULE END
*********************************************************************************************************
*/
#endif