1 /**
2 ******************************************************************************
3 * @file stm32f1xx_hal_pcd_ex.c
4 * @author MCD Application Team
5 * @brief PCD Extended HAL module driver.
6 * This file provides firmware functions to manage the following
7 * functionalities of the USB Peripheral Controller:
8 * + Extended features functions
9 *
10 ******************************************************************************
11 * @attention
12 *
13 * Copyright (c) 2016 STMicroelectronics.
14 * All rights reserved.
15 *
16 * This software is licensed under terms that can be found in the LICENSE file
17 * in the root directory of this software component.
18 * If no LICENSE file comes with this software, it is provided AS-IS.
19 *
20 ******************************************************************************
21 */
22
23 /* Includes ------------------------------------------------------------------*/
24 #include "stm32f1xx_hal.h"
25
26 /** @addtogroup STM32F1xx_HAL_Driver
27 * @{
28 */
29
30 /** @defgroup PCDEx PCDEx
31 * @brief PCD Extended HAL module driver
32 * @{
33 */
34
35 #ifdef HAL_PCD_MODULE_ENABLED
36
37 #if defined (USB) || defined (USB_OTG_FS)
38 /* Private types -------------------------------------------------------------*/
39 /* Private variables ---------------------------------------------------------*/
40 /* Private constants ---------------------------------------------------------*/
41 /* Private macros ------------------------------------------------------------*/
42 /* Private functions ---------------------------------------------------------*/
43 /* Exported functions --------------------------------------------------------*/
44
45 /** @defgroup PCDEx_Exported_Functions PCDEx Exported Functions
46 * @{
47 */
48
49 /** @defgroup PCDEx_Exported_Functions_Group1 Peripheral Control functions
50 * @brief PCDEx control functions
51 *
52 @verbatim
53 ===============================================================================
54 ##### Extended features functions #####
55 ===============================================================================
56 [..] This section provides functions allowing to:
57 (+) Update FIFO configuration
58
59 @endverbatim
60 * @{
61 */
62 #if defined (USB_OTG_FS)
63 /**
64 * @brief Set Tx FIFO
65 * @param hpcd PCD handle
66 * @param fifo The number of Tx fifo
67 * @param size Fifo size
68 * @retval HAL status
69 */
HAL_PCDEx_SetTxFiFo(PCD_HandleTypeDef * hpcd,uint8_t fifo,uint16_t size)70 HAL_StatusTypeDef HAL_PCDEx_SetTxFiFo(PCD_HandleTypeDef *hpcd, uint8_t fifo, uint16_t size)
71 {
72 uint8_t i;
73 uint32_t Tx_Offset;
74
75 /* TXn min size = 16 words. (n : Transmit FIFO index)
76 When a TxFIFO is not used, the Configuration should be as follows:
77 case 1 : n > m and Txn is not used (n,m : Transmit FIFO indexes)
78 --> Txm can use the space allocated for Txn.
79 case2 : n < m and Txn is not used (n,m : Transmit FIFO indexes)
80 --> Txn should be configured with the minimum space of 16 words
81 The FIFO is used optimally when used TxFIFOs are allocated in the top
82 of the FIFO.Ex: use EP1 and EP2 as IN instead of EP1 and EP3 as IN ones.
83 When DMA is used 3n * FIFO locations should be reserved for internal DMA registers */
84
85 Tx_Offset = hpcd->Instance->GRXFSIZ;
86
87 if (fifo == 0U)
88 {
89 hpcd->Instance->DIEPTXF0_HNPTXFSIZ = ((uint32_t)size << 16) | Tx_Offset;
90 }
91 else
92 {
93 Tx_Offset += (hpcd->Instance->DIEPTXF0_HNPTXFSIZ) >> 16;
94 for (i = 0U; i < (fifo - 1U); i++)
95 {
96 Tx_Offset += (hpcd->Instance->DIEPTXF[i] >> 16);
97 }
98
99 /* Multiply Tx_Size by 2 to get higher performance */
100 hpcd->Instance->DIEPTXF[fifo - 1U] = ((uint32_t)size << 16) | Tx_Offset;
101 }
102
103 return HAL_OK;
104 }
105
106 /**
107 * @brief Set Rx FIFO
108 * @param hpcd PCD handle
109 * @param size Size of Rx fifo
110 * @retval HAL status
111 */
HAL_PCDEx_SetRxFiFo(PCD_HandleTypeDef * hpcd,uint16_t size)112 HAL_StatusTypeDef HAL_PCDEx_SetRxFiFo(PCD_HandleTypeDef *hpcd, uint16_t size)
113 {
114 hpcd->Instance->GRXFSIZ = size;
115
116 return HAL_OK;
117 }
118 #endif /* defined (USB_OTG_FS) */
119 #if defined (USB)
120 /**
121 * @brief Configure PMA for EP
122 * @param hpcd Device instance
123 * @param ep_addr endpoint address
124 * @param ep_kind endpoint Kind
125 * USB_SNG_BUF: Single Buffer used
126 * USB_DBL_BUF: Double Buffer used
127 * @param pmaadress: EP address in The PMA: In case of single buffer endpoint
128 * this parameter is 16-bit value providing the address
129 * in PMA allocated to endpoint.
130 * In case of double buffer endpoint this parameter
131 * is a 32-bit value providing the endpoint buffer 0 address
132 * in the LSB part of 32-bit value and endpoint buffer 1 address
133 * in the MSB part of 32-bit value.
134 * @retval HAL status
135 */
136
HAL_PCDEx_PMAConfig(PCD_HandleTypeDef * hpcd,uint16_t ep_addr,uint16_t ep_kind,uint32_t pmaadress)137 HAL_StatusTypeDef HAL_PCDEx_PMAConfig(PCD_HandleTypeDef *hpcd, uint16_t ep_addr,
138 uint16_t ep_kind, uint32_t pmaadress)
139 {
140 PCD_EPTypeDef *ep;
141
142 /* initialize ep structure*/
143 if ((0x80U & ep_addr) == 0x80U)
144 {
145 ep = &hpcd->IN_ep[ep_addr & EP_ADDR_MSK];
146 }
147 else
148 {
149 ep = &hpcd->OUT_ep[ep_addr];
150 }
151
152 /* Here we check if the endpoint is single or double Buffer*/
153 if (ep_kind == PCD_SNG_BUF)
154 {
155 /* Single Buffer */
156 ep->doublebuffer = 0U;
157 /* Configure the PMA */
158 ep->pmaadress = (uint16_t)pmaadress;
159 }
160 #if (USE_USB_DOUBLE_BUFFER == 1U)
161 else /* USB_DBL_BUF */
162 {
163 /* Double Buffer Endpoint */
164 ep->doublebuffer = 1U;
165 /* Configure the PMA */
166 ep->pmaaddr0 = (uint16_t)(pmaadress & 0xFFFFU);
167 ep->pmaaddr1 = (uint16_t)((pmaadress & 0xFFFF0000U) >> 16);
168 }
169 #endif /* (USE_USB_DOUBLE_BUFFER == 1U) */
170
171 return HAL_OK;
172 }
173
174 /**
175 * @brief Software Device Connection,
176 * this function is not required by USB OTG FS peripheral, it is used
177 * only by USB Device FS peripheral.
178 * @param hpcd PCD handle
179 * @param state connection state (0 : disconnected / 1: connected)
180 * @retval None
181 */
HAL_PCDEx_SetConnectionState(PCD_HandleTypeDef * hpcd,uint8_t state)182 __weak void HAL_PCDEx_SetConnectionState(PCD_HandleTypeDef *hpcd, uint8_t state)
183 {
184 /* Prevent unused argument(s) compilation warning */
185 UNUSED(hpcd);
186 UNUSED(state);
187 /* NOTE : This function Should not be modified, when the callback is needed,
188 the HAL_PCDEx_SetConnectionState could be implemented in the user file
189 */
190 }
191 #endif /* defined (USB) */
192
193 /**
194 * @brief Send LPM message to user layer callback.
195 * @param hpcd PCD handle
196 * @param msg LPM message
197 * @retval HAL status
198 */
HAL_PCDEx_LPM_Callback(PCD_HandleTypeDef * hpcd,PCD_LPM_MsgTypeDef msg)199 __weak void HAL_PCDEx_LPM_Callback(PCD_HandleTypeDef *hpcd, PCD_LPM_MsgTypeDef msg)
200 {
201 /* Prevent unused argument(s) compilation warning */
202 UNUSED(hpcd);
203 UNUSED(msg);
204
205 /* NOTE : This function should not be modified, when the callback is needed,
206 the HAL_PCDEx_LPM_Callback could be implemented in the user file
207 */
208 }
209
210 /**
211 * @brief Send BatteryCharging message to user layer callback.
212 * @param hpcd PCD handle
213 * @param msg LPM message
214 * @retval HAL status
215 */
HAL_PCDEx_BCD_Callback(PCD_HandleTypeDef * hpcd,PCD_BCD_MsgTypeDef msg)216 __weak void HAL_PCDEx_BCD_Callback(PCD_HandleTypeDef *hpcd, PCD_BCD_MsgTypeDef msg)
217 {
218 /* Prevent unused argument(s) compilation warning */
219 UNUSED(hpcd);
220 UNUSED(msg);
221
222 /* NOTE : This function should not be modified, when the callback is needed,
223 the HAL_PCDEx_BCD_Callback could be implemented in the user file
224 */
225 }
226
227 /**
228 * @}
229 */
230
231 /**
232 * @}
233 */
234 #endif /* defined (USB) || defined (USB_OTG_FS) */
235 #endif /* HAL_PCD_MODULE_ENABLED */
236
237 /**
238 * @}
239 */
240
241 /**
242 * @}
243 */
244