3 Commits

19 changed files with 655 additions and 235 deletions

View File

@@ -742,8 +742,19 @@ static uint8_t USBD_AUDIO_IsoINIncomplete(USBD_HandleTypeDef *pdev, uint8_t epnu
*/
static uint8_t USBD_AUDIO_IsoOutIncomplete(USBD_HandleTypeDef *pdev, uint8_t epnum)
{
UNUSED(pdev);
UNUSED(epnum);
USBD_AUDIO_HandleTypeDef *haudio;
if (pdev->pClassDataCmsit[pdev->classId] == NULL)
{
return (uint8_t)USBD_FAIL;
}
haudio = (USBD_AUDIO_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId];
/* Prepare Out endpoint to receive next audio packet */
(void)USBD_LL_PrepareReceive(pdev, epnum,
&haudio->buffer[haudio->wr_ptr],
AUDIO_OUT_PACKET);
return (uint8_t)USBD_OK;
}

View File

@@ -65,6 +65,8 @@ extern "C" {
#define DFU_DESCRIPTOR_TYPE 0x21U
#define DFU_VENDOR_CMD_MAX 32U
/**************************************************/
/* DFU Requests DFU states */
@@ -126,6 +128,11 @@ extern "C" {
#define DFU_MANIFEST_MASK (1U << 2)
#define DFU_STATUS_DEPTH 6U
#define IS_DFU_DOWNLOAD 0x0DFDFU
#define IS_DFU_UPLOAD 0x1DFDFU
#define IS_DFU_SETADDRESSPOINTER 0x2DFDFU
#define IS_DFU_PHY_ADDRESS 0x3DFDFU
typedef enum
{
DFU_DETACH = 0U,
@@ -176,6 +183,7 @@ typedef struct
uint32_t wblock_num;
uint32_t wlength;
uint32_t data_ptr;
uint32_t app_addr_ptr;
uint32_t alt_setting;
uint8_t dev_status[DFU_STATUS_DEPTH];
@@ -193,6 +201,17 @@ typedef struct
uint16_t (* Write)(uint8_t *src, uint8_t *dest, uint32_t Len);
uint8_t *(* Read)(uint8_t *src, uint8_t *dest, uint32_t Len);
uint16_t (* GetStatus)(uint32_t Add, uint8_t cmd, uint8_t *buff);
#if (USBD_DFU_VENDOR_CMD_ENABLED == 1U)
uint16_t (* GetVendorCMD)(uint8_t *cmd, uint8_t *cmdlength);
uint16_t (* VendorDownloadCMD)(uint8_t *pbuf, uint32_t BlockNumber, uint32_t wlength, uint32_t *status);
uint16_t (* VendorUploadCMD)(uint32_t Add, uint32_t BlockNumber, uint32_t *status);
#endif /* USBD_DFU_VENDOR_CMD_ENABLED */
#if (USBD_DFU_VENDOR_CHECK_ENABLED == 1U)
uint16_t (* VendorCheck)(uint8_t *pbuf, uint32_t ReqType, uint32_t *status);
#endif /* USBD_DFU_VENDOR_CHECK_ENABLED */
#if (USBD_DFU_VENDOR_EXIT_ENABLED == 1U)
uint16_t (* LeaveDFU)(uint32_t Add);
#endif /* USBD_DFU_VENDOR_EXIT_ENABLED */
} USBD_DFU_MediaTypeDef;
typedef struct

View File

@@ -521,9 +521,13 @@ static uint8_t USBD_DFU_EP0_RxReady(USBD_HandleTypeDef *pdev)
static uint8_t USBD_DFU_EP0_TxReady(USBD_HandleTypeDef *pdev)
{
USBD_SetupReqTypedef req;
uint32_t app_addr_ptr;
uint32_t addr;
USBD_DFU_HandleTypeDef *hdfu = (USBD_DFU_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId];
USBD_DFU_MediaTypeDef *DfuInterface = (USBD_DFU_MediaTypeDef *)pdev->pUserData[pdev->classId];
#if (USBD_DFU_VENDOR_CMD_ENABLED == 1U)
uint32_t VendorStatus = 0U;
#endif /* USBD_DFU_VENDOR_CMD_ENABLED */
if (hdfu == NULL)
{
@@ -541,11 +545,43 @@ static uint8_t USBD_DFU_EP0_TxReady(USBD_HandleTypeDef *pdev)
{
/* Nothing to do */
}
#if (USBD_DFU_VENDOR_CMD_ENABLED == 1U)
else
{
/* Vendor specific DFU CMD */
if (DfuInterface->VendorDownloadCMD(hdfu->buffer.d8, hdfu->wblock_num,
hdfu->wlength, &VendorStatus) != USBD_OK)
{
/* Update the state machine */
hdfu->dev_state = DFU_STATE_ERROR;
hdfu->dev_status[0] = (uint8_t)VendorStatus;
hdfu->dev_status[1] = 0U;
hdfu->dev_status[2] = 0U;
hdfu->dev_status[3] = 0U;
hdfu->dev_status[4] = hdfu->dev_state;
return (uint8_t)USBD_FAIL;
}
}
#endif /* USBD_DFU_VENDOR_CMD_ENABLED */
}
else if (hdfu->wlength == 5U)
{
if (hdfu->buffer.d8[0] == DFU_CMD_SETADDRESSPOINTER)
{
#if (USBD_DFU_VENDOR_CHECK_ENABLED == 1U)
if (DfuInterface->VendorCheck(hdfu->buffer.d8, IS_DFU_SETADDRESSPOINTER, &VendorStatus) != USBD_OK)
{
/* Update the state machine */
hdfu->dev_state = DFU_STATE_ERROR;
hdfu->dev_status[0] = (uint8_t)VendorStatus;
hdfu->dev_status[1] = 0U;
hdfu->dev_status[2] = 0U;
hdfu->dev_status[3] = 0U;
hdfu->dev_status[4] = hdfu->dev_state;
return (uint8_t)USBD_FAIL;
}
#endif /* USBD_DFU_VENDOR_CHECK_ENABLED */
hdfu->data_ptr = hdfu->buffer.d8[1];
hdfu->data_ptr += (uint32_t)hdfu->buffer.d8[2] << 8;
hdfu->data_ptr += (uint32_t)hdfu->buffer.d8[3] << 16;
@@ -553,20 +589,61 @@ static uint8_t USBD_DFU_EP0_TxReady(USBD_HandleTypeDef *pdev)
}
else if (hdfu->buffer.d8[0] == DFU_CMD_ERASE)
{
hdfu->data_ptr = hdfu->buffer.d8[1];
hdfu->data_ptr += (uint32_t)hdfu->buffer.d8[2] << 8;
hdfu->data_ptr += (uint32_t)hdfu->buffer.d8[3] << 16;
hdfu->data_ptr += (uint32_t)hdfu->buffer.d8[4] << 24;
if (DfuInterface->Erase(hdfu->data_ptr) != USBD_OK)
#if (USBD_DFU_VENDOR_CHECK_ENABLED == 1U)
if (DfuInterface->VendorCheck(hdfu->buffer.d8, IS_DFU_DOWNLOAD, &VendorStatus) != USBD_OK)
{
/* Update the state machine */
hdfu->dev_state = DFU_STATE_ERROR;
hdfu->dev_status[0] = (uint8_t)VendorStatus;
hdfu->dev_status[1] = 0U;
hdfu->dev_status[2] = 0U;
hdfu->dev_status[3] = 0U;
hdfu->dev_status[4] = hdfu->dev_state;
return (uint8_t)USBD_FAIL;
}
#endif /* USBD_DFU_VENDOR_CHECK_ENABLED */
app_addr_ptr = hdfu->buffer.d8[1];
app_addr_ptr += (uint32_t)hdfu->buffer.d8[2] << 8;
app_addr_ptr += (uint32_t)hdfu->buffer.d8[3] << 16;
app_addr_ptr += (uint32_t)hdfu->buffer.d8[4] << 24;
if (DfuInterface->Erase(app_addr_ptr) != USBD_OK)
{
/* Update the state machine */
hdfu->dev_state = DFU_STATE_ERROR;
hdfu->dev_status[0] = DFU_ERROR_VENDOR;
hdfu->dev_status[1] = 0U;
hdfu->dev_status[2] = 0U;
hdfu->dev_status[3] = 0U;
hdfu->dev_status[4] = hdfu->dev_state;
return (uint8_t)USBD_FAIL;
}
}
#if (USBD_DFU_VENDOR_CMD_ENABLED == 1U)
else
{
/* Vendor specific DFU CMD */
if (DfuInterface->VendorDownloadCMD(hdfu->buffer.d8, hdfu->wblock_num,
hdfu->wlength, &VendorStatus) != USBD_OK)
{
/* Update the state machine */
hdfu->dev_state = DFU_STATE_ERROR;
hdfu->dev_status[0] = (uint8_t)VendorStatus;
hdfu->dev_status[1] = 0U;
hdfu->dev_status[2] = 0U;
hdfu->dev_status[3] = 0U;
hdfu->dev_status[4] = hdfu->dev_state;
return (uint8_t)USBD_FAIL;
}
}
#else
else
{
return (uint8_t)USBD_FAIL;
}
#endif /* USBD_DFU_VENDOR_CMD_ENABLED */
}
else
{
@@ -584,12 +661,33 @@ static uint8_t USBD_DFU_EP0_TxReady(USBD_HandleTypeDef *pdev)
{
if (hdfu->wblock_num > 1U)
{
#if (USBD_DFU_VENDOR_CHECK_ENABLED == 1U)
if (DfuInterface->VendorCheck(hdfu->buffer.d8, IS_DFU_DOWNLOAD, &VendorStatus) != USBD_OK)
{
/* Update the state machine */
hdfu->dev_state = DFU_STATE_ERROR;
hdfu->dev_status[0] = (uint8_t)VendorStatus;
hdfu->dev_status[1] = 0U;
hdfu->dev_status[2] = 0U;
hdfu->dev_status[3] = 0U;
hdfu->dev_status[4] = hdfu->dev_state;
return (uint8_t)USBD_FAIL;
}
#endif /* USBD_DFU_VENDOR_CHECK_ENABLED */
/* Decode the required address */
addr = ((hdfu->wblock_num - 2U) * USBD_DFU_XFER_SIZE) + hdfu->data_ptr;
/* Perform the write operation */
if (DfuInterface->Write(hdfu->buffer.d8, (uint8_t *)addr, hdfu->wlength) != USBD_OK)
{
/* Update the state machine */
hdfu->dev_state = DFU_STATE_ERROR;
hdfu->dev_status[0] = DFU_ERROR_VENDOR;
hdfu->dev_status[1] = 0U;
hdfu->dev_status[2] = 0U;
hdfu->dev_status[3] = 0U;
hdfu->dev_status[4] = hdfu->dev_state;
return (uint8_t)USBD_FAIL;
}
}
@@ -670,7 +768,7 @@ static uint8_t *USBD_DFU_GetUsrStringDesc(USBD_HandleTypeDef *pdev, uint8_t inde
else
{
/* Not supported Interface Descriptor index */
length = 0U;
*length = 0U;
return NULL;
}
}
@@ -758,6 +856,11 @@ static void DFU_Download(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req)
{
USBD_DFU_HandleTypeDef *hdfu = (USBD_DFU_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId];
#if (USBD_DFU_VENDOR_CMD_ENABLED == 1U)
USBD_DFU_MediaTypeDef *DfuInterface = (USBD_DFU_MediaTypeDef *)pdev->pUserData[pdev->classId];
uint32_t VendorStatus = 0U;
#endif /* USBD_DFU_VENDOR_CMD_ENABLED */
if (hdfu == NULL)
{
return;
@@ -789,9 +892,23 @@ static void DFU_Download(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req)
/* 0 Data DNLOAD request */
else
{
/* End of DNLOAD operation*/
/* End of DNLOAD operation */
if ((hdfu->dev_state == DFU_STATE_DNLOAD_IDLE) || (hdfu->dev_state == DFU_STATE_IDLE))
{
#if (USBD_DFU_VENDOR_CHECK_ENABLED == 1U)
if (DfuInterface->VendorCheck(hdfu->buffer.d8, IS_DFU_SETADDRESSPOINTER, &VendorStatus) != USBD_OK)
{
/* Update the state machine */
hdfu->dev_state = DFU_STATE_ERROR;
hdfu->dev_status[0] = (uint8_t)VendorStatus;
hdfu->dev_status[1] = 0U;
hdfu->dev_status[2] = 0U;
hdfu->dev_status[3] = 0U;
hdfu->dev_status[4] = hdfu->dev_state;
}
else
#endif /* USBD_DFU_VENDOR_CHECK_ENABLED */
{
hdfu->manif_state = DFU_MANIFEST_IN_PROGRESS;
hdfu->dev_state = DFU_STATE_MANIFEST_SYNC;
hdfu->dev_status[1] = 0U;
@@ -799,6 +916,7 @@ static void DFU_Download(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req)
hdfu->dev_status[3] = 0U;
hdfu->dev_status[4] = hdfu->dev_state;
}
}
else
{
/* Call the error management function (command will be NAKed */
@@ -820,6 +938,13 @@ static void DFU_Upload(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req)
USBD_DFU_MediaTypeDef *DfuInterface = (USBD_DFU_MediaTypeDef *)pdev->pUserData[pdev->classId];
uint8_t *phaddr;
uint32_t addr;
uint32_t CmdLength;
#if (USBD_DFU_VENDOR_CMD_ENABLED == 1U)
uint32_t VendorStatus = 0U;
uint8_t VendorCmdLength = 0U;
uint8_t VendorCmdBuffer[DFU_VENDOR_CMD_MAX];
uint8_t idx;
#endif /* USBD_DFU_VENDOR_CMD_ENABLED */
if (hdfu == NULL)
{
@@ -851,8 +976,24 @@ static void DFU_Upload(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req)
hdfu->buffer.d8[1] = DFU_CMD_SETADDRESSPOINTER;
hdfu->buffer.d8[2] = DFU_CMD_ERASE;
CmdLength = 3U;
#if (USBD_DFU_VENDOR_CMD_ENABLED == 1U)
if (DfuInterface->GetVendorCMD != NULL)
{
(void)DfuInterface->GetVendorCMD(VendorCmdBuffer, (uint8_t *)&VendorCmdLength);
for (idx = 0U; idx < MIN(VendorCmdLength, DFU_VENDOR_CMD_MAX); idx++)
{
hdfu->buffer.d8[idx + 3U] = VendorCmdBuffer[idx];
}
CmdLength += MIN(VendorCmdLength, DFU_VENDOR_CMD_MAX);
}
#endif /* USBD_DFU_VENDOR_CMD_ENABLED */
/* Send the status data over EP0 */
(void)USBD_CtlSendData(pdev, (uint8_t *)(&(hdfu->buffer.d8[0])), 3U);
(void)USBD_CtlSendData(pdev, (uint8_t *)(&(hdfu->buffer.d8[0])), CmdLength);
}
else if (hdfu->wblock_num > 1U)
{
@@ -863,14 +1004,49 @@ static void DFU_Upload(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req)
hdfu->dev_status[3] = 0U;
hdfu->dev_status[4] = hdfu->dev_state;
#if (USBD_DFU_VENDOR_CMD_ENABLED == 1U)
/* Vendor specific DFU CMD */
if (DfuInterface->VendorUploadCMD(hdfu->data_ptr, hdfu->wblock_num, &VendorStatus) != USBD_OK)
{
/* Update the state machine */
hdfu->dev_state = DFU_ERROR_STALLEDPKT;
hdfu->dev_status[0] = (uint8_t)VendorStatus;
hdfu->dev_status[1] = 0U;
hdfu->dev_status[2] = 0U;
hdfu->dev_status[3] = 0U;
hdfu->dev_status[4] = hdfu->dev_state;
/* Call the error management function (command will be NAKed) */
USBD_CtlError(pdev, req);
}
if (VendorStatus == IS_DFU_PHY_ADDRESS)
#endif /* USBD_DFU_VENDOR_CMD_ENABLED */
{
addr = ((hdfu->wblock_num - 2U) * USBD_DFU_XFER_SIZE) + hdfu->data_ptr;
/* Return the physical address where data are stored */
phaddr = DfuInterface->Read((uint8_t *)addr, hdfu->buffer.d8, hdfu->wlength);
if (phaddr == NULL)
{
hdfu->dev_state = DFU_ERROR_STALLEDPKT;
hdfu->dev_status[1] = 0U;
hdfu->dev_status[2] = 0U;
hdfu->dev_status[3] = 0U;
hdfu->dev_status[4] = hdfu->dev_state;
/* Call the error management function (command will be NAKed) */
USBD_CtlError(pdev, req);
}
else
{
/* Send the status data over EP0 */
(void)USBD_CtlSendData(pdev, phaddr, hdfu->wlength);
}
}
}
else /* unsupported hdfu->wblock_num */
{
hdfu->dev_state = DFU_ERROR_STALLEDPKT;
@@ -880,7 +1056,7 @@ static void DFU_Upload(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req)
hdfu->dev_status[3] = 0U;
hdfu->dev_status[4] = hdfu->dev_state;
/* Call the error management function (command will be NAKed */
/* Call the error management function (command will be NAKed) */
USBD_CtlError(pdev, req);
}
}
@@ -890,7 +1066,7 @@ static void DFU_Upload(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req)
hdfu->wlength = 0U;
hdfu->wblock_num = 0U;
/* Call the error management function (command will be NAKed */
/* Call the error management function (command will be NAKed) */
USBD_CtlError(pdev, req);
}
}
@@ -944,7 +1120,7 @@ static void DFU_GetStatus(USBD_HandleTypeDef *pdev)
DfuInterface->GetStatus(hdfu->data_ptr, DFU_MEDIA_PROGRAM, hdfu->dev_status);
}
}
else /* (hdfu->wlength==0)*/
else /* (hdfu->wlength == 0U) */
{
hdfu->dev_state = DFU_STATE_DNLOAD_IDLE;
@@ -960,7 +1136,7 @@ static void DFU_GetStatus(USBD_HandleTypeDef *pdev)
{
hdfu->dev_state = DFU_STATE_MANIFEST;
hdfu->dev_status[1] = 1U; /*bwPollTimeout = 1ms*/
hdfu->dev_status[1] = 1U; /* bwPollTimeout = 1ms */
hdfu->dev_status[2] = 0U;
hdfu->dev_status[3] = 0U;
hdfu->dev_status[4] = hdfu->dev_state;
@@ -1088,9 +1264,10 @@ static void DFU_Abort(USBD_HandleTypeDef *pdev)
static void DFU_Leave(USBD_HandleTypeDef *pdev)
{
USBD_DFU_HandleTypeDef *hdfu = (USBD_DFU_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId];
USBD_DFU_MediaTypeDef *DfuInterface = (USBD_DFU_MediaTypeDef *)pdev->pUserData[pdev->classId];
USBD_DFUFuncDescTypeDef *pDfuFunc = (USBD_DFUFuncDescTypeDef *)USBD_DFU_GetDfuFuncDesc(pdev->pConfDesc);
if ((hdfu == NULL) || (pDfuFunc == NULL))
if ((hdfu == NULL) || (DfuInterface == NULL) || (pDfuFunc == NULL))
{
return;
}
@@ -1119,8 +1296,13 @@ static void DFU_Leave(USBD_HandleTypeDef *pdev)
/* Disconnect the USB device */
(void)USBD_Stop(pdev);
#if (USBD_DFU_VENDOR_EXIT_ENABLED == 1U)
/* Jump should be ensured by user application */
DfuInterface->LeaveDFU(hdfu->data_ptr);
#else
/* Generate system reset to allow jumping to the user code */
NVIC_SystemReset();
#endif /* USBD_DFU_VENDOR_EXIT_ENABLED */
/* The next instructions will not be reached (system reset) */
}

View File

@@ -38,6 +38,17 @@ uint16_t MEM_If_Write(uint8_t *src, uint8_t *dest, uint32_t Len);
uint8_t *MEM_If_Read(uint8_t *src, uint8_t *dest, uint32_t Len);
uint16_t MEM_If_DeInit(void);
uint16_t MEM_If_GetStatus(uint32_t Add, uint8_t Cmd, uint8_t *buffer);
#if (USBD_DFU_VENDOR_CMD_ENABLED == 1U)
uint16_t MEM_If_GetVendorCMD(uint8_t *cmd, uint8_t *cmdlength);
uint16_t MEM_If_VendorDownloadCMD(uint8_t *pbuf, uint32_t BlockNumber, uint32_t wlength, uint32_t *status);
uint16_t MEM_If_VendorUploadCMD(uint32_t Add, uint32_t BlockNumber, uint32_t *status);
#endif /* USBD_DFU_VENDOR_CMD_ENABLED */
#if (USBD_DFU_VENDOR_CHECK_ENABLED == 1U)
uint16_t MEM_If_VendorCheck(uint8_t *pbuf, uint32_t ReqType, uint32_t *status);
#endif /* USBD_DFU_VENDOR_CHECK_ENABLED */
#if (USBD_DFU_VENDOR_EXIT_ENABLED == 1U)
uint16_t MEM_If_LeaveDFU(uint32_t Add);
#endif /* USBD_DFU_VENDOR_EXIT_ENABLED */
USBD_DFU_MediaTypeDef USBD_DFU_MEDIA_Template_fops =
{
@@ -48,8 +59,19 @@ USBD_DFU_MediaTypeDef USBD_DFU_MEDIA_Template_fops =
MEM_If_Write,
MEM_If_Read,
MEM_If_GetStatus,
#if (USBD_DFU_VENDOR_CMD_ENABLED == 1U)
MEM_If_GetVendorCMD,
MEM_If_VendorDownloadCMD,
MEM_If_VendorUploadCMD,
#endif /* USBD_DFU_VENDOR_CMD_ENABLED */
#if (USBD_DFU_VENDOR_CHECK_ENABLED == 1U)
MEM_If_VendorCheck,
#endif /* USBD_DFU_VENDOR_CHECK_ENABLED */
#if (USBD_DFU_VENDOR_EXIT_ENABLED == 1U)
MEM_If_LeaveDFU
#endif /* USBD_DFU_VENDOR_EXIT_ENABLED */
};
/**
* @brief MEM_If_Init
* Memory initialization routine.
@@ -115,7 +137,7 @@ uint8_t *MEM_If_Read(uint8_t *src, uint8_t *dest, uint32_t Len)
UNUSED(Len);
/* Return a valid address to avoid HardFault */
return (uint8_t *)(0);
return NULL;
}
/**
@@ -144,3 +166,85 @@ uint16_t MEM_If_GetStatus(uint32_t Add, uint8_t Cmd, uint8_t *buffer)
return (0);
}
#if (USBD_DFU_VENDOR_CMD_ENABLED == 1U)
/**
* @brief Get supported vendor specific commands
* @param pointer to supported vendor commands
* @param pointer to length of supported vendor commands
* @retval 0 if operation is successful
*/
uint16_t MEM_If_GetVendorCMD(uint8_t *cmd, uint8_t *cmdlength)
{
UNUSED(cmd);
UNUSED(cmdlength);
return 0U;
}
/**
* @brief Vendor specific download commands
* @param pbuf DFU data buffer
* @param BlockNumber DFU memory block number
* @param wLength DFU request length
* @param pointer to DFU status
* @retval 0 if operation is successful
*/
uint16_t MEM_If_VendorDownloadCMD(uint8_t *pbuf, uint32_t BlockNumber, uint32_t wlength, uint32_t *status)
{
UNUSED(pbuf);
UNUSED(BlockNumber);
UNUSED(wlength);
UNUSED(status);
return 0U;
}
/**
* @brief Vendor specific upload commands
* @param Add memory Address
* @param BlockNumber DFU memory block number
* @param pointer to DFU status
* @retval 0 if operation is successful
*/
uint16_t MEM_If_VendorUploadCMD(uint32_t Add, uint32_t BlockNumber, uint32_t *status)
{
UNUSED(Add);
UNUSED(BlockNumber);
UNUSED(status);
return 0U;
}
#endif /* USBD_DFU_VENDOR_CMD_ENABLED */
#if (USBD_DFU_VENDOR_CHECK_ENABLED == 1U)
/**
* @brief Vendor memory check
* @param pbuf DFU data buffer
* @param ReqType IS_DFU_SETADDRESSPOINTER/DOWNLOAD/UPLOAD
* @param pointer to DFU status
* @retval 0 if operation is successful
*/
uint16_t MEM_If_VendorCheck(uint8_t *pbuf, uint32_t ReqType, uint32_t *status)
{
UNUSED(pbuf);
UNUSED(ReqType);
UNUSED(status);
return 0U;
}
#endif /* USBD_DFU_VENDOR_CHECK_ENABLED */
#if (USBD_DFU_VENDOR_EXIT_ENABLED == 1U)
/**
* @brief Vendor Leave DFU
* @param Application address
* @retval 0 if operation is successful
*/
uint16_t MEM_If_LeaveDFU(uint32_t Add)
{
UNUSED(Add);
return 0U;
}
#endif /* USBD_DFU_VENDOR_EXIT_ENABLED */

View File

@@ -39,8 +39,8 @@ extern "C" {
/** @defgroup USB_INFO_Exported_Defines
* @{
*/
#define MODE_SENSE6_LEN 0x17U
#define MODE_SENSE10_LEN 0x1BU
#define MODE_SENSE6_LEN 0x04U
#define MODE_SENSE10_LEN 0x08U
#define LENGTH_INQUIRY_PAGE00 0x06U
#define LENGTH_INQUIRY_PAGE80 0x08U
#define LENGTH_FORMAT_CAPACITIES 0x14U

View File

@@ -91,62 +91,32 @@ uint8_t MSC_Page80_Inquiry_Data[LENGTH_INQUIRY_PAGE80] =
/* USB Mass storage sense 6 Data */
uint8_t MSC_Mode_Sense6_data[MODE_SENSE6_LEN] =
{
0x22,
0x00,
0x00,
0x00,
0x08,
0x12,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00
0x03, /* MODE DATA LENGTH. The number of bytes that follow. */
0x00, /* MEDIUM TYPE. 00h for SBC devices. */
0x00, /* DEVICE-SPECIFIC PARAMETER. For SBC devices:
* bit 7: WP. Set to 1 if the media is write-protected.
* bits 6..5: reserved
* bit 4: DPOFUA. Set to 1 if the device supports the DPO and FUA bits
* bits 3..0: reserved */
0x00 /* BLOCK DESCRIPTOR LENGTH */
};
/* USB Mass storage sense 10 Data */
uint8_t MSC_Mode_Sense10_data[MODE_SENSE10_LEN] =
{
0x00,
0x26,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x08,
0x12,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00
0x00, /* MODE DATA LENGTH MSB. */
0x06, /* MODE DATA LENGTH LSB. The number of bytes that follow. */
0x00, /* MEDIUM TYPE. 00h for SBC devices. */
0x00, /* DEVICE-SPECIFIC PARAMETER. For SBC devices:
* bit 7: WP. Set to 1 if the media is write-protected.
* bits 6..5: reserved
* bit 4: DPOFUA. Set to 1 if the device supports the DPO and FUA bits
* bits 3..0: reserved */
0x00, /* LONGLBA Set to zero */
0x00, /* Reserved */
0x00, /* BLOCK DESCRIPTOR LENGTH MSB. */
0x00 /* BLOCK DESCRIPTOR LENGTH LSB. */
};
/**
* @}

View File

@@ -477,6 +477,12 @@ static int8_t SCSI_ModeSense6(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *pa
return -1;
}
/* Check If media is write-protected */
if (((USBD_StorageTypeDef *)pdev->pUserData[pdev->classId])->IsWriteProtected(lun) != 0)
{
MSC_Mode_Sense6_data[2] |= 0x80U;
}
if (params[4] <= len)
{
len = params[4];
@@ -506,6 +512,12 @@ static int8_t SCSI_ModeSense10(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *p
return -1;
}
/* Check If media is write-protected */
if (((USBD_StorageTypeDef *)pdev->pUserData[pdev->classId])->IsWriteProtected(lun) != 0)
{
MSC_Mode_Sense10_data[3] |= 0x80U;
}
if (params[8] <= len)
{
len = params[8];

View File

@@ -377,7 +377,8 @@ typedef struct
{
uint32_t interface;
uint32_t uvc_state;
uint8_t buffer[UVC_TOTAL_BUF_SIZE];
uint32_t uvc_size;
uint8_t *uvc_buffer;
VIDEO_OffsetTypeDef offset;
USBD_VIDEO_ControlTypeDef control;
} USBD_VIDEO_HandleTypeDef;

View File

@@ -498,6 +498,11 @@ static uint8_t USBD_VIDEO_Setup(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *
uint16_t len;
uint8_t *pbuf;
#ifdef USE_USBD_COMPOSITE
/* Get the Endpoints addresses allocated for this class instance */
VIDEOinEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_ISOC, (uint8_t)pdev->classId);
#endif /* USE_USBD_COMPOSITE */
switch (req->bmRequest & USB_REQ_TYPE_MASK)
{
/* Class Requests -------------------------------*/
@@ -643,6 +648,11 @@ static uint8_t USBD_VIDEO_DataIn(USBD_HandleTypeDef *pdev, uint8_t epnum)
uint32_t RemainData = 0U;
uint32_t DataOffset = 0U;
#ifdef USE_USBD_COMPOSITE
/* Get the Endpoints addresses allocated for this class instance */
VIDEOinEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_ISOC, (uint8_t)pdev->classId);
#endif /* USE_USBD_COMPOSITE */
/* Check if the Streaming has already been started */
if (hVIDEO->uvc_state == UVC_PLAY_STATUS_STREAMING)
{
@@ -692,9 +702,12 @@ static uint8_t USBD_VIDEO_DataIn(USBD_HandleTypeDef *pdev, uint8_t epnum)
packet[1] = payload_header[1];
}
hVIDEO->uvc_buffer = (uint8_t *)&packet;
hVIDEO->uvc_size = (uint32_t)PcktSze;
/* Transmit the packet on Endpoint */
(void)USBD_LL_Transmit(pdev, (uint8_t)(epnum | 0x80U),
(uint8_t *)&packet, (uint32_t)PcktSze);
hVIDEO->uvc_buffer, hVIDEO->uvc_size);
}
/* Exit with no error code */
@@ -712,11 +725,19 @@ static uint8_t USBD_VIDEO_SOF(USBD_HandleTypeDef *pdev)
USBD_VIDEO_HandleTypeDef *hVIDEO = (USBD_VIDEO_HandleTypeDef *) pdev->pClassDataCmsit[pdev->classId];
uint8_t payload[2] = {0x02U, 0x00U};
#ifdef USE_USBD_COMPOSITE
/* Get the Endpoints addresses allocated for this class instance */
VIDEOinEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_ISOC, (uint8_t)pdev->classId);
#endif /* USE_USBD_COMPOSITE */
/* Check if the Streaming has already been started by SetInterface AltSetting 1 */
if (hVIDEO->uvc_state == UVC_PLAY_STATUS_READY)
{
hVIDEO->uvc_buffer = (uint8_t *)&payload;
hVIDEO->uvc_size = 2U;
/* Transmit the first packet indicating that Streaming is starting */
(void)USBD_LL_Transmit(pdev, VIDEOinEpAdd, (uint8_t *)payload, 2U);
(void)USBD_LL_Transmit(pdev, VIDEOinEpAdd, hVIDEO->uvc_buffer, hVIDEO->uvc_size);
/* Enable Streaming state */
hVIDEO->uvc_state = UVC_PLAY_STATUS_STREAMING;
@@ -735,8 +756,17 @@ static uint8_t USBD_VIDEO_SOF(USBD_HandleTypeDef *pdev)
*/
static uint8_t USBD_VIDEO_IsoINIncomplete(USBD_HandleTypeDef *pdev, uint8_t epnum)
{
UNUSED(pdev);
UNUSED(epnum);
USBD_VIDEO_HandleTypeDef *hVIDEO = (USBD_VIDEO_HandleTypeDef *) pdev->pClassDataCmsit[pdev->classId];
#ifdef USE_USBD_COMPOSITE
/* Get the Endpoints addresses allocated for this class instance */
VIDEOinEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_ISOC, (uint8_t)pdev->classId);
#endif /* USE_USBD_COMPOSITE */
if (epnum == (VIDEOinEpAdd & 0xFU))
{
(void)USBD_LL_Transmit(pdev, VIDEOinEpAdd, hVIDEO->uvc_buffer, hVIDEO->uvc_size);
}
return (uint8_t)USBD_OK;
}

View File

@@ -48,6 +48,7 @@ extern "C" {
#define USBD_MAX_STR_DESC_SIZ 0x100U
#define USBD_SELF_POWERED 1U
#define USBD_DEBUG_LEVEL 2U
/* #define USBD_USER_REGISTER_CALLBACK 1U */
/* ECM, RNDIS, DFU Class Config */
#define USBD_SUPPORT_USER_STRING_DESC 1U
@@ -64,6 +65,8 @@ extern "C" {
#define USBD_CDC_INTERVAL 2000U
/* DFU Class Config */
/* #define USBD_DFU_VENDOR_CMD_ENABLED 1U */
/* #define USBD_DFU_VENDOR_EXIT_ENABLED 1U */
#define USBD_DFU_MAX_ITF_NUM 1U
#define USBD_DFU_XFERS_IZE 1024U

View File

@@ -86,6 +86,9 @@ 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);
#if (USBD_USER_REGISTER_CALLBACK == 1U)
USBD_StatusTypeDef USBD_RegisterDevStateCallback(USBD_HandleTypeDef *pdev, USBD_DevStateCallbackTypeDef pUserCallback);
#endif /* USBD_USER_REGISTER_CALLBACK */
#ifdef USE_USBD_COMPOSITE
USBD_StatusTypeDef USBD_RegisterClassComposite(USBD_HandleTypeDef *pdev, USBD_ClassTypeDef *pclass,

View File

@@ -390,8 +390,15 @@ typedef struct _USBD_HandleTypeDef
#ifdef USE_USBD_COMPOSITE
USBD_CompositeElementTypeDef tclasslist[USBD_MAX_SUPPORTED_CLASS];
#endif /* USE_USBD_COMPOSITE */
#if (USBD_USER_REGISTER_CALLBACK == 1U)
void (* DevStateCallback)(uint8_t dev_state, uint8_t cfgidx); /*!< User Notification callback */
#endif /* USBD_USER_REGISTER_CALLBACK */
} USBD_HandleTypeDef;
#if (USBD_USER_REGISTER_CALLBACK == 1U)
typedef void (*USBD_DevStateCallbackTypeDef)(uint8_t dev_state, uint8_t cfgidx); /*!< pointer to User callback function */
#endif /* USBD_USER_REGISTER_CALLBACK */
/* USB Device endpoint direction */
typedef enum
{

View File

@@ -358,10 +358,22 @@ USBD_StatusTypeDef USBD_UnRegisterClassComposite(USBD_HandleTypeDef *pdev)
return ret;
}
#endif /* USE_USBD_COMPOSITE */
#if (USBD_USER_REGISTER_CALLBACK == 1U)
/**
* @brief USBD_RegisterDevStateCallback
* @param pdev : Device Handle
* @param pUserCallback: User Callback
* @retval USBD Status
*/
USBD_StatusTypeDef USBD_RegisterDevStateCallback(USBD_HandleTypeDef *pdev, USBD_DevStateCallbackTypeDef pUserCallback)
{
pdev->DevStateCallback = pUserCallback;
return USBD_OK;
}
#endif /* USBD_USER_REGISTER_CALLBACK */
/**
* @brief USBD_Start
* Start the USB Device Core.

View File

@@ -558,7 +558,6 @@ static void USBD_GetDescriptor(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *r
#if (USBD_SUPPORT_USER_STRING_DESC == 1U)
pbuf = NULL;
for (uint32_t idx = 0U; (idx < pdev->NumClasses); idx++)
{
if (pdev->pClass[idx]->GetUsrStrDescriptor != NULL)
@@ -576,13 +575,12 @@ static void USBD_GetDescriptor(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *r
}
}
}
#endif /* USBD_SUPPORT_USER_STRING_DESC */
#if (USBD_CLASS_USER_STRING_DESC == 1U)
if (pdev->pDesc->GetUserStrDescriptor != NULL)
{
pbuf = pdev->pDesc->GetUserStrDescriptor(pdev->dev_speed, (req->wValue), &len);
pbuf = pdev->pDesc->GetUserStrDescriptor(pdev->dev_speed, LOBYTE(req->wValue), &len);
}
else
{
@@ -751,6 +749,13 @@ static USBD_StatusTypeDef USBD_SetConfig(USBD_HandleTypeDef *pdev, USBD_SetupReq
{
(void)USBD_CtlSendStatus(pdev);
pdev->dev_state = USBD_STATE_CONFIGURED;
#if (USBD_USER_REGISTER_CALLBACK == 1U)
if (pdev->DevStateCallback != NULL)
{
pdev->DevStateCallback(USBD_STATE_CONFIGURED, cfgidx);
}
#endif /* USBD_USER_REGISTER_CALLBACK */
}
}
else

View File

@@ -1,86 +0,0 @@
This software component is provided to you as part of a software package and
applicable license terms are in the Package_license file. If you received this
software component outside of a package or without applicable license terms,
the terms of the SLA0044 license shall apply and are fully reproduced below:
SLA0044 Rev5/February 2018
Software license agreement
ULTIMATE LIBERTY SOFTWARE LICENSE AGREEMENT
BY INSTALLING, COPYING, DOWNLOADING, ACCESSING OR OTHERWISE USING THIS SOFTWARE
OR ANY PART THEREOF (AND THE RELATED DOCUMENTATION) FROM STMICROELECTRONICS
INTERNATIONAL N.V, SWISS BRANCH AND/OR ITS AFFILIATED COMPANIES
(STMICROELECTRONICS), THE RECIPIENT, ON BEHALF OF HIMSELF OR HERSELF, OR ON
BEHALF OF ANY ENTITY BY WHICH SUCH RECIPIENT IS EMPLOYED AND/OR ENGAGED AGREES
TO BE BOUND BY THIS SOFTWARE LICENSE AGREEMENT.
Under STMicroelectronics intellectual property rights, the redistribution,
reproduction and use in source and binary forms of the software or any part
thereof, with or without modification, are permitted provided that the following
conditions are met:
1. Redistribution of source code (modified or not) must retain any copyright
notice, this list of conditions and the disclaimer set forth below as items 10
and 11.
2. Redistributions in binary form, except as embedded into microcontroller or
microprocessor device manufactured by or for STMicroelectronics or a software
update for such device, must reproduce any copyright notice provided with the
binary code, this list of conditions, and the disclaimer set forth below as
items 10 and 11, in documentation and/or other materials provided with the
distribution.
3. Neither the name of STMicroelectronics nor the names of other contributors to
this software may be used to endorse or promote products derived from this
software or part thereof without specific written permission.
4. This software or any part thereof, including modifications and/or derivative
works of this software, must be used and execute solely and exclusively on or in
combination with a microcontroller or microprocessor device manufactured by or
for STMicroelectronics.
5. No use, reproduction or redistribution of this software partially or totally
may be done in any manner that would subject this software to any Open Source
Terms. “Open Source Terms” shall mean any open source license which requires as
part of distribution of software that the source code of such software is
distributed therewith or otherwise made available, or open source license that
substantially complies with the Open Source definition specified at
www.opensource.org and any other comparable open source license such as for
example GNU General Public License (GPL), Eclipse Public License (EPL), Apache
Software License, BSD license or MIT license.
6. STMicroelectronics has no obligation to provide any maintenance, support or
updates for the software.
7. The software is and will remain the exclusive property of STMicroelectronics
and its licensors. The recipient will not take any action that jeopardizes
STMicroelectronics and its licensors' proprietary rights or acquire any rights
in the software, except the limited rights specified hereunder.
8. The recipient shall comply with all applicable laws and regulations affecting
the use of the software or any part thereof including any applicable export
control law or regulation.
9. Redistribution and use of this software or any part thereof other than as
permitted under this license is void and will automatically terminate your
rights under this license.
10. THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY RIGHTS, WHICH ARE
DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT SHALL
STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
11. EXCEPT AS EXPRESSLY PERMITTED HEREUNDER, NO LICENSE OR OTHER RIGHTS, WHETHER
EXPRESS OR IMPLIED, ARE GRANTED UNDER ANY PATENT OR OTHER INTELLECTUAL PROPERTY
RIGHTS OF STMICROELECTRONICS OR ANY THIRD PARTY.

View File

@@ -60,8 +60,56 @@ Page</a> : STM32Cube USB Wiki Page</li>
<h1>Update History</h1>
<div class="collapse">
<input type="checkbox" id="collapse-section23" checked aria-hidden="true">
<label for="collapse-section23" aria-hidden="true">V2.11.1 /
<label for="collapse-section23" aria-hidden="true">V2.11.2 /
17-April-2023</label>
<div>
<h2 id="main-changes">Main Changes</h2>
<table>
<thead>
<tr class="header">
<th style="text-align: left;">Headline</th>
</tr>
</thead>
<tbody>
<tr class="even">
<td style="text-align: left;"><strong>USB Core:</strong></td>
</tr>
<tr class="odd">
<td style="text-align: left;">Adding user callback to get device configuration state</td>
</tr>
<tr class="even">
<td style="text-align: left;"><strong>USB DFU Class:</strong></td>
</tr>
<tr class="odd">
<td style="text-align: left;">Adding DFU Vendor Commands support</td>
</tr>
<tr class="even">
<td style="text-align: left;"><strong>USB MSC Class:</strong></td>
</tr>
<tr class="odd">
<td style="text-align: left;">fix data sense response to be aligned with SBC-3 specification</td>
</tr>
<tr class="even">
<td style="text-align: left;"><strong>USB AUDIO Class:</strong></td>
</tr>
<tr class="odd">
<td style="text-align: left;">restart AUDIO ISO endpoint during ISO incomplete event</td>
</tr>
<tr class="even">
<td style="text-align: left;"><strong>USB VIDEO Class:</strong></td>
</tr>
<tr class="odd">
<td style="text-align: left;">restart VIDEO ISO endpoint during ISO incomplete event</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="collapse">
<input type="checkbox" id="collapse-section22" aria-hidden="true">
<label for="collapse-section22" aria-hidden="true">V2.11.1 /
27-September-2022</label>
<div>
<h2 id="main-changes">Main Changes</h2>
<table>
<thead>
@@ -105,10 +153,12 @@ CustomHID, MSC & Video Classes:</strong></td>
</tbody>
</table>
</div>
</div>
<div class="collapse">
<input type="checkbox" id="collapse-section22" checked aria-hidden="true">
<label for="collapse-section22" aria-hidden="true">V2.11.0 /
<input type="checkbox" id="collapse-section21" aria-hidden="true">
<label for="collapse-section21" aria-hidden="true">V2.11.0 /
25-March-2022</label>
<div>
<h2 id="main-changes">Main Changes</h2>
<table>
<thead>
@@ -122,7 +172,7 @@ CustomHID, MSC & Video Classes:</strong></td>
</tr>
<tr class="even">
<td style="text-align: left;">Correction of the support of
VS_PROBE_CONTROL &amp; VS_COMMIT_CONTROL requets</td>
VS_PROBE_CONTROL &amp; VS_COMMIT_CONTROL requests</td>
</tr>
<tr class="odd">
<td style="text-align: left;"><strong>USB AUDIO Class:</strong></td>
@@ -177,10 +227,12 @@ style</td>
</tbody>
</table>
</div>
</div>
<div class="collapse">
<input type="checkbox" id="collapse-section21" checked aria-hidden="true">
<label for="collapse-section21" aria-hidden="true">V2.10.0 /
<input type="checkbox" id="collapse-section20" aria-hidden="true">
<label for="collapse-section20" aria-hidden="true">V2.10.0 /
03-Sept-2021</label>
<div>
<h2 id="main-changes-1">Main Changes</h2>
<table>
<thead>
@@ -216,10 +268,12 @@ selected</td>
</tbody>
</table>
</div>
</div>
<div class="collapse">
<input type="checkbox" id="collapse-section20" checked aria-hidden="true">
<label for="collapse-section20" aria-hidden="true">V2.9.0 /
<input type="checkbox" id="collapse-section19" aria-hidden="true">
<label for="collapse-section19" aria-hidden="true">V2.9.0 /
06-July-2021</label>
<div>
<h2 id="main-changes-2">Main Changes</h2>
<table>
<thead>
@@ -262,10 +316,12 @@ missing casting during class handler allocation</td>
</tbody>
</table>
</div>
</div>
<div class="collapse">
<input type="checkbox" id="collapse-section19" checked aria-hidden="true">
<label for="collapse-section19" aria-hidden="true">V2.8.0 /
<input type="checkbox" id="collapse-section18" aria-hidden="true">
<label for="collapse-section18" aria-hidden="true">V2.8.0 /
10-Mars-2021</label>
<div>
<h2 id="main-changes-3">Main Changes</h2>
<table>
<thead>
@@ -312,10 +368,12 @@ format support</td>
</tbody>
</table>
</div>
</div>
<div class="collapse">
<input type="checkbox" id="collapse-section17" checked aria-hidden="true">
<input type="checkbox" id="collapse-section17" aria-hidden="true">
<label for="collapse-section17" aria-hidden="true">V2.7.1 /
18-August-2020</label>
<div>
<h2 id="main-changes-4">Main Changes</h2>
<table>
<thead>
@@ -331,10 +389,12 @@ check to Class handler</td>
</tbody>
</table>
</div>
</div>
<div class="collapse">
<input type="checkbox" id="collapse-section16" checked aria-hidden="true">
<input type="checkbox" id="collapse-section16" aria-hidden="true">
<label for="collapse-section16" aria-hidden="true">V2.7.0 /
12-August-2020</label>
<div>
<h2 id="main-changes-5">Main Changes</h2>
<table>
<thead>
@@ -416,10 +476,12 @@ user code</td>
</tbody>
</table>
</div>
</div>
<div class="collapse">
<input type="checkbox" id="collapse-section15" checked aria-hidden="true">
<input type="checkbox" id="collapse-section15" aria-hidden="true">
<label for="collapse-section15" aria-hidden="true">V2.6.1 /
05-June-2020</label>
<div>
<h2 id="main-changes-6">Main Changes</h2>
<table>
<thead>
@@ -456,10 +518,12 @@ compatibility with device library version below v2.6.0</td>
</tbody>
</table>
</div>
</div>
<div class="collapse">
<input type="checkbox" id="collapse-section14" checked aria-hidden="true">
<input type="checkbox" id="collapse-section14" aria-hidden="true">
<label for="collapse-section14" aria-hidden="true">V2.6.0 /
27-December-2019</label>
<div>
<h2 id="main-changes-7">Main Changes</h2>
<table>
<thead>
@@ -539,10 +603,12 @@ transfer: USBD_CUSTOM_HID_ReceivePacket()</td>
</tbody>
</table>
</div>
</div>
<div class="collapse">
<input type="checkbox" id="collapse-section13" checked aria-hidden="true">
<input type="checkbox" id="collapse-section13" aria-hidden="true">
<label for="collapse-section13" aria-hidden="true">V2.5.3 /
30-April-2019</label>
<div>
<h2 id="main-changes-8">Main Changes</h2>
<table>
<thead>
@@ -578,10 +644,12 @@ device state only if the current state is USBD_STATE_SUSPENDED</td>
</tbody>
</table>
</div>
</div>
<div class="collapse">
<input type="checkbox" id="collapse-section12" checked aria-hidden="true">
<input type="checkbox" id="collapse-section12" aria-hidden="true">
<label for="collapse-section12" aria-hidden="true">V2.5.2 /
27-Mars-2019</label>
<div>
<h2 id="main-changes-9">Main Changes</h2>
<table>
<thead>
@@ -598,10 +666,12 @@ NVIC_SystemReset() prototype change</td>
</tbody>
</table>
</div>
</div>
<div class="collapse">
<input type="checkbox" id="collapse-section11" checked aria-hidden="true">
<input type="checkbox" id="collapse-section11" aria-hidden="true">
<label for="collapse-section11" aria-hidden="true">V2.5.1 /
03-August-2018</label>
<div>
<h2 id="main-changes-10">Main Changes</h2>
<table>
<thead>
@@ -633,10 +703,12 @@ Break on USBD_Template_Setup API</td>
</tbody>
</table>
</div>
</div>
<div class="collapse">
<input type="checkbox" id="collapse-section10" checked aria-hidden="true">
<input type="checkbox" id="collapse-section10" aria-hidden="true">
<label for="collapse-section10" aria-hidden="true">V2.5.0 /
15-December-2017</label>
<div>
<h2 id="main-changes-11">Main Changes</h2>
<table>
<thead>
@@ -683,10 +755,12 @@ machine</td>
</tbody>
</table>
</div>
</div>
<div class="collapse">
<input type="checkbox" id="collapse-section9" checked aria-hidden="true">
<input type="checkbox" id="collapse-section9" aria-hidden="true">
<label for="collapse-section9" aria-hidden="true">V2.4.2 /
11-December-2015</label>
<div>
<h2 id="main-changes-12">Main Changes</h2>
<table>
<thead>
@@ -705,10 +779,12 @@ by #include “usbd_cdc.h”</td>
</tbody>
</table>
</div>
</div>
<div class="collapse">
<input type="checkbox" id="collapse-section8" checked aria-hidden="true">
<input type="checkbox" id="collapse-section8" aria-hidden="true">
<label for="collapse-section8" aria-hidden="true">V2.4.1 /
19-June-2015</label>
<div>
<h2 id="main-changes-13">Main Changes</h2>
<table>
<thead>
@@ -744,10 +820,12 @@ DMA half transfer</td>
</tbody>
</table>
</div>
</div>
<div class="collapse">
<input type="checkbox" id="collapse-section7" checked aria-hidden="true">
<input type="checkbox" id="collapse-section7" aria-hidden="true">
<label for="collapse-section7" aria-hidden="true">V2.4.0 /
28-February-2015</label>
<div>
<h2 id="main-changes-14">Main Changes</h2>
<table>
<thead>
@@ -802,10 +880,12 @@ CDC_SET_CONTROL_LINE_STATE and similar no-data setup requests.</td>
</tbody>
</table>
</div>
</div>
<div class="collapse">
<input type="checkbox" id="collapse-section6" checked aria-hidden="true">
<input type="checkbox" id="collapse-section6" aria-hidden="true">
<label for="collapse-section6" aria-hidden="true">V2.3.0 /
04-November-2014</label>
<div>
<h2 id="main-changes-15">Main Changes</h2>
<table>
<thead>
@@ -836,10 +916,12 @@ update</td>
</tbody>
</table>
</div>
</div>
<div class="collapse">
<input type="checkbox" id="collapse-section5" checked aria-hidden="true">
<input type="checkbox" id="collapse-section5" aria-hidden="true">
<label for="collapse-section5" aria-hidden="true">V2.2.0 /
13-June-2014</label>
<div>
<h2 id="main-changes-16">Main Changes</h2>
<table>
<thead>
@@ -891,10 +973,12 @@ USBD_HID_CLASS)</td>
</tbody>
</table>
</div>
</div>
<div class="collapse">
<input type="checkbox" id="collapse-section4" checked aria-hidden="true">
<input type="checkbox" id="collapse-section4" aria-hidden="true">
<label for="collapse-section4" aria-hidden="true">V2.1.0 /
22-April-2014</label>
<div>
<h2 id="main-changes-17">Main Changes</h2>
<table>
<thead>
@@ -938,10 +1022,12 @@ usbd_customhid_if_template.c/h</td>
</tbody>
</table>
</div>
</div>
<div class="collapse">
<input type="checkbox" id="collapse-section3" checked aria-hidden="true">
<input type="checkbox" id="collapse-section3" aria-hidden="true">
<label for="collapse-section3" aria-hidden="true">V2.0.0 /
18-February-2014</label>
<div>
<h2 id="main-changes-18">Main Changes</h2>
<p>Major update based on STM32Cube specification.</p>
<table>
@@ -961,10 +1047,12 @@ compatible.</td>
<p><strong>This version has to be used only with STM32Cube based
development</strong></p>
</div>
</div>
<div class="collapse">
<input type="checkbox" id="collapse-section2" checked aria-hidden="true">
<input type="checkbox" id="collapse-section2" aria-hidden="true">
<label for="collapse-section2" aria-hidden="true">V1.1.0 /
19-March-2012</label>
<div>
<h2 id="main-changes-19">Main Changes</h2>
<table>
<thead>
@@ -998,15 +1086,18 @@ to take into account error during Control OUT stage</td>
</tbody>
</table>
</div>
</div>
<div class="collapse">
<input type="checkbox" id="collapse-section1" checked aria-hidden="true">
<input type="checkbox" id="collapse-section1" aria-hidden="true">
<label for="collapse-section1" aria-hidden="true">V1.0.0 /
22-July-2011</label>
<div>
<h2 id="main-changes-20">Main Changes</h2>
<p>First official version for STM32F105/7xx and STM32F2xx devices</p>
</div>
</section>
</div>
</div>
<footer class="sticky">
<div class="columns">
<div class="column" style="width:95%;">

View File

@@ -39,7 +39,32 @@ Here is the list of references to user documents:
# Update History
::: {.collapse}
<input type="checkbox" id="collapse-section23" checked aria-hidden="true">
<label for="collapse-section23" aria-hidden="true">V2.11.1 / 27-September-2022</label>
<label for="collapse-section23" aria-hidden="true">V2.11.2 / 27-September-2022</label>
<div>
## Main Changes
Headline
---------
**USB Core:**
Adding user callback to get device configuration state
**USB DFU Class:**
Adding DFU Vendor Commands support
**USB MSC Class:**
fix data sense response to be aligned with SBC-3 specification
**USB AUDIO Class:**
restart AUDIO ISO endpoint during ISO incomplete event
**USB VIDEO Class:**
restart VIDEO ISO endpoint during ISO incomplete event
</div>
:::
::: {.col-sm-12 .col-lg-8}
# Update History
::: {.collapse}
<input type="checkbox" id="collapse-section22" aria-hidden="true">
<label for="collapse-section22" aria-hidden="true">V2.11.1 / 27-September-2022</label>
<div>
## Main Changes
@@ -62,8 +87,8 @@ Here is the list of references to user documents:
::: {.col-sm-12 .col-lg-8}
# Update History
::: {.collapse}
<input type="checkbox" id="collapse-section22" checked aria-hidden="true">
<label for="collapse-section22" aria-hidden="true">V2.11.0 / 25-March-2022</label>
<input type="checkbox" id="collapse-section21" aria-hidden="true">
<label for="collapse-section21" aria-hidden="true">V2.11.0 / 25-March-2022</label>
<div>
## Main Changes
@@ -71,7 +96,7 @@ Here is the list of references to user documents:
Headline
---------
**USB VIDEO Class:**
Correction of the support of VS_PROBE_CONTROL & VS_COMMIT_CONTROL requets
Correction of the support of VS_PROBE_CONTROL & VS_COMMIT_CONTROL requests
**USB AUDIO Class:**
Correction of the check on AUDIO_TOTAL_BUF_SIZE to avoid vulnerabilities
**USB HID Class:**
@@ -92,8 +117,8 @@ Here is the list of references to user documents:
:::
::: {.collapse}
<input type="checkbox" id="collapse-section21" checked aria-hidden="true">
<label for="collapse-section21" aria-hidden="true">V2.10.0 / 03-Sept-2021</label>
<input type="checkbox" id="collapse-section20" aria-hidden="true">
<label for="collapse-section20" aria-hidden="true">V2.10.0 / 03-Sept-2021</label>
<div>
## Main Changes
@@ -112,8 +137,8 @@ Here is the list of references to user documents:
:::
::: {.collapse}
<input type="checkbox" id="collapse-section20" checked aria-hidden="true">
<label for="collapse-section20" aria-hidden="true">V2.9.0 / 06-July-2021</label>
<input type="checkbox" id="collapse-section19" aria-hidden="true">
<label for="collapse-section19" aria-hidden="true">V2.9.0 / 06-July-2021</label>
<div>
## Main Changes
@@ -134,8 +159,8 @@ Here is the list of references to user documents:
:::
::: {.collapse}
<input type="checkbox" id="collapse-section19" checked aria-hidden="true">
<label for="collapse-section19" aria-hidden="true">V2.8.0 / 10-Mars-2021</label>
<input type="checkbox" id="collapse-section18" aria-hidden="true">
<label for="collapse-section18" aria-hidden="true">V2.8.0 / 10-Mars-2021</label>
<div>
## Main Changes
@@ -158,7 +183,7 @@ Here is the list of references to user documents:
::: {.collapse}
<input type="checkbox" id="collapse-section17" checked aria-hidden="true">
<input type="checkbox" id="collapse-section17" aria-hidden="true">
<label for="collapse-section17" aria-hidden="true">V2.7.1 / 18-August-2020</label>
<div>
@@ -173,7 +198,7 @@ Here is the list of references to user documents:
:::
::: {.collapse}
<input type="checkbox" id="collapse-section16" checked aria-hidden="true">
<input type="checkbox" id="collapse-section16" aria-hidden="true">
<label for="collapse-section16" aria-hidden="true">V2.7.0 / 12-August-2020</label>
<div>
@@ -205,7 +230,7 @@ Here is the list of references to user documents:
:::
::: {.collapse}
<input type="checkbox" id="collapse-section15" checked aria-hidden="true">
<input type="checkbox" id="collapse-section15" aria-hidden="true">
<label for="collapse-section15" aria-hidden="true">V2.6.1 / 05-June-2020</label>
<div>
@@ -225,7 +250,7 @@ Here is the list of references to user documents:
:::
::: {.collapse}
<input type="checkbox" id="collapse-section14" checked aria-hidden="true">
<input type="checkbox" id="collapse-section14" aria-hidden="true">
<label for="collapse-section14" aria-hidden="true">V2.6.0 / 27-December-2019</label>
<div>
@@ -258,7 +283,7 @@ Here is the list of references to user documents:
:::
::: {.collapse}
<input type="checkbox" id="collapse-section13" checked aria-hidden="true">
<input type="checkbox" id="collapse-section13" aria-hidden="true">
<label for="collapse-section13" aria-hidden="true">V2.5.3 / 30-April-2019</label>
<div>
@@ -279,7 +304,7 @@ Here is the list of references to user documents:
::: {.collapse}
<input type="checkbox" id="collapse-section12" checked aria-hidden="true">
<input type="checkbox" id="collapse-section12" aria-hidden="true">
<label for="collapse-section12" aria-hidden="true">V2.5.2 / 27-Mars-2019</label>
<div>
@@ -294,7 +319,7 @@ Here is the list of references to user documents:
:::
::: {.collapse}
<input type="checkbox" id="collapse-section11" checked aria-hidden="true">
<input type="checkbox" id="collapse-section11" aria-hidden="true">
<label for="collapse-section11" aria-hidden="true">V2.5.1 / 03-August-2018</label>
<div>
@@ -312,7 +337,7 @@ Here is the list of references to user documents:
:::
::: {.collapse}
<input type="checkbox" id="collapse-section10" checked aria-hidden="true">
<input type="checkbox" id="collapse-section10" aria-hidden="true">
<label for="collapse-section10" aria-hidden="true">V2.5.0 / 15-December-2017</label>
<div>
@@ -335,7 +360,7 @@ Here is the list of references to user documents:
:::
::: {.collapse}
<input type="checkbox" id="collapse-section9" checked aria-hidden="true">
<input type="checkbox" id="collapse-section9" aria-hidden="true">
<label for="collapse-section9" aria-hidden="true">V2.4.2 / 11-December-2015</label>
<div>
@@ -351,7 +376,7 @@ Here is the list of references to user documents:
:::
::: {.collapse}
<input type="checkbox" id="collapse-section8" checked aria-hidden="true">
<input type="checkbox" id="collapse-section8" aria-hidden="true">
<label for="collapse-section8" aria-hidden="true">V2.4.1 / 19-June-2015</label>
<div>
@@ -372,7 +397,7 @@ Here is the list of references to user documents:
:::
::: {.collapse}
<input type="checkbox" id="collapse-section7" checked aria-hidden="true">
<input type="checkbox" id="collapse-section7" aria-hidden="true">
<label for="collapse-section7" aria-hidden="true">V2.4.0 / 28-February-2015</label>
<div>
@@ -395,7 +420,7 @@ Here is the list of references to user documents:
:::
::: {.collapse}
<input type="checkbox" id="collapse-section6" checked aria-hidden="true">
<input type="checkbox" id="collapse-section6" aria-hidden="true">
<label for="collapse-section6" aria-hidden="true">V2.3.0 / 04-November-2014</label>
<div>
@@ -413,7 +438,7 @@ Here is the list of references to user documents:
:::
::: {.collapse}
<input type="checkbox" id="collapse-section5" checked aria-hidden="true">
<input type="checkbox" id="collapse-section5" aria-hidden="true">
<label for="collapse-section5" aria-hidden="true">V2.2.0 / 13-June-2014</label>
<div>
@@ -436,7 +461,7 @@ Here is the list of references to user documents:
:::
::: {.collapse}
<input type="checkbox" id="collapse-section4" checked aria-hidden="true">
<input type="checkbox" id="collapse-section4" aria-hidden="true">
<label for="collapse-section4" aria-hidden="true">V2.1.0 / 22-April-2014</label>
<div>
@@ -457,7 +482,7 @@ Here is the list of references to user documents:
:::
::: {.collapse}
<input type="checkbox" id="collapse-section3" checked aria-hidden="true">
<input type="checkbox" id="collapse-section3" aria-hidden="true">
<label for="collapse-section3" aria-hidden="true">V2.0.0 / 18-February-2014</label>
<div>
@@ -476,7 +501,7 @@ Major update based on STM32Cube specification.
:::
::: {.collapse}
<input type="checkbox" id="collapse-section2" checked aria-hidden="true">
<input type="checkbox" id="collapse-section2" aria-hidden="true">
<label for="collapse-section2" aria-hidden="true">V1.1.0 / 19-March-2012</label>
<div>
@@ -495,7 +520,7 @@ Major update based on STM32Cube specification.
:::
::: {.collapse}
<input type="checkbox" id="collapse-section1" checked aria-hidden="true">
<input type="checkbox" id="collapse-section1" aria-hidden="true">
<label for="collapse-section1" aria-hidden="true">V1.0.0 / 22-July-2011</label>
<div>

31
SECURITY.md Normal file
View File

@@ -0,0 +1,31 @@
# Report potential product security vulnerabilities
ST places a high priority on security, and our Product Security Incident
Response Team (PSIRT) is committed to rapidly addressing potential security
vulnerabilities affecting our products. PSIRT's long history and vast experience
in security allows ST to perform clear analyses and provide appropriate guidance
on mitigations and solutions when applicable.
If you wish to report potential security vulnerabilities regarding our products,
**please do not report them through public GitHub issues.** Instead, we
encourage you to report them to our ST PSIRT following the process described at:
**https://www.st.com/content/st_com/en/security/report-vulnerabilities.html**
### IMPORTANT - READ CAREFULLY:
STMicroelectronics International N.V., on behalf of itself, its affiliates and
subsidiaries, (collectively “ST”) takes all potential security vulnerability
reports or other related communications (“Report(s)”) seriously. In order to
review Your Report (the terms “You” and “Yours” include your employer, and all
affiliates, subsidiaries and related persons or entities) and take actions as
deemed appropriate, ST requires that we have the rights and Your permission to
do so.
As such, by submitting Your Report to ST, You agree that You have the right to
do so, and You grant to ST the rights to use the Report for purposes related to
security vulnerability analysis, testing, correction, patching, reporting and
any other related purpose or function.
By submitting Your Report, You agree that STs
[Privacy Policy](https://www.st.com/content/st_com/en/common/privacy-portal.html)
applies to all related communications.