From e4ba1aeb1b5e04ed3d0702a258e982b50d0e4659 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Mon, 23 Dec 2019 23:41:42 +0100 Subject: [PATCH] core/embed: import USB code changes from STM32CubeF4 into trezorhal --- core/embed/trezorhal/usbd_conf.c | 90 +++++--------- core/embed/trezorhal/usbd_conf.h | 81 +++++------- core/embed/trezorhal/usbd_core.c | 158 ++++++++++++++---------- core/embed/trezorhal/usbd_core.h | 24 ++-- core/embed/trezorhal/usbd_ctlreq.c | 191 ++++++++++++++-------------- core/embed/trezorhal/usbd_ctlreq.h | 20 +-- core/embed/trezorhal/usbd_def.h | 192 ++++++++++++++--------------- core/embed/trezorhal/usbd_ioreq.c | 76 +++++------- core/embed/trezorhal/usbd_ioreq.h | 27 ++-- 9 files changed, 399 insertions(+), 460 deletions(-) diff --git a/core/embed/trezorhal/usbd_conf.c b/core/embed/trezorhal/usbd_conf.c index 65e5b430d..f0e93c582 100644 --- a/core/embed/trezorhal/usbd_conf.c +++ b/core/embed/trezorhal/usbd_conf.c @@ -1,55 +1,26 @@ // clang-format off -/* - * This file is part of the Micro Python project, http://micropython.org/ - */ - /** ****************************************************************************** - * @file USB_Device/CDC_Standalone/Src/usbd_conf.c + * @file usbd_conf_template.c * @author MCD Application Team - * @version V1.4.0 - * @date 17-February-2017 - * @brief This file implements the USB Device library callbacks and MSP + * @brief USB Device configuration and interface file + * This template should be copied to the user folder, renamed and customized + * following user needs. ****************************************************************************** * @attention * - *

© Copyright (c) 2017 STMicroelectronics International N.V. + *

© Copyright (c) 2015 STMicroelectronics. * All rights reserved.

* - * Redistribution and use in source and binary forms, with or without - * modification, are permitted, provided that the following conditions are met: - * - * 1. Redistribution of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the 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 without specific written permission. - * 4. This software, including modifications and/or derivative works of this - * software, must execute solely and exclusively on microcontroller or - * microprocessor devices manufactured by or for STMicroelectronics. - * 5. Redistribution and use of this software other than as permitted under - * this license is void and will automatically terminate your rights under - * this license. - * - * 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 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. + * This software component is licensed by ST under Ultimate Liberty license + * SLA0044, the "License"; You may not use this file except in compliance with + * the License. You may obtain a copy of the License at: + * http://www.st.com/SLA0044 * ****************************************************************************** */ + /* Includes ------------------------------------------------------------------*/ #include STM32_HAL_H #include "usbd_core.h" @@ -403,7 +374,7 @@ void HAL_PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd) * @param pdev: Device handle * @retval USBD Status */ -USBD_StatusTypeDef USBD_LL_Init (USBD_HandleTypeDef *pdev) +USBD_StatusTypeDef USBD_LL_Init(USBD_HandleTypeDef *pdev) { #if defined(USE_USB_FS) if (pdev->id == USB_PHY_FS_ID) @@ -547,8 +518,8 @@ USBD_StatusTypeDef USBD_LL_Stop(USBD_HandleTypeDef *pdev) * @retval USBD Status */ USBD_StatusTypeDef USBD_LL_OpenEP(USBD_HandleTypeDef *pdev, - uint8_t ep_addr, - uint8_t ep_type, + uint8_t ep_addr, + uint8_t ep_type, uint16_t ep_mps) { HAL_PCD_EP_Open(pdev->pData, ep_addr, ep_mps, ep_type); @@ -607,7 +578,7 @@ USBD_StatusTypeDef USBD_LL_ClearStallEP(USBD_HandleTypeDef *pdev, uint8_t ep_add * @brief Returns Stall condition. * @param pdev: Device handle * @param ep_addr: Endpoint Number - * @retval Stall (1: yes, 0: No) + * @retval Stall (1: Yes, 0: No) */ uint8_t USBD_LL_IsStallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr) { @@ -624,9 +595,9 @@ uint8_t USBD_LL_IsStallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr) } /** - * @brief Assigns an USB address to the device + * @brief Assigns a USB address to the device. * @param pdev: Device handle - * @param dev_addr: USB address + * @param ep_addr: Endpoint Number * @retval USBD Status */ USBD_StatusTypeDef USBD_LL_SetUSBAddress(USBD_HandleTypeDef *pdev, uint8_t dev_addr) @@ -636,7 +607,7 @@ USBD_StatusTypeDef USBD_LL_SetUSBAddress(USBD_HandleTypeDef *pdev, uint8_t dev_a } /** - * @brief Transmits data over an endpoint + * @brief Transmits data over an endpoint. * @param pdev: Device handle * @param ep_addr: Endpoint Number * @param pbuf: Pointer to data to be sent @@ -644,48 +615,48 @@ USBD_StatusTypeDef USBD_LL_SetUSBAddress(USBD_HandleTypeDef *pdev, uint8_t dev_a * @retval USBD Status */ USBD_StatusTypeDef USBD_LL_Transmit(USBD_HandleTypeDef *pdev, - uint8_t ep_addr, - uint8_t *pbuf, - uint16_t size) + uint8_t ep_addr, + uint8_t *pbuf, + uint16_t size) { HAL_PCD_EP_Transmit(pdev->pData, ep_addr, pbuf, size); return USBD_OK; } /** - * @brief Prepares an endpoint for reception + * @brief Prepares an endpoint for reception. * @param pdev: Device handle * @param ep_addr: Endpoint Number - * @param pbuf:pointer to data to be received - * @param size: data size + * @param pbuf: Pointer to data to be received + * @param size: Data size * @retval USBD Status */ USBD_StatusTypeDef USBD_LL_PrepareReceive(USBD_HandleTypeDef *pdev, - uint8_t ep_addr, - uint8_t *pbuf, - uint16_t size) + uint8_t ep_addr, + uint8_t *pbuf, + uint16_t size) { HAL_PCD_EP_Receive(pdev->pData, ep_addr, pbuf, size); return USBD_OK; } /** - * @brief Returns the last transfered packet size. + * @brief Returns the last transferred packet size. * @param pdev: Device handle * @param ep_addr: Endpoint Number * @retval Recived Data Size */ -uint32_t USBD_LL_GetRxDataSize(USBD_HandleTypeDef *pdev, uint8_t ep_addr) +uint32_t USBD_LL_GetRxDataSize(USBD_HandleTypeDef *pdev, uint8_t ep_addr) { return HAL_PCD_EP_GetRxCount(pdev->pData, ep_addr); } /** - * @brief Delay routine for the USB Device Library + * @brief Delays routine for the USB Device Library. * @param Delay: Delay in ms * @retval None */ -void USBD_LL_Delay(uint32_t Delay) +void USBD_LL_Delay(uint32_t Delay) { HAL_Delay(Delay); } @@ -785,3 +756,4 @@ void OTG_HS_WKUP_IRQHandler(void) { #endif /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/core/embed/trezorhal/usbd_conf.h b/core/embed/trezorhal/usbd_conf.h index 6ff2c71c8..474ab4b69 100644 --- a/core/embed/trezorhal/usbd_conf.h +++ b/core/embed/trezorhal/usbd_conf.h @@ -1,55 +1,24 @@ // clang-format off -/* - * This file is part of the Micro Python project, http://micropython.org/ - */ - /** ****************************************************************************** - * @file USB_Device/CDC_Standalone/Inc/usbd_conf.h + * @file usbd_conf_template.h * @author MCD Application Team - * @version V1.4.0 - * @date 17-February-2017 - * @brief General low level driver configuration + * @brief Header file for the usbd_conf_template.c file ****************************************************************************** * @attention * - *

© Copyright (c) 2017 STMicroelectronics International N.V. + *

© Copyright (c) 2015 STMicroelectronics. * All rights reserved.

* - * Redistribution and use in source and binary forms, with or without - * modification, are permitted, provided that the following conditions are met: - * - * 1. Redistribution of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the 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 without specific written permission. - * 4. This software, including modifications and/or derivative works of this - * software, must execute solely and exclusively on microcontroller or - * microprocessor devices manufactured by or for STMicroelectronics. - * 5. Redistribution and use of this software other than as permitted under - * this license is void and will automatically terminate your rights under - * this license. - * - * 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 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. + * This software component is licensed by ST under Ultimate Liberty license + * SLA0044, the "License"; You may not use this file except in compliance with + * the License. You may obtain a copy of the License at: + * http://www.st.com/SLA0044 * ****************************************************************************** */ + /* Define to prevent recursive inclusion -------------------------------------*/ #ifndef __USBD_CONF_H #define __USBD_CONF_H @@ -84,28 +53,34 @@ these should not be used because the GC is reset on a soft reset but the usb is */ /* DEBUG macros */ -#if (USBD_DEBUG_LEVEL > 0) -#define USBD_UsrLog(...) printf(__VA_ARGS__);\ - printf("\n"); +#if (USBD_DEBUG_LEVEL > 0U) +#define USBD_UsrLog(...) do { \ + printf(__VA_ARGS__); \ + printf("\n"); \ +} while (0) #else -#define USBD_UsrLog(...) +#define USBD_UsrLog(...) do {} while (0) #endif -#if (USBD_DEBUG_LEVEL > 1) +#if (USBD_DEBUG_LEVEL > 1U) -#define USBD_ErrLog(...) printf("ERROR: ") ;\ - printf(__VA_ARGS__);\ - printf("\n"); +#define USBD_ErrLog(...) do { \ + printf("ERROR: ") ; \ + printf(__VA_ARGS__); \ + printf("\n"); \ +} while (0) #else -#define USBD_ErrLog(...) +#define USBD_ErrLog(...) do {} while (0) #endif -#if (USBD_DEBUG_LEVEL > 2) -#define USBD_DbgLog(...) printf("DEBUG : ") ;\ - printf(__VA_ARGS__);\ - printf("\n"); +#if (USBD_DEBUG_LEVEL > 2U) +#define USBD_DbgLog(...) do { \ + printf("DEBUG : ") ; \ + printf(__VA_ARGS__); \ + printf("\n"); \ +} while (0) #else -#define USBD_DbgLog(...) +#define USBD_DbgLog(...) do {} while (0) #endif /* Exported functions ------------------------------------------------------- */ diff --git a/core/embed/trezorhal/usbd_core.c b/core/embed/trezorhal/usbd_core.c index 2663a6d88..9522b9bbb 100644 --- a/core/embed/trezorhal/usbd_core.c +++ b/core/embed/trezorhal/usbd_core.c @@ -4,25 +4,17 @@ ****************************************************************************** * @file usbd_core.c * @author MCD Application Team - * @version V2.4.2 - * @date 11-December-2015 * @brief This file provides all the USBD core functions. ****************************************************************************** * @attention * - *

© COPYRIGHT 2015 STMicroelectronics

+ *

© Copyright (c) 2015 STMicroelectronics. + * All rights reserved.

* - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * This software component is licensed by ST under Ultimate Liberty license + * SLA0044, the "License"; You may not use this file except in compliance with + * the License. You may obtain a copy of the License at: + * http://www.st.com/SLA0044 * ****************************************************************************** */ @@ -100,7 +92,9 @@ USBD_StatusTypeDef USBD_Init(USBD_HandleTypeDef *pdev, USBD_DescriptorsTypeDef * /* Check whether the USB Host handle is valid */ if(pdev == NULL) { +#if (USBD_DEBUG_LEVEL > 1U) USBD_ErrLog("Invalid Device handle"); +#endif return USBD_FAIL; } @@ -137,7 +131,7 @@ USBD_StatusTypeDef USBD_DeInit(USBD_HandleTypeDef *pdev) pdev->dev_state = USBD_STATE_DEFAULT; /* Free Class Resources */ - pdev->pClass->DeInit(pdev, pdev->dev_config); + pdev->pClass->DeInit(pdev, (uint8_t)pdev->dev_config); /* Stop the low level driver */ USBD_LL_Stop(pdev); @@ -148,7 +142,6 @@ USBD_StatusTypeDef USBD_DeInit(USBD_HandleTypeDef *pdev) return USBD_OK; } - /** * @brief USBD_RegisterClass * Link class driver to Device Core. @@ -167,7 +160,9 @@ USBD_StatusTypeDef USBD_RegisterClass(USBD_HandleTypeDef *pdev, USBD_ClassTypeD } else { +#if (USBD_DEBUG_LEVEL > 1U) USBD_ErrLog("Invalid Class handle"); +#endif status = USBD_FAIL; } @@ -198,7 +193,7 @@ USBD_StatusTypeDef USBD_Start (USBD_HandleTypeDef *pdev) USBD_StatusTypeDef USBD_Stop (USBD_HandleTypeDef *pdev) { /* Free Class Resources */ - pdev->pClass->DeInit(pdev, pdev->dev_config); + pdev->pClass->DeInit(pdev, (uint8_t)pdev->dev_config); /* Stop the low level driver */ USBD_LL_Stop(pdev); @@ -214,10 +209,12 @@ USBD_StatusTypeDef USBD_Stop (USBD_HandleTypeDef *pdev) */ USBD_StatusTypeDef USBD_RunTestMode (USBD_HandleTypeDef *pdev) { + /* Prevent unused argument compilation warning */ + UNUSED(pdev); + return USBD_OK; } - /** * @brief USBD_SetClassConfig * Configure device and start the interface @@ -233,11 +230,12 @@ USBD_StatusTypeDef USBD_SetClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx if(pdev->pClass != NULL) { /* Set configuration and Start the Class*/ - if(pdev->pClass->Init(pdev, cfgidx) == 0) + if(pdev->pClass->Init(pdev, cfgidx) == 0U) { ret = USBD_OK; } } + return ret; } @@ -264,10 +262,10 @@ USBD_StatusTypeDef USBD_ClrClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx */ USBD_StatusTypeDef USBD_LL_SetupStage(USBD_HandleTypeDef *pdev, uint8_t *psetup) { - USBD_ParseSetupRequest(&pdev->request, psetup); pdev->ep0_state = USBD_EP0_SETUP; + pdev->ep0_data_len = pdev->request.wLength; switch (pdev->request.bmRequest & USB_REQ_TYPE_MASK) @@ -286,7 +284,7 @@ USBD_StatusTypeDef USBD_LL_SetupStage(USBD_HandleTypeDef *pdev, uint8_t *psetup) USBD_StdEPReq(pdev, &pdev->request); break; default: - USBD_LL_StallEP(pdev, pdev->request.bmRequest & 0x80); + USBD_LL_StallEP(pdev, (pdev->request.bmRequest & 0x80U)); break; } break; @@ -311,11 +309,12 @@ USBD_StatusTypeDef USBD_LL_SetupStage(USBD_HandleTypeDef *pdev, uint8_t *psetup) * @param epnum: endpoint index * @retval status */ -USBD_StatusTypeDef USBD_LL_DataOutStage(USBD_HandleTypeDef *pdev , uint8_t epnum, uint8_t *pdata) +USBD_StatusTypeDef USBD_LL_DataOutStage(USBD_HandleTypeDef *pdev, + uint8_t epnum, uint8_t *pdata) { USBD_EndpointTypeDef *pep; - if(epnum == 0) + if(epnum == 0U) { pep = &pdev->ep_out[0]; @@ -327,7 +326,7 @@ USBD_StatusTypeDef USBD_LL_DataOutStage(USBD_HandleTypeDef *pdev , uint8_t epnum USBD_CtlContinueRx (pdev, pdata, - MIN(pep->rem_length ,pep->maxpacket)); + (uint16_t)MIN(pep->rem_length, pep->maxpacket)); } else { @@ -339,12 +338,29 @@ USBD_StatusTypeDef USBD_LL_DataOutStage(USBD_HandleTypeDef *pdev , uint8_t epnum USBD_CtlSendStatus(pdev); } } + else + { + if (pdev->ep0_state == USBD_EP0_STATUS_OUT) + { + /* + * STATUS PHASE completed, update ep0_state to idle + */ + pdev->ep0_state = USBD_EP0_IDLE; + USBD_LL_StallEP(pdev, 0U); + } + } } - else if((pdev->pClass->DataOut != NULL)&& + else if((pdev->pClass->DataOut != NULL) && (pdev->dev_state == USBD_STATE_CONFIGURED)) { pdev->pClass->DataOut(pdev, epnum); } + else + { + /* should never be in this condition */ + return USBD_FAIL; + } + return USBD_OK; } @@ -355,11 +371,12 @@ USBD_StatusTypeDef USBD_LL_DataOutStage(USBD_HandleTypeDef *pdev , uint8_t epnum * @param epnum: endpoint index * @retval status */ -USBD_StatusTypeDef USBD_LL_DataInStage(USBD_HandleTypeDef *pdev ,uint8_t epnum, uint8_t *pdata) +USBD_StatusTypeDef USBD_LL_DataInStage(USBD_HandleTypeDef *pdev, uint8_t epnum, + uint8_t *pdata) { - USBD_EndpointTypeDef *pep; + USBD_EndpointTypeDef *pep; - if(epnum == 0) + if(epnum == 0U) { pep = &pdev->ep_in[0]; @@ -367,33 +384,24 @@ USBD_StatusTypeDef USBD_LL_DataInStage(USBD_HandleTypeDef *pdev ,uint8_t epnum, { if(pep->rem_length > pep->maxpacket) { - pep->rem_length -= pep->maxpacket; + pep->rem_length -= pep->maxpacket; - USBD_CtlContinueSendData (pdev, - pdata, - pep->rem_length); + USBD_CtlContinueSendData (pdev, pdata, (uint16_t)pep->rem_length); /* Prepare endpoint for premature end of transfer */ - USBD_LL_PrepareReceive (pdev, - 0, - NULL, - 0); + USBD_LL_PrepareReceive (pdev, 0U, NULL, 0U); } else { /* last packet is MPS multiple, so send ZLP packet */ - if((pep->total_length % pep->maxpacket == 0) && + if((pep->total_length % pep->maxpacket == 0U) && (pep->total_length >= pep->maxpacket) && - (pep->total_length < pdev->ep0_data_len )) + (pep->total_length < pdev->ep0_data_len)) { + USBD_CtlContinueSendData(pdev, NULL, 0U); + pdev->ep0_data_len = 0U; - USBD_CtlContinueSendData(pdev , NULL, 0); - pdev->ep0_data_len = 0; - - /* Prepare endpoint for premature end of transfer */ - USBD_LL_PrepareReceive (pdev, - 0, - NULL, - 0); + /* Prepare endpoint for premature end of transfer */ + USBD_LL_PrepareReceive (pdev, 0U, NULL, 0U); } else { @@ -402,21 +410,37 @@ USBD_StatusTypeDef USBD_LL_DataInStage(USBD_HandleTypeDef *pdev ,uint8_t epnum, { pdev->pClass->EP0_TxSent(pdev); } + USBD_LL_StallEP(pdev, 0x80U); USBD_CtlReceiveStatus(pdev); } } } - if (pdev->dev_test_mode == 1) + else + { + if ((pdev->ep0_state == USBD_EP0_STATUS_IN) || + (pdev->ep0_state == USBD_EP0_IDLE)) + { + USBD_LL_StallEP(pdev, 0x80U); + } + } + + if (pdev->dev_test_mode == 1U) { USBD_RunTestMode(pdev); - pdev->dev_test_mode = 0; + pdev->dev_test_mode = 0U; } } - else if((pdev->pClass->DataIn != NULL)&& + else if((pdev->pClass->DataIn != NULL) && (pdev->dev_state == USBD_STATE_CONFIGURED)) { pdev->pClass->DataIn(pdev, epnum); } + else + { + /* should never be in this condition */ + return USBD_FAIL; + } + return USBD_OK; } @@ -430,33 +454,30 @@ USBD_StatusTypeDef USBD_LL_DataInStage(USBD_HandleTypeDef *pdev ,uint8_t epnum, USBD_StatusTypeDef USBD_LL_Reset(USBD_HandleTypeDef *pdev) { /* Open EP0 OUT */ - USBD_LL_OpenEP(pdev, - 0x00, - USBD_EP_TYPE_CTRL, - USB_MAX_EP0_SIZE); + USBD_LL_OpenEP(pdev, 0x00U, USBD_EP_TYPE_CTRL, USB_MAX_EP0_SIZE); + pdev->ep_out[0x00U & 0xFU].is_used = 1U; pdev->ep_out[0].maxpacket = USB_MAX_EP0_SIZE; /* Open EP0 IN */ - USBD_LL_OpenEP(pdev, - 0x80, - USBD_EP_TYPE_CTRL, - USB_MAX_EP0_SIZE); + USBD_LL_OpenEP(pdev, 0x80U, USBD_EP_TYPE_CTRL, USB_MAX_EP0_SIZE); + pdev->ep_in[0x80U & 0xFU].is_used = 1U; pdev->ep_in[0].maxpacket = USB_MAX_EP0_SIZE; /* Upon Reset call user call back */ pdev->dev_state = USBD_STATE_DEFAULT; + pdev->ep0_state = USBD_EP0_IDLE; + pdev->dev_config= 0U; + pdev->dev_remote_wakeup = 0U; if (pdev->pClassData) - pdev->pClass->DeInit(pdev, pdev->dev_config); - + { + pdev->pClass->DeInit(pdev, (uint8_t)pdev->dev_config); + } return USBD_OK; } - - - /** * @brief USBD_LL_Reset * Handle Reset event @@ -523,6 +544,10 @@ USBD_StatusTypeDef USBD_LL_SOF(USBD_HandleTypeDef *pdev) */ USBD_StatusTypeDef USBD_LL_IsoINIncomplete(USBD_HandleTypeDef *pdev, uint8_t epnum) { + /* Prevent unused arguments compilation warning */ + UNUSED(pdev); + UNUSED(epnum); + return USBD_OK; } @@ -534,6 +559,10 @@ USBD_StatusTypeDef USBD_LL_IsoINIncomplete(USBD_HandleTypeDef *pdev, uint8_t ep */ USBD_StatusTypeDef USBD_LL_IsoOUTIncomplete(USBD_HandleTypeDef *pdev, uint8_t epnum) { + /* Prevent unused arguments compilation warning */ + UNUSED(pdev); + UNUSED(epnum); + return USBD_OK; } @@ -545,6 +574,9 @@ USBD_StatusTypeDef USBD_LL_IsoOUTIncomplete(USBD_HandleTypeDef *pdev, uint8_t e */ USBD_StatusTypeDef USBD_LL_DevConnected(USBD_HandleTypeDef *pdev) { + /* Prevent unused argument compilation warning */ + UNUSED(pdev); + return USBD_OK; } @@ -558,7 +590,7 @@ USBD_StatusTypeDef USBD_LL_DevDisconnected(USBD_HandleTypeDef *pdev) { /* Free Class Resources */ pdev->dev_state = USBD_STATE_DEFAULT; - pdev->pClass->DeInit(pdev, pdev->dev_config); + pdev->pClass->DeInit(pdev, (uint8_t)pdev->dev_config); return USBD_OK; } diff --git a/core/embed/trezorhal/usbd_core.h b/core/embed/trezorhal/usbd_core.h index 960d73b0d..0930ec80d 100644 --- a/core/embed/trezorhal/usbd_core.h +++ b/core/embed/trezorhal/usbd_core.h @@ -4,25 +4,17 @@ ****************************************************************************** * @file usbd_core.h * @author MCD Application Team - * @version V2.4.2 - * @date 11-December-2015 * @brief Header file for usbd_core.c file ****************************************************************************** * @attention * - *

© COPYRIGHT 2015 STMicroelectronics

+ *

© Copyright (c) 2015 STMicroelectronics. + * All rights reserved.

* - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * This software component is licensed by ST under Ultimate Liberty license + * SLA0044, the "License"; You may not use this file except in compliance with + * the License. You may obtain a copy of the License at: + * http://www.st.com/SLA0044 * ****************************************************************************** */ @@ -54,7 +46,9 @@ /** @defgroup USBD_CORE_Exported_Defines * @{ */ - +#ifndef USBD_DEBUG_LEVEL +#define USBD_DEBUG_LEVEL 0U +#endif /* USBD_DEBUG_LEVEL */ /** * @} */ diff --git a/core/embed/trezorhal/usbd_ctlreq.c b/core/embed/trezorhal/usbd_ctlreq.c index 31c97e5f6..d9712f366 100644 --- a/core/embed/trezorhal/usbd_ctlreq.c +++ b/core/embed/trezorhal/usbd_ctlreq.c @@ -4,25 +4,17 @@ ****************************************************************************** * @file usbd_req.c * @author MCD Application Team - * @version V2.4.2 - * @date 11-December-2015 * @brief This file provides the standard USB requests following chapter 9. ****************************************************************************** * @attention * - *

© COPYRIGHT 2015 STMicroelectronics

+ *

© Copyright (c) 2015 STMicroelectronics. + * All rights reserved.

* - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * This software component is licensed by ST under Ultimate Liberty license + * SLA0044, the "License"; You may not use this file except in compliance with + * the License. You may obtain a copy of the License at: + * http://www.st.com/SLA0044 * ****************************************************************************** */ @@ -296,31 +288,53 @@ USBD_StatusTypeDef USBD_StdEPReq (USBD_HandleTypeDef *pdev , USBD_SetupReqTyped break; case USBD_STATE_CONFIGURED: - pep = ((ep_addr & 0x80) == 0x80) ? &pdev->ep_in[ep_addr & 0x7F]:\ - &pdev->ep_out[ep_addr & 0x7F]; - if(USBD_LL_IsStallEP(pdev, ep_addr)) + if((ep_addr & 0x80U) == 0x80U) { - pep->status = 0x0001; + if (pdev->ep_in[ep_addr & 0xFU].is_used == 0U) + { + USBD_CtlError(pdev, req); + break; + } } else { - pep->status = 0x0000; + if (pdev->ep_out[ep_addr & 0xFU].is_used == 0U) + { + USBD_CtlError(pdev, req); + break; + } } - USBD_CtlSendData (pdev, - (uint8_t *)&pep->status, - 2); - break; + pep = ((ep_addr & 0x80U) == 0x80U) ? &pdev->ep_in[ep_addr & 0x7FU]:\ + &pdev->ep_out[ep_addr & 0x7FU]; + + if ((ep_addr == 0x00U) || (ep_addr == 0x80U)) + { + pep->status = 0x0000U; + } + else if(USBD_LL_IsStallEP(pdev, ep_addr)) + { + pep->status = 0x0001U; + } + else + { + pep->status = 0x0000U; + } + + USBD_CtlSendData (pdev, (uint8_t *)(void *)&pep->status, 2U); + break; default: - USBD_CtlError(pdev , req); + USBD_CtlError(pdev, req); break; } break; default: + USBD_CtlError(pdev, req); break; } + return ret; } /** @@ -339,7 +353,7 @@ static void USBD_GetDescriptor(USBD_HandleTypeDef *pdev , switch (req->wValue >> 8) { -#if (USBD_LPM_ENABLED == 1) +#if (USBD_LPM_ENABLED == 1U) case USB_DESC_TYPE_BOS: pbuf = pdev->pDesc->GetBOSDescriptor(pdev->dev_speed, &len); if (!pbuf) { @@ -392,7 +406,7 @@ static void USBD_GetDescriptor(USBD_HandleTypeDef *pdev , break; default: -#if (USBD_SUPPORT_USER_STRING == 1) +#if (USBD_SUPPORT_USER_STRING == 1U) pbuf = pdev->pClass->GetUsrStrDescriptor(pdev, (req->wValue) , &len); break; #else @@ -403,9 +417,9 @@ static void USBD_GetDescriptor(USBD_HandleTypeDef *pdev , break; case USB_DESC_TYPE_DEVICE_QUALIFIER: - if(pdev->dev_speed == USBD_SPEED_HIGH ) + if(pdev->dev_speed == USBD_SPEED_HIGH) { - pbuf = (uint8_t *)pdev->pClass->GetDeviceQualifierDescriptor(&len); + pbuf = (uint8_t *)pdev->pClass->GetDeviceQualifierDescriptor(&len); break; } else @@ -432,16 +446,18 @@ static void USBD_GetDescriptor(USBD_HandleTypeDef *pdev , return; } - if((len != 0)&& (req->wLength != 0)) + if((len != 0U) && (req->wLength != 0U)) { - len = MIN(len , req->wLength); + len = MIN(len, req->wLength); - USBD_CtlSendData (pdev, - pbuf, - len); + USBD_CtlSendData (pdev, pbuf, len); } + if(req->wLength == 0U) + { + USBD_CtlSendStatus(pdev); + } } /** @@ -456,9 +472,9 @@ static void USBD_SetAddress(USBD_HandleTypeDef *pdev , { uint8_t dev_addr; - if ((req->wIndex == 0) && (req->wLength == 0)) + if ((req->wIndex == 0U) && (req->wLength == 0U) && (req->wValue < 128U)) { - dev_addr = (uint8_t)(req->wValue) & 0x7F; + dev_addr = (uint8_t)(req->wValue) & 0x7FU; if (pdev->dev_state == USBD_STATE_CONFIGURED) { @@ -470,19 +486,19 @@ static void USBD_SetAddress(USBD_HandleTypeDef *pdev , USBD_LL_SetUSBAddress(pdev, dev_addr); USBD_CtlSendStatus(pdev); - if (dev_addr != 0) + if (dev_addr != 0U) { - pdev->dev_state = USBD_STATE_ADDRESSED; + pdev->dev_state = USBD_STATE_ADDRESSED; } else { - pdev->dev_state = USBD_STATE_DEFAULT; + pdev->dev_state = USBD_STATE_DEFAULT; } } } else { - USBD_CtlError(pdev , req); + USBD_CtlError(pdev, req); } } @@ -493,17 +509,15 @@ static void USBD_SetAddress(USBD_HandleTypeDef *pdev , * @param req: usb request * @retval status */ -static void USBD_SetConfig(USBD_HandleTypeDef *pdev , - USBD_SetupReqTypedef *req) +static void USBD_SetConfig(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) { - - static uint8_t cfgidx; + static uint8_t cfgidx; cfgidx = (uint8_t)(req->wValue); - if (cfgidx > USBD_MAX_NUM_CONFIGURATION ) + if (cfgidx > USBD_MAX_NUM_CONFIGURATION) { - USBD_CtlError(pdev , req); + USBD_CtlError(pdev, req); } else { @@ -514,38 +528,37 @@ static void USBD_SetConfig(USBD_HandleTypeDef *pdev , { pdev->dev_config = cfgidx; pdev->dev_state = USBD_STATE_CONFIGURED; - if(USBD_SetClassConfig(pdev , cfgidx) == USBD_FAIL) + if(USBD_SetClassConfig(pdev, cfgidx) == USBD_FAIL) { - USBD_CtlError(pdev , req); + USBD_CtlError(pdev, req); return; } USBD_CtlSendStatus(pdev); } else { - USBD_CtlSendStatus(pdev); + USBD_CtlSendStatus(pdev); } break; case USBD_STATE_CONFIGURED: - if (cfgidx == 0) + if (cfgidx == 0U) { pdev->dev_state = USBD_STATE_ADDRESSED; pdev->dev_config = cfgidx; - USBD_ClrClassConfig(pdev , cfgidx); + USBD_ClrClassConfig(pdev, cfgidx); USBD_CtlSendStatus(pdev); - } - else if (cfgidx != pdev->dev_config) + else if (cfgidx != pdev->dev_config) { /* Clear old configuration */ - USBD_ClrClassConfig(pdev , pdev->dev_config); + USBD_ClrClassConfig(pdev, (uint8_t)pdev->dev_config); /* set new configuration */ pdev->dev_config = cfgidx; - if(USBD_SetClassConfig(pdev , cfgidx) == USBD_FAIL) + if(USBD_SetClassConfig(pdev, cfgidx) == USBD_FAIL) { - USBD_CtlError(pdev , req); + USBD_CtlError(pdev, req); return; } USBD_CtlSendStatus(pdev); @@ -557,7 +570,7 @@ static void USBD_SetConfig(USBD_HandleTypeDef *pdev , break; default: - USBD_CtlError(pdev , req); + USBD_CtlError(pdev, req); break; } } @@ -570,34 +583,28 @@ static void USBD_SetConfig(USBD_HandleTypeDef *pdev , * @param req: usb request * @retval status */ -static void USBD_GetConfig(USBD_HandleTypeDef *pdev , - USBD_SetupReqTypedef *req) +static void USBD_GetConfig(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) { - - if (req->wLength != 1) + if (req->wLength != 1U) { - USBD_CtlError(pdev , req); + USBD_CtlError(pdev , req); } else { - switch (pdev->dev_state ) + switch (pdev->dev_state) { + case USBD_STATE_DEFAULT: case USBD_STATE_ADDRESSED: - pdev->dev_default_config = 0; - USBD_CtlSendData (pdev, - (uint8_t *)&pdev->dev_default_config, - 1); + pdev->dev_default_config = 0U; + USBD_CtlSendData (pdev, (uint8_t *)(void *)&pdev->dev_default_config, 1U); break; case USBD_STATE_CONFIGURED: - - USBD_CtlSendData (pdev, - (uint8_t *)&pdev->dev_config, - 1); + USBD_CtlSendData (pdev, (uint8_t *)(void *)&pdev->dev_config, 1U); break; default: - USBD_CtlError(pdev , req); + USBD_CtlError(pdev , req); break; } } @@ -610,30 +617,31 @@ static void USBD_GetConfig(USBD_HandleTypeDef *pdev , * @param req: usb request * @retval status */ -static void USBD_GetStatus(USBD_HandleTypeDef *pdev , - USBD_SetupReqTypedef *req) +static void USBD_GetStatus(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) { - - switch (pdev->dev_state) { + case USBD_STATE_DEFAULT: case USBD_STATE_ADDRESSED: case USBD_STATE_CONFIGURED: + if(req->wLength != 0x2U) + { + USBD_CtlError(pdev, req); + break; + } -#if ( USBD_SELF_POWERED == 1) +#if ( USBD_SELF_POWERED == 1U) pdev->dev_config_status = USB_CONFIG_SELF_POWERED; #else - pdev->dev_config_status = 0; + pdev->dev_config_status = 0U; #endif if (pdev->dev_remote_wakeup) { - pdev->dev_config_status |= USB_CONFIG_REMOTE_WAKEUP; + pdev->dev_config_status |= USB_CONFIG_REMOTE_WAKEUP; } - USBD_CtlSendData (pdev, - (uint8_t *)& pdev->dev_config_status, - 2); + USBD_CtlSendData (pdev, (uint8_t *)(void *)&pdev->dev_config_status, 2U); break; default : @@ -656,7 +664,7 @@ static void USBD_SetFeature(USBD_HandleTypeDef *pdev , if (req->wValue == USB_FEATURE_REMOTE_WAKEUP) { - pdev->dev_remote_wakeup = 1; + pdev->dev_remote_wakeup = 1U; pdev->pClass->Setup (pdev, req); USBD_CtlSendStatus(pdev); } @@ -676,11 +684,12 @@ static void USBD_ClrFeature(USBD_HandleTypeDef *pdev , { switch (pdev->dev_state) { + case USBD_STATE_DEFAULT: case USBD_STATE_ADDRESSED: case USBD_STATE_CONFIGURED: if (req->wValue == USB_FEATURE_REMOTE_WAKEUP) { - pdev->dev_remote_wakeup = 0; + pdev->dev_remote_wakeup = 0U; pdev->pClass->Setup (pdev, req); USBD_CtlSendStatus(pdev); } @@ -721,8 +730,8 @@ void USBD_ParseSetupRequest(USBD_SetupReqTypedef *req, uint8_t *pdata) void USBD_CtlError( USBD_HandleTypeDef *pdev , USBD_SetupReqTypedef *req) { - USBD_LL_StallEP(pdev , 0x80); - USBD_LL_StallEP(pdev , 0); + USBD_LL_StallEP(pdev , 0x80U); + USBD_LL_StallEP(pdev , 0U); } @@ -736,18 +745,18 @@ void USBD_CtlError( USBD_HandleTypeDef *pdev , */ void USBD_GetString(const uint8_t *desc, uint8_t *unicode, uint16_t *len) { - uint8_t idx = 0; + uint8_t idx = 0U; if (desc != NULL) { - *len = USBD_GetLen(desc) * 2 + 2; - unicode[idx++] = *len; - unicode[idx++] = USB_DESC_TYPE_STRING; + *len = (uint16_t)USBD_GetLen(desc) * 2U + 2U; + unicode[idx++] = *(uint8_t *)(void *)len; + unicode[idx++] = USB_DESC_TYPE_STRING; while (*desc != '\0') { unicode[idx++] = *desc++; - unicode[idx++] = 0x00; + unicode[idx++] = 0U; } } } @@ -760,7 +769,7 @@ void USBD_GetString(const uint8_t *desc, uint8_t *unicode, uint16_t *len) */ static uint8_t USBD_GetLen(const uint8_t *buf) { - uint8_t len = 0; + uint8_t len = 0U; while (*buf != '\0') { diff --git a/core/embed/trezorhal/usbd_ctlreq.h b/core/embed/trezorhal/usbd_ctlreq.h index 27e29356d..2865bda8a 100644 --- a/core/embed/trezorhal/usbd_ctlreq.h +++ b/core/embed/trezorhal/usbd_ctlreq.h @@ -4,25 +4,17 @@ ****************************************************************************** * @file usbd_req.h * @author MCD Application Team - * @version V2.4.2 - * @date 11-December-2015 * @brief Header file for the usbd_req.c file ****************************************************************************** * @attention * - *

© COPYRIGHT 2015 STMicroelectronics

+ *

© Copyright (c) 2015 STMicroelectronics. + * All rights reserved.

* - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * This software component is licensed by ST under Ultimate Liberty license + * SLA0044, the "License"; You may not use this file except in compliance with + * the License. You may obtain a copy of the License at: + * http://www.st.com/SLA0044 * ****************************************************************************** */ diff --git a/core/embed/trezorhal/usbd_def.h b/core/embed/trezorhal/usbd_def.h index 6f20975a9..1de4cfaca 100644 --- a/core/embed/trezorhal/usbd_def.h +++ b/core/embed/trezorhal/usbd_def.h @@ -4,25 +4,17 @@ ****************************************************************************** * @file usbd_def.h * @author MCD Application Team - * @version V2.4.2 - * @date 11-December-2015 * @brief General defines for the usb device library ****************************************************************************** * @attention * - *

© COPYRIGHT 2015 STMicroelectronics

+ *

© Copyright (c) 2015 STMicroelectronics. + * All rights reserved.

* - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * This software component is licensed by ST under Ultimate Liberty license + * SLA0044, the "License"; You may not use this file except in compliance with + * the License. You may obtain a copy of the License at: + * http://www.st.com/SLA0044 * ****************************************************************************** */ @@ -52,91 +44,91 @@ */ #ifndef NULL -#define NULL 0 +#define NULL 0U #endif -#define USB_LEN_DEV_QUALIFIER_DESC 0x0A -#define USB_LEN_DEV_DESC 0x12 -#define USB_LEN_CFG_DESC 0x09 -#define USB_LEN_IF_DESC 0x09 -#define USB_LEN_EP_DESC 0x07 -#define USB_LEN_OTG_DESC 0x03 -#define USB_LEN_LANGID_STR_DESC 0x04 -#define USB_LEN_OTHER_SPEED_DESC_SIZ 0x09 - -#define USBD_IDX_LANGID_STR 0x00 -#define USBD_IDX_MFC_STR 0x01 -#define USBD_IDX_PRODUCT_STR 0x02 -#define USBD_IDX_SERIAL_STR 0x03 -#define USBD_IDX_CONFIG_STR 0x04 -#define USBD_IDX_INTERFACE_STR 0x05 - -#define USB_REQ_TYPE_STANDARD 0x00 -#define USB_REQ_TYPE_CLASS 0x20 -#define USB_REQ_TYPE_VENDOR 0x40 -#define USB_REQ_TYPE_MASK 0x60 - -#define USB_REQ_RECIPIENT_DEVICE 0x00 -#define USB_REQ_RECIPIENT_INTERFACE 0x01 -#define USB_REQ_RECIPIENT_ENDPOINT 0x02 -#define USB_REQ_RECIPIENT_MASK 0x1F - -#define USB_REQ_GET_STATUS 0x00 -#define USB_REQ_CLEAR_FEATURE 0x01 -#define USB_REQ_SET_FEATURE 0x03 -#define USB_REQ_SET_ADDRESS 0x05 -#define USB_REQ_GET_DESCRIPTOR 0x06 -#define USB_REQ_SET_DESCRIPTOR 0x07 -#define USB_REQ_GET_CONFIGURATION 0x08 -#define USB_REQ_SET_CONFIGURATION 0x09 -#define USB_REQ_GET_INTERFACE 0x0A -#define USB_REQ_SET_INTERFACE 0x0B -#define USB_REQ_SYNCH_FRAME 0x0C - -#define USB_DESC_TYPE_DEVICE 1 -#define USB_DESC_TYPE_CONFIGURATION 2 -#define USB_DESC_TYPE_STRING 3 -#define USB_DESC_TYPE_INTERFACE 4 -#define USB_DESC_TYPE_ENDPOINT 5 -#define USB_DESC_TYPE_DEVICE_QUALIFIER 6 -#define USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION 7 -#define USB_DESC_TYPE_BOS 15 -#define USB_DESC_TYPE_DEVICE_CAPABILITY 16 - -#define USB_DEVICE_CAPABILITY_PLATFORM 5 - -#define USB_CONFIG_REMOTE_WAKEUP 2 -#define USB_CONFIG_SELF_POWERED 1 - -#define USB_FEATURE_EP_HALT 0 -#define USB_FEATURE_REMOTE_WAKEUP 1 -#define USB_FEATURE_TEST_MODE 2 - -#define USB_HS_MAX_PACKET_SIZE 512 -#define USB_FS_MAX_PACKET_SIZE 64 -#define USB_MAX_EP0_SIZE 64 +#define USB_LEN_DEV_QUALIFIER_DESC 0x0AU +#define USB_LEN_DEV_DESC 0x12U +#define USB_LEN_CFG_DESC 0x09U +#define USB_LEN_IF_DESC 0x09U +#define USB_LEN_EP_DESC 0x07U +#define USB_LEN_OTG_DESC 0x03U +#define USB_LEN_LANGID_STR_DESC 0x04U +#define USB_LEN_OTHER_SPEED_DESC_SIZ 0x09U + +#define USBD_IDX_LANGID_STR 0x00U +#define USBD_IDX_MFC_STR 0x01U +#define USBD_IDX_PRODUCT_STR 0x02U +#define USBD_IDX_SERIAL_STR 0x03U +#define USBD_IDX_CONFIG_STR 0x04U +#define USBD_IDX_INTERFACE_STR 0x05U + +#define USB_REQ_TYPE_STANDARD 0x00U +#define USB_REQ_TYPE_CLASS 0x20U +#define USB_REQ_TYPE_VENDOR 0x40U +#define USB_REQ_TYPE_MASK 0x60U + +#define USB_REQ_RECIPIENT_DEVICE 0x00U +#define USB_REQ_RECIPIENT_INTERFACE 0x01U +#define USB_REQ_RECIPIENT_ENDPOINT 0x02U +#define USB_REQ_RECIPIENT_MASK 0x1FU + +#define USB_REQ_GET_STATUS 0x00U +#define USB_REQ_CLEAR_FEATURE 0x01U +#define USB_REQ_SET_FEATURE 0x03U +#define USB_REQ_SET_ADDRESS 0x05U +#define USB_REQ_GET_DESCRIPTOR 0x06U +#define USB_REQ_SET_DESCRIPTOR 0x07U +#define USB_REQ_GET_CONFIGURATION 0x08U +#define USB_REQ_SET_CONFIGURATION 0x09U +#define USB_REQ_GET_INTERFACE 0x0AU +#define USB_REQ_SET_INTERFACE 0x0BU +#define USB_REQ_SYNCH_FRAME 0x0CU + +#define USB_DESC_TYPE_DEVICE 0x01U +#define USB_DESC_TYPE_CONFIGURATION 0x02U +#define USB_DESC_TYPE_STRING 0x03U +#define USB_DESC_TYPE_INTERFACE 0x04U +#define USB_DESC_TYPE_ENDPOINT 0x05U +#define USB_DESC_TYPE_DEVICE_QUALIFIER 0x06U +#define USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION 0x07U +#define USB_DESC_TYPE_BOS 0x0FU +#define USB_DESC_TYPE_DEVICE_CAPABILITY 0x10U + +#define USB_DEVICE_CAPABILITY_PLATFORM 0x05U + +#define USB_CONFIG_REMOTE_WAKEUP 0x02U +#define USB_CONFIG_SELF_POWERED 0x01U + +#define USB_FEATURE_EP_HALT 0x00U +#define USB_FEATURE_REMOTE_WAKEUP 0x01U +#define USB_FEATURE_TEST_MODE 0x02U + +#define USB_HS_MAX_PACKET_SIZE 512U +#define USB_FS_MAX_PACKET_SIZE 64U +#define USB_MAX_EP0_SIZE 64U /* Device Status */ -#define USBD_STATE_DEFAULT 1 -#define USBD_STATE_ADDRESSED 2 -#define USBD_STATE_CONFIGURED 3 -#define USBD_STATE_SUSPENDED 4 +#define USBD_STATE_DEFAULT 0x01U +#define USBD_STATE_ADDRESSED 0x02U +#define USBD_STATE_CONFIGURED 0x03U +#define USBD_STATE_SUSPENDED 0x04U /* EP0 State */ -#define USBD_EP0_IDLE 0 -#define USBD_EP0_SETUP 1 -#define USBD_EP0_DATA_IN 2 -#define USBD_EP0_DATA_OUT 3 -#define USBD_EP0_STATUS_IN 4 -#define USBD_EP0_STATUS_OUT 5 -#define USBD_EP0_STALL 6 +#define USBD_EP0_IDLE 0x00U +#define USBD_EP0_SETUP 0x01U +#define USBD_EP0_DATA_IN 0x02U +#define USBD_EP0_DATA_OUT 0x03U +#define USBD_EP0_STATUS_IN 0x04U +#define USBD_EP0_STATUS_OUT 0x05U +#define USBD_EP0_STALL 0x06U -#define USBD_EP_TYPE_CTRL 0 -#define USBD_EP_TYPE_ISOC 1 -#define USBD_EP_TYPE_BULK 2 -#define USBD_EP_TYPE_INTR 3 +#define USBD_EP_TYPE_CTRL 0x00U +#define USBD_EP_TYPE_ISOC 0x01U +#define USBD_EP_TYPE_BULK 0x02U +#define USBD_EP_TYPE_INTR 0x03U /** @@ -179,7 +171,7 @@ typedef struct _Device_cb uint8_t *(*GetFSConfigDescriptor)(uint16_t *length); uint8_t *(*GetOtherSpeedConfigDescriptor)(uint16_t *length); uint8_t *(*GetDeviceQualifierDescriptor)(uint16_t *length); -#if (USBD_SUPPORT_USER_STRING == 1) +#if (USBD_SUPPORT_USER_STRING == 1U) uint8_t *(*GetUsrStrDescriptor)(struct _USBD_HandleTypeDef *pdev ,uint8_t index, uint16_t *length); #endif @@ -188,14 +180,14 @@ typedef struct _Device_cb /* Following USB Device Speed */ typedef enum { - USBD_SPEED_HIGH = 0, - USBD_SPEED_FULL = 1, - USBD_SPEED_LOW = 2, + USBD_SPEED_HIGH = 0U, + USBD_SPEED_FULL = 1U, + USBD_SPEED_LOW = 2U, }USBD_SpeedTypeDef; /* Following USB Device status */ typedef enum { - USBD_OK = 0, + USBD_OK = 0U, USBD_BUSY, USBD_FAIL, }USBD_StatusTypeDef; @@ -210,7 +202,7 @@ typedef struct uint8_t *(*GetSerialStrDescriptor)( USBD_SpeedTypeDef speed , uint16_t *length); uint8_t *(*GetConfigurationStrDescriptor)( USBD_SpeedTypeDef speed , uint16_t *length); uint8_t *(*GetInterfaceStrDescriptor)( USBD_SpeedTypeDef speed , uint16_t *length); -#if (USBD_LPM_ENABLED == 1) +#if (USBD_LPM_ENABLED == 1U) uint8_t *(*GetBOSDescriptor)( USBD_SpeedTypeDef speed , uint16_t *length); #endif } USBD_DescriptorsTypeDef; @@ -219,6 +211,7 @@ typedef struct typedef struct { uint32_t status; + uint32_t is_used; uint32_t total_length; uint32_t rem_length; uint32_t maxpacket; @@ -261,10 +254,10 @@ typedef struct _USBD_HandleTypeDef * @{ */ #define SWAPBYTE(addr) (((uint16_t)(*((uint8_t *)(addr)))) + \ - (((uint16_t)(*(((uint8_t *)(addr)) + 1))) << 8)) + (((uint16_t)(*(((uint8_t *)(addr)) + 1U))) << 8U)) -#define LOBYTE(x) ((uint8_t)(x & 0x00FF)) -#define HIBYTE(x) ((uint8_t)((x & 0xFF00) >>8)) +#define LOBYTE(x) ((uint8_t)(x & 0x00FFU)) +#define HIBYTE(x) ((uint8_t)((x & 0xFF00U) >> 8U)) #ifndef MIN #define MIN(a, b) (((a) < (b)) ? (a) : (b)) #endif @@ -272,6 +265,7 @@ typedef struct _USBD_HandleTypeDef #define MAX(a, b) (((a) > (b)) ? (a) : (b)) #endif + #if defined ( __GNUC__ ) #ifndef __weak #define __weak __attribute__((weak)) diff --git a/core/embed/trezorhal/usbd_ioreq.c b/core/embed/trezorhal/usbd_ioreq.c index ebbdd3b15..145798deb 100644 --- a/core/embed/trezorhal/usbd_ioreq.c +++ b/core/embed/trezorhal/usbd_ioreq.c @@ -4,25 +4,17 @@ ****************************************************************************** * @file usbd_ioreq.c * @author MCD Application Team - * @version V2.4.2 - * @date 11-December-2015 * @brief This file provides the IO requests APIs for control endpoints. ****************************************************************************** * @attention * - *

© COPYRIGHT 2015 STMicroelectronics

+ *

© Copyright (c) 2015 STMicroelectronics. + * All rights reserved.

* - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * This software component is licensed by ST under Ultimate Liberty license + * SLA0044, the "License"; You may not use this file except in compliance with + * the License. You may obtain a copy of the License at: + * http://www.st.com/SLA0044 * ****************************************************************************** */ @@ -94,16 +86,16 @@ * @param len: length of data to be sent * @retval status */ -USBD_StatusTypeDef USBD_CtlSendData (USBD_HandleTypeDef *pdev, - uint8_t *pbuf, - uint16_t len) +USBD_StatusTypeDef USBD_CtlSendData (USBD_HandleTypeDef *pdev, uint8_t *pbuf, + uint16_t len) { /* Set EP0 State */ - pdev->ep0_state = USBD_EP0_DATA_IN; + pdev->ep0_state = USBD_EP0_DATA_IN; pdev->ep_in[0].total_length = len; pdev->ep_in[0].rem_length = len; + /* Start the transfer */ - USBD_LL_Transmit (pdev, 0x00, pbuf, len); + USBD_LL_Transmit (pdev, 0x00U, pbuf, len); return USBD_OK; } @@ -116,12 +108,11 @@ USBD_StatusTypeDef USBD_CtlSendData (USBD_HandleTypeDef *pdev, * @param len: length of data to be sent * @retval status */ -USBD_StatusTypeDef USBD_CtlContinueSendData (USBD_HandleTypeDef *pdev, - uint8_t *pbuf, - uint16_t len) +USBD_StatusTypeDef USBD_CtlContinueSendData (USBD_HandleTypeDef *pdev, + uint8_t *pbuf, uint16_t len) { /* Start the next transfer */ - USBD_LL_Transmit (pdev, 0x00, pbuf, len); + USBD_LL_Transmit (pdev, 0x00U, pbuf, len); return USBD_OK; } @@ -134,19 +125,16 @@ USBD_StatusTypeDef USBD_CtlContinueSendData (USBD_HandleTypeDef *pdev, * @param len: length of data to be received * @retval status */ -USBD_StatusTypeDef USBD_CtlPrepareRx (USBD_HandleTypeDef *pdev, - uint8_t *pbuf, - uint16_t len) +USBD_StatusTypeDef USBD_CtlPrepareRx (USBD_HandleTypeDef *pdev, uint8_t *pbuf, + uint16_t len) { /* Set EP0 State */ pdev->ep0_state = USBD_EP0_DATA_OUT; pdev->ep_out[0].total_length = len; pdev->ep_out[0].rem_length = len; + /* Start the transfer */ - USBD_LL_PrepareReceive (pdev, - 0, - pbuf, - len); + USBD_LL_PrepareReceive (pdev, 0U, pbuf, len); return USBD_OK; } @@ -159,31 +147,27 @@ USBD_StatusTypeDef USBD_CtlPrepareRx (USBD_HandleTypeDef *pdev, * @param len: length of data to be received * @retval status */ -USBD_StatusTypeDef USBD_CtlContinueRx (USBD_HandleTypeDef *pdev, - uint8_t *pbuf, - uint16_t len) +USBD_StatusTypeDef USBD_CtlContinueRx (USBD_HandleTypeDef *pdev, uint8_t *pbuf, + uint16_t len) { + USBD_LL_PrepareReceive(pdev, 0U, pbuf, len); - USBD_LL_PrepareReceive (pdev, - 0, - pbuf, - len); return USBD_OK; } + /** * @brief USBD_CtlSendStatus * send zero lzngth packet on the ctl pipe * @param pdev: device instance * @retval status */ -USBD_StatusTypeDef USBD_CtlSendStatus (USBD_HandleTypeDef *pdev) +USBD_StatusTypeDef USBD_CtlSendStatus (USBD_HandleTypeDef *pdev) { - /* Set EP0 State */ pdev->ep0_state = USBD_EP0_STATUS_IN; - /* Start the transfer */ - USBD_LL_Transmit (pdev, 0x00, NULL, 0); + /* Start the transfer */ + USBD_LL_Transmit(pdev, 0x00U, NULL, 0U); return USBD_OK; } @@ -194,21 +178,17 @@ USBD_StatusTypeDef USBD_CtlSendStatus (USBD_HandleTypeDef *pdev) * @param pdev: device instance * @retval status */ -USBD_StatusTypeDef USBD_CtlReceiveStatus (USBD_HandleTypeDef *pdev) +USBD_StatusTypeDef USBD_CtlReceiveStatus (USBD_HandleTypeDef *pdev) { /* Set EP0 State */ pdev->ep0_state = USBD_EP0_STATUS_OUT; /* Start the transfer */ - USBD_LL_PrepareReceive ( pdev, - 0, - NULL, - 0); + USBD_LL_PrepareReceive (pdev, 0U, NULL, 0U); return USBD_OK; } - /** * @brief USBD_GetRxCount * returns the received data length @@ -216,7 +196,7 @@ USBD_StatusTypeDef USBD_CtlReceiveStatus (USBD_HandleTypeDef *pdev) * @param ep_addr: endpoint address * @retval Rx Data blength */ -uint16_t USBD_GetRxCount (USBD_HandleTypeDef *pdev , uint8_t ep_addr) +uint32_t USBD_GetRxCount (USBD_HandleTypeDef *pdev, uint8_t ep_addr) { return USBD_LL_GetRxDataSize(pdev, ep_addr); } diff --git a/core/embed/trezorhal/usbd_ioreq.h b/core/embed/trezorhal/usbd_ioreq.h index 78e6d2f17..d6f2c5bce 100644 --- a/core/embed/trezorhal/usbd_ioreq.h +++ b/core/embed/trezorhal/usbd_ioreq.h @@ -4,25 +4,17 @@ ****************************************************************************** * @file usbd_ioreq.h * @author MCD Application Team - * @version V2.4.2 - * @date 11-December-2015 * @brief Header file for the usbd_ioreq.c file ****************************************************************************** * @attention * - *

© COPYRIGHT 2015 STMicroelectronics

+ *

© Copyright (c) 2015 STMicroelectronics. + * All rights reserved.

* - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * This software component is licensed by ST under Ultimate Liberty license + * SLA0044, the "License"; You may not use this file except in compliance with + * the License. You may obtain a copy of the License at: + * http://www.st.com/SLA0044 * ****************************************************************************** */ @@ -87,8 +79,8 @@ * @{ */ -USBD_StatusTypeDef USBD_CtlSendData (USBD_HandleTypeDef *pdev, - uint8_t *buf, +USBD_StatusTypeDef USBD_CtlSendData (USBD_HandleTypeDef *pdev, + uint8_t *pbuf, uint16_t len); USBD_StatusTypeDef USBD_CtlContinueSendData (USBD_HandleTypeDef *pdev, @@ -107,8 +99,7 @@ USBD_StatusTypeDef USBD_CtlSendStatus (USBD_HandleTypeDef *pdev); USBD_StatusTypeDef USBD_CtlReceiveStatus (USBD_HandleTypeDef *pdev); -uint16_t USBD_GetRxCount (USBD_HandleTypeDef *pdev , - uint8_t epnum); +uint32_t USBD_GetRxCount (USBD_HandleTypeDef *pdev, uint8_t ep_addr); /** * @}