You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
328 lines
10 KiB
328 lines
10 KiB
--- 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 )
|
|
{
|
|
|