1 /**
2   ******************************************************************************
3   * @file    stm32f7xx_hal_pcd_ex.c
4   * @author  MCD Application Team
5   * @version V1.0.1
6   * @date    25-June-2015
7   * @brief   PCD HAL module driver.
8   *          This file provides firmware functions to manage the following
9   *          functionalities of the USB Peripheral Controller:
10   *           + Extended features functions
11   *
12   ******************************************************************************
13   * @attention
14   *
15   * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
16   *
17   * Redistribution and use in source and binary forms, with or without modification,
18   * are permitted provided that the following conditions are met:
19   *   1. Redistributions of source code must retain the above copyright notice,
20   *      this list of conditions and the following disclaimer.
21   *   2. Redistributions in binary form must reproduce the above copyright notice,
22   *      this list of conditions and the following disclaimer in the documentation
23   *      and/or other materials provided with the distribution.
24   *   3. Neither the name of STMicroelectronics nor the names of its contributors
25   *      may be used to endorse or promote products derived from this software
26   *      without specific prior written permission.
27   *
28   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
29   * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
30   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
31   * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
32   * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
33   * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
34   * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
35   * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
36   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
37   * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
38   *
39   ******************************************************************************
40   */
41 
42 /* Includes ------------------------------------------------------------------*/
43 #include "stm32f7xx_hal.h"
44 
45 /** @addtogroup STM32F7xx_HAL_Driver
46   * @{
47   */
48 
49 /** @defgroup PCDEx PCDEx
50   * @brief PCD Extended HAL module driver
51   * @{
52   */
53 #ifdef HAL_PCD_MODULE_ENABLED
54 
55 /* Private types -------------------------------------------------------------*/
56 /* Private variables ---------------------------------------------------------*/
57 /* Private constants ---------------------------------------------------------*/
58 /* Private macros ------------------------------------------------------------*/
59 /* Private functions ---------------------------------------------------------*/
60 /* Exported functions --------------------------------------------------------*/
61 
62 /** @defgroup PCDEx_Exported_Functions PCDEx Exported Functions
63   * @{
64   */
65 
66 /** @defgroup PCDEx_Exported_Functions_Group1 Peripheral Control functions
67   * @brief    PCDEx control functions
68  *
69 @verbatim
70  ===============================================================================
71                  ##### Extended features functions #####
72  ===============================================================================
73     [..]  This section provides functions allowing to:
74       (+) Update FIFO configuration
75 
76 @endverbatim
77   * @{
78   */
79 
80 /**
81   * @brief  Set Tx FIFO
82   * @param  hpcd: PCD handle
83   * @param  fifo: The number of Tx fifo
84   * @param  size: Fifo size
85   * @retval HAL status
86   */
HAL_PCDEx_SetTxFiFo(PCD_HandleTypeDef * hpcd,uint8_t fifo,uint16_t size)87 HAL_StatusTypeDef HAL_PCDEx_SetTxFiFo(PCD_HandleTypeDef *hpcd, uint8_t fifo, uint16_t size)
88 {
89     uint8_t i = 0;
90     uint32_t Tx_Offset = 0;
91 
92     /*  TXn min size = 16 words. (n  : Transmit FIFO index)
93         When a TxFIFO is not used, the Configuration should be as follows:
94             case 1 :  n > m    and Txn is not used    (n,m  : Transmit FIFO indexes)
95            --> Txm can use the space allocated for Txn.
96            case2  :  n < m    and Txn is not used    (n,m  : Transmit FIFO indexes)
97            --> Txn should be configured with the minimum space of 16 words
98        The FIFO is used optimally when used TxFIFOs are allocated in the top
99            of the FIFO.Ex: use EP1 and EP2 as IN instead of EP1 and EP3 as IN ones.
100        When DMA is used 3n * FIFO locations should be reserved for internal DMA registers */
101 
102     Tx_Offset = hpcd->Instance->GRXFSIZ;
103 
104     if (fifo == 0) {
105         hpcd->Instance->DIEPTXF0_HNPTXFSIZ = (size << 16) | Tx_Offset;
106     } else {
107         Tx_Offset += (hpcd->Instance->DIEPTXF0_HNPTXFSIZ) >> 16;
108         for (i = 0; i < (fifo - 1); i++) {
109             Tx_Offset += (hpcd->Instance->DIEPTXF[i] >> 16);
110         }
111 
112         /* Multiply Tx_Size by 2 to get higher performance */
113         hpcd->Instance->DIEPTXF[fifo - 1] = (size << 16) | Tx_Offset;
114 
115     }
116 
117     return HAL_OK;
118 }
119 
120 /**
121   * @brief  Set Rx FIFO
122   * @param  hpcd: PCD handle
123   * @param  size: Size of Rx fifo
124   * @retval HAL status
125   */
HAL_PCDEx_SetRxFiFo(PCD_HandleTypeDef * hpcd,uint16_t size)126 HAL_StatusTypeDef HAL_PCDEx_SetRxFiFo(PCD_HandleTypeDef *hpcd, uint16_t size)
127 {
128     hpcd->Instance->GRXFSIZ = size;
129 
130     return HAL_OK;
131 }
132 
133 /**
134   * @brief  HAL_PCDEx_ActivateLPM : active LPM Feature
135   * @param  hpcd: PCD handle
136   * @retval HAL status
137   */
HAL_PCDEx_ActivateLPM(PCD_HandleTypeDef * hpcd)138 HAL_StatusTypeDef HAL_PCDEx_ActivateLPM(PCD_HandleTypeDef *hpcd)
139 {
140     USB_OTG_GlobalTypeDef *USBx = hpcd->Instance;
141 
142     hpcd->lpm_active = ENABLE;
143     hpcd->LPM_State = LPM_L0;
144     USBx->GINTMSK |= USB_OTG_GINTMSK_LPMINTM;
145     USBx->GLPMCFG |= (USB_OTG_GLPMCFG_LPMEN | USB_OTG_GLPMCFG_LPMACK | USB_OTG_GLPMCFG_ENBESL);
146 
147     return HAL_OK;
148 }
149 
150 /**
151   * @brief  HAL_PCDEx_DeActivateLPM : de-active LPM feature
152   * @param  hpcd: PCD handle
153   * @retval HAL status
154   */
HAL_PCDEx_DeActivateLPM(PCD_HandleTypeDef * hpcd)155 HAL_StatusTypeDef HAL_PCDEx_DeActivateLPM(PCD_HandleTypeDef *hpcd)
156 {
157     USB_OTG_GlobalTypeDef *USBx = hpcd->Instance;
158 
159     hpcd->lpm_active = DISABLE;
160     USBx->GINTMSK &= ~USB_OTG_GINTMSK_LPMINTM;
161     USBx->GLPMCFG &= ~(USB_OTG_GLPMCFG_LPMEN | USB_OTG_GLPMCFG_LPMACK | USB_OTG_GLPMCFG_ENBESL);
162 
163     return HAL_OK;
164 }
165 
166 /**
167   * @brief  HAL_PCDEx_LPM_Callback : Send LPM message to user layer
168   * @param  hpcd: PCD handle
169   * @param  msg: LPM message
170   * @retval HAL status
171   */
HAL_PCDEx_LPM_Callback(PCD_HandleTypeDef * hpcd,PCD_LPM_MsgTypeDef msg)172 __weak void HAL_PCDEx_LPM_Callback(PCD_HandleTypeDef *hpcd, PCD_LPM_MsgTypeDef msg)
173 {
174 }
175 
176 /**
177   * @}
178   */
179 
180 /**
181   * @}
182   */
183 
184 #endif /* HAL_PCD_MODULE_ENABLED */
185 /**
186   * @}
187   */
188 
189 /**
190   * @}
191   */
192 
193 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
194