parent
2f24d3789d
commit
68dc30fccf
@ -0,0 +1,210 @@ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file usbd_cdc.h |
||||
* @author MCD Application Team |
||||
* @version V2.4.2 |
||||
* @date 11-December-2015 |
||||
* @brief header file for the usbd_cdc.c file. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© COPYRIGHT 2015 STMicroelectronics</center></h2> |
||||
* |
||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); |
||||
* You may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at: |
||||
* |
||||
* http://www.st.com/software_license_agreement_liberty_v2
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
* |
||||
****************************************************************************** |
||||
*/
|
||||
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/ |
||||
#ifndef __USB_CDC_H |
||||
#define __USB_CDC_H |
||||
|
||||
#ifdef __cplusplus |
||||
extern "C" { |
||||
#endif |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "usbd_ioreq.h" |
||||
|
||||
/** @addtogroup STM32_USB_DEVICE_LIBRARY
|
||||
* @{ |
||||
*/ |
||||
|
||||
/** @defgroup usbd_cdc
|
||||
* @brief This file is the Header file for usbd_cdc.c |
||||
* @{ |
||||
*/
|
||||
|
||||
|
||||
/** @defgroup usbd_cdc_Exported_Defines
|
||||
* @{ |
||||
*/ |
||||
#ifndef CDC_CUSTOM_EPS |
||||
#define CDC_IN_EP 0x81 /* EP1 for data IN */ |
||||
#define CDC_OUT_EP 0x01 /* EP1 for data OUT */ |
||||
#define CDC_CMD_EP 0x82 /* EP2 for CDC commands */ |
||||
#endif |
||||
|
||||
/* CDC Endpoints parameters: you can fine tune these values depending on the needed baudrates and performance. */ |
||||
#define CDC_DATA_HS_MAX_PACKET_SIZE 512 /* Endpoint IN & OUT Packet size */ |
||||
#define CDC_DATA_FS_MAX_PACKET_SIZE 64 /* Endpoint IN & OUT Packet size */ |
||||
#define CDC_CMD_PACKET_SIZE 8 /* Control Endpoint Packet size */ |
||||
|
||||
#define USB_CDC_CONFIG_DESC_SIZ 67 |
||||
#define CDC_DATA_HS_IN_PACKET_SIZE CDC_DATA_HS_MAX_PACKET_SIZE |
||||
#define CDC_DATA_HS_OUT_PACKET_SIZE CDC_DATA_HS_MAX_PACKET_SIZE |
||||
|
||||
#define CDC_DATA_FS_IN_PACKET_SIZE CDC_DATA_FS_MAX_PACKET_SIZE |
||||
#define CDC_DATA_FS_OUT_PACKET_SIZE CDC_DATA_FS_MAX_PACKET_SIZE |
||||
|
||||
/*---------------------------------------------------------------------*/ |
||||
/* CDC definitions */ |
||||
/*---------------------------------------------------------------------*/ |
||||
#define CDC_SEND_ENCAPSULATED_COMMAND 0x00 |
||||
#define CDC_GET_ENCAPSULATED_RESPONSE 0x01 |
||||
#define CDC_SET_COMM_FEATURE 0x02 |
||||
#define CDC_GET_COMM_FEATURE 0x03 |
||||
#define CDC_CLEAR_COMM_FEATURE 0x04 |
||||
#define CDC_SET_LINE_CODING 0x20 |
||||
#define CDC_GET_LINE_CODING 0x21 |
||||
#define CDC_SET_CONTROL_LINE_STATE 0x22 |
||||
#define CDC_SEND_BREAK 0x23 |
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
|
||||
/** @defgroup USBD_CORE_Exported_TypesDefinitions
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
typedef struct |
||||
{ |
||||
uint32_t bitrate; |
||||
uint8_t format; |
||||
uint8_t paritytype; |
||||
uint8_t datatype; |
||||
}USBD_CDC_LineCodingTypeDef; |
||||
|
||||
typedef struct _USBD_CDC_Itf |
||||
{ |
||||
int8_t (* Init) (void); |
||||
int8_t (* DeInit) (void); |
||||
int8_t (* Control) (uint8_t, uint8_t * , uint16_t);
|
||||
int8_t (* Receive) (uint8_t *, uint32_t *);
|
||||
|
||||
}USBD_CDC_ItfTypeDef; |
||||
|
||||
|
||||
typedef struct |
||||
{ |
||||
uint32_t data[CDC_DATA_FS_MAX_PACKET_SIZE/4]; /* Force 32bits alignment */ |
||||
uint8_t CmdOpCode; |
||||
uint8_t CmdLength;
|
||||
uint8_t *RxBuffer;
|
||||
uint8_t *TxBuffer;
|
||||
uint32_t RxLength; |
||||
uint32_t TxLength;
|
||||
|
||||
__IO uint32_t TxState;
|
||||
__IO uint32_t RxState;
|
||||
} |
||||
USBD_CDC_HandleTypeDef;
|
||||
|
||||
|
||||
|
||||
/** @defgroup USBD_CORE_Exported_Macros
|
||||
* @{ |
||||
*/
|
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
/** @defgroup USBD_CORE_Exported_Variables
|
||||
* @{ |
||||
*/
|
||||
|
||||
extern USBD_ClassTypeDef USBD_CDC; |
||||
#define USBD_CDC_CLASS &USBD_CDC |
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
/** @defgroup USB_CORE_Exported_Functions
|
||||
* @{ |
||||
*/ |
||||
uint8_t USBD_CDC_RegisterInterface (USBD_HandleTypeDef *pdev,
|
||||
USBD_CDC_ItfTypeDef *fops); |
||||
|
||||
uint8_t USBD_CDC_SetTxBuffer (USBD_HandleTypeDef *pdev, |
||||
uint8_t *pbuff, |
||||
uint16_t length); |
||||
|
||||
uint8_t USBD_CDC_SetRxBuffer (USBD_HandleTypeDef *pdev, |
||||
uint8_t *pbuff); |
||||
|
||||
uint8_t USBD_CDC_ReceivePacket (USBD_HandleTypeDef *pdev); |
||||
|
||||
uint8_t USBD_CDC_TransmitPacket (USBD_HandleTypeDef *pdev); |
||||
|
||||
void USBD_CDC_TransmitDone (USBD_HandleTypeDef *pdev); |
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
// XXX exported "static" for composite driver
|
||||
uint8_t USBD_CDC_Init (USBD_HandleTypeDef *pdev, |
||||
uint8_t cfgidx); |
||||
|
||||
uint8_t USBD_CDC_DeInit (USBD_HandleTypeDef *pdev, |
||||
uint8_t cfgidx); |
||||
|
||||
uint8_t USBD_CDC_Setup (USBD_HandleTypeDef *pdev, |
||||
USBD_SetupReqTypedef *req); |
||||
|
||||
uint8_t USBD_CDC_DataIn (USBD_HandleTypeDef *pdev, |
||||
uint8_t epnum); |
||||
|
||||
uint8_t USBD_CDC_DataOut (USBD_HandleTypeDef *pdev, |
||||
uint8_t epnum); |
||||
|
||||
uint8_t USBD_CDC_EP0_RxReady (USBD_HandleTypeDef *pdev); |
||||
|
||||
uint8_t *USBD_CDC_GetFSCfgDesc (uint16_t *length); |
||||
|
||||
uint8_t *USBD_CDC_GetHSCfgDesc (uint16_t *length); |
||||
|
||||
uint8_t *USBD_CDC_GetOtherSpeedCfgDesc (uint16_t *length); |
||||
|
||||
uint8_t *USBD_CDC_GetDeviceQualifierDescriptor (uint16_t *length); |
||||
|
||||
|
||||
#ifdef __cplusplus |
||||
} |
||||
#endif |
||||
|
||||
#endif /* __USB_CDC_H */ |
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -0,0 +1,53 @@ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file usbd_cdc_if_template.h |
||||
* @author MCD Application Team |
||||
* @version V2.4.2 |
||||
* @date 11-December-2015 |
||||
* @brief Header for usbd_cdc_if_template.c file. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© COPYRIGHT 2015 STMicroelectronics</center></h2> |
||||
* |
||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); |
||||
* You may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at: |
||||
* |
||||
* http://www.st.com/software_license_agreement_liberty_v2
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/ |
||||
#ifndef __USBD_CDC_IF_TEMPLATE_H |
||||
#define __USBD_CDC_IF_TEMPLATE_H |
||||
|
||||
#ifdef __cplusplus |
||||
extern "C" { |
||||
#endif |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "usbd_cdc.h" |
||||
|
||||
/* Exported types ------------------------------------------------------------*/ |
||||
/* Exported constants --------------------------------------------------------*/ |
||||
|
||||
extern USBD_CDC_ItfTypeDef USBD_CDC_Template_fops; |
||||
|
||||
/* Exported macro ------------------------------------------------------------*/ |
||||
/* Exported functions ------------------------------------------------------- */ |
||||
|
||||
#ifdef __cplusplus |
||||
} |
||||
#endif |
||||
|
||||
#endif /* __USBD_CDC_IF_TEMPLATE_H */ |
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -0,0 +1,907 @@ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file usbd_cdc.c |
||||
* @author MCD Application Team |
||||
* @version V2.4.2 |
||||
* @date 11-December-2015 |
||||
* @brief This file provides the high layer firmware functions to manage the
|
||||
* following functionalities of the USB CDC Class: |
||||
* - Initialization and Configuration of high and low layer |
||||
* - Enumeration as CDC Device (and enumeration for each implemented memory interface) |
||||
* - OUT/IN data transfer |
||||
* - Command IN transfer (class requests management) |
||||
* - Error management |
||||
*
|
||||
* @verbatim |
||||
*
|
||||
* ===================================================================
|
||||
* CDC Class Driver Description |
||||
* ===================================================================
|
||||
* This driver manages the "Universal Serial Bus Class Definitions for Communications Devices |
||||
* Revision 1.2 November 16, 2007" and the sub-protocol specification of "Universal Serial Bus
|
||||
* Communications Class Subclass Specification for PSTN Devices Revision 1.2 February 9, 2007" |
||||
* This driver implements the following aspects of the specification: |
||||
* - Device descriptor management |
||||
* - Configuration descriptor management |
||||
* - Enumeration as CDC device with 2 data endpoints (IN and OUT) and 1 command endpoint (IN) |
||||
* - Requests management (as described in section 6.2 in specification) |
||||
* - Abstract Control Model compliant |
||||
* - Union Functional collection (using 1 IN endpoint for control) |
||||
* - Data interface class |
||||
*
|
||||
* These aspects may be enriched or modified for a specific user application. |
||||
*
|
||||
* This driver doesn't implement the following aspects of the specification
|
||||
* (but it is possible to manage these features with some modifications on this driver): |
||||
* - Any class-specific aspect relative to communication classes should be managed by user application. |
||||
* - All communication classes other than PSTN are not managed |
||||
*
|
||||
* @endverbatim |
||||
*
|
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© COPYRIGHT 2015 STMicroelectronics</center></h2> |
||||
* |
||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); |
||||
* You may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at: |
||||
* |
||||
* http://www.st.com/software_license_agreement_liberty_v2
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
* |
||||
****************************************************************************** |
||||
*/
|
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "usbd_msc.h" // for rejecting bad control messages |
||||
#include "usbd_cdc.h" |
||||
#include "usbd_desc.h" |
||||
#include "usbd_ctlreq.h" |
||||
|
||||
|
||||
/** @addtogroup STM32_USB_DEVICE_LIBRARY
|
||||
* @{ |
||||
*/ |
||||
|
||||
|
||||
/** @defgroup USBD_CDC
|
||||
* @brief usbd core module |
||||
* @{ |
||||
*/
|
||||
|
||||
/** @defgroup USBD_CDC_Private_TypesDefinitions
|
||||
* @{ |
||||
*/
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
|
||||
/** @defgroup USBD_CDC_Private_Defines
|
||||
* @{ |
||||
*/
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
|
||||
/** @defgroup USBD_CDC_Private_Macros
|
||||
* @{ |
||||
*/
|
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
|
||||
/** @defgroup USBD_CDC_Private_FunctionPrototypes
|
||||
* @{ |
||||
*/ |
||||
|
||||
#ifndef CDC_COMPOSITE |
||||
/* USB Standard Device Descriptor */ |
||||
__ALIGN_BEGIN static uint8_t USBD_CDC_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER_DESC] __ALIGN_END = |
||||
{ |
||||
USB_LEN_DEV_QUALIFIER_DESC, |
||||
USB_DESC_TYPE_DEVICE_QUALIFIER, |
||||
0x00, |
||||
0x02, |
||||
0x00, |
||||
0x00, |
||||
0x00, |
||||
0x40, |
||||
0x01, |
||||
0x00, |
||||
}; |
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
/** @defgroup USBD_CDC_Private_Variables
|
||||
* @{ |
||||
*/
|
||||
|
||||
|
||||
/* CDC interface class callbacks structure */ |
||||
USBD_ClassTypeDef USBD_CDC = |
||||
{ |
||||
USBD_CDC_Init, |
||||
USBD_CDC_DeInit, |
||||
USBD_CDC_Setup, |
||||
NULL, /* EP0_TxSent, */ |
||||
USBD_CDC_EP0_RxReady, |
||||
USBD_CDC_DataIn, |
||||
USBD_CDC_DataOut, |
||||
NULL, |
||||
NULL, |
||||
NULL,
|
||||
USBD_CDC_GetHSCfgDesc,
|
||||
USBD_CDC_GetFSCfgDesc,
|
||||
USBD_CDC_GetOtherSpeedCfgDesc,
|
||||
USBD_CDC_GetDeviceQualifierDescriptor, |
||||
NULL |
||||
}; |
||||
|
||||
/* USB CDC device Configuration Descriptor */ |
||||
__ALIGN_BEGIN uint8_t USBD_CDC_CfgHSDesc[USB_CDC_CONFIG_DESC_SIZ] __ALIGN_END = |
||||
{ |
||||
/*Configuration Descriptor*/ |
||||
0x09, /* bLength: Configuration Descriptor size */ |
||||
USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */ |
||||
USB_CDC_CONFIG_DESC_SIZ, /* wTotalLength:no of returned bytes */ |
||||
0x00, |
||||
0x02, /* bNumInterfaces: 2 interface */ |
||||
0x01, /* bConfigurationValue: Configuration value */ |
||||
0x00, /* iConfiguration: Index of string descriptor describing the configuration */ |
||||
0xC0, /* bmAttributes: self powered */ |
||||
0x32, /* MaxPower 0 mA */ |
||||
|
||||
/*---------------------------------------------------------------------------*/ |
||||
|
||||
/*Interface Descriptor */ |
||||
0x09, /* bLength: Interface Descriptor size */ |
||||
USB_DESC_TYPE_INTERFACE, /* bDescriptorType: Interface */ |
||||
/* Interface descriptor type */ |
||||
0x00, /* bInterfaceNumber: Number of Interface */ |
||||
0x00, /* bAlternateSetting: Alternate setting */ |
||||
0x01, /* bNumEndpoints: One endpoints used */ |
||||
0x02, /* bInterfaceClass: Communication Interface Class */ |
||||
0x02, /* bInterfaceSubClass: Abstract Control Model */ |
||||
0x01, /* bInterfaceProtocol: Common AT commands */ |
||||
0x00, /* iInterface: */ |
||||
|
||||
/*Header Functional Descriptor*/ |
||||
0x05, /* bLength: Endpoint Descriptor size */ |
||||
0x24, /* bDescriptorType: CS_INTERFACE */ |
||||
0x00, /* bDescriptorSubtype: Header Func Desc */ |
||||
0x10, /* bcdCDC: spec release number */ |
||||
0x01, |
||||
|
||||
/*Call Management Functional Descriptor*/ |
||||
0x05, /* bFunctionLength */ |
||||
0x24, /* bDescriptorType: CS_INTERFACE */ |
||||
0x01, /* bDescriptorSubtype: Call Management Func Desc */ |
||||
0x00, /* bmCapabilities: D0+D1 */ |
||||
0x01, /* bDataInterface: 1 */ |
||||
|
||||
/*ACM Functional Descriptor*/ |
||||
0x04, /* bFunctionLength */ |
||||
0x24, /* bDescriptorType: CS_INTERFACE */ |
||||
0x02, /* bDescriptorSubtype: Abstract Control Management desc */ |
||||
0x02, /* bmCapabilities */ |
||||
|
||||
/*Union Functional Descriptor*/ |
||||
0x05, /* bFunctionLength */ |
||||
0x24, /* bDescriptorType: CS_INTERFACE */ |
||||
0x06, /* bDescriptorSubtype: Union func desc */ |
||||
0x00, /* bMasterInterface: Communication class interface */ |
||||
0x01, /* bSlaveInterface0: Data Class Interface */ |
||||
|
||||
/*Endpoint 2 Descriptor*/ |
||||
0x07, /* bLength: Endpoint Descriptor size */ |
||||
USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ |
||||
CDC_CMD_EP, /* bEndpointAddress */ |
||||
0x03, /* bmAttributes: Interrupt */ |
||||
LOBYTE(CDC_CMD_PACKET_SIZE), /* wMaxPacketSize: */ |
||||
HIBYTE(CDC_CMD_PACKET_SIZE), |
||||
0x10, /* bInterval: */
|
||||
/*---------------------------------------------------------------------------*/ |
||||
|
||||
/*Data class interface descriptor*/ |
||||
0x09, /* bLength: Endpoint Descriptor size */ |
||||
USB_DESC_TYPE_INTERFACE, /* bDescriptorType: */ |
||||
0x01, /* bInterfaceNumber: Number of Interface */ |
||||
0x00, /* bAlternateSetting: Alternate setting */ |
||||
0x02, /* bNumEndpoints: Two endpoints used */ |
||||
0x0A, /* bInterfaceClass: CDC */ |
||||
0x00, /* bInterfaceSubClass: */ |
||||
0x00, /* bInterfaceProtocol: */ |
||||
0x00, /* iInterface: */ |
||||
|
||||
/*Endpoint OUT Descriptor*/ |
||||
0x07, /* bLength: Endpoint Descriptor size */ |
||||
USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ |
||||
CDC_OUT_EP, /* bEndpointAddress */ |
||||
0x02, /* bmAttributes: Bulk */ |
||||
LOBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ |
||||
HIBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), |
||||
0x00, /* bInterval: ignore for Bulk transfer */ |
||||
|
||||
/*Endpoint IN Descriptor*/ |
||||
0x07, /* bLength: Endpoint Descriptor size */ |
||||
USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ |
||||
CDC_IN_EP, /* bEndpointAddress */ |
||||
0x02, /* bmAttributes: Bulk */ |
||||
LOBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ |
||||
HIBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), |
||||
0x00 /* bInterval: ignore for Bulk transfer */ |
||||
} ; |
||||
|
||||
|
||||
/* USB CDC device Configuration Descriptor */ |
||||
__ALIGN_BEGIN uint8_t USBD_CDC_CfgFSDesc[USB_CDC_CONFIG_DESC_SIZ] __ALIGN_END = |
||||
{ |
||||
/*Configuration Descriptor*/ |
||||
0x09, /* bLength: Configuration Descriptor size */ |
||||
USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */ |
||||
USB_CDC_CONFIG_DESC_SIZ, /* wTotalLength:no of returned bytes */ |
||||
0x00, |
||||
0x02, /* bNumInterfaces: 2 interface */ |
||||
0x01, /* bConfigurationValue: Configuration value */ |
||||
0x00, /* iConfiguration: Index of string descriptor describing the configuration */ |
||||
0xC0, /* bmAttributes: self powered */ |
||||
0x32, /* MaxPower 0 mA */ |
||||
|
||||
/*---------------------------------------------------------------------------*/ |
||||
|
||||
/*Interface Descriptor */ |
||||
0x09, /* bLength: Interface Descriptor size */ |
||||
USB_DESC_TYPE_INTERFACE, /* bDescriptorType: Interface */ |
||||
/* Interface descriptor type */ |
||||
0x00, /* bInterfaceNumber: Number of Interface */ |
||||
0x00, /* bAlternateSetting: Alternate setting */ |
||||
0x01, /* bNumEndpoints: One endpoints used */ |
||||
0x02, /* bInterfaceClass: Communication Interface Class */ |
||||
0x02, /* bInterfaceSubClass: Abstract Control Model */ |
||||
0x01, /* bInterfaceProtocol: Common AT commands */ |
||||
0x00, /* iInterface: */ |
||||
|
||||
/*Header Functional Descriptor*/ |
||||
0x05, /* bLength: Endpoint Descriptor size */ |
||||
0x24, /* bDescriptorType: CS_INTERFACE */ |
||||
0x00, /* bDescriptorSubtype: Header Func Desc */ |
||||
0x10, /* bcdCDC: spec release number */ |
||||
0x01, |
||||
|
||||
/*Call Management Functional Descriptor*/ |
||||
0x05, /* bFunctionLength */ |
||||
0x24, /* bDescriptorType: CS_INTERFACE */ |
||||
0x01, /* bDescriptorSubtype: Call Management Func Desc */ |
||||
0x00, /* bmCapabilities: D0+D1 */ |
||||
0x01, /* bDataInterface: 1 */ |
||||
|
||||
/*ACM Functional Descriptor*/ |
||||
0x04, /* bFunctionLength */ |
||||
0x24, /* bDescriptorType: CS_INTERFACE */ |
||||
0x02, /* bDescriptorSubtype: Abstract Control Management desc */ |
||||
0x02, /* bmCapabilities */ |
||||
|
||||
/*Union Functional Descriptor*/ |
||||
0x05, /* bFunctionLength */ |
||||
0x24, /* bDescriptorType: CS_INTERFACE */ |
||||
0x06, /* bDescriptorSubtype: Union func desc */ |
||||
0x00, /* bMasterInterface: Communication class interface */ |
||||
0x01, /* bSlaveInterface0: Data Class Interface */ |
||||
|
||||
/*Endpoint 2 Descriptor*/ |
||||
0x07, /* bLength: Endpoint Descriptor size */ |
||||
USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ |
||||
CDC_CMD_EP, /* bEndpointAddress */ |
||||
0x03, /* bmAttributes: Interrupt */ |
||||
LOBYTE(CDC_CMD_PACKET_SIZE), /* wMaxPacketSize: */ |
||||
HIBYTE(CDC_CMD_PACKET_SIZE), |
||||
0x10, /* bInterval: */
|
||||
/*---------------------------------------------------------------------------*/ |
||||
|
||||
/*Data class interface descriptor*/ |
||||
0x09, /* bLength: Endpoint Descriptor size */ |
||||
USB_DESC_TYPE_INTERFACE, /* bDescriptorType: */ |
||||
0x01, /* bInterfaceNumber: Number of Interface */ |
||||
0x00, /* bAlternateSetting: Alternate setting */ |
||||
0x02, /* bNumEndpoints: Two endpoints used */ |
||||
0x0A, /* bInterfaceClass: CDC */ |
||||
0x00, /* bInterfaceSubClass: */ |
||||
0x00, /* bInterfaceProtocol: */ |
||||
0x00, /* iInterface: */ |
||||
|
||||
/*Endpoint OUT Descriptor*/ |
||||
0x07, /* bLength: Endpoint Descriptor size */ |
||||
USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ |
||||
CDC_OUT_EP, /* bEndpointAddress */ |
||||
0x02, /* bmAttributes: Bulk */ |
||||
LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ |
||||
HIBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), |
||||
0x00, /* bInterval: ignore for Bulk transfer */ |
||||
|
||||
/*Endpoint IN Descriptor*/ |
||||
0x07, /* bLength: Endpoint Descriptor size */ |
||||
USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ |
||||
CDC_IN_EP, /* bEndpointAddress */ |
||||
0x02, /* bmAttributes: Bulk */ |
||||
LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ |
||||
HIBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), |
||||
0x00 /* bInterval: ignore for Bulk transfer */ |
||||
} ; |
||||
|
||||
__ALIGN_BEGIN uint8_t USBD_CDC_OtherSpeedCfgDesc[USB_CDC_CONFIG_DESC_SIZ] __ALIGN_END = |
||||
{
|
||||
0x09, /* bLength: Configuation Descriptor size */ |
||||
USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION,
|
||||
USB_CDC_CONFIG_DESC_SIZ, |
||||
0x00, |
||||
0x02, /* bNumInterfaces: 2 interfaces */ |
||||
0x01, /* bConfigurationValue: */ |
||||
0x04, /* iConfiguration: */ |
||||
0xC0, /* bmAttributes: */ |
||||
0x32, /* MaxPower 100 mA */
|
||||
|
||||
/*Interface Descriptor */ |
||||
0x09, /* bLength: Interface Descriptor size */ |
||||
USB_DESC_TYPE_INTERFACE, /* bDescriptorType: Interface */ |
||||
/* Interface descriptor type */ |
||||
0x00, /* bInterfaceNumber: Number of Interface */ |
||||
0x00, /* bAlternateSetting: Alternate setting */ |
||||
0x01, /* bNumEndpoints: One endpoints used */ |
||||
0x02, /* bInterfaceClass: Communication Interface Class */ |
||||
0x02, /* bInterfaceSubClass: Abstract Control Model */ |
||||
0x01, /* bInterfaceProtocol: Common AT commands */ |
||||
0x00, /* iInterface: */ |
||||
|
||||
/*Header Functional Descriptor*/ |
||||
0x05, /* bLength: Endpoint Descriptor size */ |
||||
0x24, /* bDescriptorType: CS_INTERFACE */ |
||||
0x00, /* bDescriptorSubtype: Header Func Desc */ |
||||
0x10, /* bcdCDC: spec release number */ |
||||
0x01, |
||||
|
||||
/*Call Management Functional Descriptor*/ |
||||
0x05, /* bFunctionLength */ |
||||
0x24, /* bDescriptorType: CS_INTERFACE */ |
||||
0x01, /* bDescriptorSubtype: Call Management Func Desc */ |
||||
0x00, /* bmCapabilities: D0+D1 */ |
||||
0x01, /* bDataInterface: 1 */ |
||||
|
||||
/*ACM Functional Descriptor*/ |
||||
0x04, /* bFunctionLength */ |
||||
0x24, /* bDescriptorType: CS_INTERFACE */ |
||||
0x02, /* bDescriptorSubtype: Abstract Control Management desc */ |
||||
0x02, /* bmCapabilities */ |
||||
|
||||
/*Union Functional Descriptor*/ |
||||
0x05, /* bFunctionLength */ |
||||
0x24, /* bDescriptorType: CS_INTERFACE */ |
||||
0x06, /* bDescriptorSubtype: Union func desc */ |
||||
0x00, /* bMasterInterface: Communication class interface */ |
||||
0x01, /* bSlaveInterface0: Data Class Interface */ |
||||
|
||||
/*Endpoint 2 Descriptor*/ |
||||
0x07, /* bLength: Endpoint Descriptor size */ |
||||
USB_DESC_TYPE_ENDPOINT , /* bDescriptorType: Endpoint */ |
||||
CDC_CMD_EP, /* bEndpointAddress */ |
||||
0x03, /* bmAttributes: Interrupt */ |
||||
LOBYTE(CDC_CMD_PACKET_SIZE), /* wMaxPacketSize: */ |
||||
HIBYTE(CDC_CMD_PACKET_SIZE), |
||||
0xFF, /* bInterval: */ |
||||
|
||||
/*---------------------------------------------------------------------------*/ |
||||
|
||||
/*Data class interface descriptor*/ |
||||
0x09, /* bLength: Endpoint Descriptor size */ |
||||
USB_DESC_TYPE_INTERFACE, /* bDescriptorType: */ |
||||
0x01, /* bInterfaceNumber: Number of Interface */ |
||||
0x00, /* bAlternateSetting: Alternate setting */ |
||||
0x02, /* bNumEndpoints: Two endpoints used */ |
||||
0x0A, /* bInterfaceClass: CDC */ |
||||
0x00, /* bInterfaceSubClass: */ |
||||
0x00, /* bInterfaceProtocol: */ |
||||
0x00, /* iInterface: */ |
||||
|
||||
/*Endpoint OUT Descriptor*/ |
||||
0x07, /* bLength: Endpoint Descriptor size */ |
||||
USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ |
||||
CDC_OUT_EP, /* bEndpointAddress */ |
||||
0x02, /* bmAttributes: Bulk */ |
||||
0x40, /* wMaxPacketSize: */ |
||||
0x00, |
||||
0x00, /* bInterval: ignore for Bulk transfer */ |
||||
|
||||
/*Endpoint IN Descriptor*/ |
||||
0x07, /* bLength: Endpoint Descriptor size */ |
||||
USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ |
||||
CDC_IN_EP, /* bEndpointAddress */ |
||||
0x02, /* bmAttributes: Bulk */ |
||||
0x40, /* wMaxPacketSize: */ |
||||
0x00, |
||||
0x00 /* bInterval */ |
||||
}; |
||||
#endif |
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
/** @defgroup USBD_CDC_Private_Functions
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief USBD_CDC_Init |
||||
* Initialize the CDC interface |
||||
* @param pdev: device instance |
||||
* @param cfgidx: Configuration index |
||||
* @retval status |
||||
*/ |
||||
uint8_t USBD_CDC_Init (USBD_HandleTypeDef *pdev, |
||||
uint8_t cfgidx) |
||||
{ |
||||
uint8_t ret = 0; |
||||
USBD_CDC_HandleTypeDef *hcdc; |
||||
|
||||
if(pdev->dev_speed == USBD_SPEED_HIGH )
|
||||
{
|
||||
/* Open EP IN */ |
||||
USBD_LL_OpenEP(pdev, |
||||
CDC_IN_EP, |
||||
USBD_EP_TYPE_BULK, |
||||
CDC_DATA_HS_IN_PACKET_SIZE); |
||||
|
||||
/* Open EP OUT */ |
||||
USBD_LL_OpenEP(pdev, |
||||
CDC_OUT_EP, |
||||
USBD_EP_TYPE_BULK, |
||||
CDC_DATA_HS_OUT_PACKET_SIZE); |
||||
|
||||
} |
||||
else |
||||
{ |
||||
/* Open EP IN */ |
||||
USBD_LL_OpenEP(pdev, |
||||
CDC_IN_EP, |
||||
USBD_EP_TYPE_BULK, |
||||
CDC_DATA_FS_IN_PACKET_SIZE); |
||||
|
||||
/* Open EP OUT */ |
||||
USBD_LL_OpenEP(pdev, |
||||
CDC_OUT_EP, |
||||
USBD_EP_TYPE_BULK, |
||||
CDC_DATA_FS_OUT_PACKET_SIZE); |
||||
} |
||||
/* Open Command IN EP */ |
||||
USBD_LL_OpenEP(pdev, |
||||
CDC_CMD_EP, |
||||
USBD_EP_TYPE_INTR, |
||||
CDC_CMD_PACKET_SIZE); |
||||
|
||||
|
||||
pdev->pClassData2 = USBD_malloc(sizeof (USBD_CDC_HandleTypeDef)); |
||||
|
||||
if(pdev->pClassData2 == NULL) |
||||
{ |
||||
ret = 1;
|
||||
} |
||||
else |
||||
{ |
||||
hcdc = (USBD_CDC_HandleTypeDef*) pdev->pClassData2; |
||||
|
||||
/* Init physical Interface components */ |
||||
((USBD_CDC_ItfTypeDef *)pdev->pUserData2)->Init(); |
||||
|
||||
/* Init Xfer states */ |
||||
hcdc->TxState =0; |
||||
hcdc->RxState =0; |
||||
|
||||
if(pdev->dev_speed == USBD_SPEED_HIGH )
|
||||
{
|
||||
/* Prepare Out endpoint to receive next packet */ |
||||
USBD_LL_PrepareReceive(pdev, |
||||
CDC_OUT_EP, |
||||
hcdc->RxBuffer, |
||||
CDC_DATA_HS_OUT_PACKET_SIZE); |
||||
} |
||||
else |
||||
{ |
||||
/* Prepare Out endpoint to receive next packet */ |
||||
USBD_LL_PrepareReceive(pdev, |
||||
CDC_OUT_EP, |
||||
hcdc->RxBuffer, |
||||
CDC_DATA_FS_OUT_PACKET_SIZE); |
||||
} |
||||
|
||||
|
||||
} |
||||
return ret; |
||||
} |
||||
|
||||
/**
|
||||
* @brief USBD_CDC_Init |
||||
* DeInitialize the CDC layer |
||||
* @param pdev: device instance |
||||
* @param cfgidx: Configuration index |
||||
* @retval status |
||||
*/ |
||||
uint8_t USBD_CDC_DeInit (USBD_HandleTypeDef *pdev, |
||||
uint8_t cfgidx) |
||||
{ |
||||
uint8_t ret = 0; |
||||
|
||||
/* Open EP IN */ |
||||
USBD_LL_CloseEP(pdev, |
||||
CDC_IN_EP); |
||||
|
||||
/* Open EP OUT */ |
||||
USBD_LL_CloseEP(pdev, |
||||
CDC_OUT_EP); |
||||
|
||||
/* Open Command IN EP */ |
||||
USBD_LL_CloseEP(pdev, |
||||
CDC_CMD_EP); |
||||
|
||||
|
||||
/* DeInit physical Interface components */ |
||||
if(pdev->pClassData2 != NULL) |
||||
{ |
||||
((USBD_CDC_ItfTypeDef *)pdev->pUserData2)->DeInit(); |
||||
USBD_free(pdev->pClassData2); |
||||
pdev->pClassData2 = NULL; |
||||
} |
||||
|
||||
return ret; |
||||
} |
||||
|
||||
/**
|
||||
* @brief USBD_CDC_Setup |
||||
* Handle the CDC specific requests |
||||
* @param pdev: instance |
||||
* @param req: usb requests |
||||
* @retval status |
||||
*/ |
||||
uint8_t USBD_CDC_Setup (USBD_HandleTypeDef *pdev, |
||||
USBD_SetupReqTypedef *req) |
||||
{ |
||||
USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*) pdev->pClassData2; |
||||
static uint8_t ifalt = 0; |
||||
|
||||
switch (req->bmRequest & USB_REQ_TYPE_MASK) |
||||
{ |
||||
case USB_REQ_TYPE_CLASS : |
||||
if (req->bRequest == BOT_GET_MAX_LUN) break; // Not ours!
|
||||
if (req->bRequest == BOT_RESET) break; // Not ours!
|
||||
|
||||
if (req->wLength) |
||||
{ |
||||
if (req->bmRequest & 0x80) |
||||
{ |
||||
((USBD_CDC_ItfTypeDef *)pdev->pUserData2)->Control(req->bRequest, |
||||
(uint8_t *)hcdc->data, |
||||
req->wLength); |
||||
USBD_CtlSendData (pdev,
|
||||
(uint8_t *)hcdc->data, |
||||
req->wLength); |
||||
} |
||||
else |
||||
{ |
||||
hcdc->CmdOpCode = req->bRequest; |
||||
hcdc->CmdLength = req->wLength; |
||||
|
||||
USBD_CtlPrepareRx (pdev,
|
||||
(uint8_t *)hcdc->data, |
||||
req->wLength); |
||||
} |
||||
|
||||
} |
||||
else |
||||
{ |
||||
((USBD_CDC_ItfTypeDef *)pdev->pUserData2)->Control(req->bRequest, |
||||
(uint8_t*)req, |
||||
0); |
||||
} |
||||
break; |
||||
|
||||
case USB_REQ_TYPE_STANDARD: |
||||
switch (req->bRequest) |
||||
{
|
||||
case USB_REQ_GET_INTERFACE : |
||||
USBD_CtlSendData (pdev, |
||||
&ifalt, |
||||
1); |
||||
break; |
||||
|
||||
case USB_REQ_SET_INTERFACE : |
||||
break; |
||||
} |
||||
|
||||
default:
|
||||
break; |
||||
} |
||||
return USBD_OK; |
||||
} |
||||
|
||||
/**
|
||||
* @brief USBD_CDC_DataIn |
||||
* Data sent on non-control IN endpoint |
||||
* @param pdev: device instance |
||||
* @param epnum: endpoint number |
||||
* @retval status |
||||
*/ |
||||
uint8_t USBD_CDC_DataIn (USBD_HandleTypeDef *pdev, uint8_t epnum) |
||||
{ |
||||
USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*) pdev->pClassData2; |
||||
|
||||
if(pdev->pClassData2 != NULL) |
||||
{ |
||||
|
||||
hcdc->TxState = 0; |
||||
USBD_CDC_TransmitDone(pdev); |
||||
|
||||
return USBD_OK; |
||||
} |
||||
else |
||||
{ |
||||
return USBD_FAIL; |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief USBD_CDC_DataOut |
||||
* Data received on non-control Out endpoint |
||||
* @param pdev: device instance |
||||
* @param epnum: endpoint number |
||||
* @retval status |
||||
*/ |
||||
uint8_t USBD_CDC_DataOut (USBD_HandleTypeDef *pdev, uint8_t epnum) |
||||
{
|
||||
USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*) pdev->pClassData2; |
||||
|
||||
/* Get the received data length */ |
||||
hcdc->RxLength = USBD_LL_GetRxDataSize (pdev, epnum); |
||||
|
||||
/* USB data will be immediately processed, this allow next USB traffic being
|
||||
NAKed till the end of the application Xfer */ |
||||
if(pdev->pClassData2 != NULL) |
||||
{ |
||||
((USBD_CDC_ItfTypeDef *)pdev->pUserData2)->Receive(hcdc->RxBuffer, &hcdc->RxLength); |
||||
|
||||
return USBD_OK; |
||||
} |
||||
else |
||||
{ |
||||
return USBD_FAIL; |
||||
} |
||||
} |
||||
|
||||
|
||||
|
||||
/**
|
||||
* @brief USBD_CDC_DataOut |
||||
* Data received on non-control Out endpoint |
||||
* @param pdev: device instance |
||||
* @param epnum: endpoint number |
||||
* @retval status |
||||
*/ |
||||
uint8_t USBD_CDC_EP0_RxReady (USBD_HandleTypeDef *pdev) |
||||
{
|
||||
USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*) pdev->pClassData2; |
||||
|
||||
if((pdev->pUserData2 != NULL) && (hcdc->CmdOpCode != 0xFF)) |
||||
{ |
||||
((USBD_CDC_ItfTypeDef *)pdev->pUserData2)->Control(hcdc->CmdOpCode, |
||||
(uint8_t *)hcdc->data, |
||||
hcdc->CmdLength); |
||||
hcdc->CmdOpCode = 0xFF;
|
||||
|
||||
} |
||||
return USBD_OK; |
||||
} |
||||
|
||||
#ifndef CDC_COMPOSITE |
||||
/**
|
||||
* @brief USBD_CDC_GetFSCfgDesc
|
||||
* Return configuration descriptor |
||||
* @param speed : current device speed |
||||
* @param length : pointer data length |
||||
* @retval pointer to descriptor buffer |
||||
*/ |
||||
uint8_t *USBD_CDC_GetFSCfgDesc (uint16_t *length) |
||||
{ |
||||
*length = sizeof (USBD_CDC_CfgFSDesc); |
||||
return USBD_CDC_CfgFSDesc; |
||||
} |
||||
|
||||
/**
|
||||
* @brief USBD_CDC_GetHSCfgDesc
|
||||
* Return configuration descriptor |
||||
* @param speed : current device speed |
||||
* @param length : pointer data length |
||||
* @retval pointer to descriptor buffer |
||||
*/ |
||||
uint8_t *USBD_CDC_GetHSCfgDesc (uint16_t *length) |
||||
{ |
||||
*length = sizeof (USBD_CDC_CfgHSDesc); |
||||
return USBD_CDC_CfgHSDesc; |
||||
} |
||||
|
||||
/**
|
||||
* @brief USBD_CDC_GetCfgDesc
|
||||
* Return configuration descriptor |
||||
* @param speed : current device speed |
||||
* @param length : pointer data length |
||||
* @retval pointer to descriptor buffer |
||||
*/ |
||||
uint8_t *USBD_CDC_GetOtherSpeedCfgDesc (uint16_t *length) |
||||
{ |
||||
*length = sizeof (USBD_CDC_OtherSpeedCfgDesc); |
||||
return USBD_CDC_OtherSpeedCfgDesc; |
||||
} |
||||
|
||||
/**
|
||||
* @brief DeviceQualifierDescriptor
|
||||
* return Device Qualifier descriptor |
||||
* @param length : pointer data length |
||||
* @retval pointer to descriptor buffer |
||||
*/ |
||||
uint8_t *USBD_CDC_GetDeviceQualifierDescriptor (uint16_t *length) |
||||
{ |
||||
*length = sizeof (USBD_CDC_DeviceQualifierDesc); |
||||
return USBD_CDC_DeviceQualifierDesc; |
||||
} |
||||
#endif |
||||
|
||||
/**
|
||||
* @brief USBD_CDC_RegisterInterface |
||||
* @param pdev: device instance |
||||
* @param fops: CD Interface callback |
||||
* @retval status |
||||
*/ |
||||
uint8_t USBD_CDC_RegisterInterface (USBD_HandleTypeDef *pdev,
|
||||
USBD_CDC_ItfTypeDef *fops) |
||||
{ |
||||
uint8_t ret = USBD_FAIL; |
||||
|
||||
if(fops != NULL) |
||||
{ |
||||
pdev->pUserData2= fops; |
||||
ret = USBD_OK;
|
||||
} |
||||
|
||||
return ret; |
||||
} |
||||
|
||||
/**
|
||||
* @brief USBD_CDC_SetTxBuffer |
||||
* @param pdev: device instance |
||||
* @param pbuff: Tx Buffer |
||||
* @retval status |
||||
*/ |
||||
uint8_t USBD_CDC_SetTxBuffer (USBD_HandleTypeDef *pdev, |
||||
uint8_t *pbuff, |
||||
uint16_t length) |
||||
{ |
||||
USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*) pdev->pClassData2; |
||||
|
||||
hcdc->TxBuffer = pbuff; |
||||
hcdc->TxLength = length;
|
||||
|
||||
return USBD_OK;
|
||||
} |
||||
|
||||
|
||||
/**
|
||||
* @brief USBD_CDC_SetRxBuffer |
||||
* @param pdev: device instance |
||||
* @param pbuff: Rx Buffer |
||||
* @retval status |
||||
*/ |
||||
uint8_t USBD_CDC_SetRxBuffer (USBD_HandleTypeDef *pdev, |
||||
uint8_t *pbuff) |
||||
{ |
||||
USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*) pdev->pClassData2; |
||||
|
||||
hcdc->RxBuffer = pbuff; |
||||
|
||||
return USBD_OK; |
||||
} |
||||
|
||||
/**
|
||||
* @brief USBD_CDC_DataOut |
||||
* Data received on non-control Out endpoint |
||||
* @param pdev: device instance |
||||
* @param epnum: endpoint number |
||||
* @retval status |
||||
*/ |
||||
uint8_t USBD_CDC_TransmitPacket(USBD_HandleTypeDef *pdev) |
||||
{
|
||||
USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*) pdev->pClassData2; |
||||
|
||||
if(pdev->pClassData2 != NULL) |
||||
{ |
||||
if(hcdc->TxState == 0) |
||||
{ |
||||
/* Tx Transfer in progress */ |
||||
hcdc->TxState = 1; |
||||
|
||||
/* Transmit next packet */ |
||||
USBD_LL_Transmit(pdev, |
||||
CDC_IN_EP, |
||||
hcdc->TxBuffer, |
||||
hcdc->TxLength); |
||||
|
||||
return USBD_OK; |
||||
} |
||||
else |
||||
{ |
||||
return USBD_BUSY; |
||||
} |
||||
} |
||||
else |
||||
{ |
||||
return USBD_FAIL; |
||||
} |
||||
} |
||||
|
||||
|
||||
/**
|
||||
* @brief USBD_CDC_ReceivePacket |
||||
* prepare OUT Endpoint for reception |
||||
* @param pdev: device instance |
||||
* @retval status |
||||
*/ |
||||
uint8_t USBD_CDC_ReceivePacket(USBD_HandleTypeDef *pdev) |
||||
{
|
||||
USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*) pdev->pClassData2; |
||||
|
||||
/* Suspend or Resume USB Out process */ |
||||
if(pdev->pClassData2 != NULL) |
||||
{ |
||||
if(pdev->dev_speed == USBD_SPEED_HIGH )
|
||||
{
|
||||
/* Prepare Out endpoint to receive next packet */ |
||||
USBD_LL_PrepareReceive(pdev, |
||||
CDC_OUT_EP, |
||||
hcdc->RxBuffer, |
||||
CDC_DATA_HS_OUT_PACKET_SIZE); |
||||
} |
||||
else |
||||
{ |
||||
/* Prepare Out endpoint to receive next packet */ |
||||
USBD_LL_PrepareReceive(pdev, |
||||
CDC_OUT_EP, |
||||
hcdc->RxBuffer, |
||||
CDC_DATA_FS_OUT_PACKET_SIZE); |
||||
} |
||||
return USBD_OK; |
||||
} |
||||
else |
||||
{ |
||||
return USBD_FAIL; |
||||
} |
||||
} |
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -0,0 +1,328 @@ |
||||
--- Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Src/usbd_cdc.c (date 1511202099000) |
||||
+++ Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Src/usbd_cdc.c (revision ) |
||||
@@ -59,6 +59,7 @@ |
||||
*/ |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
+#include "usbd_msc.h" // for rejecting bad control messages |
||||
#include "usbd_cdc.h" |
||||
#include "usbd_desc.h" |
||||
#include "usbd_ctlreq.h" |
||||
@@ -103,34 +104,7 @@ |
||||
* @{ |
||||
*/ |
||||
|
||||
- |
||||
-static uint8_t USBD_CDC_Init (USBD_HandleTypeDef *pdev, |
||||
- uint8_t cfgidx); |
||||
- |
||||
-static uint8_t USBD_CDC_DeInit (USBD_HandleTypeDef *pdev, |
||||
- uint8_t cfgidx); |
||||
- |
||||
-static uint8_t USBD_CDC_Setup (USBD_HandleTypeDef *pdev, |
||||
- USBD_SetupReqTypedef *req); |
||||
- |
||||
-static uint8_t USBD_CDC_DataIn (USBD_HandleTypeDef *pdev, |
||||
- uint8_t epnum); |
||||
- |
||||
-static uint8_t USBD_CDC_DataOut (USBD_HandleTypeDef *pdev, |
||||
- uint8_t epnum); |
||||
- |
||||
-static uint8_t USBD_CDC_EP0_RxReady (USBD_HandleTypeDef *pdev); |
||||
- |
||||
-static uint8_t *USBD_CDC_GetFSCfgDesc (uint16_t *length); |
||||
- |
||||
-static uint8_t *USBD_CDC_GetHSCfgDesc (uint16_t *length); |
||||
- |
||||
-static uint8_t *USBD_CDC_GetOtherSpeedCfgDesc (uint16_t *length); |
||||
- |
||||
-static uint8_t *USBD_CDC_GetOtherSpeedCfgDesc (uint16_t *length); |
||||
- |
||||
-uint8_t *USBD_CDC_GetDeviceQualifierDescriptor (uint16_t *length); |
||||
- |
||||
+#ifndef CDC_COMPOSITE |
||||
/* USB Standard Device Descriptor */ |
||||
__ALIGN_BEGIN static uint8_t USBD_CDC_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER_DESC] __ALIGN_END = |
||||
{ |
||||
@@ -156,7 +130,7 @@ |
||||
|
||||
|
||||
/* CDC interface class callbacks structure */ |
||||
-USBD_ClassTypeDef USBD_CDC = |
||||
+USBD_ClassTypeDef USBD_CDC = |
||||
{ |
||||
USBD_CDC_Init, |
||||
USBD_CDC_DeInit, |
||||
@@ -172,6 +146,7 @@ |
||||
USBD_CDC_GetFSCfgDesc, |
||||
USBD_CDC_GetOtherSpeedCfgDesc, |
||||
USBD_CDC_GetDeviceQualifierDescriptor, |
||||
+ NULL |
||||
}; |
||||
|
||||
/* USB CDC device Configuration Descriptor */ |
||||
@@ -456,6 +431,7 @@ |
||||
0x00, |
||||
0x00 /* bInterval */ |
||||
}; |
||||
+#endif |
||||
|
||||
/** |
||||
* @} |
||||
@@ -463,7 +439,7 @@ |
||||
|
||||
/** @defgroup USBD_CDC_Private_Functions |
||||
* @{ |
||||
- */ |
||||
+ */ |
||||
|
||||
/** |
||||
* @brief USBD_CDC_Init |
||||
@@ -472,7 +448,7 @@ |
||||
* @param cfgidx: Configuration index |
||||
* @retval status |
||||
*/ |
||||
-static uint8_t USBD_CDC_Init (USBD_HandleTypeDef *pdev, |
||||
+uint8_t USBD_CDC_Init (USBD_HandleTypeDef *pdev, |
||||
uint8_t cfgidx) |
||||
{ |
||||
uint8_t ret = 0; |
||||
@@ -514,18 +490,18 @@ |
||||
CDC_CMD_PACKET_SIZE); |
||||
|
||||
|
||||
- pdev->pClassData = USBD_malloc(sizeof (USBD_CDC_HandleTypeDef)); |
||||
+ pdev->pClassData2 = USBD_malloc(sizeof (USBD_CDC_HandleTypeDef)); |
||||
|
||||
- if(pdev->pClassData == NULL) |
||||
+ if(pdev->pClassData2 == NULL) |
||||
{ |
||||
ret = 1; |
||||
} |
||||
else |
||||
{ |
||||
- hcdc = (USBD_CDC_HandleTypeDef*) pdev->pClassData; |
||||
+ hcdc = (USBD_CDC_HandleTypeDef*) pdev->pClassData2; |
||||
|
||||
/* Init physical Interface components */ |
||||
- ((USBD_CDC_ItfTypeDef *)pdev->pUserData)->Init(); |
||||
+ ((USBD_CDC_ItfTypeDef *)pdev->pUserData2)->Init(); |
||||
|
||||
/* Init Xfer states */ |
||||
hcdc->TxState =0; |
||||
@@ -560,7 +536,7 @@ |
||||
* @param cfgidx: Configuration index |
||||
* @retval status |
||||
*/ |
||||
-static uint8_t USBD_CDC_DeInit (USBD_HandleTypeDef *pdev, |
||||
+uint8_t USBD_CDC_DeInit (USBD_HandleTypeDef *pdev, |
||||
uint8_t cfgidx) |
||||
{ |
||||
uint8_t ret = 0; |
||||
@@ -579,11 +555,11 @@ |
||||
|
||||
|
||||
/* DeInit physical Interface components */ |
||||
- if(pdev->pClassData != NULL) |
||||
+ if(pdev->pClassData2 != NULL) |
||||
{ |
||||
- ((USBD_CDC_ItfTypeDef *)pdev->pUserData)->DeInit(); |
||||
- USBD_free(pdev->pClassData); |
||||
- pdev->pClassData = NULL; |
||||
+ ((USBD_CDC_ItfTypeDef *)pdev->pUserData2)->DeInit(); |
||||
+ USBD_free(pdev->pClassData2); |
||||
+ pdev->pClassData2 = NULL; |
||||
} |
||||
|
||||
return ret; |
||||
@@ -596,20 +572,23 @@ |
||||
* @param req: usb requests |
||||
* @retval status |
||||
*/ |
||||
-static uint8_t USBD_CDC_Setup (USBD_HandleTypeDef *pdev, |
||||
+uint8_t USBD_CDC_Setup (USBD_HandleTypeDef *pdev, |
||||
USBD_SetupReqTypedef *req) |
||||
{ |
||||
- USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*) pdev->pClassData; |
||||
+ USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*) pdev->pClassData2; |
||||
static uint8_t ifalt = 0; |
||||
|
||||
switch (req->bmRequest & USB_REQ_TYPE_MASK) |
||||
{ |
||||
case USB_REQ_TYPE_CLASS : |
||||
+ if (req->bRequest == BOT_GET_MAX_LUN) break; // Not ours! |
||||
+ if (req->bRequest == BOT_RESET) break; // Not ours! |
||||
+ |
||||
if (req->wLength) |
||||
{ |
||||
if (req->bmRequest & 0x80) |
||||
{ |
||||
- ((USBD_CDC_ItfTypeDef *)pdev->pUserData)->Control(req->bRequest, |
||||
+ ((USBD_CDC_ItfTypeDef *)pdev->pUserData2)->Control(req->bRequest, |
||||
(uint8_t *)hcdc->data, |
||||
req->wLength); |
||||
USBD_CtlSendData (pdev, |
||||
@@ -629,7 +608,7 @@ |
||||
} |
||||
else |
||||
{ |
||||
- ((USBD_CDC_ItfTypeDef *)pdev->pUserData)->Control(req->bRequest, |
||||
+ ((USBD_CDC_ItfTypeDef *)pdev->pUserData2)->Control(req->bRequest, |
||||
(uint8_t*)req, |
||||
0); |
||||
} |
||||
@@ -661,14 +640,15 @@ |
||||
* @param epnum: endpoint number |
||||
* @retval status |
||||
*/ |
||||
-static uint8_t USBD_CDC_DataIn (USBD_HandleTypeDef *pdev, uint8_t epnum) |
||||
+uint8_t USBD_CDC_DataIn (USBD_HandleTypeDef *pdev, uint8_t epnum) |
||||
{ |
||||
- USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*) pdev->pClassData; |
||||
+ USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*) pdev->pClassData2; |
||||
|
||||
- if(pdev->pClassData != NULL) |
||||
+ if(pdev->pClassData2 != NULL) |
||||
{ |
||||
|
||||
hcdc->TxState = 0; |
||||
+ USBD_CDC_TransmitDone(pdev); |
||||
|
||||
return USBD_OK; |
||||
} |
||||
@@ -685,18 +665,18 @@ |
||||
* @param epnum: endpoint number |
||||
* @retval status |
||||
*/ |
||||
-static uint8_t USBD_CDC_DataOut (USBD_HandleTypeDef *pdev, uint8_t epnum) |
||||
+uint8_t USBD_CDC_DataOut (USBD_HandleTypeDef *pdev, uint8_t epnum) |
||||
{ |
||||
- USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*) pdev->pClassData; |
||||
+ USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*) pdev->pClassData2; |
||||
|
||||
/* Get the received data length */ |
||||
hcdc->RxLength = USBD_LL_GetRxDataSize (pdev, epnum); |
||||
|
||||
/* USB data will be immediately processed, this allow next USB traffic being |
||||
NAKed till the end of the application Xfer */ |
||||
- if(pdev->pClassData != NULL) |
||||
+ if(pdev->pClassData2 != NULL) |
||||
{ |
||||
- ((USBD_CDC_ItfTypeDef *)pdev->pUserData)->Receive(hcdc->RxBuffer, &hcdc->RxLength); |
||||
+ ((USBD_CDC_ItfTypeDef *)pdev->pUserData2)->Receive(hcdc->RxBuffer, &hcdc->RxLength); |
||||
|
||||
return USBD_OK; |
||||
} |
||||
@@ -715,13 +695,13 @@ |
||||
* @param epnum: endpoint number |
||||
* @retval status |
||||
*/ |
||||
-static uint8_t USBD_CDC_EP0_RxReady (USBD_HandleTypeDef *pdev) |
||||
+uint8_t USBD_CDC_EP0_RxReady (USBD_HandleTypeDef *pdev) |
||||
{ |
||||
- USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*) pdev->pClassData; |
||||
+ USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*) pdev->pClassData2; |
||||
|
||||
- if((pdev->pUserData != NULL) && (hcdc->CmdOpCode != 0xFF)) |
||||
+ if((pdev->pUserData2 != NULL) && (hcdc->CmdOpCode != 0xFF)) |
||||
{ |
||||
- ((USBD_CDC_ItfTypeDef *)pdev->pUserData)->Control(hcdc->CmdOpCode, |
||||
+ ((USBD_CDC_ItfTypeDef *)pdev->pUserData2)->Control(hcdc->CmdOpCode, |
||||
(uint8_t *)hcdc->data, |
||||
hcdc->CmdLength); |
||||
hcdc->CmdOpCode = 0xFF; |
||||
@@ -730,6 +710,7 @@ |
||||
return USBD_OK; |
||||
} |
||||
|
||||
+#ifndef CDC_COMPOSITE |
||||
/** |
||||
* @brief USBD_CDC_GetFSCfgDesc |
||||
* Return configuration descriptor |
||||
@@ -737,7 +718,7 @@ |
||||
* @param length : pointer data length |
||||
* @retval pointer to descriptor buffer |
||||
*/ |
||||
-static uint8_t *USBD_CDC_GetFSCfgDesc (uint16_t *length) |
||||
+uint8_t *USBD_CDC_GetFSCfgDesc (uint16_t *length) |
||||
{ |
||||
*length = sizeof (USBD_CDC_CfgFSDesc); |
||||
return USBD_CDC_CfgFSDesc; |
||||
@@ -750,7 +731,7 @@ |
||||
* @param length : pointer data length |
||||
* @retval pointer to descriptor buffer |
||||
*/ |
||||
-static uint8_t *USBD_CDC_GetHSCfgDesc (uint16_t *length) |
||||
+uint8_t *USBD_CDC_GetHSCfgDesc (uint16_t *length) |
||||
{ |
||||
*length = sizeof (USBD_CDC_CfgHSDesc); |
||||
return USBD_CDC_CfgHSDesc; |
||||
@@ -763,7 +744,7 @@ |
||||
* @param length : pointer data length |
||||
* @retval pointer to descriptor buffer |
||||
*/ |
||||
-static uint8_t *USBD_CDC_GetOtherSpeedCfgDesc (uint16_t *length) |
||||
+uint8_t *USBD_CDC_GetOtherSpeedCfgDesc (uint16_t *length) |
||||
{ |
||||
*length = sizeof (USBD_CDC_OtherSpeedCfgDesc); |
||||
return USBD_CDC_OtherSpeedCfgDesc; |
||||
@@ -780,6 +761,7 @@ |
||||
*length = sizeof (USBD_CDC_DeviceQualifierDesc); |
||||
return USBD_CDC_DeviceQualifierDesc; |
||||
} |
||||
+#endif |
||||
|
||||
/** |
||||
* @brief USBD_CDC_RegisterInterface |
||||
@@ -794,7 +776,7 @@ |
||||
|
||||
if(fops != NULL) |
||||
{ |
||||
- pdev->pUserData= fops; |
||||
+ pdev->pUserData2= fops; |
||||
ret = USBD_OK; |
||||
} |
||||
|
||||
@@ -811,7 +793,7 @@ |
||||
uint8_t *pbuff, |
||||
uint16_t length) |
||||
{ |
||||
- USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*) pdev->pClassData; |
||||
+ USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*) pdev->pClassData2; |
||||
|
||||
hcdc->TxBuffer = pbuff; |
||||
hcdc->TxLength = length; |
||||
@@ -829,7 +811,7 @@ |
||||
uint8_t USBD_CDC_SetRxBuffer (USBD_HandleTypeDef *pdev, |
||||
uint8_t *pbuff) |
||||
{ |
||||
- USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*) pdev->pClassData; |
||||
+ USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*) pdev->pClassData2; |
||||
|
||||
hcdc->RxBuffer = pbuff; |
||||
|
||||
@@ -845,9 +827,9 @@ |
||||
*/ |
||||
uint8_t USBD_CDC_TransmitPacket(USBD_HandleTypeDef *pdev) |
||||
{ |
||||
- USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*) pdev->pClassData; |
||||
+ USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*) pdev->pClassData2; |
||||
|
||||
- if(pdev->pClassData != NULL) |
||||
+ if(pdev->pClassData2 != NULL) |
||||
{ |
||||
if(hcdc->TxState == 0) |
||||
{ |
||||
@@ -882,10 +864,10 @@ |
||||
*/ |
||||
uint8_t USBD_CDC_ReceivePacket(USBD_HandleTypeDef *pdev) |
||||
{ |
||||
- USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*) pdev->pClassData; |
||||
+ USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*) pdev->pClassData2; |
||||
|
||||
/* Suspend or Resume USB Out process */ |
||||
- if(pdev->pClassData != NULL) |
||||
+ if(pdev->pClassData2 != NULL) |
||||
{ |
||||
if(pdev->dev_speed == USBD_SPEED_HIGH ) |
||||
{ |
@ -0,0 +1,226 @@ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file usbd_cdc_if_template.c |
||||
* @author MCD Application Team |
||||
* @version V2.4.2 |
||||
* @date 11-December-2015 |
||||
* @brief Generic media access Layer. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© COPYRIGHT 2015 STMicroelectronics</center></h2> |
||||
* |
||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); |
||||
* You may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at: |
||||
* |
||||
* http://www.st.com/software_license_agreement_liberty_v2
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
* |
||||
****************************************************************************** |
||||
*/
|
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "usbd_cdc_if_template.h" |
||||
|
||||
/** @addtogroup STM32_USB_DEVICE_LIBRARY
|
||||
* @{ |
||||
*/ |
||||
|
||||
|
||||
/** @defgroup USBD_CDC
|
||||
* @brief usbd core module |
||||
* @{ |
||||
*/
|
||||
|
||||
/** @defgroup USBD_CDC_Private_TypesDefinitions
|
||||
* @{ |
||||
*/
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
|
||||
/** @defgroup USBD_CDC_Private_Defines
|
||||
* @{ |
||||
*/
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
|
||||
/** @defgroup USBD_CDC_Private_Macros
|
||||
* @{ |
||||
*/
|
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
|
||||
/** @defgroup USBD_CDC_Private_FunctionPrototypes
|
||||
* @{ |
||||
*/ |
||||
|
||||
static int8_t TEMPLATE_Init (void); |
||||
static int8_t TEMPLATE_DeInit (void); |
||||
static int8_t TEMPLATE_Control (uint8_t cmd, uint8_t* pbuf, uint16_t length); |
||||
static int8_t TEMPLATE_Receive (uint8_t* pbuf, uint32_t *Len); |
||||
|
||||
USBD_CDC_ItfTypeDef USBD_CDC_Template_fops =
|
||||
{ |
||||
TEMPLATE_Init, |
||||
TEMPLATE_DeInit, |
||||
TEMPLATE_Control, |
||||
TEMPLATE_Receive |
||||
}; |
||||
|
||||
USBD_CDC_LineCodingTypeDef linecoding = |
||||
{ |
||||
115200, /* baud rate*/ |
||||
0x00, /* stop bits-1*/ |
||||
0x00, /* parity - none*/ |
||||
0x08 /* nb. of bits 8*/ |
||||
}; |
||||
|
||||
/* Private functions ---------------------------------------------------------*/ |
||||
|
||||
/**
|
||||
* @brief TEMPLATE_Init |
||||
* Initializes the CDC media low layer |
||||
* @param None |
||||
* @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL |
||||
*/ |
||||
static int8_t TEMPLATE_Init(void) |
||||
{ |
||||
/*
|
||||
Add your initialization code here
|
||||
*/
|
||||
return (0); |
||||
} |
||||
|
||||
/**
|
||||
* @brief TEMPLATE_DeInit |
||||
* DeInitializes the CDC media low layer |
||||
* @param None |
||||
* @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL |
||||
*/ |
||||
static int8_t TEMPLATE_DeInit(void) |
||||
{ |
||||
/*
|
||||
Add your deinitialization code here
|
||||
*/
|
||||
return (0); |
||||
} |
||||
|
||||
|
||||
/**
|
||||
* @brief TEMPLATE_Control |
||||
* Manage the CDC class requests |
||||
* @param Cmd: Command code
|
||||
* @param Buf: Buffer containing command data (request parameters) |
||||
* @param Len: Number of data to be sent (in bytes) |
||||
* @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL |
||||
*/ |
||||
static int8_t TEMPLATE_Control (uint8_t cmd, uint8_t* pbuf, uint16_t length) |
||||
{
|
||||
switch (cmd) |
||||
{ |
||||
case CDC_SEND_ENCAPSULATED_COMMAND: |
||||
/* Add your code here */ |
||||
break; |
||||
|
||||
case CDC_GET_ENCAPSULATED_RESPONSE: |
||||
/* Add your code here */ |
||||
break; |
||||
|
||||
case CDC_SET_COMM_FEATURE: |
||||
/* Add your code here */ |
||||
break; |
||||
|
||||
case CDC_GET_COMM_FEATURE: |
||||
/* Add your code here */ |
||||
break; |
||||
|
||||
case CDC_CLEAR_COMM_FEATURE: |
||||
/* Add your code here */ |
||||
break; |
||||
|
||||
case CDC_SET_LINE_CODING: |
||||
linecoding.bitrate = (uint32_t)(pbuf[0] | (pbuf[1] << 8) |\
|
||||
(pbuf[2] << 16) | (pbuf[3] << 24)); |
||||
linecoding.format = pbuf[4]; |
||||
linecoding.paritytype = pbuf[5]; |
||||
linecoding.datatype = pbuf[6]; |
||||
|
||||
/* Add your code here */ |
||||
break; |
||||
|
||||
case CDC_GET_LINE_CODING: |
||||
pbuf[0] = (uint8_t)(linecoding.bitrate); |
||||
pbuf[1] = (uint8_t)(linecoding.bitrate >> 8); |
||||
pbuf[2] = (uint8_t)(linecoding.bitrate >> 16); |
||||
pbuf[3] = (uint8_t)(linecoding.bitrate >> 24); |
||||
pbuf[4] = linecoding.format; |
||||
pbuf[5] = linecoding.paritytype; |
||||
pbuf[6] = linecoding.datatype;
|
||||
|
||||
/* Add your code here */ |
||||
break; |
||||
|
||||
case CDC_SET_CONTROL_LINE_STATE: |
||||
/* Add your code here */ |
||||
break; |
||||
|
||||
case CDC_SEND_BREAK: |
||||
/* Add your code here */ |
||||
break;
|
||||
|
||||
default: |
||||
break; |
||||
} |
||||
|
||||
return (0); |
||||
} |
||||
|
||||
/**
|
||||
* @brief TEMPLATE_Receive |
||||
* Data received over USB OUT endpoint are sent over CDC interface
|
||||
* through this function. |
||||
*
|
||||
* @note |
||||
* This function will issue a NAK packet on any OUT packet received on
|
||||
* USB endpoint untill exiting this function. If you exit this function |
||||
* before transfer is complete on CDC interface (ie. using DMA controller) |
||||
* it will result in receiving more data while previous ones are still
|
||||
* not sent. |
||||
*
|
||||
* @param Buf: Buffer of data to be received |
||||
* @param Len: Number of data received (in bytes) |
||||
* @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL |
||||
*/ |
||||
static int8_t TEMPLATE_Receive (uint8_t* Buf, uint32_t *Len) |
||||
{ |
||||
|
||||
return (0); |
||||
} |
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
||||
|
@ -0,0 +1,159 @@ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file usbd_msc.h |
||||
* @author MCD Application Team |
||||
* @version V2.4.2 |
||||
* @date 11-December-2015 |
||||
* @brief Header for the usbd_msc.c file |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© COPYRIGHT 2015 STMicroelectronics</center></h2> |
||||
* |
||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); |
||||
* You may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at: |
||||
* |
||||
* http://www.st.com/software_license_agreement_liberty_v2
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
* |
||||
****************************************************************************** |
||||
*/
|
||||
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/ |
||||
#ifndef __USBD_MSC_H |
||||
#define __USBD_MSC_H |
||||
|
||||
#ifdef __cplusplus |
||||
extern "C" { |
||||
#endif |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "usbd_msc_bot.h" |
||||
#include "usbd_msc_scsi.h" |
||||
#include "usbd_ioreq.h" |
||||
|
||||
/** @addtogroup USBD_MSC_BOT
|
||||
* @{ |
||||
*/ |
||||
|
||||
/** @defgroup USBD_MSC
|
||||
* @brief This file is the Header file for usbd_msc.c |
||||
* @{ |
||||
*/
|
||||
|
||||
|
||||
/** @defgroup USBD_BOT_Exported_Defines
|
||||
* @{ |
||||
*/
|
||||
#define MSC_MAX_FS_PACKET 0x40 |
||||
#define MSC_MAX_HS_PACKET 0x200 |
||||
|
||||
#define BOT_GET_MAX_LUN 0xFE |
||||
#define BOT_RESET 0xFF |
||||
#define USB_MSC_CONFIG_DESC_SIZ 32 |
||||
|
||||
#ifndef MSC_CUSTOM_EPS |
||||
#define MSC_EPIN_ADDR 0x81 |
||||
#define MSC_EPOUT_ADDR 0x01 |
||||
#endif |
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
/** @defgroup USB_CORE_Exported_Types
|
||||
* @{ |
||||
*/
|
||||
typedef struct _USBD_STORAGE |
||||
{ |
||||
int8_t (* Init) (uint8_t lun); |
||||
int8_t (* GetCapacity) (uint8_t lun, uint32_t *block_num, uint16_t *block_size); |
||||
int8_t (* IsReady) (uint8_t lun); |
||||
int8_t (* IsWriteProtected) (uint8_t lun); |
||||
int8_t (* Read) (uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len); |
||||
int8_t (* Write)(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len); |
||||
int8_t (* GetMaxLun)(void); |
||||
int8_t *pInquiry; |
||||
|
||||
}USBD_StorageTypeDef; |
||||
|
||||
|
||||
typedef struct |
||||
{ |
||||
uint32_t max_lun;
|
||||
uint32_t interface;
|
||||
uint8_t bot_state; |
||||
uint8_t bot_status;
|
||||
uint16_t bot_data_length; |
||||
uint8_t bot_data[MSC_MEDIA_PACKET];
|
||||
USBD_MSC_BOT_CBWTypeDef cbw; |
||||
USBD_MSC_BOT_CSWTypeDef csw; |
||||
|
||||
USBD_SCSI_SenseTypeDef scsi_sense [SENSE_LIST_DEEPTH]; |
||||
uint8_t scsi_sense_head; |
||||
uint8_t scsi_sense_tail; |
||||
|
||||
uint16_t scsi_blk_size; |
||||
uint32_t scsi_blk_nbr; |
||||
|
||||
uint32_t scsi_blk_addr; |
||||
uint32_t scsi_blk_len; |
||||
} |
||||
USBD_MSC_BOT_HandleTypeDef;
|
||||
|
||||
/* Structure for MSC process */ |
||||
extern USBD_ClassTypeDef USBD_MSC; |
||||
#define USBD_MSC_CLASS &USBD_MSC |
||||
|
||||
uint8_t USBD_MSC_RegisterStorage (USBD_HandleTypeDef *pdev,
|
||||
USBD_StorageTypeDef *fops); |
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
// XXX "static" moved here for use in composite driver
|
||||
|
||||
uint8_t USBD_MSC_Init (USBD_HandleTypeDef *pdev, |
||||
uint8_t cfgidx); |
||||
|
||||
uint8_t USBD_MSC_DeInit (USBD_HandleTypeDef *pdev, |
||||
uint8_t cfgidx); |
||||
|
||||
uint8_t USBD_MSC_Setup (USBD_HandleTypeDef *pdev, |
||||
USBD_SetupReqTypedef *req); |
||||
|
||||
uint8_t USBD_MSC_DataIn (USBD_HandleTypeDef *pdev, |
||||
uint8_t epnum); |
||||
|
||||
|
||||
uint8_t USBD_MSC_DataOut (USBD_HandleTypeDef *pdev, |
||||
uint8_t epnum); |
||||
|
||||
uint8_t *USBD_MSC_GetHSCfgDesc (uint16_t *length); |
||||
|
||||
uint8_t *USBD_MSC_GetFSCfgDesc (uint16_t *length); |
||||
|
||||
uint8_t *USBD_MSC_GetOtherSpeedCfgDesc (uint16_t *length); |
||||
|
||||
uint8_t *USBD_MSC_GetDeviceQualifierDescriptor (uint16_t *length); |
||||
|
||||
#ifdef __cplusplus |
||||
} |
||||
#endif |
||||
|
||||
#endif /* __USBD_MSC_H */ |
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -0,0 +1,60 @@ |
||||
--- Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Inc/usbd_msc.h (date 1511202099000) |
||||
+++ Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Inc/usbd_msc.h (revision ) |
||||
@@ -58,9 +58,10 @@ |
||||
#define BOT_RESET 0xFF |
||||
#define USB_MSC_CONFIG_DESC_SIZ 32 |
||||
|
||||
- |
||||
+#ifndef MSC_CUSTOM_EPS |
||||
#define MSC_EPIN_ADDR 0x81 |
||||
-#define MSC_EPOUT_ADDR 0x01 |
||||
+#define MSC_EPOUT_ADDR 0x01 |
||||
+#endif |
||||
|
||||
/** |
||||
* @} |
||||
@@ -107,7 +108,7 @@ |
||||
USBD_MSC_BOT_HandleTypeDef; |
||||
|
||||
/* Structure for MSC process */ |
||||
-extern USBD_ClassTypeDef USBD_MSC; |
||||
+extern USBD_ClassTypeDef USBD_MSC; |
||||
#define USBD_MSC_CLASS &USBD_MSC |
||||
|
||||
uint8_t USBD_MSC_RegisterStorage (USBD_HandleTypeDef *pdev, |
||||
@@ -118,8 +119,34 @@ |
||||
|
||||
/** |
||||
* @} |
||||
- */ |
||||
+ */ |
||||
|
||||
+// XXX "static" moved here for use in composite driver |
||||
+ |
||||
+uint8_t USBD_MSC_Init (USBD_HandleTypeDef *pdev, |
||||
+ uint8_t cfgidx); |
||||
+ |
||||
+uint8_t USBD_MSC_DeInit (USBD_HandleTypeDef *pdev, |
||||
+ uint8_t cfgidx); |
||||
+ |
||||
+uint8_t USBD_MSC_Setup (USBD_HandleTypeDef *pdev, |
||||
+ USBD_SetupReqTypedef *req); |
||||
+ |
||||
+uint8_t USBD_MSC_DataIn (USBD_HandleTypeDef *pdev, |
||||
+ uint8_t epnum); |
||||
+ |
||||
+ |
||||
+uint8_t USBD_MSC_DataOut (USBD_HandleTypeDef *pdev, |
||||
+ uint8_t epnum); |
||||
+ |
||||
+uint8_t *USBD_MSC_GetHSCfgDesc (uint16_t *length); |
||||
+ |
||||
+uint8_t *USBD_MSC_GetFSCfgDesc (uint16_t *length); |
||||
+ |
||||
+uint8_t *USBD_MSC_GetOtherSpeedCfgDesc (uint16_t *length); |
||||
+ |
||||
+uint8_t *USBD_MSC_GetDeviceQualifierDescriptor (uint16_t *length); |
||||
+ |
||||
#ifdef __cplusplus |
||||
} |
||||
#endif |
@ -0,0 +1,158 @@ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file usbd_msc_bot.h |
||||
* @author MCD Application Team |
||||
* @version V2.4.2 |
||||
* @date 11-December-2015 |
||||
* @brief Header for the usbd_msc_bot.c file |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© COPYRIGHT 2015 STMicroelectronics</center></h2> |
||||
* |
||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); |
||||
* You may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at: |
||||
* |
||||
* http://www.st.com/software_license_agreement_liberty_v2
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/ |
||||
#ifndef __USBD_MSC_BOT_H |
||||
#define __USBD_MSC_BOT_H |
||||
|
||||
#ifdef __cplusplus |
||||
extern "C" { |
||||
#endif |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "usbd_core.h" |
||||
|
||||
/** @addtogroup STM32_USB_DEVICE_LIBRARY
|
||||
* @{ |
||||
*/ |
||||
|
||||
/** @defgroup MSC_BOT
|
||||
* @brief This file is the Header file for usbd_msc_bot.c |
||||
* @{ |
||||
*/
|
||||
|
||||
|
||||
/** @defgroup USBD_CORE_Exported_Defines
|
||||
* @{ |
||||
*/
|
||||
#define USBD_BOT_IDLE 0 /* Idle state */ |
||||
#define USBD_BOT_DATA_OUT 1 /* Data Out state */ |
||||
#define USBD_BOT_DATA_IN 2 /* Data In state */ |
||||
#define USBD_BOT_LAST_DATA_IN 3 /* Last Data In Last */ |
||||
#define USBD_BOT_SEND_DATA 4 /* Send Immediate data */ |
||||
#define USBD_BOT_NO_DATA 5 /* No data Stage */ |
||||
|
||||
#define USBD_BOT_CBW_SIGNATURE 0x43425355 |
||||
#define USBD_BOT_CSW_SIGNATURE 0x53425355 |
||||
#define USBD_BOT_CBW_LENGTH 31 |
||||
#define USBD_BOT_CSW_LENGTH 13 |
||||
#define USBD_BOT_MAX_DATA 256 |
||||
|
||||
/* CSW Status Definitions */ |
||||
#define USBD_CSW_CMD_PASSED 0x00 |
||||
#define USBD_CSW_CMD_FAILED 0x01 |
||||
#define USBD_CSW_PHASE_ERROR 0x02 |
||||
|
||||
/* BOT Status */ |
||||
#define USBD_BOT_STATUS_NORMAL 0 |
||||
#define USBD_BOT_STATUS_RECOVERY 1 |
||||
#define USBD_BOT_STATUS_ERROR 2 |
||||
|
||||
|
||||
#define USBD_DIR_IN 0 |
||||
#define USBD_DIR_OUT 1 |
||||
#define USBD_BOTH_DIR 2 |
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
/** @defgroup MSC_CORE_Private_TypesDefinitions
|
||||
* @{ |
||||
*/
|
||||
|
||||
typedef struct |
||||
{ |
||||
uint32_t dSignature; |
||||
uint32_t dTag; |
||||
uint32_t dDataLength; |
||||
uint8_t bmFlags; |
||||
uint8_t bLUN; |
||||
uint8_t bCBLength; |
||||
uint8_t CB[16]; |
||||
uint8_t ReservedForAlign; |
||||
} |
||||
USBD_MSC_BOT_CBWTypeDef; |
||||
|
||||
|
||||
typedef struct |
||||
{ |
||||
uint32_t dSignature; |
||||
uint32_t dTag; |
||||
uint32_t dDataResidue; |
||||
uint8_t bStatus; |
||||
uint8_t ReservedForAlign[3];
|
||||
} |
||||
USBD_MSC_BOT_CSWTypeDef; |
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
|
||||
/** @defgroup USBD_CORE_Exported_Types
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
/** @defgroup USBD_CORE_Exported_FunctionsPrototypes
|
||||
* @{ |
||||
*/
|
||||
void MSC_BOT_Init (USBD_HandleTypeDef *pdev); |
||||
void MSC_BOT_Reset (USBD_HandleTypeDef *pdev); |
||||
void MSC_BOT_DeInit (USBD_HandleTypeDef *pdev); |
||||
void MSC_BOT_DataIn (USBD_HandleTypeDef *pdev,
|
||||
uint8_t epnum); |
||||
|
||||
void MSC_BOT_DataOut (USBD_HandleTypeDef *pdev,
|
||||
uint8_t epnum); |
||||
|
||||
void MSC_BOT_SendCSW (USBD_HandleTypeDef *pdev, |
||||
uint8_t CSW_Status); |
||||
|
||||
void MSC_BOT_CplClrFeature (USBD_HandleTypeDef *pdev,
|
||||
uint8_t epnum); |
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
#ifdef __cplusplus |
||||
} |
||||
#endif |
||||
|
||||
#endif /* __USBD_MSC_BOT_H */ |
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
||||
|
@ -0,0 +1,111 @@ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file usbd_msc_data.h |
||||
* @author MCD Application Team |
||||
* @version V2.4.2 |
||||
* @date 11-December-2015 |
||||
* @brief Header for the usbd_msc_data.c file |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© COPYRIGHT 2015 STMicroelectronics</center></h2> |
||||
* |
||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); |
||||
* You may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at: |
||||
* |
||||
* http://www.st.com/software_license_agreement_liberty_v2
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
* |
||||
****************************************************************************** |
||||
*/
|
||||
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/ |
||||
#ifndef __USBD_MSC_DATA_H |
||||
#define __USBD_MSC_DATA_H |
||||
|
||||
#ifdef __cplusplus |
||||
extern "C" { |
||||
#endif |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "usbd_conf.h" |
||||
|
||||
/** @addtogroup STM32_USB_DEVICE_LIBRARY
|
||||
* @{ |
||||
*/ |
||||
|
||||
/** @defgroup USB_INFO
|
||||
* @brief general defines for the usb device library file |
||||
* @{ |
||||
*/
|
||||
|
||||
/** @defgroup USB_INFO_Exported_Defines
|
||||
* @{ |
||||
*/
|
||||
#define MODE_SENSE6_LEN 8 |
||||
#define MODE_SENSE10_LEN 8 |
||||
#define LENGTH_INQUIRY_PAGE00 7 |
||||
#define LENGTH_FORMAT_CAPACITIES 20 |
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
|
||||
/** @defgroup USBD_INFO_Exported_TypesDefinitions
|
||||
* @{ |
||||
*/ |
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
|
||||
|
||||
/** @defgroup USBD_INFO_Exported_Macros
|
||||
* @{ |
||||
*/
|
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
/** @defgroup USBD_INFO_Exported_Variables
|
||||
* @{ |
||||
*/
|
||||
extern const uint8_t MSC_Page00_Inquiry_Data[];
|
||||
extern const uint8_t MSC_Mode_Sense6_data[]; |
||||
extern const uint8_t MSC_Mode_Sense10_data[] ; |
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
/** @defgroup USBD_INFO_Exported_FunctionsPrototype
|
||||
* @{ |
||||
*/
|
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
#ifdef __cplusplus |
||||
} |
||||
#endif |
||||
|
||||
#endif /* __USBD_MSC_DATA_H */ |
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -0,0 +1,201 @@ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file usbd_msc_scsi.h |
||||
* @author MCD Application Team |
||||
* @version V2.4.2 |
||||
* @date 11-December-2015 |
||||
* @brief Header for the usbd_msc_scsi.c file |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© COPYRIGHT 2015 STMicroelectronics</center></h2> |
||||
* |
||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); |
||||
* You may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at: |
||||
* |
||||
* http://www.st.com/software_license_agreement_liberty_v2
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
* |
||||
****************************************************************************** |
||||
*/
|
||||
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/ |
||||
#ifndef __USBD_MSC_SCSI_H |
||||
#define __USBD_MSC_SCSI_H |
||||
|
||||
#ifdef __cplusplus |
||||
extern "C" { |
||||
#endif |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "usbd_def.h" |
||||
|
||||
/** @addtogroup STM32_USB_DEVICE_LIBRARY
|
||||
* @{ |
||||
*/ |
||||
|
||||
/** @defgroup USBD_SCSI
|
||||
* @brief header file for the storage disk file |
||||
* @{ |
||||
*/
|
||||
|
||||
/** @defgroup USBD_SCSI_Exported_Defines
|
||||
* @{ |
||||
*/
|
||||
|
||||
#define SENSE_LIST_DEEPTH 4 |
||||
|
||||
/* SCSI Commands */ |
||||
#define SCSI_FORMAT_UNIT 0x04 |
||||
#define SCSI_INQUIRY 0x12 |
||||
#define SCSI_MODE_SELECT6 0x15 |
||||
#define SCSI_MODE_SELECT10 0x55 |
||||
#define SCSI_MODE_SENSE6 0x1A |
||||
#define SCSI_MODE_SENSE10 0x5A |
||||
#define SCSI_ALLOW_MEDIUM_REMOVAL 0x1E |
||||
#define SCSI_READ6 0x08 |
||||
#define SCSI_READ10 0x28 |
||||
#define SCSI_READ12 0xA8 |
||||
#define SCSI_READ16 0x88 |
||||
|
||||
#define SCSI_READ_CAPACITY10 0x25 |
||||
#define SCSI_READ_CAPACITY16 0x9E |
||||
|
||||
#define SCSI_REQUEST_SENSE 0x03 |
||||
#define SCSI_START_STOP_UNIT 0x1B |
||||
#define SCSI_TEST_UNIT_READY 0x00 |
||||
#define SCSI_WRITE6 0x0A |
||||
#define SCSI_WRITE10 0x2A |
||||
#define SCSI_WRITE12 0xAA |
||||
#define SCSI_WRITE16 0x8A |
||||
|
||||
#define SCSI_VERIFY10 0x2F |
||||
#define SCSI_VERIFY12 0xAF |
||||
#define SCSI_VERIFY16 0x8F |
||||
|
||||
#define SCSI_SEND_DIAGNOSTIC 0x1D |
||||
#define SCSI_READ_FORMAT_CAPACITIES 0x23 |
||||
|
||||
#define NO_SENSE 0 |
||||
#define RECOVERED_ERROR 1 |
||||
#define NOT_READY 2 |
||||
#define MEDIUM_ERROR 3 |
||||
#define HARDWARE_ERROR 4 |
||||
#define ILLEGAL_REQUEST 5 |
||||
#define UNIT_ATTENTION 6 |
||||
#define DATA_PROTECT 7 |
||||
#define BLANK_CHECK 8 |
||||
#define VENDOR_SPECIFIC 9 |
||||
#define COPY_ABORTED 10 |
||||
#define ABORTED_COMMAND 11 |
||||
#define VOLUME_OVERFLOW 13 |
||||
#define MISCOMPARE 14 |
||||
|
||||
|
||||
#define INVALID_CDB 0x20 |
||||
#define INVALID_FIELED_IN_COMMAND 0x24 |
||||
#define PARAMETER_LIST_LENGTH_ERROR 0x1A |
||||
#define INVALID_FIELD_IN_PARAMETER_LIST 0x26 |
||||
#define ADDRESS_OUT_OF_RANGE 0x21 |
||||
#define MEDIUM_NOT_PRESENT 0x3A |
||||
#define MEDIUM_HAVE_CHANGED 0x28 |
||||
#define WRITE_PROTECTED 0x27 |
||||
#define UNRECOVERED_READ_ERROR 0x11 |
||||
#define WRITE_FAULT 0x03 |
||||
|
||||
#define READ_FORMAT_CAPACITY_DATA_LEN 0x0C |
||||
#define READ_CAPACITY10_DATA_LEN 0x08 |
||||
#define MODE_SENSE10_DATA_LEN 0x08 |
||||
#define MODE_SENSE6_DATA_LEN 0x04 |
||||
#define REQUEST_SENSE_DATA_LEN 0x12 |
||||
#define STANDARD_INQUIRY_DATA_LEN 0x24 |
||||
#define BLKVFY 0x04 |
||||
|
||||
extern uint8_t Page00_Inquiry_Data[]; |
||||
extern uint8_t Standard_Inquiry_Data[]; |
||||
extern uint8_t Standard_Inquiry_Data2[]; |
||||
extern uint8_t Mode_Sense6_data[]; |
||||
extern uint8_t Mode_Sense10_data[]; |
||||
extern uint8_t Scsi_Sense_Data[]; |
||||
extern uint8_t ReadCapacity10_Data[]; |
||||
extern uint8_t ReadFormatCapacity_Data []; |
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
|
||||
/** @defgroup USBD_SCSI_Exported_TypesDefinitions
|
||||
* @{ |
||||
*/ |
||||
|
||||
typedef struct _SENSE_ITEM {
|
||||
char Skey; |
||||
union { |
||||
struct _ASCs { |
||||
char ASC; |
||||
char ASCQ; |
||||
}b; |
||||
unsigned int ASC; |
||||
char *pData; |
||||
} w; |
||||
} USBD_SCSI_SenseTypeDef;
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
/** @defgroup USBD_SCSI_Exported_Macros
|
||||
* @{ |
||||
*/
|
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
/** @defgroup USBD_SCSI_Exported_Variables
|
||||
* @{ |
||||
*/
|
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
/** @defgroup USBD_SCSI_Exported_FunctionsPrototype
|
||||
* @{ |
||||
*/
|
||||
int8_t SCSI_ProcessCmd(USBD_HandleTypeDef *pdev, |
||||
uint8_t lun,
|
||||
uint8_t *cmd); |
||||
|
||||
void SCSI_SenseCode(USBD_HandleTypeDef *pdev, |
||||
uint8_t lun,
|
||||
uint8_t sKey,
|
||||
uint8_t ASC); |
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
#ifdef __cplusplus |
||||
} |
||||
#endif |
||||
|
||||
#endif /* __USBD_MSC_SCSI_H */ |
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
||||
|
@ -0,0 +1,105 @@ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file usbd_msc_storage.h |
||||
* @author MCD Application Team |
||||
* @version V2.4.2 |
||||
* @date 11-December-2015 |
||||
* @brief Header file for the usbd_msc_storage.c file |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© COPYRIGHT 2015 STMicroelectronics</center></h2> |
||||
* |
||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); |
||||
* You may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at: |
||||
* |
||||
* http://www.st.com/software_license_agreement_liberty_v2
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
* |
||||
****************************************************************************** |
||||
*/
|
||||
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/ |
||||
#ifndef __USBD_MSC_STORAGE_H |
||||
#define __USBD_MSC_STORAGE_H |
||||
|
||||
#ifdef __cplusplus |
||||
extern "C" { |
||||
#endif |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "usbd_msc.h" |
||||
|
||||
/** @addtogroup STM32_USB_DEVICE_LIBRARY
|
||||
* @{ |
||||
*/ |
||||
|
||||
/** @defgroup USBD_STORAGE
|
||||
* @brief header file for the usbd_msc_storage.c file |
||||
* @{ |
||||
*/
|
||||
|
||||
/** @defgroup USBD_STORAGE_Exported_Defines
|
||||
* @{ |
||||
*/
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
|
||||
/** @defgroup USBD_STORAGE_Exported_Types
|
||||
* @{ |
||||
*/ |
||||
|
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
|
||||
|
||||
/** @defgroup USBD_STORAGE_Exported_Macros
|
||||
* @{ |
||||
*/
|
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
/** @defgroup USBD_STORAGE_Exported_Variables
|
||||
* @{ |
||||
*/
|
||||
extern USBD_StorageTypeDef USBD_MSC_Template_fops; |
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
/** @defgroup USBD_STORAGE_Exported_FunctionsPrototype
|
||||
* @{ |
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
#ifdef __cplusplus |
||||
} |
||||
#endif |
||||
|
||||
#endif /* __USBD_MSC_STORAGE_H */ |
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -0,0 +1,612 @@ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file usbd_msc.c |
||||
* @author MCD Application Team |
||||
* @version V2.4.2 |
||||
* @date 11-December-2015 |
||||
* @brief This file provides all the MSC core functions. |
||||
* |
||||
* @verbatim |
||||
*
|
||||
* ===================================================================
|
||||
* MSC Class Description |
||||
* ===================================================================
|
||||
* This module manages the MSC class V1.0 following the "Universal |
||||
* Serial Bus Mass Storage Class (MSC) Bulk-Only Transport (BOT) Version 1.0 |
||||
* Sep. 31, 1999". |
||||
* This driver implements the following aspects of the specification: |
||||
* - Bulk-Only Transport protocol |
||||
* - Subclass : SCSI transparent command set (ref. SCSI Primary Commands - 3 (SPC-3)) |
||||
*
|
||||
* @endverbatim |
||||
* |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© COPYRIGHT 2015 STMicroelectronics</center></h2> |
||||
* |
||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); |
||||
* You may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at: |
||||
* |
||||
* http://www.st.com/software_license_agreement_liberty_v2
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
* |
||||
****************************************************************************** |
||||
*/
|
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "usbd_msc.h" |
||||
|
||||
|
||||
/** @addtogroup STM32_USB_DEVICE_LIBRARY
|
||||
* @{ |
||||
*/ |
||||
|
||||
|
||||
/** @defgroup MSC_CORE
|
||||
* @brief Mass storage core module |
||||
* @{ |
||||
*/
|
||||
|
||||
/** @defgroup MSC_CORE_Private_TypesDefinitions
|
||||
* @{ |
||||
*/
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
|
||||
/** @defgroup MSC_CORE_Private_Defines
|
||||
* @{ |
||||
*/
|
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
|
||||
/** @defgroup MSC_CORE_Private_Macros
|
||||
* @{ |
||||
*/
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
|
||||
/** @defgroup MSC_CORE_Private_FunctionPrototypes
|
||||
* @{ |
||||
*/
|
||||
uint8_t USBD_MSC_Init (USBD_HandleTypeDef *pdev,
|
||||
uint8_t cfgidx); |
||||
|
||||
uint8_t USBD_MSC_DeInit (USBD_HandleTypeDef *pdev,
|
||||
uint8_t cfgidx); |
||||
|
||||
uint8_t USBD_MSC_Setup (USBD_HandleTypeDef *pdev,
|
||||
USBD_SetupReqTypedef *req); |
||||
|
||||
uint8_t USBD_MSC_DataIn (USBD_HandleTypeDef *pdev,
|
||||
uint8_t epnum); |
||||
|
||||
|
||||
uint8_t USBD_MSC_DataOut (USBD_HandleTypeDef *pdev,
|
||||
uint8_t epnum); |
||||
|
||||
uint8_t *USBD_MSC_GetHSCfgDesc (uint16_t *length); |
||||
|
||||
uint8_t *USBD_MSC_GetFSCfgDesc (uint16_t *length); |
||||
|
||||
uint8_t *USBD_MSC_GetOtherSpeedCfgDesc (uint16_t *length); |
||||
|
||||
uint8_t *USBD_MSC_GetDeviceQualifierDescriptor (uint16_t *length); |
||||
|
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
|
||||
/** @defgroup MSC_CORE_Private_Variables
|
||||
* @{ |
||||
*/
|
||||
|
||||
#ifndef MSC_COMPOSITE |
||||
USBD_ClassTypeDef USBD_MSC =
|
||||
{ |
||||
USBD_MSC_Init, |
||||
USBD_MSC_DeInit, |
||||
USBD_MSC_Setup, |
||||
NULL, /*EP0_TxSent*/
|
||||
NULL, /*EP0_RxReady*/ |
||||
USBD_MSC_DataIn, |
||||
USBD_MSC_DataOut, |
||||
NULL, /*SOF */
|
||||
NULL,
|
||||
NULL,
|
||||
USBD_MSC_GetHSCfgDesc, |
||||
USBD_MSC_GetFSCfgDesc,
|
||||
USBD_MSC_GetOtherSpeedCfgDesc, |
||||
USBD_MSC_GetDeviceQualifierDescriptor, |
||||
}; |
||||
|
||||
/* USB Mass storage device Configuration Descriptor */ |
||||
/* All Descriptors (Configuration, Interface, Endpoint, Class, Vendor */ |
||||
__ALIGN_BEGIN uint8_t USBD_MSC_CfgHSDesc[USB_MSC_CONFIG_DESC_SIZ] __ALIGN_END = |
||||
{ |
||||
|
||||
0x09, /* bLength: Configuation Descriptor size */ |
||||
USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */ |
||||
USB_MSC_CONFIG_DESC_SIZ, |
||||
|
||||
0x00, |
||||
0x01, /* bNumInterfaces: 1 interface */ |
||||
0x01, /* bConfigurationValue: */ |
||||
0x04, /* iConfiguration: */ |
||||
0xC0, /* bmAttributes: */ |
||||
0x32, /* MaxPower 100 mA */ |
||||
|
||||
/******************** Mass Storage interface ********************/ |
||||
0x09, /* bLength: Interface Descriptor size */ |
||||
0x04, /* bDescriptorType: */ |
||||
0x00, /* bInterfaceNumber: Number of Interface */ |
||||
0x00, /* bAlternateSetting: Alternate setting */ |
||||
0x02, /* bNumEndpoints*/ |
||||
0x08, /* bInterfaceClass: MSC Class */ |
||||
0x06, /* bInterfaceSubClass : SCSI transparent*/ |
||||
0x50, /* nInterfaceProtocol */ |
||||
0x05, /* iInterface: */ |
||||
/******************** Mass Storage Endpoints ********************/ |
||||
0x07, /*Endpoint descriptor length = 7*/ |
||||
0x05, /*Endpoint descriptor type */ |
||||
MSC_EPIN_ADDR, /*Endpoint address (IN, address 1) */ |
||||
0x02, /*Bulk endpoint type */ |
||||
LOBYTE(MSC_MAX_HS_PACKET), |
||||
HIBYTE(MSC_MAX_HS_PACKET), |
||||
0x00, /*Polling interval in milliseconds */ |
||||
|
||||
0x07, /*Endpoint descriptor length = 7 */ |
||||
0x05, /*Endpoint descriptor type */ |
||||
MSC_EPOUT_ADDR, /*Endpoint address (OUT, address 1) */ |
||||
0x02, /*Bulk endpoint type */ |
||||
LOBYTE(MSC_MAX_HS_PACKET), |
||||
HIBYTE(MSC_MAX_HS_PACKET), |
||||
0x00 /*Polling interval in milliseconds*/ |
||||
}; |
||||
|
||||
/* USB Mass storage device Configuration Descriptor */ |
||||
/* All Descriptors (Configuration, Interface, Endpoint, Class, Vendor */ |
||||
uint8_t USBD_MSC_CfgFSDesc[USB_MSC_CONFIG_DESC_SIZ] __ALIGN_END = |
||||
{ |
||||
|
||||
0x09, /* bLength: Configuation Descriptor size */ |
||||
USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */ |
||||
USB_MSC_CONFIG_DESC_SIZ, |
||||
|
||||
0x00, |
||||
0x01, /* bNumInterfaces: 1 interface */ |
||||
0x01, /* bConfigurationValue: */ |
||||
0x04, /* iConfiguration: */ |
||||
0xC0, /* bmAttributes: */ |
||||
0x32, /* MaxPower 100 mA */ |
||||
|
||||
/******************** Mass Storage interface ********************/ |
||||
0x09, /* bLength: Interface Descriptor size */ |
||||
0x04, /* bDescriptorType: */ |
||||
0x00, /* bInterfaceNumber: Number of Interface */ |
||||
0x00, /* bAlternateSetting: Alternate setting */ |
||||
0x02, /* bNumEndpoints*/ |
||||
0x08, /* bInterfaceClass: MSC Class */ |
||||
0x06, /* bInterfaceSubClass : SCSI transparent*/ |
||||
0x50, /* nInterfaceProtocol */ |
||||
0x05, /* iInterface: */ |
||||
/******************** Mass Storage Endpoints ********************/ |
||||
0x07, /*Endpoint descriptor length = 7*/ |
||||
0x05, /*Endpoint descriptor type */ |
||||
MSC_EPIN_ADDR, /*Endpoint address (IN, address 1) */ |
||||
0x02, /*Bulk endpoint type */ |
||||
LOBYTE(MSC_MAX_FS_PACKET), |
||||
HIBYTE(MSC_MAX_FS_PACKET), |
||||
0x00, /*Polling interval in milliseconds */ |
||||
|
||||
0x07, /*Endpoint descriptor length = 7 */ |
||||
0x05, /*Endpoint descriptor type */ |
||||
MSC_EPOUT_ADDR, /*Endpoint address (OUT, address 1) */ |
||||
0x02, /*Bulk endpoint type */ |
||||
LOBYTE(MSC_MAX_FS_PACKET), |
||||
HIBYTE(MSC_MAX_FS_PACKET), |
||||
0x00 /*Polling interval in milliseconds*/ |
||||
}; |
||||
|
||||
__ALIGN_BEGIN uint8_t USBD_MSC_OtherSpeedCfgDesc[USB_MSC_CONFIG_DESC_SIZ] __ALIGN_END = |
||||
{ |
||||
|
||||
0x09, /* bLength: Configuation Descriptor size */ |
||||
USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION,
|
||||
USB_MSC_CONFIG_DESC_SIZ, |
||||
|
||||
0x00, |
||||
0x01, /* bNumInterfaces: 1 interface */ |
||||
0x01, /* bConfigurationValue: */ |
||||
0x04, /* iConfiguration: */ |
||||
0xC0, /* bmAttributes: */ |
||||
0x32, /* MaxPower 100 mA */ |
||||
|
||||
/******************** Mass Storage interface ********************/ |
||||
0x09, /* bLength: Interface Descriptor size */ |
||||
0x04, /* bDescriptorType: */ |
||||
0x00, /* bInterfaceNumber: Number of Interface */ |
||||
0x00, /* bAlternateSetting: Alternate setting */ |
||||
0x02, /* bNumEndpoints*/ |
||||
0x08, /* bInterfaceClass: MSC Class */ |
||||
0x06, /* bInterfaceSubClass : SCSI transparent command set*/ |
||||
0x50, /* nInterfaceProtocol */ |
||||
0x05, /* iInterface: */ |
||||
/******************** Mass Storage Endpoints ********************/ |
||||
0x07, /*Endpoint descriptor length = 7*/ |
||||
0x05, /*Endpoint descriptor type */ |
||||
MSC_EPIN_ADDR, /*Endpoint address (IN, address 1) */ |
||||
0x02, /*Bulk endpoint type */ |
||||
0x40, |
||||
0x00, |
||||
0x00, /*Polling interval in milliseconds */ |
||||
|
||||
0x07, /*Endpoint descriptor length = 7 */ |
||||
0x05, /*Endpoint descriptor type */ |
||||
MSC_EPOUT_ADDR, /*Endpoint address (OUT, address 1) */ |
||||
0x02, /*Bulk endpoint type */ |
||||
0x40, |
||||
0x00, |
||||
0x00 /*Polling interval in milliseconds*/ |
||||
}; |
||||
|
||||
/* USB Standard Device Descriptor */ |
||||
__ALIGN_BEGIN uint8_t USBD_MSC_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER_DESC] __ALIGN_END = |
||||
{ |
||||
USB_LEN_DEV_QUALIFIER_DESC, |
||||
USB_DESC_TYPE_DEVICE_QUALIFIER, |
||||
0x00, |
||||
0x02, |
||||
0x00, |
||||
0x00, |
||||
0x00, |
||||
MSC_MAX_FS_PACKET, |
||||
0x01, |
||||
0x00, |
||||
}; |
||||
#endif |
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
|
||||
/** @defgroup MSC_CORE_Private_Functions
|
||||
* @{ |
||||
*/
|
||||
|
||||
/**
|
||||
* @brief USBD_MSC_Init |
||||
* Initialize the mass storage configuration |
||||
* @param pdev: device instance |
||||
* @param cfgidx: configuration index |
||||
* @retval status |
||||
*/ |
||||
uint8_t USBD_MSC_Init (USBD_HandleTypeDef *pdev,
|
||||
uint8_t cfgidx) |
||||
{ |
||||
int16_t ret = 0; |
||||
|
||||
if(pdev->dev_speed == USBD_SPEED_HIGH )
|
||||
{ |
||||
/* Open EP OUT */ |
||||
USBD_LL_OpenEP(pdev, |
||||
MSC_EPOUT_ADDR, |
||||
USBD_EP_TYPE_BULK, |
||||
MSC_MAX_HS_PACKET); |
||||
|
||||
/* Open EP IN */ |
||||
USBD_LL_OpenEP(pdev, |
||||
MSC_EPIN_ADDR, |
||||
USBD_EP_TYPE_BULK, |
||||
MSC_MAX_HS_PACKET);
|
||||
} |
||||
else |
||||
{ |
||||
/* Open EP OUT */ |
||||
USBD_LL_OpenEP(pdev, |
||||
MSC_EPOUT_ADDR, |
||||
USBD_EP_TYPE_BULK, |
||||
MSC_MAX_FS_PACKET); |
||||
|
||||
/* Open EP IN */ |
||||
USBD_LL_OpenEP(pdev, |
||||
MSC_EPIN_ADDR, |
||||
USBD_EP_TYPE_BULK, |
||||
MSC_MAX_FS_PACKET);
|
||||
} |
||||
pdev->pClassData = USBD_malloc(sizeof (USBD_MSC_BOT_HandleTypeDef)); |
||||
|
||||
if(pdev->pClassData == NULL) |
||||
{ |
||||
ret = 1;
|
||||
} |
||||
else |
||||
{ |
||||
/* Init the BOT layer */ |
||||
MSC_BOT_Init(pdev);
|
||||
ret = 0; |
||||
} |
||||
|
||||
return ret; |
||||
} |
||||
|
||||
/**
|
||||
* @brief USBD_MSC_DeInit |
||||
* DeInitilaize the mass storage configuration |
||||
* @param pdev: device instance |
||||
* @param cfgidx: configuration index |
||||
* @retval status |
||||
*/ |
||||
uint8_t USBD_MSC_DeInit (USBD_HandleTypeDef *pdev,
|
||||
uint8_t cfgidx) |
||||
{ |
||||
/* Close MSC EPs */ |
||||
USBD_LL_CloseEP(pdev, |
||||
MSC_EPOUT_ADDR); |
||||
|
||||
/* Open EP IN */ |
||||
USBD_LL_CloseEP(pdev, |
||||
MSC_EPIN_ADDR); |
||||
|
||||
|
||||
/* De-Init the BOT layer */ |
||||
MSC_BOT_DeInit(pdev); |
||||
|
||||
/* Free MSC Class Resources */ |
||||
if(pdev->pClassData != NULL) |
||||
{ |
||||
USBD_free(pdev->pClassData); |
||||
pdev->pClassData = NULL;
|
||||
} |
||||
return 0; |
||||
} |
||||
/**
|
||||
* @brief USBD_MSC_Setup |
||||
* Handle the MSC specific requests |
||||
* @param pdev: device instance |
||||
* @param req: USB request |
||||
* @retval status |
||||
*/ |
||||
uint8_t USBD_MSC_Setup (USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) |
||||
{ |
||||
USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef*) pdev->pClassData; |
||||
|
||||
switch (req->bmRequest & USB_REQ_TYPE_MASK) |
||||
{ |
||||
|
||||
/* Class request */ |
||||
case USB_REQ_TYPE_CLASS : |
||||
switch (req->bRequest) |
||||
{ |
||||
case BOT_GET_MAX_LUN : |
||||
|
||||
if((req->wValue == 0) &&
|
||||
(req->wLength == 1) && |
||||
((req->bmRequest & 0x80) == 0x80)) |
||||
{ |
||||
hmsc->max_lun = ((USBD_StorageTypeDef *)pdev->pUserData)->GetMaxLun(); |
||||
USBD_CtlSendData (pdev, |
||||
(uint8_t *)&hmsc->max_lun, |
||||
1); |
||||
} |
||||
else |
||||
{ |
||||
USBD_CtlError(pdev , req); |
||||
return USBD_FAIL;
|
||||
} |
||||
break; |
||||
|
||||
case BOT_RESET : |
||||
if((req->wValue == 0) &&
|
||||
(req->wLength == 0) && |
||||
((req->bmRequest & 0x80) != 0x80)) |
||||
{
|
||||
MSC_BOT_Reset(pdev); |
||||
} |
||||
else |
||||
{ |
||||
USBD_CtlError(pdev , req); |
||||
return USBD_FAIL;
|
||||
} |
||||
break; |
||||
|
||||
default: |
||||
USBD_CtlError(pdev , req); |
||||
return USBD_FAIL;
|
||||
} |
||||
break; |
||||
/* Interface & Endpoint request */ |
||||
case USB_REQ_TYPE_STANDARD: |
||||
switch (req->bRequest) |
||||
{ |
||||
case USB_REQ_GET_INTERFACE : |
||||
USBD_CtlSendData (pdev, |
||||
(uint8_t *)&hmsc->interface, |
||||
1); |
||||
break; |
||||
|
||||
case USB_REQ_SET_INTERFACE : |
||||
hmsc->interface = (uint8_t)(req->wValue); |
||||
break; |
||||
|
||||
case USB_REQ_CLEAR_FEATURE:
|
||||
|
||||
/* Flush the FIFO and Clear the stall status */
|
||||
USBD_LL_FlushEP(pdev, (uint8_t)req->wIndex); |
||||
|
||||
/* Reactivate the EP */
|
||||
USBD_LL_CloseEP (pdev , (uint8_t)req->wIndex); |
||||
if((((uint8_t)req->wIndex) & 0x80) == 0x80) |
||||
{ |
||||
if(pdev->dev_speed == USBD_SPEED_HIGH )
|
||||
{ |
||||
/* Open EP IN */ |
||||
USBD_LL_OpenEP(pdev, |
||||
MSC_EPIN_ADDR, |
||||
USBD_EP_TYPE_BULK, |
||||
MSC_MAX_HS_PACKET);
|
||||
} |
||||
else |
||||
{
|
||||
/* Open EP IN */ |
||||
USBD_LL_OpenEP(pdev, |
||||
MSC_EPIN_ADDR, |
||||
USBD_EP_TYPE_BULK, |
||||
MSC_MAX_FS_PACKET);
|
||||
} |
||||
} |
||||
else |
||||
{ |
||||
if(pdev->dev_speed == USBD_SPEED_HIGH )
|
||||
{ |
||||
/* Open EP IN */ |
||||
USBD_LL_OpenEP(pdev, |
||||
MSC_EPOUT_ADDR, |
||||
USBD_EP_TYPE_BULK, |
||||
MSC_MAX_HS_PACKET);
|
||||
} |
||||
else |
||||
{
|
||||
/* Open EP IN */ |
||||
USBD_LL_OpenEP(pdev, |
||||
MSC_EPOUT_ADDR, |
||||
USBD_EP_TYPE_BULK, |
||||
MSC_MAX_FS_PACKET);
|
||||
} |
||||
} |
||||
|
||||
/* Handle BOT error */ |
||||
MSC_BOT_CplClrFeature(pdev, (uint8_t)req->wIndex); |
||||
break; |
||||
|
||||
}
|
||||
break; |
||||
|
||||
default: |
||||
break; |
||||
} |
||||
return 0; |
||||
} |
||||
|
||||
/**
|
||||
* @brief USBD_MSC_DataIn |
||||
* handle data IN Stage |
||||
* @param pdev: device instance |
||||
* @param epnum: endpoint index |
||||
* @retval status |
||||
*/ |
||||
uint8_t USBD_MSC_DataIn (USBD_HandleTypeDef *pdev,
|
||||
uint8_t epnum) |
||||
{ |
||||
MSC_BOT_DataIn(pdev , epnum); |
||||
return 0; |
||||
} |
||||
|
||||
/**
|
||||
* @brief USBD_MSC_DataOut |
||||
* handle data OUT Stage |
||||
* @param pdev: device instance |
||||
* @param epnum: endpoint index |
||||
* @retval status |
||||
*/ |
||||
uint8_t USBD_MSC_DataOut (USBD_HandleTypeDef *pdev,
|
||||
uint8_t epnum) |
||||
{ |
||||
MSC_BOT_DataOut(pdev , epnum); |
||||
return 0; |
||||
} |
||||
|
||||
#ifndef MSC_COMPOSITE |
||||
/**
|
||||
* @brief USBD_MSC_GetHSCfgDesc
|
||||
* return configuration descriptor |
||||
* @param length : pointer data length |
||||
* @retval pointer to descriptor buffer |
||||
*/ |
||||
uint8_t *USBD_MSC_GetHSCfgDesc (uint16_t *length) |
||||
{ |
||||
*length = sizeof (USBD_MSC_CfgHSDesc); |
||||
return USBD_MSC_CfgHSDesc; |
||||
} |
||||
|
||||
/**
|
||||
* @brief USBD_MSC_GetFSCfgDesc
|
||||
* return configuration descriptor |
||||
* @param length : pointer data length |
||||
* @retval pointer to descriptor buffer |
||||
*/ |
||||
uint8_t *USBD_MSC_GetFSCfgDesc (uint16_t *length) |
||||
{ |
||||
*length = sizeof (USBD_MSC_CfgFSDesc); |
||||
return USBD_MSC_CfgFSDesc; |
||||
} |
||||
|
||||
/**
|
||||
* @brief USBD_MSC_GetOtherSpeedCfgDesc
|
||||
* return other speed configuration descriptor |
||||
* @param length : pointer data length |
||||
* @retval pointer to descriptor buffer |
||||
*/ |
||||
uint8_t *USBD_MSC_GetOtherSpeedCfgDesc (uint16_t *length) |
||||
{ |
||||
*length = sizeof (USBD_MSC_OtherSpeedCfgDesc); |
||||
return USBD_MSC_OtherSpeedCfgDesc; |
||||
} |
||||
/**
|
||||
* @brief DeviceQualifierDescriptor
|
||||
* return Device Qualifier descriptor |
||||
* @param length : pointer data length |
||||
* @retval pointer to descriptor buffer |
||||
*/ |
||||
uint8_t *USBD_MSC_GetDeviceQualifierDescriptor (uint16_t *length) |
||||
{ |
||||
*length = sizeof (USBD_MSC_DeviceQualifierDesc); |
||||
return USBD_MSC_DeviceQualifierDesc; |
||||
} |
||||
#endif |
||||
|
||||
/**
|
||||
* @brief USBD_MSC_RegisterStorage |
||||
* @param fops: storage callback |
||||
* @retval status |
||||
*/ |
||||
uint8_t USBD_MSC_RegisterStorage (USBD_HandleTypeDef *pdev,
|
||||
USBD_StorageTypeDef *fops) |
||||
{ |
||||
if(fops != NULL) |
||||
{ |
||||
pdev->pUserData= fops; |
||||
} |
||||
return 0; |
||||
} |
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -0,0 +1,35 @@ |
||||
--- Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc.c (date 1511202099000) |
||||
+++ Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc.c (revision ) |
||||
@@ -116,7 +116,7 @@ |
||||
* @{ |
||||
*/ |
||||
|
||||
- |
||||
+#ifndef MSC_COMPOSITE |
||||
USBD_ClassTypeDef USBD_MSC = |
||||
{ |
||||
USBD_MSC_Init, |
||||
@@ -279,6 +279,7 @@ |
||||
0x01, |
||||
0x00, |
||||
}; |
||||
+#endif |
||||
/** |
||||
* @} |
||||
*/ |
||||
@@ -530,6 +531,7 @@ |
||||
return 0; |
||||
} |
||||
|
||||
+#ifndef MSC_COMPOSITE |
||||
/** |
||||
* @brief USBD_MSC_GetHSCfgDesc |
||||
* return configuration descriptor |
||||
@@ -576,6 +578,7 @@ |
||||
*length = sizeof (USBD_MSC_DeviceQualifierDesc); |
||||
return USBD_MSC_DeviceQualifierDesc; |
||||
} |
||||
+#endif |
||||
|
||||
/** |
||||
* @brief USBD_MSC_RegisterStorage |
@ -0,0 +1,407 @@ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file usbd_msc_bot.c |
||||
* @author MCD Application Team |
||||
* @version V2.4.2 |
||||
* @date 11-December-2015 |
||||
* @brief This file provides all the BOT protocol core functions. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© COPYRIGHT 2015 STMicroelectronics</center></h2> |
||||
* |
||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); |
||||
* You may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at: |
||||
* |
||||
* http://www.st.com/software_license_agreement_liberty_v2
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
* |
||||
****************************************************************************** |
||||
*/
|
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "usbd_msc_bot.h" |
||||
#include "usbd_msc.h" |
||||
#include "usbd_msc_scsi.h" |
||||
#include "usbd_ioreq.h" |
||||
|
||||
/** @addtogroup STM32_USB_DEVICE_LIBRARY
|
||||
* @{ |
||||
*/ |
||||
|
||||
|
||||
/** @defgroup MSC_BOT
|
||||
* @brief BOT protocol module |
||||
* @{ |
||||
*/
|
||||
|
||||
/** @defgroup MSC_BOT_Private_TypesDefinitions
|
||||
* @{ |
||||
*/
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
|
||||
/** @defgroup MSC_BOT_Private_Defines
|
||||
* @{ |
||||
*/
|
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
|
||||
/** @defgroup MSC_BOT_Private_Macros
|
||||
* @{ |
||||
*/
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
|
||||
/** @defgroup MSC_BOT_Private_Variables
|
||||
* @{ |
||||
*/
|
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
|
||||
/** @defgroup MSC_BOT_Private_FunctionPrototypes
|
||||
* @{ |
||||
*/
|
||||
static void MSC_BOT_CBW_Decode (USBD_HandleTypeDef *pdev); |
||||
|
||||
static void MSC_BOT_SendData (USBD_HandleTypeDef *pdev,
|
||||
uint8_t* pbuf,
|
||||
uint16_t len); |
||||
|
||||
static void MSC_BOT_Abort(USBD_HandleTypeDef *pdev); |
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
|
||||
/** @defgroup MSC_BOT_Private_Functions
|
||||
* @{ |
||||
*/
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @brief MSC_BOT_Init |
||||
* Initialize the BOT Process |
||||
* @param pdev: device instance |
||||
* @retval None |
||||
*/ |
||||
void MSC_BOT_Init (USBD_HandleTypeDef *pdev) |
||||
{ |
||||
USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef*)pdev->pClassData; |
||||
|
||||
hmsc->bot_state = USBD_BOT_IDLE; |
||||
hmsc->bot_status = USBD_BOT_STATUS_NORMAL; |
||||
|
||||
hmsc->scsi_sense_tail = 0; |
||||
hmsc->scsi_sense_head = 0; |
||||
|
||||
((USBD_StorageTypeDef *)pdev->pUserData)->Init(0); |
||||
|
||||
USBD_LL_FlushEP(pdev, MSC_EPOUT_ADDR); |
||||
USBD_LL_FlushEP(pdev, MSC_EPIN_ADDR); |
||||
|
||||
/* Prapare EP to Receive First BOT Cmd */ |
||||
USBD_LL_PrepareReceive (pdev, |
||||
MSC_EPOUT_ADDR, |
||||
(uint8_t *)&hmsc->cbw, |
||||
USBD_BOT_CBW_LENGTH);
|
||||
} |
||||
|
||||
/**
|
||||
* @brief MSC_BOT_Reset |
||||
* Reset the BOT Machine |
||||
* @param pdev: device instance |
||||
* @retval None |
||||
*/ |
||||
void MSC_BOT_Reset (USBD_HandleTypeDef *pdev) |
||||
{ |
||||
USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef*)pdev->pClassData; |
||||
|
||||
hmsc->bot_state = USBD_BOT_IDLE; |
||||
hmsc->bot_status = USBD_BOT_STATUS_RECOVERY;
|
||||
|
||||
/* Prapare EP to Receive First BOT Cmd */ |
||||
USBD_LL_PrepareReceive (pdev, |
||||
MSC_EPOUT_ADDR, |
||||
(uint8_t *)&hmsc->cbw, |
||||
USBD_BOT_CBW_LENGTH);
|
||||
} |
||||
|
||||
/**
|
||||
* @brief MSC_BOT_DeInit |
||||
* Deinitialize the BOT Machine |
||||
* @param pdev: device instance |
||||
* @retval None |
||||
*/ |
||||
void MSC_BOT_DeInit (USBD_HandleTypeDef *pdev) |
||||
{ |
||||
USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef*)pdev->pClassData;
|
||||
hmsc->bot_state = USBD_BOT_IDLE; |
||||
} |
||||
|
||||
/**
|
||||
* @brief MSC_BOT_DataIn |
||||
* Handle BOT IN data stage |
||||
* @param pdev: device instance |
||||
* @param epnum: endpoint index |
||||
* @retval None |
||||
*/ |
||||
void MSC_BOT_DataIn (USBD_HandleTypeDef *pdev,
|
||||
uint8_t epnum) |
||||
{ |
||||
USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef*)pdev->pClassData;
|
||||
|
||||
switch (hmsc->bot_state) |
||||
{ |
||||
case USBD_BOT_DATA_IN: |
||||
if(SCSI_ProcessCmd(pdev, |
||||
hmsc->cbw.bLUN, |
||||
&hmsc->cbw.CB[0]) < 0) |
||||
{ |
||||
MSC_BOT_SendCSW (pdev, USBD_CSW_CMD_FAILED); |
||||
} |
||||
break; |
||||
|
||||
case USBD_BOT_SEND_DATA: |
||||
case USBD_BOT_LAST_DATA_IN: |
||||
MSC_BOT_SendCSW (pdev, USBD_CSW_CMD_PASSED); |
||||
|
||||
break; |
||||
|
||||
default: |
||||
break; |
||||
} |
||||
} |
||||
/**
|
||||
* @brief MSC_BOT_DataOut |
||||
* Process MSC OUT data |
||||
* @param pdev: device instance |
||||
* @param epnum: endpoint index |
||||
* @retval None |
||||
*/ |
||||
void MSC_BOT_DataOut (USBD_HandleTypeDef *pdev,
|
||||
uint8_t epnum) |
||||
{ |
||||
USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef*)pdev->pClassData; |
||||
|
||||
switch (hmsc->bot_state) |
||||
{ |
||||
case USBD_BOT_IDLE: |
||||
MSC_BOT_CBW_Decode(pdev); |
||||
break; |
||||
|
||||
case USBD_BOT_DATA_OUT: |
||||
|
||||
if(SCSI_ProcessCmd(pdev, |
||||
hmsc->cbw.bLUN, |
||||
&hmsc->cbw.CB[0]) < 0) |
||||
{ |
||||
MSC_BOT_SendCSW (pdev, USBD_CSW_CMD_FAILED); |
||||
} |
||||
|
||||
break; |
||||
|
||||
default: |
||||
break; |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief MSC_BOT_CBW_Decode |
||||
* Decode the CBW command and set the BOT state machine accordingly
|
||||
* @param pdev: device instance |
||||
* @retval None |
||||
*/ |
||||
static void MSC_BOT_CBW_Decode (USBD_HandleTypeDef *pdev) |
||||
{ |
||||
USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef*)pdev->pClassData;
|
||||
|
||||
hmsc->csw.dTag = hmsc->cbw.dTag; |
||||
hmsc->csw.dDataResidue = hmsc->cbw.dDataLength; |
||||
|
||||
if ((USBD_LL_GetRxDataSize (pdev ,MSC_EPOUT_ADDR) != USBD_BOT_CBW_LENGTH) || |
||||
(hmsc->cbw.dSignature != USBD_BOT_CBW_SIGNATURE)|| |
||||
(hmsc->cbw.bLUN > 1) ||
|
||||
(hmsc->cbw.bCBLength < 1) ||
|
||||
(hmsc->cbw.bCBLength > 16)) |
||||
{ |
||||
|
||||
SCSI_SenseCode(pdev, |
||||
hmsc->cbw.bLUN,
|
||||
ILLEGAL_REQUEST,
|
||||
INVALID_CDB); |
||||
|
||||
hmsc->bot_status = USBD_BOT_STATUS_ERROR;
|
||||
MSC_BOT_Abort(pdev); |
||||
|
||||
} |
||||
else |
||||
{ |
||||
if(SCSI_ProcessCmd(pdev, |
||||
hmsc->cbw.bLUN, |
||||
&hmsc->cbw.CB[0]) < 0) |
||||
{ |
||||
if(hmsc->bot_state == USBD_BOT_NO_DATA) |
||||
{ |
||||
MSC_BOT_SendCSW (pdev, |
||||
USBD_CSW_CMD_FAILED);
|
||||
} |
||||
else |
||||
{ |
||||
MSC_BOT_Abort(pdev); |
||||
} |
||||
} |
||||
/*Burst xfer handled internally*/ |
||||
else if ((hmsc->bot_state != USBD_BOT_DATA_IN) &&
|
||||
(hmsc->bot_state != USBD_BOT_DATA_OUT) && |
||||
(hmsc->bot_state != USBD_BOT_LAST_DATA_IN))
|
||||
{ |
||||
if (hmsc->bot_data_length > 0) |
||||
{ |
||||
MSC_BOT_SendData(pdev, |
||||
hmsc->bot_data,
|
||||
hmsc->bot_data_length); |
||||
} |
||||
else if (hmsc->bot_data_length == 0)
|
||||
{ |
||||
MSC_BOT_SendCSW (pdev, |
||||
USBD_CSW_CMD_PASSED); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief MSC_BOT_SendData |
||||
* Send the requested data |
||||
* @param pdev: device instance |
||||
* @param buf: pointer to data buffer |
||||
* @param len: Data Length |
||||
* @retval None |
||||
*/ |
||||
static void MSC_BOT_SendData(USBD_HandleTypeDef *pdev, |
||||
uint8_t* buf,
|
||||
uint16_t len) |
||||
{ |
||||
USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef*)pdev->pClassData;
|
||||
|
||||
len = MIN (hmsc->cbw.dDataLength, len); |
||||
hmsc->csw.dDataResidue -= len; |
||||
hmsc->csw.bStatus = USBD_CSW_CMD_PASSED; |
||||
hmsc->bot_state = USBD_BOT_SEND_DATA; |
||||
|
||||
USBD_LL_Transmit (pdev, MSC_EPIN_ADDR, buf, len);
|
||||
} |
||||
|
||||
/**
|
||||
* @brief MSC_BOT_SendCSW |
||||
* Send the Command Status Wrapper |
||||
* @param pdev: device instance |
||||
* @param status : CSW status |
||||
* @retval None |
||||
*/ |
||||
void MSC_BOT_SendCSW (USBD_HandleTypeDef *pdev, |
||||
uint8_t CSW_Status) |
||||
{ |
||||
USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef*)pdev->pClassData;
|
||||
|
||||
hmsc->csw.dSignature = USBD_BOT_CSW_SIGNATURE; |
||||
hmsc->csw.bStatus = CSW_Status; |
||||
hmsc->bot_state = USBD_BOT_IDLE; |
||||
|
||||
USBD_LL_Transmit (pdev,
|
||||
MSC_EPIN_ADDR,
|
||||
(uint8_t *)&hmsc->csw,
|
||||
USBD_BOT_CSW_LENGTH); |
||||
|
||||
/* Prepare EP to Receive next Cmd */ |
||||
USBD_LL_PrepareReceive (pdev, |
||||
MSC_EPOUT_ADDR, |
||||
(uint8_t *)&hmsc->cbw,
|
||||
USBD_BOT_CBW_LENGTH);
|
||||
|
||||
} |
||||
|
||||
/**
|
||||
* @brief MSC_BOT_Abort |
||||
* Abort the current transfer |
||||
* @param pdev: device instance |
||||
* @retval status |
||||
*/ |
||||
|
||||
static void MSC_BOT_Abort (USBD_HandleTypeDef *pdev) |
||||
{ |
||||
USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef*)pdev->pClassData;
|
||||
|
||||
if ((hmsc->cbw.bmFlags == 0) &&
|
||||
(hmsc->cbw.dDataLength != 0) && |
||||
(hmsc->bot_status == USBD_BOT_STATUS_NORMAL) ) |
||||
{ |
||||
USBD_LL_StallEP(pdev, MSC_EPOUT_ADDR ); |
||||
} |
||||
USBD_LL_StallEP(pdev, MSC_EPIN_ADDR); |
||||
|
||||
if(hmsc->bot_status == USBD_BOT_STATUS_ERROR) |
||||
{ |
||||
USBD_LL_PrepareReceive (pdev, |
||||
MSC_EPOUT_ADDR, |
||||
(uint8_t *)&hmsc->cbw,
|
||||
USBD_BOT_CBW_LENGTH);
|
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief MSC_BOT_CplClrFeature |
||||
* Complete the clear feature request |
||||
* @param pdev: device instance |
||||
* @param epnum: endpoint index |
||||
* @retval None |
||||
*/ |
||||
|
||||
void MSC_BOT_CplClrFeature (USBD_HandleTypeDef *pdev, uint8_t epnum) |
||||
{ |
||||
USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef*)pdev->pClassData;
|
||||
|
||||
if(hmsc->bot_status == USBD_BOT_STATUS_ERROR )/* Bad CBW Signature */ |
||||
{ |
||||
USBD_LL_StallEP(pdev, MSC_EPIN_ADDR); |
||||
hmsc->bot_status = USBD_BOT_STATUS_NORMAL;
|
||||
} |
||||
else if(((epnum & 0x80) == 0x80) && ( hmsc->bot_status != USBD_BOT_STATUS_RECOVERY)) |
||||
{ |
||||
MSC_BOT_SendCSW (pdev, USBD_CSW_CMD_FAILED); |
||||
} |
||||
|
||||
} |
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -0,0 +1,134 @@ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file usbd_msc_data.c |
||||
* @author MCD Application Team |
||||
* @version V2.4.2 |
||||
* @date 11-December-2015 |
||||
* @brief This file provides all the vital inquiry pages and sense data. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© COPYRIGHT 2015 STMicroelectronics</center></h2> |
||||
* |
||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); |
||||
* You may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at: |
||||
* |
||||
* http://www.st.com/software_license_agreement_liberty_v2
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
* |
||||
****************************************************************************** |
||||
*/
|
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "usbd_msc_data.h" |
||||
|
||||
|
||||
/** @addtogroup STM32_USB_DEVICE_LIBRARY
|
||||
* @{ |
||||
*/ |
||||
|
||||
|
||||
/** @defgroup MSC_DATA
|
||||
* @brief Mass storage info/data module |
||||
* @{ |
||||
*/
|
||||
|
||||
/** @defgroup MSC_DATA_Private_TypesDefinitions
|
||||
* @{ |
||||
*/
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
|
||||
/** @defgroup MSC_DATA_Private_Defines
|
||||
* @{ |
||||
*/
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
|
||||
/** @defgroup MSC_DATA_Private_Macros
|
||||
* @{ |
||||
*/
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
|
||||
/** @defgroup MSC_DATA_Private_Variables
|
||||
* @{ |
||||
*/
|
||||
|
||||
|
||||
/* USB Mass storage Page 0 Inquiry Data */ |
||||
const uint8_t MSC_Page00_Inquiry_Data[] = {//7
|
||||
0x00,
|
||||
0x00,
|
||||
0x00,
|
||||
(LENGTH_INQUIRY_PAGE00 - 4), |
||||
0x00,
|
||||
0x80,
|
||||
0x83
|
||||
};
|
||||
/* USB Mass storage sense 6 Data */ |
||||
const uint8_t MSC_Mode_Sense6_data[] = { |
||||
0x00, |
||||
0x00, |
||||
0x00, |
||||
0x00, |
||||
0x00, |
||||
0x00,
|
||||
0x00, |
||||
0x00 |
||||
};
|
||||
/* USB Mass storage sense 10 Data */ |
||||
const uint8_t MSC_Mode_Sense10_data[] = { |
||||
0x00, |
||||
0x06,
|
||||
0x00,
|
||||
0x00,
|
||||
0x00,
|
||||
0x00,
|
||||
0x00,
|
||||
0x00 |
||||
}; |
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
|
||||
/** @defgroup MSC_DATA_Private_FunctionPrototypes
|
||||
* @{ |
||||
*/
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
|
||||
/** @defgroup MSC_DATA_Private_Functions
|
||||
* @{ |
||||
*/
|
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -0,0 +1,783 @@ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file usbd_msc_scsi.c |
||||
* @author MCD Application Team |
||||
* @version V2.4.2 |
||||
* @date 11-December-2015 |
||||
* @brief This file provides all the USBD SCSI layer functions. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© COPYRIGHT 2015 STMicroelectronics</center></h2> |
||||
* |
||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); |
||||
* You may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at: |
||||
* |
||||
* http://www.st.com/software_license_agreement_liberty_v2
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
* |
||||
****************************************************************************** |
||||
*/
|
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "usbd_msc_bot.h" |
||||
#include "usbd_msc_scsi.h" |
||||
#include "usbd_msc.h" |
||||
#include "usbd_msc_data.h" |
||||
|
||||
|
||||
|
||||
/** @addtogroup STM32_USB_DEVICE_LIBRARY
|
||||
* @{ |
||||
*/ |
||||
|
||||
|
||||
/** @defgroup MSC_SCSI
|
||||
* @brief Mass storage SCSI layer module |
||||
* @{ |
||||
*/
|
||||
|
||||
/** @defgroup MSC_SCSI_Private_TypesDefinitions
|
||||
* @{ |
||||
*/
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
|
||||
/** @defgroup MSC_SCSI_Private_Defines
|
||||
* @{ |
||||
*/
|
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
|
||||
/** @defgroup MSC_SCSI_Private_Macros
|
||||
* @{ |
||||
*/
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
|
||||
/** @defgroup MSC_SCSI_Private_Variables
|
||||
* @{ |
||||
*/
|
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
|
||||
/** @defgroup MSC_SCSI_Private_FunctionPrototypes
|
||||
* @{ |
||||
*/
|
||||
static int8_t SCSI_TestUnitReady(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params); |
||||
static int8_t SCSI_Inquiry(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params); |
||||
static int8_t SCSI_ReadFormatCapacity(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params); |
||||
static int8_t SCSI_ReadCapacity10(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params); |
||||
static int8_t SCSI_RequestSense (USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params); |
||||
static int8_t SCSI_StartStopUnit(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params); |
||||
static int8_t SCSI_ModeSense6 (USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params); |
||||
static int8_t SCSI_ModeSense10 (USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params); |
||||
static int8_t SCSI_Write10(USBD_HandleTypeDef *pdev, uint8_t lun , uint8_t *params); |
||||
static int8_t SCSI_Read10(USBD_HandleTypeDef *pdev, uint8_t lun , uint8_t *params); |
||||
static int8_t SCSI_Verify10(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params); |
||||
static int8_t SCSI_CheckAddressRange (USBD_HandleTypeDef *pdev,
|
||||
uint8_t lun ,
|
||||
uint32_t blk_offset ,
|
||||
uint16_t blk_nbr); |
||||
static int8_t SCSI_ProcessRead (USBD_HandleTypeDef *pdev, |
||||
uint8_t lun); |
||||
|
||||
static int8_t SCSI_ProcessWrite (USBD_HandleTypeDef *pdev, |
||||
uint8_t lun); |
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
|
||||
/** @defgroup MSC_SCSI_Private_Functions
|
||||
* @{ |
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* @brief SCSI_ProcessCmd |
||||
* Process SCSI commands |
||||
* @param pdev: device instance |
||||
* @param lun: Logical unit number |
||||
* @param params: Command parameters |
||||
* @retval status |
||||
*/ |
||||
int8_t SCSI_ProcessCmd(USBD_HandleTypeDef *pdev, |
||||
uint8_t lun,
|
||||
uint8_t *params) |
||||
{ |
||||
|
||||
switch (params[0]) |
||||
{ |
||||
case SCSI_TEST_UNIT_READY: |
||||
return SCSI_TestUnitReady(pdev, lun, params); |
||||
|
||||
case SCSI_REQUEST_SENSE: |
||||
return SCSI_RequestSense (pdev, lun, params); |
||||
case SCSI_INQUIRY: |
||||
return SCSI_Inquiry(pdev, lun, params); |
||||
|
||||
case SCSI_START_STOP_UNIT: |
||||
return SCSI_StartStopUnit(pdev, lun, params); |
||||
|
||||
case SCSI_ALLOW_MEDIUM_REMOVAL: |
||||
return SCSI_StartStopUnit(pdev, lun, params); |
||||
|
||||
case SCSI_MODE_SENSE6: |
||||
return SCSI_ModeSense6 (pdev, lun, params); |
||||
|
||||
case SCSI_MODE_SENSE10: |
||||
return SCSI_ModeSense10 (pdev, lun, params); |
||||
|
||||
case SCSI_READ_FORMAT_CAPACITIES: |
||||
return SCSI_ReadFormatCapacity(pdev, lun, params); |
||||
|
||||
case SCSI_READ_CAPACITY10: |
||||
return SCSI_ReadCapacity10(pdev, lun, params); |
||||
|
||||
case SCSI_READ10: |
||||
return SCSI_Read10(pdev, lun, params);
|
||||
|
||||
case SCSI_WRITE10: |
||||
return SCSI_Write10(pdev, lun, params); |
||||
|
||||
case SCSI_VERIFY10: |
||||
return SCSI_Verify10(pdev, lun, params); |
||||
|
||||
default: |
||||
SCSI_SenseCode(pdev,
|
||||
lun, |
||||
ILLEGAL_REQUEST,
|
||||
INVALID_CDB);
|
||||
return -1; |
||||
} |
||||
} |
||||
|
||||
|
||||
/**
|
||||
* @brief SCSI_TestUnitReady |
||||
* Process SCSI Test Unit Ready Command |
||||
* @param lun: Logical unit number |
||||
* @param params: Command parameters |
||||
* @retval status |
||||
*/ |
||||
static int8_t SCSI_TestUnitReady(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params) |
||||
{ |
||||
USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef*)pdev->pClassData;
|
||||
|
||||
/* case 9 : Hi > D0 */ |
||||
if (hmsc->cbw.dDataLength != 0) |
||||
{ |
||||
SCSI_SenseCode(pdev, |
||||
hmsc->cbw.bLUN,
|
||||
ILLEGAL_REQUEST,
|
||||
INVALID_CDB); |
||||
return -1; |
||||
}
|
||||
|
||||
// XXX THIS SECTION IS MODIFIED FOR NOTIFY!
|
||||
// https://www.microchip.com/forums/m401735.aspx
|
||||
int8_t changeStatus = ((USBD_StorageTypeDef *)pdev->pUserData)->IsReady(lun); |
||||
if(changeStatus != 0) |
||||
{ |
||||
if (changeStatus == -1) |
||||
{ |
||||
SCSI_SenseCode(pdev, |
||||
lun, |
||||
UNIT_ATTENTION, |
||||
MEDIUM_HAVE_CHANGED); |
||||
} |
||||
else |
||||
{ |
||||
SCSI_SenseCode(pdev, |
||||
lun, |
||||
NOT_READY, |
||||
MEDIUM_NOT_PRESENT); |
||||
} |
||||
|
||||
hmsc->bot_state = USBD_BOT_NO_DATA; |
||||
return -1; |
||||
}
|
||||
hmsc->bot_data_length = 0; |
||||
return 0; |
||||
} |
||||
|
||||
/**
|
||||
* @brief SCSI_Inquiry |
||||
* Process Inquiry command |
||||
* @param lun: Logical unit number |
||||
* @param params: Command parameters |
||||
* @retval status |
||||
*/ |
||||
static int8_t SCSI_Inquiry(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params) |
||||
{ |
||||
uint8_t* pPage; |
||||
uint16_t len; |
||||
USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef*)pdev->pClassData;
|
||||
|
||||
if (params[1] & 0x01)/*Evpd is set*/ |
||||
{ |
||||
pPage = (uint8_t *)MSC_Page00_Inquiry_Data; |
||||
len = LENGTH_INQUIRY_PAGE00; |
||||
} |
||||
else |
||||
{ |
||||
|
||||
pPage = (uint8_t *)&((USBD_StorageTypeDef *)pdev->pUserData)->pInquiry[lun * STANDARD_INQUIRY_DATA_LEN]; |
||||
len = pPage[4] + 5; |
||||
|
||||
if (params[4] <= len) |
||||
{ |
||||
len = params[4]; |
||||
} |
||||
} |
||||
hmsc->bot_data_length = len; |
||||
|
||||
while (len)
|
||||
{ |
||||
len--; |
||||
hmsc->bot_data[len] = pPage[len]; |
||||
} |
||||
return 0; |
||||
} |
||||
|
||||
/**
|
||||
* @brief SCSI_ReadCapacity10 |
||||
* Process Read Capacity 10 command |
||||
* @param lun: Logical unit number |
||||
* @param params: Command parameters |
||||
* @retval status |
||||
*/ |
||||
static int8_t SCSI_ReadCapacity10(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params) |
||||
{ |
||||
USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef*)pdev->pClassData;
|
||||
|
||||
if(((USBD_StorageTypeDef *)pdev->pUserData)->GetCapacity(lun, &hmsc->scsi_blk_nbr, &hmsc->scsi_blk_size) != 0) |
||||
{ |
||||
SCSI_SenseCode(pdev, |
||||
lun, |
||||
NOT_READY,
|
||||
MEDIUM_NOT_PRESENT); |
||||
return -1; |
||||
}
|
||||
else |
||||
{ |
||||
|
||||
hmsc->bot_data[0] = (uint8_t)((hmsc->scsi_blk_nbr - 1) >> 24); |
||||
hmsc->bot_data[1] = (uint8_t)((hmsc->scsi_blk_nbr - 1) >> 16); |
||||
hmsc->bot_data[2] = (uint8_t)((hmsc->scsi_blk_nbr - 1) >> 8); |
||||
hmsc->bot_data[3] = (uint8_t)(hmsc->scsi_blk_nbr - 1); |
||||
|
||||
hmsc->bot_data[4] = (uint8_t)(hmsc->scsi_blk_size >> 24); |
||||
hmsc->bot_data[5] = (uint8_t)(hmsc->scsi_blk_size >> 16); |
||||
hmsc->bot_data[6] = (uint8_t)(hmsc->scsi_blk_size >> 8); |
||||
hmsc->bot_data[7] = (uint8_t)(hmsc->scsi_blk_size); |
||||
|
||||
hmsc->bot_data_length = 8; |
||||
return 0; |
||||
} |
||||
} |
||||
/**
|
||||
* @brief SCSI_ReadFormatCapacity |
||||
* Process Read Format Capacity command |
||||
* @param lun: Logical unit number |
||||
* @param params: Command parameters |
||||
* @retval status |
||||
*/ |
||||
static int8_t SCSI_ReadFormatCapacity(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params) |
||||
{ |
||||
USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef*)pdev->pClassData;
|
||||
|
||||
uint16_t blk_size; |
||||
uint32_t blk_nbr; |
||||
uint16_t i; |
||||
|
||||
for(i=0 ; i < 12 ; i++)
|
||||
{ |
||||
hmsc->bot_data[i] = 0; |
||||
} |
||||
|
||||
if(((USBD_StorageTypeDef *)pdev->pUserData)->GetCapacity(lun, &blk_nbr, &blk_size) != 0) |
||||
{ |
||||
SCSI_SenseCode(pdev, |
||||
lun, |
||||
NOT_READY,
|
||||
MEDIUM_NOT_PRESENT); |
||||
return -1; |
||||
}
|
||||
else |
||||
{ |
||||
hmsc->bot_data[3] = 0x08; |
||||
hmsc->bot_data[4] = (uint8_t)((blk_nbr - 1) >> 24); |
||||
hmsc->bot_data[5] = (uint8_t)((blk_nbr - 1) >> 16); |
||||
hmsc->bot_data[6] = (uint8_t)((blk_nbr - 1) >> 8); |
||||
hmsc->bot_data[7] = (uint8_t)(blk_nbr - 1); |
||||
|
||||
hmsc->bot_data[8] = 0x02; |
||||
hmsc->bot_data[9] = (uint8_t)(blk_size >> 16); |
||||
hmsc->bot_data[10] = (uint8_t)(blk_size >> 8); |
||||
hmsc->bot_data[11] = (uint8_t)(blk_size); |
||||
|
||||
hmsc->bot_data_length = 12; |
||||
return 0; |
||||
} |
||||
} |
||||
/**
|
||||
* @brief SCSI_ModeSense6 |
||||
* Process Mode Sense6 command |
||||
* @param lun: Logical unit number |
||||
* @param params: Command parameters |
||||
* @retval status |
||||
*/ |
||||
static int8_t SCSI_ModeSense6 (USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params) |
||||
{ |
||||
USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef*)pdev->pClassData;
|
||||
uint16_t len = 8 ; |
||||
hmsc->bot_data_length = len; |
||||
|
||||
while (len)
|
||||
{ |
||||
len--; |
||||
hmsc->bot_data[len] = MSC_Mode_Sense6_data[len]; |
||||
} |
||||
return 0; |
||||
} |
||||
|
||||
/**
|
||||
* @brief SCSI_ModeSense10 |
||||
* Process Mode Sense10 command |
||||
* @param lun: Logical unit number |
||||
* @param params: Command parameters |
||||
* @retval status |
||||
*/ |
||||
static int8_t SCSI_ModeSense10 (USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params) |
||||
{ |
||||
uint16_t len = 8; |
||||
USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef*)pdev->pClassData;
|
||||
|
||||
hmsc->bot_data_length = len; |
||||
|
||||
while (len)
|
||||
{ |
||||
len--; |
||||
hmsc->bot_data[len] = MSC_Mode_Sense10_data[len]; |
||||
} |
||||
return 0; |
||||
} |
||||
|
||||
/**
|
||||
* @brief SCSI_RequestSense |
||||
* Process Request Sense command |
||||
* @param lun: Logical unit number |
||||
* @param params: Command parameters |
||||
* @retval status |
||||
*/ |
||||
|
||||
static int8_t SCSI_RequestSense (USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params) |
||||
{ |
||||
uint8_t i; |
||||
USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef*)pdev->pClassData;
|
||||
|
||||
for(i=0 ; i < REQUEST_SENSE_DATA_LEN ; i++)
|
||||
{ |
||||
hmsc->bot_data[i] = 0; |
||||
} |
||||
|
||||
hmsc->bot_data[0] = 0x70;
|
||||
hmsc->bot_data[7] = REQUEST_SENSE_DATA_LEN - 6;
|
||||
|
||||
if((hmsc->scsi_sense_head != hmsc->scsi_sense_tail)) { |
||||
|
||||
hmsc->bot_data[2] = hmsc->scsi_sense[hmsc->scsi_sense_head].Skey;
|
||||
hmsc->bot_data[12] = hmsc->scsi_sense[hmsc->scsi_sense_head].w.b.ASCQ;
|
||||
hmsc->bot_data[13] = hmsc->scsi_sense[hmsc->scsi_sense_head].w.b.ASC;
|
||||
hmsc->scsi_sense_head++; |
||||
|
||||
if (hmsc->scsi_sense_head == SENSE_LIST_DEEPTH) |
||||
{ |
||||
hmsc->scsi_sense_head = 0; |
||||
} |
||||
} |
||||
hmsc->bot_data_length = REQUEST_SENSE_DATA_LEN;
|
||||
|
||||
if (params[4] <= REQUEST_SENSE_DATA_LEN) |
||||
{ |
||||
hmsc->bot_data_length = params[4]; |
||||
} |
||||
return 0; |
||||
} |
||||
|
||||
/**
|
||||
* @brief SCSI_SenseCode |
||||
* Load the last error code in the error list |
||||
* @param lun: Logical unit number |
||||
* @param sKey: Sense Key |
||||
* @param ASC: Additional Sense Key |
||||
* @retval none |
||||
|
||||
*/ |
||||
void SCSI_SenseCode(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t sKey, uint8_t ASC) |
||||
{ |
||||
USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef*)pdev->pClassData;
|
||||
|
||||
hmsc->scsi_sense[hmsc->scsi_sense_tail].Skey = sKey; |
||||
hmsc->scsi_sense[hmsc->scsi_sense_tail].w.ASC = ASC << 8; |
||||
hmsc->scsi_sense_tail++; |
||||
if (hmsc->scsi_sense_tail == SENSE_LIST_DEEPTH) |
||||
{ |
||||
hmsc->scsi_sense_tail = 0; |
||||
} |
||||
} |
||||
/**
|
||||
* @brief SCSI_StartStopUnit |
||||
* Process Start Stop Unit command |
||||
* @param lun: Logical unit number |
||||
* @param params: Command parameters |
||||
* @retval status |
||||
*/ |
||||
static int8_t SCSI_StartStopUnit(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params) |
||||
{ |
||||
USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef*) pdev->pClassData;
|
||||
hmsc->bot_data_length = 0; |
||||
return 0; |
||||
} |
||||
|
||||
/**
|
||||
* @brief SCSI_Read10 |
||||
* Process Read10 command |
||||
* @param lun: Logical unit number |
||||
* @param params: Command parameters |
||||
* @retval status |
||||
*/ |
||||
static int8_t SCSI_Read10(USBD_HandleTypeDef *pdev, uint8_t lun , uint8_t *params) |
||||
{ |
||||
USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef*) pdev->pClassData;
|
||||
|
||||
if(hmsc->bot_state == USBD_BOT_IDLE) /* Idle */ |
||||
{ |
||||
|
||||
/* case 10 : Ho <> Di */ |
||||
|
||||
if ((hmsc->cbw.bmFlags & 0x80) != 0x80) |
||||
{ |
||||
SCSI_SenseCode(pdev, |
||||
hmsc->cbw.bLUN,
|
||||
ILLEGAL_REQUEST,
|
||||
INVALID_CDB); |
||||
return -1; |
||||
}
|
||||
|
||||
if(((USBD_StorageTypeDef *)pdev->pUserData)->IsReady(lun) !=0 ) |
||||
{ |
||||
SCSI_SenseCode(pdev, |
||||
lun, |
||||
NOT_READY,
|
||||
MEDIUM_NOT_PRESENT); |
||||
return -1; |
||||
}
|
||||
|
||||
hmsc->scsi_blk_addr = (params[2] << 24) | \
|
||||
(params[3] << 16) | \
|
||||
(params[4] << 8) | \
|
||||
params[5]; |
||||
|
||||
hmsc->scsi_blk_len = (params[7] << 8) | \
|
||||
params[8];
|
||||
|
||||
|
||||
|
||||
if( SCSI_CheckAddressRange(pdev, lun, hmsc->scsi_blk_addr, hmsc->scsi_blk_len) < 0) |
||||
{ |
||||
return -1; /* error */ |
||||
} |
||||
|
||||
hmsc->bot_state = USBD_BOT_DATA_IN; |
||||
hmsc->scsi_blk_addr *= hmsc->scsi_blk_size; |
||||
hmsc->scsi_blk_len *= hmsc->scsi_blk_size; |
||||
|
||||
/* cases 4,5 : Hi <> Dn */ |
||||
if (hmsc->cbw.dDataLength != hmsc->scsi_blk_len) |
||||
{ |
||||
SCSI_SenseCode(pdev, |
||||
hmsc->cbw.bLUN,
|
||||
ILLEGAL_REQUEST,
|
||||
INVALID_CDB); |
||||
return -1; |
||||
} |
||||
} |
||||
hmsc->bot_data_length = MSC_MEDIA_PACKET;
|
||||
|
||||
return SCSI_ProcessRead(pdev, lun); |
||||
} |
||||
|
||||
/**
|
||||
* @brief SCSI_Write10 |
||||
* Process Write10 command |
||||
* @param lun: Logical unit number |
||||
* @param params: Command parameters |
||||
* @retval status |
||||
*/ |
||||
|
||||
static int8_t SCSI_Write10 (USBD_HandleTypeDef *pdev, uint8_t lun , uint8_t *params) |
||||
{ |
||||
USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef*) pdev->pClassData;
|
||||
|
||||
if (hmsc->bot_state == USBD_BOT_IDLE) /* Idle */ |
||||
{ |
||||
|
||||
/* case 8 : Hi <> Do */ |
||||
|
||||
if ((hmsc->cbw.bmFlags & 0x80) == 0x80) |
||||
{ |
||||
SCSI_SenseCode(pdev, |
||||
hmsc->cbw.bLUN,
|
||||
ILLEGAL_REQUEST,
|
||||
INVALID_CDB); |
||||
return -1; |
||||
} |
||||
|
||||
/* Check whether Media is ready */ |
||||
if(((USBD_StorageTypeDef *)pdev->pUserData)->IsReady(lun) !=0 ) |
||||
{ |
||||
SCSI_SenseCode(pdev, |
||||
lun, |
||||
NOT_READY,
|
||||
MEDIUM_NOT_PRESENT); |
||||
return -1; |
||||
}
|
||||
|
||||
/* Check If media is write-protected */ |
||||
if(((USBD_StorageTypeDef *)pdev->pUserData)->IsWriteProtected(lun) !=0 ) |
||||
{ |
||||
SCSI_SenseCode(pdev, |
||||
lun, |
||||
NOT_READY,
|
||||
WRITE_PROTECTED); |
||||
return -1; |
||||
}
|
||||
|
||||
|
||||
hmsc->scsi_blk_addr = (params[2] << 24) | \
|
||||
(params[3] << 16) | \
|
||||
(params[4] << 8) | \
|
||||
params[5]; |
||||
hmsc->scsi_blk_len = (params[7] << 8) | \
|
||||
params[8];
|
||||
|
||||
/* check if LBA address is in the right range */ |
||||
if(SCSI_CheckAddressRange(pdev, |
||||
lun, |
||||
hmsc->scsi_blk_addr, |
||||
hmsc->scsi_blk_len) < 0) |
||||
{ |
||||
return -1; /* error */
|
||||
} |
||||
|
||||
hmsc->scsi_blk_addr *= hmsc->scsi_blk_size; |
||||
hmsc->scsi_blk_len *= hmsc->scsi_blk_size; |
||||
|
||||
/* cases 3,11,13 : Hn,Ho <> D0 */ |
||||
if (hmsc->cbw.dDataLength != hmsc->scsi_blk_len) |
||||
{ |
||||
SCSI_SenseCode(pdev, |
||||
hmsc->cbw.bLUN,
|
||||
ILLEGAL_REQUEST,
|
||||
INVALID_CDB); |
||||
return -1; |
||||
} |
||||
|
||||
/* Prepare EP to receive first data packet */ |
||||
hmsc->bot_state = USBD_BOT_DATA_OUT;
|
||||
USBD_LL_PrepareReceive (pdev, |
||||
MSC_EPOUT_ADDR, |
||||
hmsc->bot_data,
|
||||
MIN (hmsc->scsi_blk_len, MSC_MEDIA_PACKET));
|
||||
} |
||||
else /* Write Process ongoing */ |
||||
{ |
||||
return SCSI_ProcessWrite(pdev, lun); |
||||
} |
||||
return 0; |
||||
} |
||||
|
||||
|
||||
/**
|
||||
* @brief SCSI_Verify10 |
||||
* Process Verify10 command |
||||
* @param lun: Logical unit number |
||||
* @param params: Command parameters |
||||
* @retval status |
||||
*/ |
||||
|
||||
static int8_t SCSI_Verify10(USBD_HandleTypeDef *pdev, uint8_t lun , uint8_t *params) |
||||
{ |
||||
USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef*) pdev->pClassData;
|
||||
|
||||
if ((params[1]& 0x02) == 0x02)
|
||||
{ |
||||
SCSI_SenseCode (pdev, |
||||
lun,
|
||||
ILLEGAL_REQUEST,
|
||||
INVALID_FIELED_IN_COMMAND); |
||||
return -1; /* Error, Verify Mode Not supported*/ |
||||
} |
||||
|
||||
if(SCSI_CheckAddressRange(pdev, |
||||
lun,
|
||||
hmsc->scsi_blk_addr,
|
||||
hmsc->scsi_blk_len) < 0) |
||||
{ |
||||
return -1; /* error */
|
||||
} |
||||
hmsc->bot_data_length = 0; |
||||
return 0; |
||||
} |
||||
|
||||
/**
|
||||
* @brief SCSI_CheckAddressRange |
||||
* Check address range |
||||
* @param lun: Logical unit number |
||||
* @param blk_offset: first block address |
||||
* @param blk_nbr: number of block to be processed |
||||
* @retval status |
||||
*/ |
||||
static int8_t SCSI_CheckAddressRange (USBD_HandleTypeDef *pdev, uint8_t lun , uint32_t blk_offset , uint16_t blk_nbr) |
||||
{ |
||||
USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef*) pdev->pClassData;
|
||||
|
||||
if ((blk_offset + blk_nbr) > hmsc->scsi_blk_nbr ) |
||||
{ |
||||
SCSI_SenseCode(pdev, |
||||
lun,
|
||||
ILLEGAL_REQUEST,
|
||||
ADDRESS_OUT_OF_RANGE); |
||||
return -1; |
||||
} |
||||
return 0; |
||||
} |
||||
|
||||
/**
|
||||
* @brief SCSI_ProcessRead |
||||
* Handle Read Process |
||||
* @param lun: Logical unit number |
||||
* @retval status |
||||
*/ |
||||
static int8_t SCSI_ProcessRead (USBD_HandleTypeDef *pdev, uint8_t lun) |
||||
{ |
||||
USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef*)pdev->pClassData;
|
||||
uint32_t len; |
||||
|
||||
len = MIN(hmsc->scsi_blk_len , MSC_MEDIA_PACKET);
|
||||
|
||||
if( ((USBD_StorageTypeDef *)pdev->pUserData)->Read(lun , |
||||
hmsc->bot_data,
|
||||
hmsc->scsi_blk_addr / hmsc->scsi_blk_size,
|
||||
len / hmsc->scsi_blk_size) < 0) |
||||
{ |
||||
|
||||
SCSI_SenseCode(pdev, |
||||
lun,
|
||||
HARDWARE_ERROR,
|
||||
UNRECOVERED_READ_ERROR); |
||||
return -1;
|
||||
} |
||||
|
||||
|
||||
USBD_LL_Transmit (pdev,
|
||||
MSC_EPIN_ADDR, |
||||
hmsc->bot_data, |
||||
len); |
||||
|
||||
|
||||
hmsc->scsi_blk_addr += len;
|
||||
hmsc->scsi_blk_len -= len;
|
||||
|
||||
/* case 6 : Hi = Di */ |
||||
hmsc->csw.dDataResidue -= len; |
||||
|
||||
if (hmsc->scsi_blk_len == 0) |
||||
{ |
||||
hmsc->bot_state = USBD_BOT_LAST_DATA_IN; |
||||
} |
||||
return 0; |
||||
} |
||||
|
||||
/**
|
||||
* @brief SCSI_ProcessWrite |
||||
* Handle Write Process |
||||
* @param lun: Logical unit number |
||||
* @retval status |
||||
*/ |
||||
|
||||
static int8_t SCSI_ProcessWrite (USBD_HandleTypeDef *pdev, uint8_t lun) |
||||
{ |
||||
uint32_t len; |
||||
USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef*) pdev->pClassData;
|
||||
|
||||
len = MIN(hmsc->scsi_blk_len , MSC_MEDIA_PACKET);
|
||||
|
||||
if(((USBD_StorageTypeDef *)pdev->pUserData)->Write(lun , |
||||
hmsc->bot_data,
|
||||
hmsc->scsi_blk_addr / hmsc->scsi_blk_size,
|
||||
len / hmsc->scsi_blk_size) < 0) |
||||
{ |
||||
SCSI_SenseCode(pdev, |
||||
lun,
|
||||
HARDWARE_ERROR,
|
||||
WRITE_FAULT);
|
||||
return -1;
|
||||
} |
||||
|
||||
|
||||
hmsc->scsi_blk_addr += len;
|
||||
hmsc->scsi_blk_len -= len;
|
||||
|
||||
/* case 12 : Ho = Do */ |
||||
hmsc->csw.dDataResidue -= len; |
||||
|
||||
if (hmsc->scsi_blk_len == 0) |
||||
{ |
||||
MSC_BOT_SendCSW (pdev, USBD_CSW_CMD_PASSED); |
||||
} |
||||
else |
||||
{ |
||||
/* Prepare EP to Receive next packet */ |
||||
USBD_LL_PrepareReceive (pdev, |
||||
MSC_EPOUT_ADDR, |
||||
hmsc->bot_data,
|
||||
MIN (hmsc->scsi_blk_len, MSC_MEDIA_PACKET));
|
||||
} |
||||
|
||||
return 0; |
||||
} |
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -0,0 +1,37 @@ |
||||
--- Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc_scsi.c (date 1511202099000) |
||||
+++ Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc_scsi.c (revision ) |
||||
@@ -190,14 +190,27 @@ |
||||
INVALID_CDB); |
||||
return -1; |
||||
} |
||||
- |
||||
- if(((USBD_StorageTypeDef *)pdev->pUserData)->IsReady(lun) !=0 ) |
||||
+ |
||||
+ // XXX THIS SECTION IS MODIFIED FOR NOTIFY! |
||||
+ // https://www.microchip.com/forums/m401735.aspx |
||||
+ int8_t changeStatus = ((USBD_StorageTypeDef *)pdev->pUserData)->IsReady(lun); |
||||
+ if(changeStatus != 0) |
||||
{ |
||||
- SCSI_SenseCode(pdev, |
||||
- lun, |
||||
- NOT_READY, |
||||
- MEDIUM_NOT_PRESENT); |
||||
- |
||||
+ if (changeStatus == -1) |
||||
+ { |
||||
+ SCSI_SenseCode(pdev, |
||||
+ lun, |
||||
+ UNIT_ATTENTION, |
||||
+ MEDIUM_HAVE_CHANGED); |
||||
+ } |
||||
+ else |
||||
+ { |
||||
+ SCSI_SenseCode(pdev, |
||||
+ lun, |
||||
+ NOT_READY, |
||||
+ MEDIUM_NOT_PRESENT); |
||||
+ } |
||||
+ |
||||
hmsc->bot_state = USBD_BOT_NO_DATA; |
||||
return -1; |
||||
} |
@ -0,0 +1,188 @@ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file usbd_msc_storage_template.c |
||||
* @author MCD Application Team |
||||
* @version V2.4.2 |
||||
* @date 11-December-2015 |
||||
* @brief Memory management layer |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© COPYRIGHT 2015 STMicroelectronics</center></h2> |
||||
* |
||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); |
||||
* You may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at: |
||||
* |
||||
* http://www.st.com/software_license_agreement_liberty_v2
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
* |
||||
****************************************************************************** |
||||
*/
|
||||
|
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "usbd_msc_storage_template.h" |
||||
|
||||
|
||||
/* Private typedef -----------------------------------------------------------*/ |
||||
/* Private define ------------------------------------------------------------*/ |
||||
/* Private macro -------------------------------------------------------------*/ |
||||
/* Private variables ---------------------------------------------------------*/ |
||||
/* Private function prototypes -----------------------------------------------*/ |
||||
/* Extern function prototypes ------------------------------------------------*/ |
||||
/* Private functions ---------------------------------------------------------*/ |
||||
|
||||
#define STORAGE_LUN_NBR 1 |
||||
#define STORAGE_BLK_NBR 0x10000 |
||||
#define STORAGE_BLK_SIZ 0x200 |
||||
|
||||
int8_t STORAGE_Init (uint8_t lun); |
||||
|
||||
int8_t STORAGE_GetCapacity (uint8_t lun,
|
||||
uint32_t *block_num,
|
||||
uint16_t *block_size); |
||||
|
||||
int8_t STORAGE_IsReady (uint8_t lun); |
||||
|
||||
int8_t STORAGE_IsWriteProtected (uint8_t lun); |
||||
|
||||
int8_t STORAGE_Read (uint8_t lun,
|
||||
uint8_t *buf,
|
||||
uint32_t blk_addr, |
||||
uint16_t blk_len); |
||||
|
||||
int8_t STORAGE_Write (uint8_t lun,
|
||||
uint8_t *buf,
|
||||
uint32_t blk_addr, |
||||
uint16_t blk_len); |
||||
|
||||
int8_t STORAGE_GetMaxLun (void); |
||||
|
||||
/* USB Mass storage Standard Inquiry Data */ |
||||
int8_t STORAGE_Inquirydata[] = {//36
|
||||
|
||||
/* LUN 0 */ |
||||
0x00,
|
||||
0x80,
|
||||
0x02,
|
||||
0x02, |
||||
(STANDARD_INQUIRY_DATA_LEN - 5), |
||||
0x00, |
||||
0x00,
|
||||
0x00, |
||||
'S', 'T', 'M', ' ', ' ', ' ', ' ', ' ', /* Manufacturer : 8 bytes */ |
||||
'P', 'r', 'o', 'd', 'u', 'c', 't', ' ', /* Product : 16 Bytes */ |
||||
' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', |
||||
'0', '.', '0' ,'1', /* Version : 4 Bytes */ |
||||
};
|
||||
|
||||
USBD_StorageTypeDef USBD_MSC_Template_fops = |
||||
{ |
||||
STORAGE_Init, |
||||
STORAGE_GetCapacity, |
||||
STORAGE_IsReady, |
||||
STORAGE_IsWriteProtected, |
||||
STORAGE_Read, |
||||
STORAGE_Write, |
||||
STORAGE_GetMaxLun, |
||||
STORAGE_Inquirydata, |
||||
|
||||
}; |
||||
/*******************************************************************************
|
||||
* Function Name : Read_Memory |
||||
* Description : Handle the Read operation from the microSD card. |
||||
* Input : None. |
||||
* Output : None. |
||||
* Return : None. |
||||
*******************************************************************************/ |
||||
int8_t STORAGE_Init (uint8_t lun) |
||||
{ |
||||
return (0); |
||||
} |
||||
|
||||
/*******************************************************************************
|
||||
* Function Name : Read_Memory |
||||
* Description : Handle the Read operation from the STORAGE card. |
||||
* Input : None. |
||||
* Output : None. |
||||
* Return : None. |
||||
*******************************************************************************/ |
||||
int8_t STORAGE_GetCapacity (uint8_t lun, uint32_t *block_num, uint16_t *block_size) |
||||
{ |
||||
*block_num = STORAGE_BLK_NBR; |
||||
*block_size = STORAGE_BLK_SIZ; |
||||
return (0); |
||||
} |
||||
|
||||
/*******************************************************************************
|
||||
* Function Name : Read_Memory |
||||
* Description : Handle the Read operation from the STORAGE card. |
||||
* Input : None. |
||||
* Output : None. |
||||
* Return : None. |
||||
*******************************************************************************/ |
||||
int8_t STORAGE_IsReady (uint8_t lun) |
||||
{ |
||||
return (0); |
||||
} |
||||
|
||||
/*******************************************************************************
|
||||
* Function Name : Read_Memory |
||||
* Description : Handle the Read operation from the STORAGE card. |
||||
* Input : None. |
||||
* Output : None. |
||||
* Return : None. |
||||
*******************************************************************************/ |
||||
int8_t STORAGE_IsWriteProtected (uint8_t lun) |
||||
{ |
||||
return 0; |
||||
} |
||||
|
||||
/*******************************************************************************
|
||||
* Function Name : Read_Memory |
||||
* Description : Handle the Read operation from the STORAGE card. |
||||
* Input : None. |
||||
* Output : None. |
||||
* Return : None. |
||||
*******************************************************************************/ |
||||
int8_t STORAGE_Read (uint8_t lun,
|
||||
uint8_t *buf,
|
||||
uint32_t blk_addr,
|
||||
uint16_t blk_len) |
||||
{ |
||||
return 0; |
||||
} |
||||
/*******************************************************************************
|
||||
* Function Name : Write_Memory |
||||
* Description : Handle the Write operation to the STORAGE card. |
||||
* Input : None. |
||||
* Output : None. |
||||
* Return : None. |
||||
*******************************************************************************/ |
||||
int8_t STORAGE_Write (uint8_t lun,
|
||||
uint8_t *buf,
|
||||
uint32_t blk_addr, |
||||
uint16_t blk_len) |
||||
{ |
||||
return (0); |
||||
} |
||||
/*******************************************************************************
|
||||
* Function Name : Write_Memory |
||||
* Description : Handle the Write operation to the STORAGE card. |
||||
* Input : None. |
||||
* Output : None. |
||||
* Return : None. |
||||
*******************************************************************************/ |
||||
int8_t STORAGE_GetMaxLun (void) |
||||
{ |
||||
return (STORAGE_LUN_NBR - 1); |
||||
} |
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
||||
|
@ -0,0 +1,169 @@ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file usbd_conf_template.h |
||||
* @author MCD Application Team |
||||
* @version V2.4.2 |
||||
* @date 11-December-2015 |
||||
* @brief Header file for the usbd_conf_template.c file |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© COPYRIGHT 2015 STMicroelectronics</center></h2> |
||||
* |
||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); |
||||
* You may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at: |
||||
* |
||||
* http://www.st.com/software_license_agreement_liberty_v2
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/ |
||||
#ifndef __USBD_CONF_TEMPLATE_H |
||||
#define __USBD_CONF_TEMPLATE_H |
||||
|
||||
#ifdef __cplusplus |
||||
extern "C" { |
||||
#endif |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "stm32fxxx.h" /* replace 'stm32xxx' with your HAL driver header filename, ex: stm32f4xx.h */ |
||||
#include <stdio.h> |
||||
#include <stdlib.h> |
||||
#include <string.h> |
||||
|
||||
/** @addtogroup STM32_USB_DEVICE_LIBRARY
|
||||
* @{ |
||||
*/ |
||||
|
||||
/** @defgroup USBD_CONF
|
||||
* @brief USB device low level driver configuration file |
||||
* @{ |
||||
*/
|
||||
|
||||
/** @defgroup USBD_CONF_Exported_Defines
|
||||
* @{ |
||||
*/
|
||||
|
||||
#define USBD_MAX_NUM_INTERFACES 1 |
||||
#define USBD_MAX_NUM_CONFIGURATION 1 |
||||
#define USBD_MAX_STR_DESC_SIZ 0x100 |
||||
#define USBD_SUPPORT_USER_STRING 0 |
||||
#define USBD_SELF_POWERED 1 |
||||
#define USBD_DEBUG_LEVEL 2 |
||||
|
||||
/* MSC Class Config */ |
||||
#define MSC_MEDIA_PACKET 8192 |
||||
|
||||
/* CDC Class Config */ |
||||
#define USBD_CDC_INTERVAL 2000 |
||||
|
||||
/* DFU Class Config */ |
||||
#define USBD_DFU_MAX_ITF_NUM 1 |
||||
#define USBD_DFU_XFERS_IZE 1024 |
||||
|
||||
/* AUDIO Class Config */ |
||||
#define USBD_AUDIO_FREQ 22100 |
||||
|
||||
/** @defgroup USBD_Exported_Macros
|
||||
* @{ |
||||
*/
|
||||
|
||||
/* Memory management macros */
|
||||
#define USBD_malloc malloc |
||||
#define USBD_free free |
||||
#define USBD_memset memset |
||||
#define USBD_memcpy memcpy |
||||
|
||||
/* DEBUG macros */
|
||||
|
||||
|
||||
#if (USBD_DEBUG_LEVEL > 0) |
||||
#define USBD_UsrLog(...) printf(__VA_ARGS__);\ |
||||
printf("\n"); |
||||
#else |
||||
#define USBD_UsrLog(...) |
||||
#endif |
||||
|
||||
|
||||
#if (USBD_DEBUG_LEVEL > 1) |
||||
|
||||
#define USBD_ErrLog(...) printf("ERROR: ") ;\ |
||||
printf(__VA_ARGS__);\
|
||||
printf("\n"); |
||||
#else |
||||
#define USBD_ErrLog(...) |
||||
#endif |
||||
|
||||
|
||||
#if (USBD_DEBUG_LEVEL > 2) |
||||
#define USBD_DbgLog(...) printf("DEBUG : ") ;\ |
||||
printf(__VA_ARGS__);\
|
||||
printf("\n"); |
||||
#else |
||||
#define USBD_DbgLog(...) |
||||
#endif |
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
|
||||
/** @defgroup USBD_CONF_Exported_Types
|
||||
* @{ |
||||
*/
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
|
||||
/** @defgroup USBD_CONF_Exported_Macros
|
||||
* @{ |
||||
*/
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
/** @defgroup USBD_CONF_Exported_Variables
|
||||
* @{ |
||||
*/
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
/** @defgroup USBD_CONF_Exported_FunctionsPrototype
|
||||
* @{ |
||||
*/
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
#ifdef __cplusplus |
||||
} |
||||
#endif |
||||
|
||||
#endif /* __USBD_CONF_TEMPLATE_H */ |
||||
|
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
||||
|
@ -0,0 +1,167 @@ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file usbd_core.h |
||||
* @author MCD Application Team |
||||
* @version V2.4.2 |
||||
* @date 11-December-2015 |
||||
* @brief Header file for usbd_core.c file |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© COPYRIGHT 2015 STMicroelectronics</center></h2> |
||||
* |
||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); |
||||
* You may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at: |
||||
* |
||||
* http://www.st.com/software_license_agreement_liberty_v2
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
* |
||||
****************************************************************************** |
||||
*/
|
||||
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/ |
||||
#ifndef __USBD_CORE_H |
||||
#define __USBD_CORE_H |
||||
|
||||
#ifdef __cplusplus |
||||
extern "C" { |
||||
#endif |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "usbd_conf.h" |
||||
#include "usbd_def.h" |
||||
#include "usbd_ioreq.h" |
||||
#include "usbd_ctlreq.h" |
||||
|
||||
/** @addtogroup STM32_USB_DEVICE_LIBRARY
|
||||
* @{ |
||||
*/ |
||||
|
||||
/** @defgroup USBD_CORE
|
||||
* @brief This file is the Header file for usbd_core.c file |
||||
* @{ |
||||
*/
|
||||
|
||||
|
||||
/** @defgroup USBD_CORE_Exported_Defines
|
||||
* @{ |
||||
*/
|
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
|
||||
/** @defgroup USBD_CORE_Exported_TypesDefinitions
|
||||
* @{ |
||||
*/ |
||||
|
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
|
||||
|
||||
/** @defgroup USBD_CORE_Exported_Macros
|
||||
* @{ |
||||
*/
|
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
/** @defgroup USBD_CORE_Exported_Variables
|
||||
* @{ |
||||
*/
|
||||
#define USBD_SOF USBD_LL_SOF |
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
/** @defgroup USBD_CORE_Exported_FunctionsPrototype
|
||||
* @{ |
||||
*/
|
||||
USBD_StatusTypeDef USBD_Init(USBD_HandleTypeDef *pdev, USBD_DescriptorsTypeDef *pdesc, uint8_t id); |
||||
USBD_StatusTypeDef USBD_DeInit(USBD_HandleTypeDef *pdev); |
||||
USBD_StatusTypeDef USBD_Start (USBD_HandleTypeDef *pdev); |
||||
USBD_StatusTypeDef USBD_Stop (USBD_HandleTypeDef *pdev); |
||||
USBD_StatusTypeDef USBD_RegisterClass(USBD_HandleTypeDef *pdev, USBD_ClassTypeDef *pclass); |
||||
|
||||
USBD_StatusTypeDef USBD_RunTestMode (USBD_HandleTypeDef *pdev);
|
||||
USBD_StatusTypeDef USBD_SetClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx); |
||||
USBD_StatusTypeDef USBD_ClrClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx); |
||||
|
||||
USBD_StatusTypeDef USBD_LL_SetupStage(USBD_HandleTypeDef *pdev, uint8_t *psetup); |
||||
USBD_StatusTypeDef USBD_LL_DataOutStage(USBD_HandleTypeDef *pdev , uint8_t epnum, uint8_t *pdata); |
||||
USBD_StatusTypeDef USBD_LL_DataInStage(USBD_HandleTypeDef *pdev , uint8_t epnum, uint8_t *pdata); |
||||
|
||||
USBD_StatusTypeDef USBD_LL_Reset(USBD_HandleTypeDef *pdev); |
||||
USBD_StatusTypeDef USBD_LL_SetSpeed(USBD_HandleTypeDef *pdev, USBD_SpeedTypeDef speed); |
||||
USBD_StatusTypeDef USBD_LL_Suspend(USBD_HandleTypeDef *pdev); |
||||
USBD_StatusTypeDef USBD_LL_Resume(USBD_HandleTypeDef *pdev); |
||||
|
||||
USBD_StatusTypeDef USBD_LL_SOF(USBD_HandleTypeDef *pdev); |
||||
USBD_StatusTypeDef USBD_LL_IsoINIncomplete(USBD_HandleTypeDef *pdev, uint8_t epnum); |
||||
USBD_StatusTypeDef USBD_LL_IsoOUTIncomplete(USBD_HandleTypeDef *pdev, uint8_t epnum); |
||||
|
||||
USBD_StatusTypeDef USBD_LL_DevConnected(USBD_HandleTypeDef *pdev); |
||||
USBD_StatusTypeDef USBD_LL_DevDisconnected(USBD_HandleTypeDef *pdev); |
||||
|
||||
/* USBD Low Level Driver */ |
||||
USBD_StatusTypeDef USBD_LL_Init (USBD_HandleTypeDef *pdev); |
||||
USBD_StatusTypeDef USBD_LL_DeInit (USBD_HandleTypeDef *pdev); |
||||
USBD_StatusTypeDef USBD_LL_Start(USBD_HandleTypeDef *pdev); |
||||
USBD_StatusTypeDef USBD_LL_Stop (USBD_HandleTypeDef *pdev); |
||||
USBD_StatusTypeDef USBD_LL_OpenEP (USBD_HandleTypeDef *pdev,
|
||||
uint8_t ep_addr,
|
||||
uint8_t ep_type, |
||||
uint16_t ep_mps); |
||||
|
||||
USBD_StatusTypeDef USBD_LL_CloseEP (USBD_HandleTypeDef *pdev, uint8_t ep_addr);
|
||||
USBD_StatusTypeDef USBD_LL_FlushEP (USBD_HandleTypeDef *pdev, uint8_t ep_addr);
|
||||
USBD_StatusTypeDef USBD_LL_StallEP (USBD_HandleTypeDef *pdev, uint8_t ep_addr);
|
||||
USBD_StatusTypeDef USBD_LL_ClearStallEP (USBD_HandleTypeDef *pdev, uint8_t ep_addr);
|
||||
uint8_t USBD_LL_IsStallEP (USBD_HandleTypeDef *pdev, uint8_t ep_addr);
|
||||
USBD_StatusTypeDef USBD_LL_SetUSBAddress (USBD_HandleTypeDef *pdev, uint8_t dev_addr);
|
||||
USBD_StatusTypeDef USBD_LL_Transmit (USBD_HandleTypeDef *pdev,
|
||||
uint8_t ep_addr,
|
||||
uint8_t *pbuf, |
||||
uint16_t size); |
||||
|
||||
USBD_StatusTypeDef USBD_LL_PrepareReceive(USBD_HandleTypeDef *pdev,
|
||||
uint8_t ep_addr,
|
||||
uint8_t *pbuf, |
||||
uint16_t size); |
||||
|
||||
uint32_t USBD_LL_GetRxDataSize (USBD_HandleTypeDef *pdev, uint8_t ep_addr);
|
||||
void USBD_LL_Delay (uint32_t Delay); |
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
#ifdef __cplusplus |
||||
} |
||||
#endif |
||||
|
||||
#endif /* __USBD_CORE_H */ |
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
||||
|
||||
|
||||
|
@ -0,0 +1,113 @@ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file usbd_req.h |
||||
* @author MCD Application Team |
||||
* @version V2.4.2 |
||||
* @date 11-December-2015 |
||||
* @brief Header file for the usbd_req.c file |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© COPYRIGHT 2015 STMicroelectronics</center></h2> |
||||
* |
||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); |
||||
* You may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at: |
||||
* |
||||
* http://www.st.com/software_license_agreement_liberty_v2
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
* |
||||
****************************************************************************** |
||||
*/
|
||||
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/ |
||||
#ifndef __USB_REQUEST_H |
||||
#define __USB_REQUEST_H |
||||
|
||||
#ifdef __cplusplus |
||||
extern "C" { |
||||
#endif |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "usbd_def.h" |
||||
|
||||
|
||||
/** @addtogroup STM32_USB_DEVICE_LIBRARY
|
||||
* @{ |
||||
*/ |
||||
|
||||
/** @defgroup USBD_REQ
|
||||
* @brief header file for the usbd_req.c file |
||||
* @{ |
||||
*/
|
||||
|
||||
/** @defgroup USBD_REQ_Exported_Defines
|
||||
* @{ |
||||
*/
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
|
||||
/** @defgroup USBD_REQ_Exported_Types
|
||||
* @{ |
||||
*/ |
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
|
||||
|
||||
/** @defgroup USBD_REQ_Exported_Macros
|
||||
* @{ |
||||
*/
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
/** @defgroup USBD_REQ_Exported_Variables
|
||||
* @{ |
||||
*/
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
/** @defgroup USBD_REQ_Exported_FunctionsPrototype
|
||||
* @{ |
||||
*/
|
||||
|
||||
USBD_StatusTypeDef USBD_StdDevReq (USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); |
||||
USBD_StatusTypeDef USBD_StdItfReq (USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); |
||||
USBD_StatusTypeDef USBD_StdEPReq (USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); |
||||
|
||||
|
||||
void USBD_CtlError (USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); |
||||
|
||||
void USBD_ParseSetupRequest (USBD_SetupReqTypedef *req, uint8_t *pdata); |
||||
|
||||
void USBD_GetString (uint8_t *desc, uint8_t *unicode, uint16_t *len); |
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
#ifdef __cplusplus |
||||
} |
||||
#endif |
||||
|
||||
#endif /* __USB_REQUEST_H */ |
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -0,0 +1,341 @@ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file usbd_def.h |
||||
* @author MCD Application Team |
||||
* @version V2.4.2 |
||||
* @date 11-December-2015 |
||||
* @brief General defines for the usb device library
|
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© COPYRIGHT 2015 STMicroelectronics</center></h2> |
||||
* |
||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); |
||||
* You may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at: |
||||
* |
||||
* http://www.st.com/software_license_agreement_liberty_v2
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
* |
||||
****************************************************************************** |
||||
*/
|
||||
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/ |
||||
#ifndef __USBD_DEF_H |
||||
#define __USBD_DEF_H |
||||
|
||||
#ifdef __cplusplus |
||||
extern "C" { |
||||
#endif |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "usbd_conf.h" |
||||
|
||||
/** @addtogroup STM32_USBD_DEVICE_LIBRARY
|
||||
* @{ |
||||
*/ |
||||
|
||||
/** @defgroup USB_DEF
|
||||
* @brief general defines for the usb device library file |
||||
* @{ |
||||
*/
|
||||
|
||||
/** @defgroup USB_DEF_Exported_Defines
|
||||
* @{ |
||||
*/
|
||||
|
||||
#ifndef NULL |
||||
#define NULL 0 |
||||
#endif |
||||
|
||||
|
||||
#define USB_LEN_DEV_QUALIFIER_DESC 0x0A |
||||
#define USB_LEN_DEV_DESC 0x12 |
||||
#define USB_LEN_CFG_DESC 0x09 |
||||
#define USB_LEN_IF_DESC 0x09 |
||||
#define USB_LEN_EP_DESC 0x07 |
||||
#define USB_LEN_OTG_DESC 0x03 |
||||
#define USB_LEN_LANGID_STR_DESC 0x04 |
||||
#define USB_LEN_OTHER_SPEED_DESC_SIZ 0x09 |
||||
|
||||
#define USBD_IDX_LANGID_STR 0x00 |
||||
#define USBD_IDX_MFC_STR 0x01 |
||||
#define USBD_IDX_PRODUCT_STR 0x02 |
||||
#define USBD_IDX_SERIAL_STR 0x03 |
||||
#define USBD_IDX_CONFIG_STR 0x04 |
||||
#define USBD_IDX_INTERFACE_STR 0x05 |
||||
|
||||
#define USB_REQ_TYPE_STANDARD 0x00 |
||||
#define USB_REQ_TYPE_CLASS 0x20 |
||||
#define USB_REQ_TYPE_VENDOR 0x40 |
||||
#define USB_REQ_TYPE_MASK 0x60 |
||||
|
||||
#define USB_REQ_RECIPIENT_DEVICE 0x00 |
||||
#define USB_REQ_RECIPIENT_INTERFACE 0x01 |
||||
#define USB_REQ_RECIPIENT_ENDPOINT 0x02 |
||||
#define USB_REQ_RECIPIENT_MASK 0x03 |
||||
|
||||
#define USB_REQ_GET_STATUS 0x00 |
||||
#define USB_REQ_CLEAR_FEATURE 0x01 |
||||
#define USB_REQ_SET_FEATURE 0x03 |
||||
#define USB_REQ_SET_ADDRESS 0x05 |
||||
#define USB_REQ_GET_DESCRIPTOR 0x06 |
||||
#define USB_REQ_SET_DESCRIPTOR 0x07 |
||||
#define USB_REQ_GET_CONFIGURATION 0x08 |
||||
#define USB_REQ_SET_CONFIGURATION 0x09 |
||||
#define USB_REQ_GET_INTERFACE 0x0A |
||||
#define USB_REQ_SET_INTERFACE 0x0B |
||||
#define USB_REQ_SYNCH_FRAME 0x0C |
||||
|
||||
#define USB_DESC_TYPE_DEVICE 1 |
||||
#define USB_DESC_TYPE_CONFIGURATION 2 |
||||
#define USB_DESC_TYPE_STRING 3 |
||||
#define USB_DESC_TYPE_INTERFACE 4 |
||||
#define USB_DESC_TYPE_ENDPOINT 5 |
||||
#define USB_DESC_TYPE_DEVICE_QUALIFIER 6 |
||||
#define USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION 7 |
||||
#define USB_DESC_TYPE_IFACE_ASSOCIATION 11 |
||||
#define USB_DESC_TYPE_BOS 0x0F |
||||
|
||||
#define USB_CONFIG_REMOTE_WAKEUP 2 |
||||
#define USB_CONFIG_SELF_POWERED 1 |
||||
|
||||
#define USB_FEATURE_EP_HALT 0 |
||||
#define USB_FEATURE_REMOTE_WAKEUP 1 |
||||
#define USB_FEATURE_TEST_MODE 2 |
||||
|
||||
#define USB_DEVICE_CAPABITY_TYPE 0x10 |
||||
|
||||
#define USB_HS_MAX_PACKET_SIZE 512 |
||||
#define USB_FS_MAX_PACKET_SIZE 64 |
||||
#define USB_MAX_EP0_SIZE 64 |
||||
|
||||
/* Device Status */ |
||||
#define USBD_STATE_DEFAULT 1 |
||||
#define USBD_STATE_ADDRESSED 2 |
||||
#define USBD_STATE_CONFIGURED 3 |
||||
#define USBD_STATE_SUSPENDED 4 |
||||
|
||||
|
||||
/* EP0 State */
|
||||
#define USBD_EP0_IDLE 0 |
||||
#define USBD_EP0_SETUP 1 |
||||
#define USBD_EP0_DATA_IN 2 |
||||
#define USBD_EP0_DATA_OUT 3 |
||||
#define USBD_EP0_STATUS_IN 4 |
||||
#define USBD_EP0_STATUS_OUT 5 |
||||
#define USBD_EP0_STALL 6 |
||||
|
||||
#define USBD_EP_TYPE_CTRL 0 |
||||
#define USBD_EP_TYPE_ISOC 1 |
||||
#define USBD_EP_TYPE_BULK 2 |
||||
#define USBD_EP_TYPE_INTR 3 |
||||
|
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
|
||||
/** @defgroup USBD_DEF_Exported_TypesDefinitions
|
||||
* @{ |
||||
*/ |
||||
|
||||
typedef struct usb_setup_req
|
||||
{ |
||||
|
||||
uint8_t bmRequest;
|
||||
uint8_t bRequest;
|
||||
uint16_t wValue;
|
||||
uint16_t wIndex;
|
||||
uint16_t wLength;
|
||||
}USBD_SetupReqTypedef; |
||||
|
||||
struct _USBD_HandleTypeDef; |
||||
|
||||
typedef struct _Device_cb |
||||
{ |
||||
uint8_t (*Init) (struct _USBD_HandleTypeDef *pdev , uint8_t cfgidx); |
||||
uint8_t (*DeInit) (struct _USBD_HandleTypeDef *pdev , uint8_t cfgidx); |
||||
/* Control Endpoints*/ |
||||
uint8_t (*Setup) (struct _USBD_HandleTypeDef *pdev , USBD_SetupReqTypedef *req);
|
||||
uint8_t (*EP0_TxSent) (struct _USBD_HandleTypeDef *pdev );
|
||||
uint8_t (*EP0_RxReady) (struct _USBD_HandleTypeDef *pdev );
|
||||
/* Class Specific Endpoints*/ |
||||
uint8_t (*DataIn) (struct _USBD_HandleTypeDef *pdev , uint8_t epnum);
|
||||
uint8_t (*DataOut) (struct _USBD_HandleTypeDef *pdev , uint8_t epnum);
|
||||
uint8_t (*SOF) (struct _USBD_HandleTypeDef *pdev);
|
||||
uint8_t (*IsoINIncomplete) (struct _USBD_HandleTypeDef *pdev , uint8_t epnum);
|
||||
uint8_t (*IsoOUTIncomplete) (struct _USBD_HandleTypeDef *pdev , uint8_t epnum);
|
||||
|
||||
uint8_t *(*GetHSConfigDescriptor)(uint16_t *length);
|
||||
uint8_t *(*GetFSConfigDescriptor)(uint16_t *length);
|
||||
uint8_t *(*GetOtherSpeedConfigDescriptor)(uint16_t *length); |
||||
uint8_t *(*GetDeviceQualifierDescriptor)(uint16_t *length); |
||||
#if (USBD_SUPPORT_USER_STRING == 1) |
||||
uint8_t *(*GetUsrStrDescriptor)(struct _USBD_HandleTypeDef *pdev ,uint8_t index, uint16_t *length);
|
||||
#endif |
||||
|
||||
} USBD_ClassTypeDef; |
||||
|
||||
/* Following USB Device Speed */ |
||||
typedef enum
|
||||
{ |
||||
USBD_SPEED_HIGH = 0, |
||||
USBD_SPEED_FULL = 1, |
||||
USBD_SPEED_LOW = 2,
|
||||
}USBD_SpeedTypeDef; |
||||
|
||||
/* Following USB Device status */ |
||||
typedef enum { |
||||
USBD_OK = 0, |
||||
USBD_BUSY, |
||||
USBD_FAIL, |
||||
}USBD_StatusTypeDef; |
||||
|
||||
/* USB Device descriptors structure */ |
||||
typedef struct |
||||
{ |
||||
uint8_t *(*GetDeviceDescriptor)( USBD_SpeedTypeDef speed , uint16_t *length);
|
||||
uint8_t *(*GetLangIDStrDescriptor)( USBD_SpeedTypeDef speed , uint16_t *length);
|
||||
uint8_t *(*GetManufacturerStrDescriptor)( USBD_SpeedTypeDef speed , uint16_t *length);
|
||||
uint8_t *(*GetProductStrDescriptor)( USBD_SpeedTypeDef speed , uint16_t *length);
|
||||
uint8_t *(*GetSerialStrDescriptor)( USBD_SpeedTypeDef speed , uint16_t *length);
|
||||
uint8_t *(*GetConfigurationStrDescriptor)( USBD_SpeedTypeDef speed , uint16_t *length);
|
||||
uint8_t *(*GetInterfaceStrDescriptor)( USBD_SpeedTypeDef speed , uint16_t *length);
|
||||
#if (USBD_LPM_ENABLED == 1) |
||||
uint8_t *(*GetBOSDescriptor)( USBD_SpeedTypeDef speed , uint16_t *length);
|
||||
#endif |
||||
} USBD_DescriptorsTypeDef; |
||||
|
||||
/* USB Device handle structure */ |
||||
typedef struct |
||||
{
|
||||
uint32_t status; |
||||
uint32_t total_length;
|
||||
uint32_t rem_length;
|
||||
uint32_t maxpacket;
|
||||
} USBD_EndpointTypeDef; |
||||
|
||||
/* USB Device handle structure */ |
||||
typedef struct _USBD_HandleTypeDef |
||||
{ |
||||
uint8_t id; |
||||
uint32_t dev_config; |
||||
uint32_t dev_default_config; |
||||
uint32_t dev_config_status;
|
||||
USBD_SpeedTypeDef dev_speed;
|
||||
USBD_EndpointTypeDef ep_in[USBD_NUM_ENDPOINTS]; |
||||
USBD_EndpointTypeDef ep_out[USBD_NUM_ENDPOINTS]; |
||||
uint32_t ep0_state;
|
||||
uint32_t ep0_data_len;
|
||||
uint8_t dev_state; |
||||
uint8_t dev_old_state; |
||||
uint8_t dev_address; |
||||
uint8_t dev_connection_status;
|
||||
uint8_t dev_test_mode; |
||||
uint32_t dev_remote_wakeup; |
||||
|
||||
USBD_SetupReqTypedef request; |
||||
USBD_DescriptorsTypeDef *pDesc; |
||||
USBD_ClassTypeDef *pClass; // the composite class
|
||||
void *pClassData; |
||||
void *pUserData; |
||||
void *pClassData2; // used for secondary class
|
||||
void *pUserData2; // used for secondary class
|
||||
void *pClassData3; // used for tertiary class
|
||||
void *pUserData3; // used for tertiary class
|
||||
void *pData; // this is a pointer to the low level registers struct
|
||||
} USBD_HandleTypeDef; |
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
|
||||
|
||||
/** @defgroup USBD_DEF_Exported_Macros
|
||||
* @{ |
||||
*/
|
||||
#define SWAPBYTE(addr) (((uint16_t)(*((uint8_t *)(addr)))) + \ |
||||
(((uint16_t)(*(((uint8_t *)(addr)) + 1))) << 8)) |
||||
|
||||
#define LOBYTE(x) ((uint8_t)(x & 0x00FF)) |
||||
#define HIBYTE(x) ((uint8_t)((x & 0xFF00) >>8)) |
||||
|
||||
#ifndef MIN |
||||
#define MIN(a, b) (((a) < (b)) ? (a) : (b)) |
||||
#endif |
||||
|
||||
#ifndef MAX |
||||
#define MAX(a, b) (((a) > (b)) ? (a) : (b)) |
||||
#endif |
||||
|
||||
|
||||
#if defined ( __GNUC__ ) |
||||
#ifndef __weak |
||||
#define __weak __attribute__((weak)) |
||||
#endif /* __weak */ |
||||
#ifndef __packed |
||||
#define __packed __attribute__((__packed__)) |
||||
#endif /* __packed */ |
||||
#endif /* __GNUC__ */ |
||||
|
||||
|
||||
/* In HS mode and when the DMA is used, all variables and data structures dealing
|
||||
with the DMA during the transaction process should be 4-bytes aligned */
|
||||
|
||||
#if defined (__GNUC__) /* GNU Compiler */ |
||||
#define __ALIGN_END __attribute__ ((aligned (4))) |
||||
#define __ALIGN_BEGIN |
||||
#else |
||||
#define __ALIGN_END |
||||
#if defined (__CC_ARM) /* ARM Compiler */ |
||||
#define __ALIGN_BEGIN __align(4) |
||||
#elif defined (__ICCARM__) /* IAR Compiler */ |
||||
#define __ALIGN_BEGIN |
||||
#elif defined (__TASKING__) /* TASKING Compiler */ |
||||
#define __ALIGN_BEGIN __align(4) |
||||
#endif /* __CC_ARM */ |
||||
#endif /* __GNUC__ */ |
||||
|
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
/** @defgroup USBD_DEF_Exported_Variables
|
||||
* @{ |
||||
*/
|
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
/** @defgroup USBD_DEF_Exported_FunctionsPrototype
|
||||
* @{ |
||||
*/
|
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
#ifdef __cplusplus |
||||
} |
||||
#endif |
||||
|
||||
#endif /* __USBD_DEF_H */ |
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -0,0 +1,62 @@ |
||||
--- Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_def.h (date 1511202099000) |
||||
+++ Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_def.h (revision ) |
||||
@@ -99,6 +99,7 @@ |
||||
#define USB_DESC_TYPE_ENDPOINT 5 |
||||
#define USB_DESC_TYPE_DEVICE_QUALIFIER 6 |
||||
#define USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION 7 |
||||
+#define USB_DESC_TYPE_IFACE_ASSOCIATION 11 |
||||
#define USB_DESC_TYPE_BOS 0x0F |
||||
|
||||
#define USB_CONFIG_REMOTE_WAKEUP 2 |
||||
@@ -147,7 +148,7 @@ |
||||
|
||||
typedef struct usb_setup_req |
||||
{ |
||||
- |
||||
+ |
||||
uint8_t bmRequest; |
||||
uint8_t bRequest; |
||||
uint16_t wValue; |
||||
@@ -230,7 +231,7 @@ |
||||
uint32_t dev_config_status; |
||||
USBD_SpeedTypeDef dev_speed; |
||||
USBD_EndpointTypeDef ep_in[15]; |
||||
- USBD_EndpointTypeDef ep_out[15]; |
||||
+ USBD_EndpointTypeDef ep_out[15]; |
||||
uint32_t ep0_state; |
||||
uint32_t ep0_data_len; |
||||
uint8_t dev_state; |
||||
@@ -242,10 +243,14 @@ |
||||
|
||||
USBD_SetupReqTypedef request; |
||||
USBD_DescriptorsTypeDef *pDesc; |
||||
- USBD_ClassTypeDef *pClass; |
||||
- void *pClassData; |
||||
- void *pUserData; |
||||
- void *pData; |
||||
+ USBD_ClassTypeDef *pClass; // the composite class |
||||
+ void *pClassData; |
||||
+ void *pUserData; |
||||
+ void *pClassData2; // used for secondary class |
||||
+ void *pUserData2; // used for secondary class |
||||
+ void *pClassData3; // used for tertiary class |
||||
+ void *pUserData3; // used for tertiary class |
||||
+ void *pData; // this is a pointer to the low level registers struct |
||||
} USBD_HandleTypeDef; |
||||
|
||||
/** |
||||
@@ -262,8 +267,14 @@ |
||||
|
||||
#define LOBYTE(x) ((uint8_t)(x & 0x00FF)) |
||||
#define HIBYTE(x) ((uint8_t)((x & 0xFF00) >>8)) |
||||
+ |
||||
+#ifndef MIN |
||||
#define MIN(a, b) (((a) < (b)) ? (a) : (b)) |
||||
+#endif |
||||
+ |
||||
+#ifndef MAX |
||||
#define MAX(a, b) (((a) > (b)) ? (a) : (b)) |
||||
+#endif |
||||
|
||||
|
||||
#if defined ( __GNUC__ ) |
@ -0,0 +1,128 @@ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file usbd_ioreq.h |
||||
* @author MCD Application Team |
||||
* @version V2.4.2 |
||||
* @date 11-December-2015 |
||||
* @brief Header file for the usbd_ioreq.c file |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© COPYRIGHT 2015 STMicroelectronics</center></h2> |
||||
* |
||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); |
||||
* You may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at: |
||||
* |
||||
* http://www.st.com/software_license_agreement_liberty_v2
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
* |
||||
****************************************************************************** |
||||
*/
|
||||
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/ |
||||
#ifndef __USBD_IOREQ_H |
||||
#define __USBD_IOREQ_H |
||||
|
||||
#ifdef __cplusplus |
||||
extern "C" { |
||||
#endif |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "usbd_def.h" |
||||
#include "usbd_core.h" |
||||
|
||||
/** @addtogroup STM32_USB_DEVICE_LIBRARY
|
||||
* @{ |
||||
*/ |
||||
|
||||
/** @defgroup USBD_IOREQ
|
||||
* @brief header file for the usbd_ioreq.c file |
||||
* @{ |
||||
*/
|
||||
|
||||
/** @defgroup USBD_IOREQ_Exported_Defines
|
||||
* @{ |
||||
*/
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
|
||||
/** @defgroup USBD_IOREQ_Exported_Types
|
||||
* @{ |
||||
*/ |
||||
|
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
|
||||
|
||||
/** @defgroup USBD_IOREQ_Exported_Macros
|
||||
* @{ |
||||
*/
|
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
/** @defgroup USBD_IOREQ_Exported_Variables
|
||||
* @{ |
||||
*/
|
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
/** @defgroup USBD_IOREQ_Exported_FunctionsPrototype
|
||||
* @{ |
||||
*/
|
||||
|
||||
USBD_StatusTypeDef USBD_CtlSendData (USBD_HandleTypeDef *pdev,
|
||||
uint8_t *buf, |
||||
uint16_t len); |
||||
|
||||
USBD_StatusTypeDef USBD_CtlContinueSendData (USBD_HandleTypeDef *pdev,
|
||||
uint8_t *pbuf, |
||||
uint16_t len); |
||||
|
||||
USBD_StatusTypeDef USBD_CtlPrepareRx (USBD_HandleTypeDef *pdev,
|
||||
uint8_t *pbuf,
|
||||
uint16_t len); |
||||
|
||||
USBD_StatusTypeDef USBD_CtlContinueRx (USBD_HandleTypeDef *pdev,
|
||||
uint8_t *pbuf,
|
||||
uint16_t len); |
||||
|
||||
USBD_StatusTypeDef USBD_CtlSendStatus (USBD_HandleTypeDef *pdev); |
||||
|
||||
USBD_StatusTypeDef USBD_CtlReceiveStatus (USBD_HandleTypeDef *pdev); |
||||
|
||||
uint16_t USBD_GetRxCount (USBD_HandleTypeDef *pdev ,
|
||||
uint8_t epnum); |
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
#ifdef __cplusplus |
||||
} |
||||
#endif |
||||
|
||||
#endif /* __USBD_IOREQ_H */ |
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -0,0 +1,212 @@ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file usbd_conf_template.c |
||||
* @author MCD Application Team |
||||
* @version V2.4.2 |
||||
* @date 11-December-2015 |
||||
* @brief USB Device configuration and interface file |
||||
* This template should be copied to the user folder, renamed and customized |
||||
* following user needs.
|
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© COPYRIGHT 2015 STMicroelectronics</center></h2> |
||||
* |
||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); |
||||
* You may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at: |
||||
* |
||||
* http://www.st.com/software_license_agreement_liberty_v2
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
* |
||||
****************************************************************************** |
||||
*/
|
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "usbd_core.h" |
||||
/* Private typedef -----------------------------------------------------------*/ |
||||
/* Private define ------------------------------------------------------------*/ |
||||
/* Private macro -------------------------------------------------------------*/ |
||||
/* Private variables ---------------------------------------------------------*/ |
||||
/* Private function prototypes -----------------------------------------------*/ |
||||
/* Private functions ---------------------------------------------------------*/ |
||||
/**
|
||||
* @brief Initializes the Low Level portion of the Device driver. |
||||
* @param pdev: Device handle |
||||
* @retval USBD Status |
||||
*/ |
||||
USBD_StatusTypeDef USBD_LL_Init(USBD_HandleTypeDef *pdev) |
||||
{
|
||||
return USBD_OK; |
||||
} |
||||
|
||||
/**
|
||||
* @brief De-Initializes the Low Level portion of the Device driver. |
||||
* @param pdev: Device handle |
||||
* @retval USBD Status |
||||
*/ |
||||
USBD_StatusTypeDef USBD_LL_DeInit(USBD_HandleTypeDef *pdev) |
||||
{ |
||||
return USBD_OK; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Starts the Low Level portion of the Device driver.
|
||||
* @param pdev: Device handle |
||||
* @retval USBD Status |
||||
*/ |
||||
USBD_StatusTypeDef USBD_LL_Start(USBD_HandleTypeDef *pdev) |
||||
{ |
||||
return USBD_OK; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Stops the Low Level portion of the Device driver. |
||||
* @param pdev: Device handle |
||||
* @retval USBD Status |
||||
*/ |
||||
USBD_StatusTypeDef USBD_LL_Stop(USBD_HandleTypeDef *pdev) |
||||
{ |
||||
return USBD_OK; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Opens an endpoint of the Low Level Driver. |
||||
* @param pdev: Device handle |
||||
* @param ep_addr: Endpoint Number |
||||
* @param ep_type: Endpoint Type |
||||
* @param ep_mps: Endpoint Max Packet Size |
||||
* @retval USBD Status |
||||
*/ |
||||
USBD_StatusTypeDef USBD_LL_OpenEP(USBD_HandleTypeDef *pdev, |
||||
uint8_t ep_addr, |
||||
uint8_t ep_type, |
||||
uint16_t ep_mps) |
||||
{ |
||||
return USBD_OK; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Closes an endpoint of the Low Level Driver. |
||||
* @param pdev: Device handle |
||||
* @param ep_addr: Endpoint Number |
||||
* @retval USBD Status |
||||
*/ |
||||
USBD_StatusTypeDef USBD_LL_CloseEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr) |
||||
{ |
||||
return USBD_OK; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Flushes an endpoint of the Low Level Driver. |
||||
* @param pdev: Device handle |
||||
* @param ep_addr: Endpoint Number |
||||
* @retval USBD Status |
||||
*/ |
||||
USBD_StatusTypeDef USBD_LL_FlushEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr) |
||||
{ |
||||
return USBD_OK; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Sets a Stall condition on an endpoint of the Low Level Driver. |
||||
* @param pdev: Device handle |
||||
* @param ep_addr: Endpoint Number |
||||
* @retval USBD Status |
||||
*/ |
||||
USBD_StatusTypeDef USBD_LL_StallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr) |
||||
{ |
||||
return USBD_OK; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Clears a Stall condition on an endpoint of the Low Level Driver. |
||||
* @param pdev: Device handle |
||||
* @param ep_addr: Endpoint Number |
||||
* @retval USBD Status |
||||
*/ |
||||
USBD_StatusTypeDef USBD_LL_ClearStallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr) |
||||
{ |
||||
return USBD_OK;
|
||||
} |
||||
|
||||
/**
|
||||
* @brief Returns Stall condition. |
||||
* @param pdev: Device handle |
||||
* @param ep_addr: Endpoint Number |
||||
* @retval Stall (1: Yes, 0: No) |
||||
*/ |
||||
uint8_t USBD_LL_IsStallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr) |
||||
{ |
||||
return 0; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Assigns a USB address to the device. |
||||
* @param pdev: Device handle |
||||
* @param ep_addr: Endpoint Number |
||||
* @retval USBD Status |
||||
*/ |
||||
USBD_StatusTypeDef USBD_LL_SetUSBAddress(USBD_HandleTypeDef *pdev, uint8_t dev_addr) |
||||
{ |
||||
return USBD_OK;
|
||||
} |
||||
|
||||
/**
|
||||
* @brief Transmits data over an endpoint. |
||||
* @param pdev: Device handle |
||||
* @param ep_addr: Endpoint Number |
||||
* @param pbuf: Pointer to data to be sent |
||||
* @param size: Data size
|
||||
* @retval USBD Status |
||||
*/ |
||||
USBD_StatusTypeDef USBD_LL_Transmit(USBD_HandleTypeDef *pdev,
|
||||
uint8_t ep_addr, |
||||
uint8_t *pbuf, |
||||
uint16_t size) |
||||
{ |
||||
return USBD_OK; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Prepares an endpoint for reception. |
||||
* @param pdev: Device handle |
||||
* @param ep_addr: Endpoint Number |
||||
* @param pbuf: Pointer to data to be received |
||||
* @param size: Data size |
||||
* @retval USBD Status |
||||
*/ |
||||
USBD_StatusTypeDef USBD_LL_PrepareReceive(USBD_HandleTypeDef *pdev,
|
||||
uint8_t ep_addr, |
||||
uint8_t *pbuf, |
||||
uint16_t size) |
||||
{ |
||||
return USBD_OK; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Returns the last transferred packet size. |
||||
* @param pdev: Device handle |
||||
* @param ep_addr: Endpoint Number |
||||
* @retval Recived Data Size |
||||
*/ |
||||
uint32_t USBD_LL_GetRxDataSize(USBD_HandleTypeDef *pdev, uint8_t ep_addr) |
||||
{ |
||||
return 0; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Delays routine for the USB Device Library. |
||||
* @param Delay: Delay in ms |
||||
* @retval None |
||||
*/ |
||||
void USBD_LL_Delay(uint32_t Delay) |
||||
{ |
||||
} |
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
||||
|
@ -0,0 +1,565 @@ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file usbd_core.c |
||||
* @author MCD Application Team |
||||
* @version V2.4.2 |
||||
* @date 11-December-2015 |
||||
* @brief This file provides all the USBD core functions. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© COPYRIGHT 2015 STMicroelectronics</center></h2> |
||||
* |
||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); |
||||
* You may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at: |
||||
* |
||||
* http://www.st.com/software_license_agreement_liberty_v2
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
* |
||||
****************************************************************************** |
||||
*/
|
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "usbd_core.h" |
||||
|
||||
/** @addtogroup STM32_USBD_DEVICE_LIBRARY
|
||||
* @{ |
||||
*/ |
||||
|
||||
|
||||
/** @defgroup USBD_CORE
|
||||
* @brief usbd core module |
||||
* @{ |
||||
*/
|
||||
|
||||
/** @defgroup USBD_CORE_Private_TypesDefinitions
|
||||
* @{ |
||||
*/
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
|
||||
/** @defgroup USBD_CORE_Private_Defines
|
||||
* @{ |
||||
*/
|
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
|
||||
/** @defgroup USBD_CORE_Private_Macros
|
||||
* @{ |
||||
*/
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
|
||||
|
||||
|
||||
/** @defgroup USBD_CORE_Private_FunctionPrototypes
|
||||
* @{ |
||||
*/
|
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
/** @defgroup USBD_CORE_Private_Variables
|
||||
* @{ |
||||
*/
|
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
/** @defgroup USBD_CORE_Private_Functions
|
||||
* @{ |
||||
*/
|
||||
|
||||
/**
|
||||
* @brief USBD_Init |
||||
* Initializes the device stack and load the class driver |
||||
* @param pdev: device instance |
||||
* @param pdesc: Descriptor structure address |
||||
* @param id: Low level core index |
||||
* @retval None |
||||
*/ |
||||
USBD_StatusTypeDef USBD_Init(USBD_HandleTypeDef *pdev, USBD_DescriptorsTypeDef *pdesc, uint8_t id) |
||||
{ |
||||
/* Check whether the USB Host handle is valid */ |
||||
if(pdev == NULL) |
||||
{ |
||||
USBD_ErrLog("Invalid Device handle"); |
||||
return USBD_FAIL;
|
||||
} |
||||
|
||||
/* Unlink previous class*/ |
||||
if(pdev->pClass != NULL) |
||||
{ |
||||
pdev->pClass = NULL; |
||||
} |
||||
|
||||
/* Assign USBD Descriptors */ |
||||
if(pdesc != NULL) |
||||
{ |
||||
pdev->pDesc = pdesc; |
||||
} |
||||
|
||||
/* Set Device initial State */ |
||||
pdev->dev_state = USBD_STATE_DEFAULT; |
||||
pdev->id = id; |
||||
/* Initialize low level driver */ |
||||
USBD_LL_Init(pdev); |
||||
|
||||
return USBD_OK;
|
||||
} |
||||
|
||||
/**
|
||||
* @brief USBD_DeInit
|
||||
* Re-Initialize th device library |
||||
* @param pdev: device instance |
||||
* @retval status: status |
||||
*/ |
||||
USBD_StatusTypeDef USBD_DeInit(USBD_HandleTypeDef *pdev) |
||||
{ |
||||
/* Set Default State */ |
||||
pdev->dev_state = USBD_STATE_DEFAULT; |
||||
|
||||
/* Free Class Resources */ |
||||
pdev->pClass->DeInit(pdev, pdev->dev_config);
|
||||
|
||||
/* Stop the low level driver */ |
||||
USBD_LL_Stop(pdev);
|
||||
|
||||
/* Initialize low level driver */ |
||||
USBD_LL_DeInit(pdev); |
||||
|
||||
return USBD_OK; |
||||
} |
||||
|
||||
|
||||
/**
|
||||
* @brief USBD_RegisterClass
|
||||
* Link class driver to Device Core. |
||||
* @param pDevice : Device Handle |
||||
* @param pclass: Class handle |
||||
* @retval USBD Status |
||||
*/ |
||||
USBD_StatusTypeDef USBD_RegisterClass(USBD_HandleTypeDef *pdev, USBD_ClassTypeDef *pclass) |
||||
{ |
||||
USBD_StatusTypeDef status = USBD_OK; |
||||
if(pclass != 0) |
||||
{ |
||||
/* link the class to the USB Device handle */ |
||||
pdev->pClass = pclass; |
||||
status = USBD_OK; |
||||
} |
||||
else |
||||
{ |
||||
USBD_ErrLog("Invalid Class handle"); |
||||
status = USBD_FAIL;
|
||||
} |
||||
|
||||
return status; |
||||
} |
||||
|
||||
/**
|
||||
* @brief USBD_Start
|
||||
* Start the USB Device Core. |
||||
* @param pdev: Device Handle |
||||
* @retval USBD Status |
||||
*/ |
||||
USBD_StatusTypeDef USBD_Start (USBD_HandleTypeDef *pdev) |
||||
{ |
||||
|
||||
/* Start the low level driver */ |
||||
USBD_LL_Start(pdev);
|
||||
|
||||
return USBD_OK;
|
||||
} |
||||
|
||||
/**
|
||||
* @brief USBD_Stop
|
||||
* Stop the USB Device Core. |
||||
* @param pdev: Device Handle |
||||
* @retval USBD Status |
||||
*/ |
||||
USBD_StatusTypeDef USBD_Stop (USBD_HandleTypeDef *pdev) |
||||
{ |
||||
/* Free Class Resources */ |
||||
pdev->pClass->DeInit(pdev, pdev->dev_config);
|
||||
|
||||
/* Stop the low level driver */ |
||||
USBD_LL_Stop(pdev);
|
||||
|
||||
return USBD_OK;
|
||||
} |
||||
|
||||
/**
|
||||
* @brief USBD_RunTestMode
|
||||
* Launch test mode process |
||||
* @param pdev: device instance |
||||
* @retval status |
||||
*/ |
||||
USBD_StatusTypeDef USBD_RunTestMode (USBD_HandleTypeDef *pdev)
|
||||
{ |
||||
return USBD_OK; |
||||
} |
||||
|
||||
|
||||
/**
|
||||
* @brief USBD_SetClassConfig
|
||||
* Configure device and start the interface |
||||
* @param pdev: device instance |
||||
* @param cfgidx: configuration index |
||||
* @retval status |
||||
*/ |
||||
|
||||
USBD_StatusTypeDef USBD_SetClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx) |
||||
{ |
||||
USBD_StatusTypeDef ret = USBD_FAIL; |
||||
|
||||
if(pdev->pClass != NULL) |
||||
{ |
||||
/* Set configuration and Start the Class*/ |
||||
if(pdev->pClass->Init(pdev, cfgidx) == 0) |
||||
{ |
||||
ret = USBD_OK; |
||||
} |
||||
} |
||||
return ret;
|
||||
} |
||||
|
||||
/**
|
||||
* @brief USBD_ClrClassConfig
|
||||
* Clear current configuration |
||||
* @param pdev: device instance |
||||
* @param cfgidx: configuration index |
||||
* @retval status: USBD_StatusTypeDef |
||||
*/ |
||||
USBD_StatusTypeDef USBD_ClrClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx) |
||||
{ |
||||
/* Clear configuration and De-initialize the Class process*/ |
||||
pdev->pClass->DeInit(pdev, cfgidx);
|
||||
return USBD_OK; |
||||
} |
||||
|
||||
|
||||
/**
|
||||
* @brief USBD_SetupStage
|
||||
* Handle the setup stage |
||||
* @param pdev: device instance |
||||
* @retval status |
||||
*/ |
||||
USBD_StatusTypeDef USBD_LL_SetupStage(USBD_HandleTypeDef *pdev, uint8_t *psetup) |
||||
{ |
||||
|
||||
USBD_ParseSetupRequest(&pdev->request, psetup); |
||||
|
||||
pdev->ep0_state = USBD_EP0_SETUP; |
||||
pdev->ep0_data_len = pdev->request.wLength; |
||||
|
||||
switch (pdev->request.bmRequest & 0x1F)
|
||||
{ |
||||
case USB_REQ_RECIPIENT_DEVICE:
|
||||
USBD_StdDevReq (pdev, &pdev->request); |
||||
break; |
||||
|
||||
case USB_REQ_RECIPIENT_INTERFACE:
|
||||
USBD_StdItfReq(pdev, &pdev->request); |
||||
break; |
||||
|
||||
case USB_REQ_RECIPIENT_ENDPOINT:
|
||||
USBD_StdEPReq(pdev, &pdev->request);
|
||||
break; |
||||
|
||||
default:
|
||||
USBD_LL_StallEP(pdev , pdev->request.bmRequest & 0x80); |
||||
break; |
||||
}
|
||||
return USBD_OK;
|
||||
} |
||||
|
||||
/**
|
||||
* @brief USBD_DataOutStage
|
||||
* Handle data OUT stage |
||||
* @param pdev: device instance |
||||
* @param epnum: endpoint index |
||||
* @retval status |
||||
*/ |
||||
USBD_StatusTypeDef USBD_LL_DataOutStage(USBD_HandleTypeDef *pdev , uint8_t epnum, uint8_t *pdata) |
||||
{ |
||||
USBD_EndpointTypeDef *pep; |
||||
|
||||
if(epnum == 0)
|
||||
{ |
||||
pep = &pdev->ep_out[0]; |
||||
|
||||
if ( pdev->ep0_state == USBD_EP0_DATA_OUT) |
||||
{ |
||||
if(pep->rem_length > pep->maxpacket) |
||||
{ |
||||
pep->rem_length -= pep->maxpacket; |
||||
|
||||
USBD_CtlContinueRx (pdev,
|
||||
pdata, |
||||
MIN(pep->rem_length ,pep->maxpacket)); |
||||
} |
||||
else |
||||
{ |
||||
if((pdev->pClass->EP0_RxReady != NULL)&& |
||||
(pdev->dev_state == USBD_STATE_CONFIGURED)) |
||||
{ |
||||
pdev->pClass->EP0_RxReady(pdev);
|
||||
} |
||||
USBD_CtlSendStatus(pdev); |
||||
} |
||||
} |
||||
} |
||||
else if((pdev->pClass->DataOut != NULL)&& |
||||
(pdev->dev_state == USBD_STATE_CONFIGURED)) |
||||
{ |
||||
pdev->pClass->DataOut(pdev, epnum);
|
||||
}
|
||||
return USBD_OK; |
||||
} |
||||
|
||||
/**
|
||||
* @brief USBD_DataInStage
|
||||
* Handle data in stage |
||||
* @param pdev: device instance |
||||
* @param epnum: endpoint index |
||||
* @retval status |
||||
*/ |
||||
USBD_StatusTypeDef USBD_LL_DataInStage(USBD_HandleTypeDef *pdev ,uint8_t epnum, uint8_t *pdata) |
||||
{ |
||||
USBD_EndpointTypeDef *pep; |
||||
|
||||
if(epnum == 0)
|
||||
{ |
||||
pep = &pdev->ep_in[0]; |
||||
|
||||
if ( pdev->ep0_state == USBD_EP0_DATA_IN) |
||||
{ |
||||
if(pep->rem_length > pep->maxpacket) |
||||
{ |
||||
pep->rem_length -= pep->maxpacket; |
||||
|
||||
USBD_CtlContinueSendData (pdev,
|
||||
pdata,
|
||||
pep->rem_length); |
||||
|
||||
/* Prepare endpoint for premature end of transfer */ |
||||
USBD_LL_PrepareReceive (pdev, |
||||
0, |
||||
NULL, |
||||
0);
|
||||
} |
||||
else |
||||
{ /* last packet is MPS multiple, so send ZLP packet */ |
||||
if((pep->total_length % pep->maxpacket == 0) && |
||||
(pep->total_length >= pep->maxpacket) && |
||||
(pep->total_length < pdev->ep0_data_len )) |
||||
{ |
||||
|
||||
USBD_CtlContinueSendData(pdev , NULL, 0); |
||||
pdev->ep0_data_len = 0; |
||||
|
||||
/* Prepare endpoint for premature end of transfer */ |
||||
USBD_LL_PrepareReceive (pdev, |
||||
0, |
||||
NULL, |
||||
0); |
||||
} |
||||
else |
||||
{ |
||||
if((pdev->pClass->EP0_TxSent != NULL)&& |
||||
(pdev->dev_state == USBD_STATE_CONFIGURED)) |
||||
{ |
||||
pdev->pClass->EP0_TxSent(pdev);
|
||||
}
|
||||
USBD_CtlReceiveStatus(pdev); |
||||
} |
||||
} |
||||
} |
||||
if (pdev->dev_test_mode == 1) |
||||
{ |
||||
USBD_RunTestMode(pdev);
|
||||
pdev->dev_test_mode = 0; |
||||
} |
||||
} |
||||
else if((pdev->pClass->DataIn != NULL)&&
|
||||
(pdev->dev_state == USBD_STATE_CONFIGURED)) |
||||
{ |
||||
pdev->pClass->DataIn(pdev, epnum);
|
||||
}
|
||||
return USBD_OK; |
||||
} |
||||
|
||||
/**
|
||||
* @brief USBD_LL_Reset
|
||||
* Handle Reset event |
||||
* @param pdev: device instance |
||||
* @retval status |
||||
*/ |
||||
|
||||
USBD_StatusTypeDef USBD_LL_Reset(USBD_HandleTypeDef *pdev) |
||||
{ |
||||
/* Open EP0 OUT */ |
||||
USBD_LL_OpenEP(pdev, |
||||
0x00, |
||||
USBD_EP_TYPE_CTRL, |
||||
USB_MAX_EP0_SIZE); |
||||
|
||||
pdev->ep_out[0].maxpacket = USB_MAX_EP0_SIZE; |
||||
|
||||
/* Open EP0 IN */ |
||||
USBD_LL_OpenEP(pdev, |
||||
0x80, |
||||
USBD_EP_TYPE_CTRL, |
||||
USB_MAX_EP0_SIZE); |
||||
|
||||
pdev->ep_in[0].maxpacket = USB_MAX_EP0_SIZE; |
||||
/* Upon Reset call user call back */ |
||||
pdev->dev_state = USBD_STATE_DEFAULT; |
||||
|
||||
if (pdev->pClassData)
|
||||
pdev->pClass->DeInit(pdev, pdev->dev_config);
|
||||
|
||||
|
||||
return USBD_OK; |
||||
} |
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @brief USBD_LL_Reset
|
||||
* Handle Reset event |
||||
* @param pdev: device instance |
||||
* @retval status |
||||
*/ |
||||
USBD_StatusTypeDef USBD_LL_SetSpeed(USBD_HandleTypeDef *pdev, USBD_SpeedTypeDef speed) |
||||
{ |
||||
pdev->dev_speed = speed; |
||||
return USBD_OK; |
||||
} |
||||
|
||||
/**
|
||||
* @brief USBD_Suspend
|
||||
* Handle Suspend event |
||||
* @param pdev: device instance |
||||
* @retval status |
||||
*/ |
||||
|
||||
USBD_StatusTypeDef USBD_LL_Suspend(USBD_HandleTypeDef *pdev) |
||||
{ |
||||
pdev->dev_old_state = pdev->dev_state; |
||||
pdev->dev_state = USBD_STATE_SUSPENDED; |
||||
return USBD_OK; |
||||
} |
||||
|
||||
/**
|
||||
* @brief USBD_Resume
|
||||
* Handle Resume event |
||||
* @param pdev: device instance |
||||
* @retval status |
||||
*/ |
||||
|
||||
USBD_StatusTypeDef USBD_LL_Resume(USBD_HandleTypeDef *pdev) |
||||
{ |
||||
pdev->dev_state = pdev->dev_old_state;
|
||||
return USBD_OK; |
||||
} |
||||
|
||||
/**
|
||||
* @brief USBD_SOF
|
||||
* Handle SOF event |
||||
* @param pdev: device instance |
||||
* @retval status |
||||
*/ |
||||
|
||||
USBD_StatusTypeDef USBD_LL_SOF(USBD_HandleTypeDef *pdev) |
||||
{ |
||||
if(pdev->dev_state == USBD_STATE_CONFIGURED) |
||||
{ |
||||
if(pdev->pClass->SOF != NULL) |
||||
{ |
||||
pdev->pClass->SOF(pdev); |
||||
} |
||||
} |
||||
return USBD_OK; |
||||
} |
||||
|
||||
/**
|
||||
* @brief USBD_IsoINIncomplete
|
||||
* Handle iso in incomplete event |
||||
* @param pdev: device instance |
||||
* @retval status |
||||
*/ |
||||
USBD_StatusTypeDef USBD_LL_IsoINIncomplete(USBD_HandleTypeDef *pdev, uint8_t epnum) |
||||
{ |
||||
return USBD_OK; |
||||
} |
||||
|
||||
/**
|
||||
* @brief USBD_IsoOUTIncomplete
|
||||
* Handle iso out incomplete event |
||||
* @param pdev: device instance |
||||
* @retval status |
||||
*/ |
||||
USBD_StatusTypeDef USBD_LL_IsoOUTIncomplete(USBD_HandleTypeDef *pdev, uint8_t epnum) |
||||
{ |
||||
return USBD_OK; |
||||
} |
||||
|
||||
/**
|
||||
* @brief USBD_DevConnected
|
||||
* Handle device connection event |
||||
* @param pdev: device instance |
||||
* @retval status |
||||
*/ |
||||
USBD_StatusTypeDef USBD_LL_DevConnected(USBD_HandleTypeDef *pdev) |
||||
{ |
||||
return USBD_OK; |
||||
} |
||||
|
||||
/**
|
||||
* @brief USBD_DevDisconnected
|
||||
* Handle device disconnection event |
||||
* @param pdev: device instance |
||||
* @retval status |
||||
*/ |
||||
USBD_StatusTypeDef USBD_LL_DevDisconnected(USBD_HandleTypeDef *pdev) |
||||
{ |
||||
/* Free Class Resources */ |
||||
pdev->dev_state = USBD_STATE_DEFAULT; |
||||
pdev->pClass->DeInit(pdev, pdev->dev_config);
|
||||
|
||||
return USBD_OK; |
||||
} |
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
||||
|
@ -0,0 +1,782 @@ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file usbd_req.c |
||||
* @author MCD Application Team |
||||
* @version V2.4.2 |
||||
* @date 11-December-2015
|
||||
* @brief This file provides the standard USB requests following chapter 9. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© COPYRIGHT 2015 STMicroelectronics</center></h2> |
||||
* |
||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); |
||||
* You may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at: |
||||
* |
||||
* http://www.st.com/software_license_agreement_liberty_v2
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
* |
||||
****************************************************************************** |
||||
*/
|
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "usbd_ctlreq.h" |
||||
#include "usbd_ioreq.h" |
||||
|
||||
|
||||
/** @addtogroup STM32_USBD_STATE_DEVICE_LIBRARY
|
||||
* @{ |
||||
*/ |
||||
|
||||
|
||||
/** @defgroup USBD_REQ
|
||||
* @brief USB standard requests module |
||||
* @{ |
||||
*/
|
||||
|
||||
/** @defgroup USBD_REQ_Private_TypesDefinitions
|
||||
* @{ |
||||
*/
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
|
||||
/** @defgroup USBD_REQ_Private_Defines
|
||||
* @{ |
||||
*/
|
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
|
||||
/** @defgroup USBD_REQ_Private_Macros
|
||||
* @{ |
||||
*/
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
|
||||
/** @defgroup USBD_REQ_Private_Variables
|
||||
* @{ |
||||
*/
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
|
||||
/** @defgroup USBD_REQ_Private_FunctionPrototypes
|
||||
* @{ |
||||
*/
|
||||
static void USBD_GetDescriptor(USBD_HandleTypeDef *pdev ,
|
||||
USBD_SetupReqTypedef *req); |
||||
|
||||
static void USBD_SetAddress(USBD_HandleTypeDef *pdev ,
|
||||
USBD_SetupReqTypedef *req); |
||||
|
||||
static void USBD_SetConfig(USBD_HandleTypeDef *pdev ,
|
||||
USBD_SetupReqTypedef *req); |
||||
|
||||
static void USBD_GetConfig(USBD_HandleTypeDef *pdev ,
|
||||
USBD_SetupReqTypedef *req); |
||||
|
||||
static void USBD_GetStatus(USBD_HandleTypeDef *pdev ,
|
||||
USBD_SetupReqTypedef *req); |
||||
|
||||
static void USBD_SetFeature(USBD_HandleTypeDef *pdev ,
|
||||
USBD_SetupReqTypedef *req); |
||||
|
||||
static void USBD_ClrFeature(USBD_HandleTypeDef *pdev ,
|
||||
USBD_SetupReqTypedef *req); |
||||
|
||||
static uint8_t USBD_GetLen(uint8_t *buf); |
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
|
||||
/** @defgroup USBD_REQ_Private_Functions
|
||||
* @{ |
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* @brief USBD_StdDevReq |
||||
* Handle standard usb device requests |
||||
* @param pdev: device instance |
||||
* @param req: usb request |
||||
* @retval status |
||||
*/ |
||||
USBD_StatusTypeDef USBD_StdDevReq (USBD_HandleTypeDef *pdev , USBD_SetupReqTypedef *req) |
||||
{ |
||||
USBD_StatusTypeDef ret = USBD_OK;
|
||||
|
||||
switch (req->bRequest)
|
||||
{ |
||||
case USB_REQ_GET_DESCRIPTOR:
|
||||
|
||||
USBD_GetDescriptor (pdev, req) ; |
||||
break; |
||||
|
||||
case USB_REQ_SET_ADDRESS:
|
||||
USBD_SetAddress(pdev, req); |
||||
break; |
||||
|
||||
case USB_REQ_SET_CONFIGURATION:
|
||||
USBD_SetConfig (pdev , req); |
||||
break; |
||||
|
||||
case USB_REQ_GET_CONFIGURATION:
|
||||
USBD_GetConfig (pdev , req); |
||||
break; |
||||
|
||||
case USB_REQ_GET_STATUS:
|
||||
USBD_GetStatus (pdev , req); |
||||
break; |
||||
|
||||
|
||||
case USB_REQ_SET_FEATURE:
|
||||
USBD_SetFeature (pdev , req);
|
||||
break; |
||||
|
||||
case USB_REQ_CLEAR_FEATURE:
|
||||
USBD_ClrFeature (pdev , req); |
||||
break; |
||||
|
||||
default:
|
||||
USBD_CtlError(pdev , req); |
||||
break; |
||||
} |
||||
|
||||
return ret; |
||||
} |
||||
|
||||
/**
|
||||
* @brief USBD_StdItfReq |
||||
* Handle standard usb interface requests |
||||
* @param pdev: device instance |
||||
* @param req: usb request |
||||
* @retval status |
||||
*/ |
||||
USBD_StatusTypeDef USBD_StdItfReq (USBD_HandleTypeDef *pdev , USBD_SetupReqTypedef *req) |
||||
{ |
||||
USBD_StatusTypeDef ret = USBD_OK;
|
||||
|
||||
switch (pdev->dev_state)
|
||||
{ |
||||
case USBD_STATE_CONFIGURED: |
||||
|
||||
if (LOBYTE(req->wIndex) <= USBD_MAX_NUM_INTERFACES)
|
||||
{ |
||||
pdev->pClass->Setup (pdev, req);
|
||||
|
||||
if((req->wLength == 0)&& (ret == USBD_OK)) |
||||
{ |
||||
USBD_CtlSendStatus(pdev); |
||||
} |
||||
}
|
||||
else
|
||||
{
|
||||
USBD_CtlError(pdev , req); |
||||
} |
||||
break; |
||||
|
||||
default: |
||||
USBD_CtlError(pdev , req); |
||||
break; |
||||
} |
||||
return USBD_OK; |
||||
} |
||||
|
||||
/**
|
||||
* @brief USBD_StdEPReq |
||||
* Handle standard usb endpoint requests |
||||
* @param pdev: device instance |
||||
* @param req: usb request |
||||
* @retval status |
||||
*/ |
||||
USBD_StatusTypeDef USBD_StdEPReq (USBD_HandleTypeDef *pdev , USBD_SetupReqTypedef *req) |
||||
{ |
||||
|
||||
uint8_t ep_addr; |
||||
USBD_StatusTypeDef ret = USBD_OK;
|
||||
USBD_EndpointTypeDef *pep; |
||||
ep_addr = LOBYTE(req->wIndex);
|
||||
|
||||
/* Check if it is a class request */ |
||||
if ((req->bmRequest & 0x60) == 0x20) |
||||
{ |
||||
pdev->pClass->Setup (pdev, req); |
||||
|
||||
return USBD_OK; |
||||
} |
||||
|
||||
switch (req->bRequest)
|
||||
{ |
||||
|
||||
case USB_REQ_SET_FEATURE : |
||||
|
||||
switch (pdev->dev_state)
|
||||
{ |
||||
case USBD_STATE_ADDRESSED:
|
||||
if ((ep_addr != 0x00) && (ep_addr != 0x80))
|
||||
{ |
||||
USBD_LL_StallEP(pdev , ep_addr); |
||||
} |
||||
break;
|
||||
|
||||
case USBD_STATE_CONFIGURED:
|
||||
if (req->wValue == USB_FEATURE_EP_HALT) |
||||
{ |
||||
if ((ep_addr != 0x00) && (ep_addr != 0x80))
|
||||
{
|
||||
USBD_LL_StallEP(pdev , ep_addr); |
||||
|
||||
} |
||||
} |
||||
pdev->pClass->Setup (pdev, req);
|
||||
USBD_CtlSendStatus(pdev); |
||||
|
||||
break; |
||||
|
||||
default:
|
||||
USBD_CtlError(pdev , req); |
||||
break;
|
||||
} |
||||
break; |
||||
|
||||
case USB_REQ_CLEAR_FEATURE : |
||||
|
||||
switch (pdev->dev_state)
|
||||
{ |
||||
case USBD_STATE_ADDRESSED:
|
||||
if ((ep_addr != 0x00) && (ep_addr != 0x80))
|
||||
{ |
||||
USBD_LL_StallEP(pdev , ep_addr); |
||||
} |
||||
break;
|
||||
|
||||
case USBD_STATE_CONFIGURED:
|
||||
if (req->wValue == USB_FEATURE_EP_HALT) |
||||
{ |
||||
if ((ep_addr & 0x7F) != 0x00)
|
||||
{
|
||||
USBD_LL_ClearStallEP(pdev , ep_addr); |
||||
pdev->pClass->Setup (pdev, req); |
||||
} |
||||
USBD_CtlSendStatus(pdev); |
||||
} |
||||
break; |
||||
|
||||
default:
|
||||
USBD_CtlError(pdev , req); |
||||
break;
|
||||
} |
||||
break; |
||||
|
||||
case USB_REQ_GET_STATUS:
|
||||
switch (pdev->dev_state)
|
||||
{ |
||||
case USBD_STATE_ADDRESSED:
|
||||
if ((ep_addr & 0x7F) != 0x00)
|
||||
{ |
||||
USBD_LL_StallEP(pdev , ep_addr); |
||||
} |
||||
break;
|
||||
|
||||
case USBD_STATE_CONFIGURED: |
||||
pep = ((ep_addr & 0x80) == 0x80) ? &pdev->ep_in[ep_addr & 0x7F]:\
|
||||
&pdev->ep_out[ep_addr & 0x7F]; |
||||
if(USBD_LL_IsStallEP(pdev, ep_addr)) |
||||
{ |
||||
pep->status = 0x0001;
|
||||
} |
||||
else |
||||
{ |
||||
pep->status = 0x0000;
|
||||
} |
||||
|
||||
USBD_CtlSendData (pdev, |
||||
(uint8_t *)&pep->status, |
||||
2); |
||||
break; |
||||
|
||||
default:
|
||||
USBD_CtlError(pdev , req); |
||||
break; |
||||
} |
||||
break; |
||||
|
||||
default: |
||||
break; |
||||
} |
||||
return ret; |
||||
} |
||||
/**
|
||||
* @brief USBD_GetDescriptor |
||||
* Handle Get Descriptor requests |
||||
* @param pdev: device instance |
||||
* @param req: usb request |
||||
* @retval status |
||||
*/ |
||||
static void USBD_GetDescriptor(USBD_HandleTypeDef *pdev ,
|
||||
USBD_SetupReqTypedef *req) |
||||
{ |
||||
uint16_t len; |
||||
uint8_t *pbuf; |
||||
|
||||
|
||||
switch (req->wValue >> 8) |
||||
{
|
||||
#if (USBD_LPM_ENABLED == 1) |
||||
case USB_DESC_TYPE_BOS: |
||||
pbuf = pdev->pDesc->GetBOSDescriptor(pdev->dev_speed, &len); |
||||
break; |
||||
#endif |
||||
case USB_DESC_TYPE_DEVICE: |
||||
pbuf = pdev->pDesc->GetDeviceDescriptor(pdev->dev_speed, &len); |
||||
break; |
||||
|
||||
case USB_DESC_TYPE_CONFIGURATION:
|
||||
if(pdev->dev_speed == USBD_SPEED_HIGH )
|
||||
{ |
||||
pbuf = (uint8_t *)pdev->pClass->GetHSConfigDescriptor(&len); |
||||
pbuf[1] = USB_DESC_TYPE_CONFIGURATION; |
||||
} |
||||
else |
||||
{ |
||||
pbuf = (uint8_t *)pdev->pClass->GetFSConfigDescriptor(&len); |
||||
pbuf[1] = USB_DESC_TYPE_CONFIGURATION; |
||||
} |
||||
break; |
||||
|
||||
case USB_DESC_TYPE_STRING: |
||||
switch ((uint8_t)(req->wValue)) |
||||
{ |
||||
case USBD_IDX_LANGID_STR: |
||||
pbuf = pdev->pDesc->GetLangIDStrDescriptor(pdev->dev_speed, &len);
|
||||
break; |
||||
|
||||
case USBD_IDX_MFC_STR: |
||||
pbuf = pdev->pDesc->GetManufacturerStrDescriptor(pdev->dev_speed, &len); |
||||
break; |
||||
|
||||
case USBD_IDX_PRODUCT_STR: |
||||
pbuf = pdev->pDesc->GetProductStrDescriptor(pdev->dev_speed, &len); |
||||
break; |
||||
|
||||
case USBD_IDX_SERIAL_STR: |
||||
pbuf = pdev->pDesc->GetSerialStrDescriptor(pdev->dev_speed, &len); |
||||
break; |
||||
|
||||
// case USBD_IDX_CONFIG_STR:
|
||||
// pbuf = pdev->pDesc->GetConfigurationStrDescriptor(pdev->dev_speed, &len);
|
||||
// break;
|
||||
//
|
||||
// case USBD_IDX_INTERFACE_STR:
|
||||
// pbuf = pdev->pDesc->GetInterfaceStrDescriptor(pdev->dev_speed, &len);
|
||||
// break;
|
||||
|
||||
default: |
||||
#if (USBD_SUPPORT_USER_STRING == 1) |
||||
pbuf = pdev->pClass->GetUsrStrDescriptor(pdev, (req->wValue) , &len); |
||||
break; |
||||
#else |
||||
USBD_CtlError(pdev , req); |
||||
return; |
||||
#endif |
||||
} |
||||
break; |
||||
case USB_DESC_TYPE_DEVICE_QUALIFIER:
|
||||
|
||||
if(pdev->dev_speed == USBD_SPEED_HIGH )
|
||||
{ |
||||
pbuf = (uint8_t *)pdev->pClass->GetDeviceQualifierDescriptor(&len); |
||||
break; |
||||
} |
||||
else |
||||
{ |
||||
USBD_CtlError(pdev , req); |
||||
return; |
||||
}
|
||||
|
||||
case USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION: |
||||
if(pdev->dev_speed == USBD_SPEED_HIGH )
|
||||
{ |
||||
pbuf = (uint8_t *)pdev->pClass->GetOtherSpeedConfigDescriptor(&len); |
||||
pbuf[1] = USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION; |
||||
break;
|
||||
} |
||||
else |
||||
{ |
||||
USBD_CtlError(pdev , req); |
||||
return; |
||||
} |
||||
|
||||
default:
|
||||
USBD_CtlError(pdev , req); |
||||
return; |
||||
} |
||||
|
||||
if((len != 0)&& (req->wLength != 0)) |
||||
{ |
||||
|
||||
len = MIN(len , req->wLength); |
||||
|
||||
USBD_CtlSendData (pdev,
|
||||
pbuf, |
||||
len); |
||||
} |
||||
|
||||
} |
||||
|
||||
/**
|
||||
* @brief USBD_SetAddress |
||||
* Set device address |
||||
* @param pdev: device instance |
||||
* @param req: usb request |
||||
* @retval status |
||||
*/ |
||||
static void USBD_SetAddress(USBD_HandleTypeDef *pdev ,
|
||||
USBD_SetupReqTypedef *req) |
||||
{ |
||||
uint8_t dev_addr;
|
||||
|
||||
if ((req->wIndex == 0) && (req->wLength == 0))
|
||||
{ |
||||
dev_addr = (uint8_t)(req->wValue) & 0x7F;
|
||||
|
||||
if (pdev->dev_state == USBD_STATE_CONFIGURED)
|
||||
{ |
||||
USBD_CtlError(pdev , req); |
||||
}
|
||||
else
|
||||
{ |
||||
pdev->dev_address = dev_addr; |
||||
USBD_LL_SetUSBAddress(pdev, dev_addr);
|
||||
USBD_CtlSendStatus(pdev);
|
||||
|
||||
if (dev_addr != 0)
|
||||
{ |
||||
pdev->dev_state = USBD_STATE_ADDRESSED; |
||||
}
|
||||
else
|
||||
{ |
||||
pdev->dev_state = USBD_STATE_DEFAULT;
|
||||
} |
||||
} |
||||
}
|
||||
else
|
||||
{ |
||||
USBD_CtlError(pdev , req);
|
||||
}
|
||||
} |
||||
|
||||
/**
|
||||
* @brief USBD_SetConfig |
||||
* Handle Set device configuration request |
||||
* @param pdev: device instance |
||||
* @param req: usb request |
||||
* @retval status |
||||
*/ |
||||
static void USBD_SetConfig(USBD_HandleTypeDef *pdev ,
|
||||
USBD_SetupReqTypedef *req) |
||||
{ |
||||
|
||||
static uint8_t cfgidx; |
||||
|
||||
cfgidx = (uint8_t)(req->wValue);
|
||||
|
||||
if (cfgidx > USBD_MAX_NUM_CONFIGURATION )
|
||||
{
|
||||
USBD_CtlError(pdev , req);
|
||||
}
|
||||
else
|
||||
{ |
||||
switch (pdev->dev_state)
|
||||
{ |
||||
case USBD_STATE_ADDRESSED: |
||||
if (cfgidx)
|
||||
{
|
||||
pdev->dev_config = cfgidx; |
||||
pdev->dev_state = USBD_STATE_CONFIGURED; |
||||
if(USBD_SetClassConfig(pdev , cfgidx) == USBD_FAIL) |
||||
{ |
||||
USBD_CtlError(pdev , req);
|
||||
return; |
||||
} |
||||
USBD_CtlSendStatus(pdev); |
||||
} |
||||
else
|
||||
{ |
||||
USBD_CtlSendStatus(pdev); |
||||
} |
||||
break; |
||||
|
||||
case USBD_STATE_CONFIGURED: |
||||
if (cfgidx == 0)
|
||||
{
|
||||
pdev->dev_state = USBD_STATE_ADDRESSED; |
||||
pdev->dev_config = cfgidx;
|
||||
USBD_ClrClassConfig(pdev , cfgidx); |
||||
USBD_CtlSendStatus(pdev); |
||||
|
||||
}
|
||||
else if (cfgidx != pdev->dev_config)
|
||||
{ |
||||
/* Clear old configuration */ |
||||
USBD_ClrClassConfig(pdev , pdev->dev_config); |
||||
|
||||
/* set new configuration */ |
||||
pdev->dev_config = cfgidx; |
||||
if(USBD_SetClassConfig(pdev , cfgidx) == USBD_FAIL) |
||||
{ |
||||
USBD_CtlError(pdev , req);
|
||||
return; |
||||
} |
||||
USBD_CtlSendStatus(pdev); |
||||
} |
||||
else |
||||
{ |
||||
USBD_CtlSendStatus(pdev); |
||||
} |
||||
break; |
||||
|
||||
default:
|
||||
USBD_CtlError(pdev , req);
|
||||
break; |
||||
} |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief USBD_GetConfig |
||||
* Handle Get device configuration request |
||||
* @param pdev: device instance |
||||
* @param req: usb request |
||||
* @retval status |
||||
*/ |
||||
static void USBD_GetConfig(USBD_HandleTypeDef *pdev ,
|
||||
USBD_SetupReqTypedef *req) |
||||
{ |
||||
|
||||
if (req->wLength != 1)
|
||||
{
|
||||
USBD_CtlError(pdev , req); |
||||
} |
||||
else
|
||||
{ |
||||
switch (pdev->dev_state )
|
||||
{ |
||||
case USBD_STATE_ADDRESSED:
|
||||
pdev->dev_default_config = 0; |
||||
USBD_CtlSendData (pdev,
|
||||
(uint8_t *)&pdev->dev_default_config, |
||||
1); |
||||
break; |
||||
|
||||
case USBD_STATE_CONFIGURED:
|
||||
|
||||
USBD_CtlSendData (pdev,
|
||||
(uint8_t *)&pdev->dev_config, |
||||
1); |
||||
break; |
||||
|
||||
default: |
||||
USBD_CtlError(pdev , req); |
||||
break; |
||||
} |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief USBD_GetStatus |
||||
* Handle Get Status request |
||||
* @param pdev: device instance |
||||
* @param req: usb request |
||||
* @retval status |
||||
*/ |
||||
static void USBD_GetStatus(USBD_HandleTypeDef *pdev ,
|
||||
USBD_SetupReqTypedef *req) |
||||
{ |
||||
|
||||
|
||||
switch (pdev->dev_state)
|
||||
{ |
||||
case USBD_STATE_ADDRESSED: |
||||
case USBD_STATE_CONFIGURED: |
||||
|
||||
#if ( USBD_SELF_POWERED == 1) |
||||
pdev->dev_config_status = USB_CONFIG_SELF_POWERED;
|
||||
#else |
||||
pdev->dev_config_status = 0;
|
||||
#endif |
||||
|
||||
if (pdev->dev_remote_wakeup)
|
||||
{ |
||||
pdev->dev_config_status |= USB_CONFIG_REMOTE_WAKEUP;
|
||||
} |
||||
|
||||
USBD_CtlSendData (pdev,
|
||||
(uint8_t *)& pdev->dev_config_status, |
||||
2); |
||||
break; |
||||
|
||||
default : |
||||
USBD_CtlError(pdev , req);
|
||||
break; |
||||
} |
||||
} |
||||
|
||||
|
||||
/**
|
||||
* @brief USBD_SetFeature |
||||
* Handle Set device feature request |
||||
* @param pdev: device instance |
||||
* @param req: usb request |
||||
* @retval status |
||||
*/ |
||||
static void USBD_SetFeature(USBD_HandleTypeDef *pdev ,
|
||||
USBD_SetupReqTypedef *req) |
||||
{ |
||||
|
||||
if (req->wValue == USB_FEATURE_REMOTE_WAKEUP) |
||||
{ |
||||
pdev->dev_remote_wakeup = 1;
|
||||
pdev->pClass->Setup (pdev, req);
|
||||
USBD_CtlSendStatus(pdev); |
||||
} |
||||
|
||||
} |
||||
|
||||
|
||||
/**
|
||||
* @brief USBD_ClrFeature |
||||
* Handle clear device feature request |
||||
* @param pdev: device instance |
||||
* @param req: usb request |
||||
* @retval status |
||||
*/ |
||||
static void USBD_ClrFeature(USBD_HandleTypeDef *pdev ,
|
||||
USBD_SetupReqTypedef *req) |
||||
{ |
||||
switch (pdev->dev_state) |
||||
{ |
||||
case USBD_STATE_ADDRESSED: |
||||
case USBD_STATE_CONFIGURED: |
||||
if (req->wValue == USB_FEATURE_REMOTE_WAKEUP)
|
||||
{ |
||||
pdev->dev_remote_wakeup = 0;
|
||||
pdev->pClass->Setup (pdev, req);
|
||||
USBD_CtlSendStatus(pdev); |
||||
} |
||||
break; |
||||
|
||||
default : |
||||
USBD_CtlError(pdev , req); |
||||
break; |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief USBD_ParseSetupRequest
|
||||
* Copy buffer into setup structure |
||||
* @param pdev: device instance |
||||
* @param req: usb request |
||||
* @retval None |
||||
*/ |
||||
|
||||
void USBD_ParseSetupRequest(USBD_SetupReqTypedef *req, uint8_t *pdata) |
||||
{ |
||||
req->bmRequest = *(uint8_t *) (pdata); |
||||
req->bRequest = *(uint8_t *) (pdata + 1); |
||||
req->wValue = SWAPBYTE (pdata + 2); |
||||
req->wIndex = SWAPBYTE (pdata + 4); |
||||
req->wLength = SWAPBYTE (pdata + 6); |
||||
|
||||
} |
||||
|
||||
/**
|
||||
* @brief USBD_CtlError
|
||||
* Handle USB low level Error |
||||
* @param pdev: device instance |
||||
* @param req: usb request |
||||
* @retval None |
||||
*/ |
||||
|
||||
void USBD_CtlError( USBD_HandleTypeDef *pdev , |
||||
USBD_SetupReqTypedef *req) |
||||
{ |
||||
USBD_LL_StallEP(pdev , 0x80); |
||||
USBD_LL_StallEP(pdev , 0); |
||||
} |
||||
|
||||
|
||||
/**
|
||||
* @brief USBD_GetString |
||||
* Convert Ascii string into unicode one |
||||
* @param desc : descriptor buffer |
||||
* @param unicode : Formatted string buffer (unicode) |
||||
* @param len : descriptor length |
||||
* @retval None |
||||
*/ |
||||
void USBD_GetString(uint8_t *desc, uint8_t *unicode, uint16_t *len) |
||||
{ |
||||
uint8_t idx = 0; |
||||
|
||||
if (desc != NULL)
|
||||
{ |
||||
*len = USBD_GetLen(desc) * 2 + 2;
|
||||
unicode[idx++] = *len; |
||||
unicode[idx++] = USB_DESC_TYPE_STRING; |
||||
|
||||
while (*desc != '\0')
|
||||
{ |
||||
unicode[idx++] = *desc++; |
||||
unicode[idx++] = 0x00; |
||||
} |
||||
}
|
||||
} |
||||
|
||||
/**
|
||||
* @brief USBD_GetLen |
||||
* return the string length |
||||
* @param buf : pointer to the ascii string buffer |
||||
* @retval string length |
||||
*/ |
||||
static uint8_t USBD_GetLen(uint8_t *buf) |
||||
{ |
||||
uint8_t len = 0; |
||||
|
||||
while (*buf != '\0')
|
||||
{ |
||||
len++; |
||||
buf++; |
||||
} |
||||
|
||||
return len; |
||||
} |
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -0,0 +1,236 @@ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file usbd_ioreq.c |
||||
* @author MCD Application Team |
||||
* @version V2.4.2 |
||||
* @date 11-December-2015 |
||||
* @brief This file provides the IO requests APIs for control endpoints. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© COPYRIGHT 2015 STMicroelectronics</center></h2> |
||||
* |
||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); |
||||
* You may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at: |
||||
* |
||||
* http://www.st.com/software_license_agreement_liberty_v2
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
* |
||||
****************************************************************************** |
||||
*/
|
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "usbd_ioreq.h" |
||||
|
||||
/** @addtogroup STM32_USB_DEVICE_LIBRARY
|
||||
* @{ |
||||
*/ |
||||
|
||||
|
||||
/** @defgroup USBD_IOREQ
|
||||
* @brief control I/O requests module |
||||
* @{ |
||||
*/
|
||||
|
||||
/** @defgroup USBD_IOREQ_Private_TypesDefinitions
|
||||
* @{ |
||||
*/
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
|
||||
/** @defgroup USBD_IOREQ_Private_Defines
|
||||
* @{ |
||||
*/
|
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
|
||||
/** @defgroup USBD_IOREQ_Private_Macros
|
||||
* @{ |
||||
*/
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
|
||||
/** @defgroup USBD_IOREQ_Private_Variables
|
||||
* @{ |
||||
*/
|
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
|
||||
/** @defgroup USBD_IOREQ_Private_FunctionPrototypes
|
||||
* @{ |
||||
*/
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
|
||||
/** @defgroup USBD_IOREQ_Private_Functions
|
||||
* @{ |
||||
*/
|
||||
|
||||
/**
|
||||
* @brief USBD_CtlSendData |
||||
* send data on the ctl pipe |
||||
* @param pdev: device instance |
||||
* @param buff: pointer to data buffer |
||||
* @param len: length of data to be sent |
||||
* @retval status |
||||
*/ |
||||
USBD_StatusTypeDef USBD_CtlSendData (USBD_HandleTypeDef *pdev,
|
||||
uint8_t *pbuf, |
||||
uint16_t len) |
||||
{ |
||||
/* Set EP0 State */ |
||||
pdev->ep0_state = USBD_EP0_DATA_IN;
|
||||
pdev->ep_in[0].total_length = len; |
||||
pdev->ep_in[0].rem_length = len; |
||||
/* Start the transfer */ |
||||
USBD_LL_Transmit (pdev, 0x00, pbuf, len);
|
||||
|
||||
return USBD_OK; |
||||
} |
||||
|
||||
/**
|
||||
* @brief USBD_CtlContinueSendData |
||||
* continue sending data on the ctl pipe |
||||
* @param pdev: device instance |
||||
* @param buff: pointer to data buffer |
||||
* @param len: length of data to be sent |
||||
* @retval status |
||||
*/ |
||||
USBD_StatusTypeDef USBD_CtlContinueSendData (USBD_HandleTypeDef *pdev,
|
||||
uint8_t *pbuf, |
||||
uint16_t len) |
||||
{ |
||||
/* Start the next transfer */ |
||||
USBD_LL_Transmit (pdev, 0x00, pbuf, len);
|
||||
|
||||
return USBD_OK; |
||||
} |
||||
|
||||
/**
|
||||
* @brief USBD_CtlPrepareRx |
||||
* receive data on the ctl pipe |
||||
* @param pdev: device instance |
||||
* @param buff: pointer to data buffer |
||||
* @param len: length of data to be received |
||||
* @retval status |
||||
*/ |
||||
USBD_StatusTypeDef USBD_CtlPrepareRx (USBD_HandleTypeDef *pdev, |
||||
uint8_t *pbuf,
|
||||
uint16_t len) |
||||
{ |
||||
/* Set EP0 State */ |
||||
pdev->ep0_state = USBD_EP0_DATA_OUT;
|
||||
pdev->ep_out[0].total_length = len; |
||||
pdev->ep_out[0].rem_length = len; |
||||
/* Start the transfer */ |
||||
USBD_LL_PrepareReceive (pdev, |
||||
0, |
||||
pbuf, |
||||
len); |
||||
|
||||
return USBD_OK; |
||||
} |
||||
|
||||
/**
|
||||
* @brief USBD_CtlContinueRx |
||||
* continue receive data on the ctl pipe |
||||
* @param pdev: device instance |
||||
* @param buff: pointer to data buffer |
||||
* @param len: length of data to be received |
||||
* @retval status |
||||
*/ |
||||
USBD_StatusTypeDef USBD_CtlContinueRx (USBD_HandleTypeDef *pdev,
|
||||
uint8_t *pbuf,
|
||||
uint16_t len) |
||||
{ |
||||
|
||||
USBD_LL_PrepareReceive (pdev, |
||||
0,
|
||||
pbuf,
|
||||
len); |
||||
return USBD_OK; |
||||
} |
||||
/**
|
||||
* @brief USBD_CtlSendStatus |
||||
* send zero lzngth packet on the ctl pipe |
||||
* @param pdev: device instance |
||||
* @retval status |
||||
*/ |
||||
USBD_StatusTypeDef USBD_CtlSendStatus (USBD_HandleTypeDef *pdev) |
||||
{ |
||||
|
||||
/* Set EP0 State */ |
||||
pdev->ep0_state = USBD_EP0_STATUS_IN; |
||||
|
||||
/* Start the transfer */ |
||||
USBD_LL_Transmit (pdev, 0x00, NULL, 0);
|
||||
|
||||
return USBD_OK; |
||||
} |
||||
|
||||
/**
|
||||
* @brief USBD_CtlReceiveStatus |
||||
* receive zero lzngth packet on the ctl pipe |
||||
* @param pdev: device instance |
||||
* @retval status |
||||
*/ |
||||
USBD_StatusTypeDef USBD_CtlReceiveStatus (USBD_HandleTypeDef *pdev) |
||||
{ |
||||
/* Set EP0 State */ |
||||
pdev->ep0_state = USBD_EP0_STATUS_OUT;
|
||||
|
||||
/* Start the transfer */
|
||||
USBD_LL_PrepareReceive ( pdev, |
||||
0, |
||||
NULL, |
||||
0);
|
||||
|
||||
return USBD_OK; |
||||
} |
||||
|
||||
|
||||
/**
|
||||
* @brief USBD_GetRxCount |
||||
* returns the received data length |
||||
* @param pdev: device instance |
||||
* @param ep_addr: endpoint address |
||||
* @retval Rx Data blength |
||||
*/ |
||||
uint16_t USBD_GetRxCount (USBD_HandleTypeDef *pdev , uint8_t ep_addr) |
||||
{ |
||||
return USBD_LL_GetRxDataSize(pdev, ep_addr); |
||||
} |
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* @} |
||||
*/
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
File diff suppressed because it is too large
Load Diff
Loading…
Reference in new issue