From 60d163f271987fd322e22f63c095836e1dc703f6 Mon Sep 17 00:00:00 2001 From: slimih Date: Mon, 31 Aug 2020 09:19:23 +0100 Subject: [PATCH] Release v2.7.1 --- Class/AUDIO/Src/usbd_audio.c | 25 +++++++ Class/CDC/Src/usbd_cdc.c | 20 +++++ Class/CDC_ECM/Src/usbd_cdc_ecm.c | 25 +++++++ Class/CDC_RNDIS/Src/usbd_cdc_rndis.c | 65 +++++++++++++++++ Class/CustomHID/Src/usbd_customhid.c | 10 +++ Class/DFU/Src/usbd_dfu.c | 49 +++++++++++++ Class/HID/Src/usbd_hid.c | 10 +++ Class/MSC/Src/usbd_msc.c | 11 ++- Class/MSC/Src/usbd_msc_bot.c | 51 ++++++++++++- Class/MSC/Src/usbd_msc_scsi.c | 105 +++++++++++++++++++++++++++ Core/Src/usbd_core.c | 7 +- Release_Notes.html | 54 +++++++++----- 12 files changed, 406 insertions(+), 26 deletions(-) diff --git a/Class/AUDIO/Src/usbd_audio.c b/Class/AUDIO/Src/usbd_audio.c index 7b4915b..e8c093f 100644 --- a/Class/AUDIO/Src/usbd_audio.c +++ b/Class/AUDIO/Src/usbd_audio.c @@ -428,6 +428,11 @@ static uint8_t USBD_AUDIO_Setup(USBD_HandleTypeDef *pdev, haudio = (USBD_AUDIO_HandleTypeDef *)pdev->pClassData; + if (haudio == NULL) + { + return (uint8_t)USBD_FAIL; + } + switch (req->bmRequest & USB_REQ_TYPE_MASK) { case USB_REQ_TYPE_CLASS: @@ -566,6 +571,11 @@ static uint8_t USBD_AUDIO_EP0_RxReady(USBD_HandleTypeDef *pdev) USBD_AUDIO_HandleTypeDef *haudio; haudio = (USBD_AUDIO_HandleTypeDef *)pdev->pClassData; + if (haudio == NULL) + { + return (uint8_t)USBD_FAIL; + } + if (haudio->control.cmd == AUDIO_REQ_SET_CUR) { /* In this driver, to simplify code, only SET_CUR request is managed */ @@ -716,6 +726,11 @@ static uint8_t USBD_AUDIO_DataOut(USBD_HandleTypeDef *pdev, uint8_t epnum) haudio = (USBD_AUDIO_HandleTypeDef *)pdev->pClassData; + if (haudio == NULL) + { + return (uint8_t)USBD_FAIL; + } + if (epnum == AUDIO_OUT_EP) { /* Get received data packet length */ @@ -771,6 +786,11 @@ static void AUDIO_REQ_GetCurrent(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef USBD_AUDIO_HandleTypeDef *haudio; haudio = (USBD_AUDIO_HandleTypeDef *)pdev->pClassData; + if (haudio == NULL) + { + return; + } + (void)USBD_memset(haudio->control.data, 0, 64U); /* Send the current mute state */ @@ -789,6 +809,11 @@ static void AUDIO_REQ_SetCurrent(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef USBD_AUDIO_HandleTypeDef *haudio; haudio = (USBD_AUDIO_HandleTypeDef *)pdev->pClassData; + if (haudio == NULL) + { + return; + } + if (req->wLength != 0U) { /* Prepare the reception of the buffer over EP0 */ diff --git a/Class/CDC/Src/usbd_cdc.c b/Class/CDC/Src/usbd_cdc.c index fa5b588..631520b 100644 --- a/Class/CDC/Src/usbd_cdc.c +++ b/Class/CDC/Src/usbd_cdc.c @@ -592,6 +592,11 @@ static uint8_t USBD_CDC_Setup(USBD_HandleTypeDef *pdev, uint16_t status_info = 0U; USBD_StatusTypeDef ret = USBD_OK; + if (hcdc == NULL) + { + return (uint8_t)USBD_FAIL; + } + switch (req->bmRequest & USB_REQ_TYPE_MASK) { case USB_REQ_TYPE_CLASS: @@ -753,6 +758,11 @@ static uint8_t USBD_CDC_EP0_RxReady(USBD_HandleTypeDef *pdev) { USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef *)pdev->pClassData; + if (hcdc == NULL) + { + return (uint8_t)USBD_FAIL; + } + if ((pdev->pUserData != NULL) && (hcdc->CmdOpCode != 0xFFU)) { ((USBD_CDC_ItfTypeDef *)pdev->pUserData)->Control(hcdc->CmdOpCode, @@ -849,6 +859,11 @@ uint8_t USBD_CDC_SetTxBuffer(USBD_HandleTypeDef *pdev, { USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef *)pdev->pClassData; + if (hcdc == NULL) + { + return (uint8_t)USBD_FAIL; + } + hcdc->TxBuffer = pbuff; hcdc->TxLength = length; @@ -865,6 +880,11 @@ uint8_t USBD_CDC_SetRxBuffer(USBD_HandleTypeDef *pdev, uint8_t *pbuff) { USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef *)pdev->pClassData; + if (hcdc == NULL) + { + return (uint8_t)USBD_FAIL; + } + hcdc->RxBuffer = pbuff; return (uint8_t)USBD_OK; diff --git a/Class/CDC_ECM/Src/usbd_cdc_ecm.c b/Class/CDC_ECM/Src/usbd_cdc_ecm.c index a58baa5..a0f4856 100644 --- a/Class/CDC_ECM/Src/usbd_cdc_ecm.c +++ b/Class/CDC_ECM/Src/usbd_cdc_ecm.c @@ -619,6 +619,11 @@ static uint8_t USBD_CDC_ECM_Setup(USBD_HandleTypeDef *pdev, uint16_t status_info = 0U; uint8_t ifalt = 0U; + if (hcdc == NULL) + { + return (uint8_t)USBD_FAIL; + } + switch (req->bmRequest & USB_REQ_TYPE_MASK) { case USB_REQ_TYPE_CLASS : @@ -816,6 +821,11 @@ static uint8_t USBD_CDC_ECM_EP0_RxReady(USBD_HandleTypeDef *pdev) { USBD_CDC_ECM_HandleTypeDef *hcdc = (USBD_CDC_ECM_HandleTypeDef *)pdev->pClassData; + if (hcdc == NULL) + { + return (uint8_t)USBD_FAIL; + } + if ((pdev->pUserData != NULL) && (hcdc->CmdOpCode != 0xFFU)) { ((USBD_CDC_ECM_ItfTypeDef *)pdev->pUserData)->Control(hcdc->CmdOpCode, @@ -939,6 +949,11 @@ uint8_t USBD_CDC_ECM_SetTxBuffer(USBD_HandleTypeDef *pdev, uint8_t *pbuff, uint3 { USBD_CDC_ECM_HandleTypeDef *hcdc = (USBD_CDC_ECM_HandleTypeDef *)pdev->pClassData; + if (hcdc == NULL) + { + return (uint8_t)USBD_FAIL; + } + hcdc->TxBuffer = pbuff; hcdc->TxLength = length; @@ -956,6 +971,11 @@ uint8_t USBD_CDC_ECM_SetRxBuffer(USBD_HandleTypeDef *pdev, uint8_t *pbuff) { USBD_CDC_ECM_HandleTypeDef *hcdc = (USBD_CDC_ECM_HandleTypeDef *)pdev->pClassData; + if (hcdc == NULL) + { + return (uint8_t)USBD_FAIL; + } + hcdc->RxBuffer = pbuff; return (uint8_t)USBD_OK; @@ -1034,6 +1054,11 @@ uint8_t USBD_CDC_ECM_SendNotification(USBD_HandleTypeDef *pdev, USBD_CDC_ECM_HandleTypeDef *hcdc = (USBD_CDC_ECM_HandleTypeDef *)pdev->pClassData; USBD_StatusTypeDef ret = USBD_OK; + if (hcdc == NULL) + { + return (uint8_t)USBD_FAIL; + } + /* Initialize the request fields */ (hcdc->Req).bmRequest = CDC_ECM_BMREQUEST_TYPE_ECM; (hcdc->Req).bRequest = (uint8_t)Notif; diff --git a/Class/CDC_RNDIS/Src/usbd_cdc_rndis.c b/Class/CDC_RNDIS/Src/usbd_cdc_rndis.c index 3ce4d77..4a08d35 100644 --- a/Class/CDC_RNDIS/Src/usbd_cdc_rndis.c +++ b/Class/CDC_RNDIS/Src/usbd_cdc_rndis.c @@ -676,6 +676,11 @@ static uint8_t USBD_CDC_RNDIS_Setup(USBD_HandleTypeDef *pdev, uint16_t status_info = 0U; USBD_StatusTypeDef ret = USBD_OK; + if (hcdc == NULL) + { + return (uint8_t)USBD_FAIL; + } + switch (req->bmRequest & USB_REQ_TYPE_MASK) { case USB_REQ_TYPE_CLASS : @@ -912,6 +917,11 @@ static uint8_t USBD_CDC_RNDIS_EP0_RxReady(USBD_HandleTypeDef *pdev) { USBD_CDC_RNDIS_HandleTypeDef *hcdc = (USBD_CDC_RNDIS_HandleTypeDef *)pdev->pClassData; + if (hcdc == NULL) + { + return (uint8_t)USBD_FAIL; + } + if ((pdev->pUserData != NULL) && (hcdc->CmdOpCode != 0xFFU)) { /* Check if the received command is SendEncapsulated command */ @@ -1048,6 +1058,11 @@ uint8_t USBD_CDC_RNDIS_SetTxBuffer(USBD_HandleTypeDef *pdev, uint8_t *pbuff, uin { USBD_CDC_RNDIS_HandleTypeDef *hcdc = (USBD_CDC_RNDIS_HandleTypeDef *)pdev->pClassData; + if (hcdc == NULL) + { + return (uint8_t)USBD_FAIL; + } + hcdc->TxBuffer = pbuff; hcdc->TxLength = length; @@ -1065,6 +1080,11 @@ uint8_t USBD_CDC_RNDIS_SetRxBuffer(USBD_HandleTypeDef *pdev, uint8_t *pbuff) { USBD_CDC_RNDIS_HandleTypeDef *hcdc = (USBD_CDC_RNDIS_HandleTypeDef *)pdev->pClassData; + if (hcdc == NULL) + { + return (uint8_t)USBD_FAIL; + } + hcdc->RxBuffer = pbuff; return (uint8_t)USBD_OK; @@ -1168,6 +1188,11 @@ uint8_t USBD_CDC_RNDIS_SendNotification(USBD_HandleTypeDef *pdev, UNUSED(bVal); UNUSED(pData); + if (hcdc == NULL) + { + return (uint8_t)USBD_FAIL; + } + /* Initialize the request fields */ (hcdc->Req).bmRequest = CDC_RNDIS_BMREQUEST_TYPE_RNDIS; (hcdc->Req).bRequest = (uint8_t)Notif; @@ -1280,6 +1305,11 @@ static uint8_t USBD_CDC_RNDIS_ProcessInitMsg(USBD_HandleTypeDef *pdev, /* Store the Message Request ID */ uint32_t ReqId = InitMessage->ReqId; + if (hcdc == NULL) + { + return (uint8_t)USBD_FAIL; + } + /* Check correctness of the message (MsgType already checked by entry to this function) */ if ((InitMessage->MsgLength != sizeof(USBD_CDC_RNDIS_InitMsgTypeDef)) || \ (InitMessage->MajorVersion < CDC_RNDIS_VERSION_MAJOR)) @@ -1331,6 +1361,11 @@ static uint8_t USBD_CDC_RNDIS_ProcessHaltMsg(USBD_HandleTypeDef *pdev, /* Get the CDC_RNDIS handle pointer */ USBD_CDC_RNDIS_HandleTypeDef *hcdc = (USBD_CDC_RNDIS_HandleTypeDef *)pdev->pClassData; + if (hcdc == NULL) + { + return (uint8_t)USBD_FAIL; + } + /* Set CDC_RNDIS state to INITIALIZED */ hcdc->State = CDC_RNDIS_STATE_UNINITIALIZED; @@ -1361,6 +1396,11 @@ static uint8_t USBD_CDC_RNDIS_ProcessKeepAliveMsg(USBD_HandleTypeDef *pdev, /* Store the Message Request ID */ uint32_t ReqId = Msg->ReqId; + if (hcdc == NULL) + { + return (uint8_t)USBD_FAIL; + } + /* Check correctness of the message (MsgType already checked by entry to this function) */ if (Msg->MsgLength != sizeof(USBD_CDC_RNDIS_KpAliveMsgTypeDef)) { @@ -1406,6 +1446,11 @@ static uint8_t USBD_CDC_RNDIS_ProcessQueryMsg(USBD_HandleTypeDef *pdev, /* Store the Message Request ID */ uint32_t ReqId = Msg->RequestId; + if (hcdc == NULL) + { + return (uint8_t)USBD_FAIL; + } + /* Process the OID depending on its code */ switch (Msg->Oid) { @@ -1549,6 +1594,11 @@ static uint8_t USBD_CDC_RNDIS_ProcessSetMsg(USBD_HandleTypeDef *pdev, /* Store the Message Request ID */ uint32_t ReqId = SetMessage->ReqId; + if (hcdc == NULL) + { + return (uint8_t)USBD_FAIL; + } + switch (SetMessage->Oid) { case OID_GEN_CURRENT_PACKET_FILTER: @@ -1600,6 +1650,11 @@ static uint8_t USBD_CDC_RNDIS_ProcessResetMsg(USBD_HandleTypeDef *pdev, /* Use same Msg input buffer as response buffer */ USBD_CDC_RNDIS_ResetCpltMsgTypeDef *ResetResponse = (USBD_CDC_RNDIS_ResetCpltMsgTypeDef *)(void *)Msg; + if (hcdc == NULL) + { + return (uint8_t)USBD_FAIL; + } + if ((ResetMessage->MsgLength != sizeof(USBD_CDC_RNDIS_ResetMsgTypeDef)) || \ (ResetMessage->Reserved != 0U)) { @@ -1647,6 +1702,11 @@ static uint8_t USBD_CDC_RNDIS_ProcessPacketMsg(USBD_HandleTypeDef *pdev, /* Get and format the Msg input */ USBD_CDC_RNDIS_PacketMsgTypeDef *PacketMsg = (USBD_CDC_RNDIS_PacketMsgTypeDef *)Msg; + if (hcdc == NULL) + { + return (uint8_t)USBD_FAIL; + } + /* Check correctness of the message */ if ((PacketMsg->MsgType != CDC_RNDIS_PACKET_MSG_ID)) { @@ -1684,6 +1744,11 @@ static uint8_t USBD_CDC_RNDIS_ProcessUnsupportedMsg(USBD_HandleTypeDef *pdev, /* Use same Msg input buffer as response buffer */ USBD_CDC_RNDIS_StsChangeMsgTypeDef *Response = (USBD_CDC_RNDIS_StsChangeMsgTypeDef *)(void *)Msg; + if (hcdc == NULL) + { + return (uint8_t)USBD_FAIL; + } + /* Setup the response buffer content */ Response->MsgType = CDC_RNDIS_INDICATE_STATUS_MSG_ID; Response->MsgLength = sizeof(USBD_CDC_RNDIS_StsChangeMsgTypeDef); diff --git a/Class/CustomHID/Src/usbd_customhid.c b/Class/CustomHID/Src/usbd_customhid.c index bdb25f8..504ff4a 100644 --- a/Class/CustomHID/Src/usbd_customhid.c +++ b/Class/CustomHID/Src/usbd_customhid.c @@ -448,6 +448,11 @@ static uint8_t USBD_CUSTOM_HID_Setup(USBD_HandleTypeDef *pdev, uint16_t status_info = 0U; USBD_StatusTypeDef ret = USBD_OK; + if (hhid == NULL) + { + return (uint8_t)USBD_FAIL; + } + switch (req->bmRequest & USB_REQ_TYPE_MASK) { case USB_REQ_TYPE_CLASS: @@ -713,6 +718,11 @@ static uint8_t USBD_CUSTOM_HID_EP0_RxReady(USBD_HandleTypeDef *pdev) { USBD_CUSTOM_HID_HandleTypeDef *hhid = (USBD_CUSTOM_HID_HandleTypeDef *)pdev->pClassData; + if (hhid == NULL) + { + return (uint8_t)USBD_FAIL; + } + if (hhid->IsReportAvailable == 1U) { ((USBD_CUSTOM_HID_ItfTypeDef *)pdev->pUserData)->OutEvent(hhid->Report_buf[0], diff --git a/Class/DFU/Src/usbd_dfu.c b/Class/DFU/Src/usbd_dfu.c index db86c05..c3f1b7a 100644 --- a/Class/DFU/Src/usbd_dfu.c +++ b/Class/DFU/Src/usbd_dfu.c @@ -340,6 +340,11 @@ static uint8_t USBD_DFU_Setup(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *re uint16_t len = 0U; uint16_t status_info = 0U; + if (hdfu == NULL) + { + return (uint8_t)USBD_FAIL; + } + switch (req->bmRequest & USB_REQ_TYPE_MASK) { case USB_REQ_TYPE_CLASS: @@ -498,6 +503,11 @@ static uint8_t USBD_DFU_EP0_TxReady(USBD_HandleTypeDef *pdev) USBD_DFU_HandleTypeDef *hdfu = (USBD_DFU_HandleTypeDef *)pdev->pClassData; USBD_DFU_MediaTypeDef *DfuInterface = (USBD_DFU_MediaTypeDef *)pdev->pUserData; + if (hdfu == NULL) + { + return (uint8_t)USBD_FAIL; + } + if (hdfu->dev_state == DFU_STATE_DNLOAD_BUSY) { /* Decode the Special Command */ @@ -674,6 +684,11 @@ static void DFU_Detach(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) { USBD_DFU_HandleTypeDef *hdfu = (USBD_DFU_HandleTypeDef *)pdev->pClassData; + if (hdfu == NULL) + { + return; + } + if ((hdfu->dev_state == DFU_STATE_IDLE) || (hdfu->dev_state == DFU_STATE_DNLOAD_SYNC) || (hdfu->dev_state == DFU_STATE_DNLOAD_IDLE) || @@ -717,6 +732,11 @@ static void DFU_Download(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) { USBD_DFU_HandleTypeDef *hdfu = (USBD_DFU_HandleTypeDef *)pdev->pClassData; + if (hdfu == NULL) + { + return; + } + /* Data setup request */ if (req->wLength > 0U) { @@ -775,6 +795,11 @@ static void DFU_Upload(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) uint8_t *phaddr; uint32_t addr; + if (hdfu == NULL) + { + return; + } + /* Data setup request */ if (req->wLength > 0U) { @@ -866,6 +891,11 @@ static void DFU_GetStatus(USBD_HandleTypeDef *pdev) USBD_DFU_HandleTypeDef *hdfu = (USBD_DFU_HandleTypeDef *)pdev->pClassData; USBD_DFU_MediaTypeDef *DfuInterface = (USBD_DFU_MediaTypeDef *)pdev->pUserData; + if (hdfu == NULL) + { + return; + } + switch (hdfu->dev_state) { case DFU_STATE_DNLOAD_SYNC: @@ -941,6 +971,11 @@ static void DFU_ClearStatus(USBD_HandleTypeDef *pdev) { USBD_DFU_HandleTypeDef *hdfu = (USBD_DFU_HandleTypeDef *)pdev->pClassData; + if (hdfu == NULL) + { + return; + } + if (hdfu->dev_state == DFU_STATE_ERROR) { hdfu->dev_state = DFU_STATE_IDLE; @@ -974,6 +1009,11 @@ static void DFU_GetState(USBD_HandleTypeDef *pdev) { USBD_DFU_HandleTypeDef *hdfu = (USBD_DFU_HandleTypeDef *)pdev->pClassData; + if (hdfu == NULL) + { + return; + } + /* Return the current state of the DFU interface */ (void)USBD_CtlSendData(pdev, &hdfu->dev_state, 1U); } @@ -988,6 +1028,10 @@ static void DFU_Abort(USBD_HandleTypeDef *pdev) { USBD_DFU_HandleTypeDef *hdfu = (USBD_DFU_HandleTypeDef *)pdev->pClassData; + if (hdfu == NULL) + { + return; + } if ((hdfu->dev_state == DFU_STATE_IDLE) || (hdfu->dev_state == DFU_STATE_DNLOAD_SYNC) || @@ -1018,6 +1062,11 @@ static void DFU_Leave(USBD_HandleTypeDef *pdev) { USBD_DFU_HandleTypeDef *hdfu = (USBD_DFU_HandleTypeDef *)pdev->pClassData; + if (hdfu == NULL) + { + return; + } + hdfu->manif_state = DFU_MANIFEST_COMPLETE; if (((USBD_DFU_CfgDesc[(11U + (9U * USBD_DFU_MAX_ITF_NUM))]) & 0x04U) != 0U) diff --git a/Class/HID/Src/usbd_hid.c b/Class/HID/Src/usbd_hid.c index da1dd1c..9301625 100644 --- a/Class/HID/Src/usbd_hid.c +++ b/Class/HID/Src/usbd_hid.c @@ -450,6 +450,11 @@ static uint8_t USBD_HID_Setup(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *re uint8_t *pbuf; uint16_t status_info = 0U; + if (hhid == NULL) + { + return (uint8_t)USBD_FAIL; + } + switch (req->bmRequest & USB_REQ_TYPE_MASK) { case USB_REQ_TYPE_CLASS : @@ -566,6 +571,11 @@ uint8_t USBD_HID_SendReport(USBD_HandleTypeDef *pdev, uint8_t *report, uint16_t { USBD_HID_HandleTypeDef *hhid = (USBD_HID_HandleTypeDef *)pdev->pClassData; + if (hhid == NULL) + { + return (uint8_t)USBD_FAIL; + } + if (pdev->dev_state == USBD_STATE_CONFIGURED) { if (hhid->state == HID_IDLE) diff --git a/Class/MSC/Src/usbd_msc.c b/Class/MSC/Src/usbd_msc.c index 22b9cb0..4b96dbd 100644 --- a/Class/MSC/Src/usbd_msc.c +++ b/Class/MSC/Src/usbd_msc.c @@ -349,12 +349,12 @@ uint8_t USBD_MSC_DeInit(USBD_HandleTypeDef *pdev, uint8_t cfgidx) (void)USBD_LL_CloseEP(pdev, MSC_EPIN_ADDR); pdev->ep_in[MSC_EPIN_ADDR & 0xFU].is_used = 0U; - /* De-Init the BOT layer */ - MSC_BOT_DeInit(pdev); - /* Free MSC Class Resources */ if (pdev->pClassData != NULL) { + /* De-Init the BOT layer */ + MSC_BOT_DeInit(pdev); + (void)USBD_free(pdev->pClassData); pdev->pClassData = NULL; } @@ -374,6 +374,11 @@ uint8_t USBD_MSC_Setup(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) USBD_StatusTypeDef ret = USBD_OK; uint16_t status_info = 0U; + if (hmsc == NULL) + { + return (uint8_t)USBD_FAIL; + } + switch (req->bmRequest & USB_REQ_TYPE_MASK) { /* Class request */ diff --git a/Class/MSC/Src/usbd_msc_bot.c b/Class/MSC/Src/usbd_msc_bot.c index ab15e54..bbe9430 100644 --- a/Class/MSC/Src/usbd_msc_bot.c +++ b/Class/MSC/Src/usbd_msc_bot.c @@ -99,6 +99,11 @@ void MSC_BOT_Init(USBD_HandleTypeDef *pdev) { USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassData; + if (hmsc == NULL) + { + return; + } + hmsc->bot_state = USBD_BOT_IDLE; hmsc->bot_status = USBD_BOT_STATUS_NORMAL; @@ -126,6 +131,11 @@ void MSC_BOT_Reset(USBD_HandleTypeDef *pdev) { USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassData; + if (hmsc == NULL) + { + return; + } + hmsc->bot_state = USBD_BOT_IDLE; hmsc->bot_status = USBD_BOT_STATUS_RECOVERY; @@ -146,7 +156,11 @@ void MSC_BOT_Reset(USBD_HandleTypeDef *pdev) void MSC_BOT_DeInit(USBD_HandleTypeDef *pdev) { USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassData; - hmsc->bot_state = USBD_BOT_IDLE; + + if (hmsc != NULL) + { + hmsc->bot_state = USBD_BOT_IDLE; + } } /** @@ -162,6 +176,11 @@ void MSC_BOT_DataIn(USBD_HandleTypeDef *pdev, uint8_t epnum) USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassData; + if (hmsc == NULL) + { + return; + } + switch (hmsc->bot_state) { case USBD_BOT_DATA_IN: @@ -193,6 +212,11 @@ void MSC_BOT_DataOut(USBD_HandleTypeDef *pdev, uint8_t epnum) USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassData; + if (hmsc == NULL) + { + return; + } + switch (hmsc->bot_state) { case USBD_BOT_IDLE: @@ -221,6 +245,11 @@ static void MSC_BOT_CBW_Decode(USBD_HandleTypeDef *pdev) { USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassData; + if (hmsc == NULL) + { + return; + } + hmsc->csw.dTag = hmsc->cbw.dTag; hmsc->csw.dDataResidue = hmsc->cbw.dDataLength; @@ -286,6 +315,11 @@ static void MSC_BOT_SendData(USBD_HandleTypeDef *pdev, uint8_t *pbuf, uint32_t uint32_t length = MIN(hmsc->cbw.dDataLength, len); + if (hmsc == NULL) + { + return; + } + hmsc->csw.dDataResidue -= len; hmsc->csw.bStatus = USBD_CSW_CMD_PASSED; hmsc->bot_state = USBD_BOT_SEND_DATA; @@ -304,6 +338,11 @@ void MSC_BOT_SendCSW(USBD_HandleTypeDef *pdev, uint8_t CSW_Status) { USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassData; + if (hmsc == NULL) + { + return; + } + hmsc->csw.dSignature = USBD_BOT_CSW_SIGNATURE; hmsc->csw.bStatus = CSW_Status; hmsc->bot_state = USBD_BOT_IDLE; @@ -327,6 +366,11 @@ static void MSC_BOT_Abort(USBD_HandleTypeDef *pdev) { USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassData; + if (hmsc == NULL) + { + return; + } + if ((hmsc->cbw.bmFlags == 0U) && (hmsc->cbw.dDataLength != 0U) && (hmsc->bot_status == USBD_BOT_STATUS_NORMAL)) @@ -355,6 +399,11 @@ void MSC_BOT_CplClrFeature(USBD_HandleTypeDef *pdev, uint8_t epnum) { USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassData; + if (hmsc == NULL) + { + return; + } + if (hmsc->bot_status == USBD_BOT_STATUS_ERROR) /* Bad CBW Signature */ { (void)USBD_LL_StallEP(pdev, MSC_EPIN_ADDR); diff --git a/Class/MSC/Src/usbd_msc_scsi.c b/Class/MSC/Src/usbd_msc_scsi.c index b118933..02fdc83 100644 --- a/Class/MSC/Src/usbd_msc_scsi.c +++ b/Class/MSC/Src/usbd_msc_scsi.c @@ -123,6 +123,11 @@ int8_t SCSI_ProcessCmd(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *cmd) int8_t ret; USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassData; + if (hmsc == NULL) + { + return -1; + } + switch (cmd[0]) { case SCSI_TEST_UNIT_READY: @@ -208,6 +213,11 @@ static int8_t SCSI_TestUnitReady(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t UNUSED(params); USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassData; + if (hmsc == NULL) + { + return -1; + } + /* case 9 : Hi > D0 */ if (hmsc->cbw.dDataLength != 0U) { @@ -249,6 +259,11 @@ static int8_t SCSI_Inquiry(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *param uint16_t len; USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassData; + if (hmsc == NULL) + { + return -1; + } + if (hmsc->cbw.dDataLength == 0U) { SCSI_SenseCode(pdev, hmsc->cbw.bLUN, ILLEGAL_REQUEST, INVALID_CDB); @@ -303,6 +318,11 @@ static int8_t SCSI_ReadCapacity10(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t int8_t ret; USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassData; + if (hmsc == NULL) + { + return -1; + } + ret = ((USBD_StorageTypeDef *)pdev->pUserData)->GetCapacity(lun, &hmsc->scsi_blk_nbr, &hmsc->scsi_blk_size); if ((ret != 0) || (hmsc->scsi_medium_state == SCSI_MEDIUM_EJECTED)) @@ -342,6 +362,11 @@ static int8_t SCSI_ReadCapacity16(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t int8_t ret; USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassData; + if (hmsc == NULL) + { + return -1; + } + ret = ((USBD_StorageTypeDef *)pdev->pUserData)->GetCapacity(lun, &hmsc->scsi_blk_nbr, &hmsc->scsi_blk_size); if ((ret != 0) || (hmsc->scsi_medium_state == SCSI_MEDIUM_EJECTED)) @@ -395,6 +420,11 @@ static int8_t SCSI_ReadFormatCapacity(USBD_HandleTypeDef *pdev, uint8_t lun, uin int8_t ret; USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassData; + if (hmsc == NULL) + { + return -1; + } + ret = ((USBD_StorageTypeDef *)pdev->pUserData)->GetCapacity(lun, &blk_nbr, &blk_size); if ((ret != 0) || (hmsc->scsi_medium_state == SCSI_MEDIUM_EJECTED)) @@ -438,6 +468,11 @@ static int8_t SCSI_ModeSense6(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *pa USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassData; uint16_t len = MODE_SENSE6_LEN; + if (hmsc == NULL) + { + return -1; + } + if (params[4] <= len) { len = params[4]; @@ -462,6 +497,11 @@ static int8_t SCSI_ModeSense10(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *p USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassData; uint16_t len = MODE_SENSE10_LEN; + if (hmsc == NULL) + { + return -1; + } + if (params[8] <= len) { len = params[8]; @@ -486,6 +526,11 @@ static int8_t SCSI_RequestSense(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t * uint8_t i; USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassData; + if (hmsc == NULL) + { + return -1; + } + if (hmsc->cbw.dDataLength == 0U) { SCSI_SenseCode(pdev, hmsc->cbw.bLUN, ILLEGAL_REQUEST, INVALID_CDB); @@ -538,6 +583,11 @@ void SCSI_SenseCode(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t sKey, uint8_t UNUSED(lun); USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassData; + if (hmsc == NULL) + { + return; + } + hmsc->scsi_sense[hmsc->scsi_sense_tail].Skey = sKey; hmsc->scsi_sense[hmsc->scsi_sense_tail].w.b.ASC = ASC; hmsc->scsi_sense[hmsc->scsi_sense_tail].w.b.ASCQ = 0U; @@ -562,6 +612,11 @@ static int8_t SCSI_StartStopUnit(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t UNUSED(lun); USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassData; + if (hmsc == NULL) + { + return -1; + } + if ((hmsc->scsi_medium_state == SCSI_MEDIUM_LOCKED) && ((params[4] & 0x3U) == 2U)) { SCSI_SenseCode(pdev, lun, ILLEGAL_REQUEST, INVALID_FIELED_IN_COMMAND); @@ -603,6 +658,11 @@ static int8_t SCSI_AllowPreventRemovable(USBD_HandleTypeDef *pdev, uint8_t lun, UNUSED(lun); USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassData; + if (hmsc == NULL) + { + return -1; + } + if (params[4] == 0U) { hmsc->scsi_medium_state = SCSI_MEDIUM_UNLOCKED; @@ -629,6 +689,11 @@ 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 == NULL) + { + return -1; + } + if (hmsc->bot_state == USBD_BOT_IDLE) /* Idle */ { /* case 10 : Ho <> Di */ @@ -690,6 +755,11 @@ static int8_t SCSI_Read12(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params { USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassData; + if (hmsc == NULL) + { + return -1; + } + if (hmsc->bot_state == USBD_BOT_IDLE) /* Idle */ { /* case 10 : Ho <> Di */ @@ -754,6 +824,11 @@ static int8_t SCSI_Write10(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *param USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassData; uint32_t len; + if (hmsc == NULL) + { + return -1; + } + if (hmsc->bot_state == USBD_BOT_IDLE) /* Idle */ { if (hmsc->cbw.dDataLength == 0U) @@ -834,6 +909,11 @@ static int8_t SCSI_Write12(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *param USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassData; uint32_t len; + if (hmsc == NULL) + { + return -1; + } + if (hmsc->bot_state == USBD_BOT_IDLE) /* Idle */ { if (hmsc->cbw.dDataLength == 0U) @@ -917,6 +997,11 @@ static int8_t SCSI_Verify10(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *para { USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassData; + if (hmsc == NULL) + { + return -1; + } + if ((params[1] & 0x02U) == 0x02U) { SCSI_SenseCode(pdev, lun, ILLEGAL_REQUEST, INVALID_FIELED_IN_COMMAND); @@ -946,6 +1031,11 @@ static int8_t SCSI_CheckAddressRange(USBD_HandleTypeDef *pdev, uint8_t lun, { USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassData; + if (hmsc == NULL) + { + return -1; + } + if ((blk_offset + blk_nbr) > hmsc->scsi_blk_nbr) { SCSI_SenseCode(pdev, lun, ILLEGAL_REQUEST, ADDRESS_OUT_OF_RANGE); @@ -966,6 +1056,11 @@ 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 = hmsc->scsi_blk_len * hmsc->scsi_blk_size; + if (hmsc == NULL) + { + return -1; + } + len = MIN(len, MSC_MEDIA_PACKET); if (((USBD_StorageTypeDef *)pdev->pUserData)->Read(lun, hmsc->bot_data, @@ -1003,6 +1098,11 @@ static int8_t SCSI_ProcessWrite(USBD_HandleTypeDef *pdev, uint8_t lun) USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassData; uint32_t len = hmsc->scsi_blk_len * hmsc->scsi_blk_size; + if (hmsc == NULL) + { + return -1; + } + len = MIN(len, MSC_MEDIA_PACKET); if (((USBD_StorageTypeDef *)pdev->pUserData)->Write(lun, hmsc->bot_data, @@ -1048,6 +1148,11 @@ static int8_t SCSI_UpdateBotData(USBD_MSC_BOT_HandleTypeDef *hmsc, { uint16_t len = length; + if (hmsc == NULL) + { + return -1; + } + hmsc->bot_data_length = len; while (len != 0U) diff --git a/Core/Src/usbd_core.c b/Core/Src/usbd_core.c index 4ec7c9e..fcca9af 100644 --- a/Core/Src/usbd_core.c +++ b/Core/Src/usbd_core.c @@ -500,9 +500,12 @@ USBD_StatusTypeDef USBD_LL_Reset(USBD_HandleTypeDef *pdev) return USBD_FAIL; } - if (pdev->pClass->DeInit != NULL) + if (pdev->pClassData != NULL) { - (void)pdev->pClass->DeInit(pdev, (uint8_t)pdev->dev_config); + if (pdev->pClass->DeInit != NULL) + { + (void)pdev->pClass->DeInit(pdev, (uint8_t)pdev->dev_config); + } } /* Open EP0 OUT */ diff --git a/Release_Notes.html b/Release_Notes.html index 2cab92c..13005ad 100644 --- a/Release_Notes.html +++ b/Release_Notes.html @@ -15,6 +15,7 @@ + - +
@@ -923,8 +923,22 @@ ul
-

Update History

-

V2.7.0 / 12-August-2020

Main +

Update History

+ +

V2.7.1 / 18-August-2020

+ Main +Changes
+
+
    +
  • USB All Class:
  • +
      +
    • Add NULL pointer access check to Class handler
      +
    • +
    +
+ +

V2.7.0 / 12-August-2020

+

Main Changes

  • Integration of  new USB device Class driver:
    • USB video Class driver based on USB-IF video class definition version 1.1
@@ -952,7 +966,7 @@ Changes

  • Integra
    • USB Core:
      • Enhance NULL pointer check in Core APIs
      • Allow supporting both USER and USER Class string desc
      • Add support of USB controller which handles packet-size splitting by hardware
      • Avoid compilation warning due macro redefinition
      • change added to USBD_HandleTypeDef structure: dev_state, old_dev_state and ep0_state declaration become volatile to disable compiler optimization
      • Word spelling correction and file indentation improved
      • usbd_conf.h/c Template file updated to suggest using by default a static memory allocation for Class handler
    • USB All Classes
      • Word spelling correction and file indentation improved
      • Allow updating device config descriptor Max power from user code usbd_conf.h using USBD_MAX_POWER define
      • Fix device config descriptor bmAttributes value which depends on user code define USBD_SELF_POWERED
    • USB CDC Class:
      • Class specific request, add protection to limit the maximum data length to be sent by the CDC device
    • USB CustomHID Class:
      • Allow changing CustomHID data EP size from user code
    -

    V2.6.1 / 05-June-2020

    +

    V2.6.1 / 05-June-2020

    @@ -1001,7 +1015,7 @@ compatibility with device library version below v2.6.0
    • Fix minor misra-c 2012 violations
    -

    V2.6.0 / 27-December-2019

    +

    V2.6.0 / 27-December-2019

    Main Changes

    @@ -1025,7 +1039,7 @@ Changes
  • Integration of three new USB device Class drivers:
    • USB CDC ECM Class driver
    • USB CDC RNDIS Microsoft Class driver
    • USB Billboard Class driver
  • Fix mandatory misra-c 2012 violations
  • update user core and class template files
  • USB Core:
    • Fix unexpected EP0 stall during enumeration phase 
    • Improve APIs error management and prevent accessing NULL pointers
  • USB MSC Class:
    • Fix USBCV specific class tests
    • Fix multiple error with SCSI commands handling
    • Protect medium access when host ask for medium ejection
  • USB CDC Class:
    • Add new function to inform user that current IN transfer is completed
    • update transmit and receive APIs to transfer up to 64KB
  • USB AUDIO Class:
    • Fix audio sync start buffer size
    • update user callback periodicTC args by adding pointer to user buffer and size
  • USB CustomHID Class:
    • Rework the OUT transfer complete and prevent automatically re-enabling the OUT EP 
    • Add new user API to restart the OUT transfer: USBD_CUSTOM_HID_ReceivePacket()

V2.5.3 / 30-April-2019

Main +

  • Integration of three new USB device Class drivers:
    • USB CDC ECM Class driver
    • USB CDC RNDIS Microsoft Class driver
    • USB Billboard Class driver
  • Fix mandatory misra-c 2012 violations
  • update user core and class template files
  • USB Core:
    • Fix unexpected EP0 stall during enumeration phase 
    • Improve APIs error management and prevent accessing NULL pointers
  • USB MSC Class:
    • Fix USBCV specific class tests
    • Fix multiple error with SCSI commands handling
    • Protect medium access when host ask for medium ejection
  • USB CDC Class:
    • Add new function to inform user that current IN transfer is completed
    • update transmit and receive APIs to transfer up to 64KB
  • USB AUDIO Class:
    • Fix audio sync start buffer size
    • update user callback periodicTC args by adding pointer to user buffer and size
  • USB CustomHID Class:
    • Rework the OUT transfer complete and prevent automatically re-enabling the OUT EP 
    • Add new user API to restart the OUT transfer: USBD_CUSTOM_HID_ReceivePacket()

V2.5.3 / 30-April-2019

Main Changes

@@ -1048,7 +1062,7 @@ Changes
  • Fix misra-c 2012 high severity violations
  • Core driver:
    • protect shared macros __ALIGN_BEGIN, __ALIGN_END with C directive #ifndef
    • update Core driver and DFU Class driver to use USBD_SUPPORT_USER_STRING_DESC instead of  USBD_SUPPORT_USER_STRING
    •  prevent accessing to NULL pointer if the get descriptor functions are not defined
    • Update on USBD_LL_Resume(),  restore the device state only if the current state is USBD_STATE_SUSPENDED

    V2.5.2 / 27-Mars-2019

    Main +

    • Fix misra-c 2012 high severity violations
    • Core driver:
      • protect shared macros __ALIGN_BEGIN, __ALIGN_END with C directive #ifndef
      • update Core driver and DFU Class driver to use USBD_SUPPORT_USER_STRING_DESC instead of  USBD_SUPPORT_USER_STRING
      •  prevent accessing to NULL pointer if the get descriptor functions are not defined
      • Update on USBD_LL_Resume(),  restore the device state only if the current state is USBD_STATE_SUSPENDED

    V2.5.2 / 27-Mars-2019

    Main Changes

    @@ -1072,7 +1086,7 @@ Changes
  • DFU Class:
    • fix compilation warning due to unreachable - instruction code introduced with CMSIS V5.4.0 NVIC_SystemReset() prototype change

    V2.5.1 / 03-August-2018
    +
    instruction code introduced with CMSIS V5.4.0 NVIC_SystemReset() prototype change

    V2.5.1 / 03-August-2018

    @@ -1114,7 +1128,7 @@ Changes
  • Update license section by adding path to get copy of ST Ultimate Liberty license
  • Core: Fix unexpected stall during status OUT phase
  • DFU Class:
    • rework hdfu struct to prevent unaligned addresses
  • MSC Class:
    • fix lba address overflow during large file transfers > 4Go
  • Template Class:
    • add missing Switch case Break on USBD_Template_Setup API

    V2.5.0 / 15-December-2017
    +
    • Update license section by adding path to get copy of ST Ultimate Liberty license
    • Core: Fix unexpected stall during status OUT phase
    • DFU Class:
      • rework hdfu struct to prevent unaligned addresses
    • MSC Class:
      • fix lba address overflow during large file transfers > 4Go
    • Template Class:
      • add missing Switch case Break on USBD_Template_Setup API

    V2.5.0 / 15-December-2017

    @@ -1156,7 +1170,7 @@ Changes
  • Update license section
  • Update some functions to be MISRAC 2004 compliant
  • Add HS and OtherSpeed configuration descriptor for HID and CustomHID classes
  • Correct error handling in all class setup function
  • Add usbd_desc_template.c/ usbd_desc_template.h templates files
  • Add support of class and vendor request
  • CDC Class: fix zero-length packet issue in bulk IN transfer
  • Fix compilation warning with unused arguments for some functions
  • Improve USB Core enumeration state machine
  • V2.4.2 / 11-December-2015
    +
    • Update license section
    • Update some functions to be MISRAC 2004 compliant
    • Add HS and OtherSpeed configuration descriptor for HID and CustomHID classes
    • Correct error handling in all class setup function
    • Add usbd_desc_template.c/ usbd_desc_template.h templates files
    • Add support of class and vendor request
    • CDC Class: fix zero-length packet issue in bulk IN transfer
    • Fix compilation warning with unused arguments for some functions
    • Improve USB Core enumeration state machine

    V2.4.2 / 11-December-2015

    @@ -1203,7 +1217,7 @@ Changes
    V2.4.1 / 19-June-2015
    +

    V2.4.1 / 19-June-2015

    @@ -1262,7 +1276,7 @@ Changes
    V2.4.0 / 28-February-2015
    +

    V2.4.0 / 28-February-2015

    @@ -1312,7 +1326,7 @@ USBD_CDC_Setup() function to allow correct user implementation of CDC_SET_CONTROL_LINE_STATE and similar no-data setup requests.
    -

    V2.3.0 / 04-November-2014
    +

    V2.3.0 / 04-November-2014

    @@ -1355,7 +1369,7 @@ Changes
    Miscellaneous source code comments update -

    V2.2.0 / 13-June-2014

    +

    V2.2.0 / 13-June-2014

    @@ -1401,7 +1415,7 @@ Changes
    ex. for the HID, the USBD_HID_CLASS macro is defined this way #define USBD_HID_CLASS  &USBD_HID
      and the application code can use the previous definition: &USBD_HID ex. USBD_RegisterClass(&USBD_Device, &USBD_HID) or the new USBD_HID_CLASS ex. USBD_RegisterClass(&USBD_Device, USBD_HID_CLASS) -

    V2.1.0 / 22-April-2014

    +

    V2.1.0 / 22-April-2014

    @@ -1439,7 +1453,7 @@ Changes
    V2.0.0 / 18-February-2014

    +

    V2.0.0 / 18-February-2014

    @@ -1464,14 +1478,14 @@ modified vs. V1.1.0, and thus the 2 versions are not compatible.
    -

    V1.1.0 / 19-March-2012

    +

    V1.1.0 / 19-March-2012

    Main Changes

    -
    • Official support of STM32F4xx devices
    • All source files: license disclaimer text update and add link to the License file on ST Internet.
    • Handle test mode in the set feature request
    • Handle dynamically the USB SELF POWERED feature
    • Handle correctly the USBD_CtlError process to take into account error during Control OUT stage
    • Miscellaneous bug fix

    V1.0.0 / 22-July-2011

    Main +

    • Official support of STM32F4xx devices
    • All source files: license disclaimer text update and add link to the License file on ST Internet.
    • Handle test mode in the set feature request
    • Handle dynamically the USB SELF POWERED feature
    • Handle correctly the USBD_CtlError process to take into account error during Control OUT stage
    • Miscellaneous bug fix

    V1.0.0 / 22-July-2011

    Main Changes

    • First official version for STM32F105/7xx and STM32F2xx devices

    -

    License

    This +

    License

    This software component is licensed by ST under Ultimate Liberty license SLA0044, the "License"; You may not use this component except in compliance with the License. You may obtain a copy of the License at:

    http://www.st.com/SLA0044