diff --git a/Class/CustomHID/Src/usbd_customhid.c b/Class/CustomHID/Src/usbd_customhid.c index 8207618..c64ba99 100644 --- a/Class/CustomHID/Src/usbd_customhid.c +++ b/Class/CustomHID/Src/usbd_customhid.c @@ -479,7 +479,15 @@ static uint8_t USBD_CUSTOM_HID_Setup(USBD_HandleTypeDef *pdev, } } - (void)USBD_CtlSendData(pdev, pbuf, len); + if (pbuf != NULL) + { + (void)USBD_CtlSendData(pdev, pbuf, len); + } + else + { + USBD_CtlError(pdev, req); + ret = USBD_FAIL; + } break; case USB_REQ_GET_INTERFACE: diff --git a/Class/DFU/Src/usbd_dfu.c b/Class/DFU/Src/usbd_dfu.c index 3a1b29e..67ba12c 100644 --- a/Class/DFU/Src/usbd_dfu.c +++ b/Class/DFU/Src/usbd_dfu.c @@ -512,6 +512,7 @@ static uint8_t USBD_DFU_EP0_RxReady(USBD_HandleTypeDef *pdev) return (uint8_t)USBD_OK; } + /** * @brief USBD_DFU_EP0_TxReady * handle EP0 TRx Ready event @@ -525,7 +526,7 @@ static uint8_t USBD_DFU_EP0_TxReady(USBD_HandleTypeDef *pdev) 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) +#if (USBD_DFU_VENDOR_CMD_ENABLED == 1U) || (USBD_DFU_VENDOR_CHECK_ENABLED == 1U) uint32_t VendorStatus = 0U; #endif /* USBD_DFU_VENDOR_CMD_ENABLED */ @@ -619,7 +620,6 @@ static uint8_t USBD_DFU_EP0_TxReady(USBD_HandleTypeDef *pdev) hdfu->dev_status[4] = hdfu->dev_state; return (uint8_t)USBD_FAIL; } - } #if (USBD_DFU_VENDOR_CMD_ENABLED == 1U) else @@ -647,13 +647,57 @@ static uint8_t USBD_DFU_EP0_TxReady(USBD_HandleTypeDef *pdev) } else { +#if (USBD_DFU_VENDOR_CMD_ENABLED == 1U) + if (hdfu->wlength > 0U) + { +#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 */ + + /* 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 + { + /* Reset the block number */ + hdfu->wblock_num = 0U; + + /* Call the error management function (command will be NAKed) */ + req.bmRequest = 0U; + req.wLength = 1U; + USBD_CtlError(pdev, &req); + } +#else /* Reset the global length and block number */ hdfu->wlength = 0U; hdfu->wblock_num = 0U; + /* Call the error management function (command will be NAKed) */ req.bmRequest = 0U; req.wLength = 1U; USBD_CtlError(pdev, &req); +#endif /* USBD_DFU_VENDOR_CMD_ENABLED */ } } /* Regular Download Command */ @@ -856,10 +900,10 @@ 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) +#if (USBD_DFU_VENDOR_CHECK_ENABLED == 1U) USBD_DFU_MediaTypeDef *DfuInterface = (USBD_DFU_MediaTypeDef *)pdev->pUserData[pdev->classId]; uint32_t VendorStatus = 0U; -#endif /* USBD_DFU_VENDOR_CMD_ENABLED */ +#endif /* USBD_DFU_VENDOR_CHECK_ENABLED */ if (hdfu == NULL) { diff --git a/Core/Src/usbd_core.c b/Core/Src/usbd_core.c index 186a309..0576c87 100644 --- a/Core/Src/usbd_core.c +++ b/Core/Src/usbd_core.c @@ -83,11 +83,11 @@ /** * @brief USBD_Init - * Initializes the device stack and load the class driver + * Initialize 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 + * @retval status: USBD Status */ USBD_StatusTypeDef USBD_Init(USBD_HandleTypeDef *pdev, USBD_DescriptorsTypeDef *pdesc, uint8_t id) @@ -142,9 +142,9 @@ USBD_StatusTypeDef USBD_Init(USBD_HandleTypeDef *pdev, /** * @brief USBD_DeInit - * Re-Initialize the device library + * De-Initialize the device library * @param pdev: device instance - * @retval status: status + * @retval status: USBD Status */ USBD_StatusTypeDef USBD_DeInit(USBD_HandleTypeDef *pdev) { @@ -195,7 +195,7 @@ USBD_StatusTypeDef USBD_DeInit(USBD_HandleTypeDef *pdev) /** * @brief USBD_RegisterClass * Link class driver to Device Core. - * @param pDevice : Device Handle + * @param pdev: Device Handle * @param pclass: Class handle * @retval USBD Status */ @@ -228,7 +228,7 @@ USBD_StatusTypeDef USBD_RegisterClass(USBD_HandleTypeDef *pdev, USBD_ClassTypeDe #endif /* USE_USB_FS */ /* Increment the NumClasses */ - pdev->NumClasses ++; + pdev->NumClasses++; return USBD_OK; } @@ -243,10 +243,10 @@ USBD_StatusTypeDef USBD_RegisterClass(USBD_HandleTypeDef *pdev, USBD_ClassTypeDe * @param EpAddr: Endpoint Address handle * @retval USBD Status */ -USBD_StatusTypeDef USBD_RegisterClassComposite(USBD_HandleTypeDef *pdev, USBD_ClassTypeDef *pclass, - USBD_CompositeClassTypeDef classtype, uint8_t *EpAddr) +USBD_StatusTypeDef USBD_RegisterClassComposite(USBD_HandleTypeDef *pdev, USBD_ClassTypeDef *pclass, + USBD_CompositeClassTypeDef classtype, uint8_t *EpAddr) { - USBD_StatusTypeDef ret = USBD_OK; + USBD_StatusTypeDef ret = USBD_OK; uint16_t len = 0U; if ((pdev->classId < USBD_MAX_SUPPORTED_CLASS) && (pdev->NumClasses < USBD_MAX_SUPPORTED_CLASS)) @@ -291,7 +291,7 @@ USBD_StatusTypeDef USBD_RegisterClassComposite(USBD_HandleTypeDef *pdev, USBD_C /** * @brief USBD_UnRegisterClassComposite * UnLink all composite class drivers from Device Core. - * @param pDevice : Device Handle + * @param pdev: Device Handle * @retval USBD Status */ USBD_StatusTypeDef USBD_UnRegisterClassComposite(USBD_HandleTypeDef *pdev) @@ -374,6 +374,7 @@ USBD_StatusTypeDef USBD_RegisterDevStateCallback(USBD_HandleTypeDef *pdev, USBD_ return USBD_OK; } #endif /* USBD_USER_REGISTER_CALLBACK */ + /** * @brief USBD_Start * Start the USB Device Core. @@ -499,7 +500,7 @@ USBD_StatusTypeDef USBD_SetClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx) * Clear current configuration * @param pdev: device instance * @param cfgidx: configuration index - * @retval status: USBD_StatusTypeDef + * @retval status */ USBD_StatusTypeDef USBD_ClrClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx) { @@ -539,6 +540,7 @@ USBD_StatusTypeDef USBD_ClrClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx) * @brief USBD_LL_SetupStage * Handle the setup stage * @param pdev: device instance + * @param psetup: setup packet buffer pointer * @retval status */ USBD_StatusTypeDef USBD_LL_SetupStage(USBD_HandleTypeDef *pdev, uint8_t *psetup) @@ -673,6 +675,7 @@ USBD_StatusTypeDef USBD_LL_DataOutStage(USBD_HandleTypeDef *pdev, * Handle data in stage * @param pdev: device instance * @param epnum: endpoint index + * @param pdata: data pointer * @retval status */ USBD_StatusTypeDef USBD_LL_DataInStage(USBD_HandleTypeDef *pdev, @@ -765,7 +768,6 @@ USBD_StatusTypeDef USBD_LL_DataInStage(USBD_HandleTypeDef *pdev, * @param pdev: device instance * @retval status */ - USBD_StatusTypeDef USBD_LL_Reset(USBD_HandleTypeDef *pdev) { USBD_StatusTypeDef ret = USBD_OK; @@ -848,7 +850,6 @@ USBD_StatusTypeDef USBD_LL_SetSpeed(USBD_HandleTypeDef *pdev, * @param pdev: device instance * @retval status */ - USBD_StatusTypeDef USBD_LL_Suspend(USBD_HandleTypeDef *pdev) { if (pdev->dev_state != USBD_STATE_SUSPENDED) @@ -867,7 +868,6 @@ USBD_StatusTypeDef USBD_LL_Suspend(USBD_HandleTypeDef *pdev) * @param pdev: device instance * @retval status */ - USBD_StatusTypeDef USBD_LL_Resume(USBD_HandleTypeDef *pdev) { if (pdev->dev_state == USBD_STATE_SUSPENDED) @@ -884,7 +884,6 @@ USBD_StatusTypeDef USBD_LL_Resume(USBD_HandleTypeDef *pdev) * @param pdev: device instance * @retval status */ - USBD_StatusTypeDef USBD_LL_SOF(USBD_HandleTypeDef *pdev) { /* The SOF event can be distributed for all classes that support it */ @@ -925,6 +924,7 @@ USBD_StatusTypeDef USBD_LL_SOF(USBD_HandleTypeDef *pdev) * @brief USBD_LL_IsoINIncomplete * Handle iso in incomplete event * @param pdev: device instance + * @param epnum: Endpoint number * @retval status */ USBD_StatusTypeDef USBD_LL_IsoINIncomplete(USBD_HandleTypeDef *pdev, @@ -950,6 +950,7 @@ USBD_StatusTypeDef USBD_LL_IsoINIncomplete(USBD_HandleTypeDef *pdev, * @brief USBD_LL_IsoOUTIncomplete * Handle iso out incomplete event * @param pdev: device instance + * @param epnum: Endpoint number * @retval status */ USBD_StatusTypeDef USBD_LL_IsoOUTIncomplete(USBD_HandleTypeDef *pdev, diff --git a/Core/Src/usbd_ctlreq.c b/Core/Src/usbd_ctlreq.c index af9a015..814b810 100644 --- a/Core/Src/usbd_ctlreq.c +++ b/Core/Src/usbd_ctlreq.c @@ -46,7 +46,9 @@ /** @defgroup USBD_REQ_Private_Defines * @{ */ - +#ifndef USBD_MAX_STR_DESC_SIZ +#define USBD_MAX_STR_DESC_SIZ 64U +#endif /* USBD_MAX_STR_DESC_SIZ */ /** * @} */ @@ -421,7 +423,7 @@ USBD_StatusTypeDef USBD_StdEPReq(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef * Handle Get Descriptor requests * @param pdev: device instance * @param req: usb request - * @retval status + * @retval None */ static void USBD_GetDescriptor(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) { @@ -675,7 +677,7 @@ static void USBD_GetDescriptor(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *r * Set device address * @param pdev: device instance * @param req: usb request - * @retval status + * @retval None */ static void USBD_SetAddress(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) { @@ -814,7 +816,7 @@ static USBD_StatusTypeDef USBD_SetConfig(USBD_HandleTypeDef *pdev, USBD_SetupReq * Handle Get device configuration request * @param pdev: device instance * @param req: usb request - * @retval status + * @retval None */ static void USBD_GetConfig(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) { @@ -848,7 +850,7 @@ static void USBD_GetConfig(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) * Handle Get Status request * @param pdev: device instance * @param req: usb request - * @retval status + * @retval None */ static void USBD_GetStatus(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) { @@ -889,7 +891,7 @@ static void USBD_GetStatus(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) * Handle Set device feature request * @param pdev: device instance * @param req: usb request - * @retval status + * @retval None */ static void USBD_SetFeature(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) { @@ -915,7 +917,7 @@ static void USBD_SetFeature(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) * Handle clear device feature request * @param pdev: device instance * @param req: usb request - * @retval status + * @retval None */ static void USBD_ClrFeature(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) { @@ -941,8 +943,8 @@ static void USBD_ClrFeature(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) /** * @brief USBD_ParseSetupRequest * Copy buffer into setup structure - * @param pdev: device instance * @param req: usb request + * @param pdata: setup data pointer * @retval None */ void USBD_ParseSetupRequest(USBD_SetupReqTypedef *req, uint8_t *pdata) @@ -1002,7 +1004,7 @@ void USBD_GetString(uint8_t *desc, uint8_t *unicode, uint16_t *len) } pdesc = desc; - *len = ((uint16_t)USBD_GetLen(pdesc) * 2U) + 2U; + *len = MIN(USBD_MAX_STR_DESC_SIZ, ((uint16_t)USBD_GetLen(pdesc) * 2U) + 2U); unicode[idx] = *(uint8_t *)len; idx++; diff --git a/Release_Notes.html b/Release_Notes.html index 31e63f7..94390d0 100644 --- a/Release_Notes.html +++ b/Release_Notes.html @@ -60,6 +60,35 @@ Page : STM32Cube USB Wiki Page
| Headline | +
|---|
| USB Core: | +
| Minor enhancement; add a check on device string descriptor length | +
| USB DFU Class: | +
| Improve DFU Vendor Commands support | +