STAR
Cal STAR — firmware, DAQ server, and engine design
Loading...
Searching...
No Matches
stm32h7xx_hal_pcd_ex.c
Go to the documentation of this file.
1/**
2 ******************************************************************************
3 * @file stm32h7xx_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) 2017 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 "stm32h7xx_hal.h"
25
26/** @addtogroup STM32H7xx_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_OTG_FS) || defined (USB_OTG_HS)
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) || defined (USB_OTG_HS)
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 */
70HAL_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 */
112HAL_StatusTypeDef HAL_PCDEx_SetRxFiFo(PCD_HandleTypeDef *hpcd, uint16_t size)
113{
114 hpcd->Instance->GRXFSIZ = size;
115
116 return HAL_OK;
117}
118
119/**
120 * @brief Activate LPM feature.
121 * @param hpcd PCD handle
122 * @retval HAL status
123 */
124HAL_StatusTypeDef HAL_PCDEx_ActivateLPM(PCD_HandleTypeDef *hpcd)
125{
126 USB_OTG_GlobalTypeDef *USBx = hpcd->Instance;
127
128 hpcd->lpm_active = 1U;
129 hpcd->LPM_State = LPM_L0;
132
133 return HAL_OK;
134}
135
136/**
137 * @brief Deactivate LPM feature.
138 * @param hpcd PCD handle
139 * @retval HAL status
140 */
141HAL_StatusTypeDef HAL_PCDEx_DeActivateLPM(PCD_HandleTypeDef *hpcd)
142{
143 USB_OTG_GlobalTypeDef *USBx = hpcd->Instance;
144
145 hpcd->lpm_active = 0U;
148
149 return HAL_OK;
150}
151
152
153/**
154 * @brief Handle BatteryCharging Process.
155 * @param hpcd PCD handle
156 * @retval HAL status
157 */
158void HAL_PCDEx_BCD_VBUSDetect(PCD_HandleTypeDef *hpcd)
159{
160 USB_OTG_GlobalTypeDef *USBx = hpcd->Instance;
161 uint32_t tickstart = HAL_GetTick();
162
163 /* Enable DCD : Data Contact Detect */
164 USBx->GCCFG |= USB_OTG_GCCFG_DCDEN;
165
166 /* Wait for Min DCD Timeout */
167 HAL_Delay(300U);
168
169 /* Check Detect flag */
171 {
172#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
173 hpcd->BCDCallback(hpcd, PCD_BCD_CONTACT_DETECTION);
174#else
175 HAL_PCDEx_BCD_Callback(hpcd, PCD_BCD_CONTACT_DETECTION);
176#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
177 }
178
179 /* Primary detection: checks if connected to Standard Downstream Port
180 (without charging capability) */
182 HAL_Delay(50U);
183 USBx->GCCFG |= USB_OTG_GCCFG_PDEN;
184 HAL_Delay(50U);
185
186 if ((USBx->GCCFG & USB_OTG_GCCFG_PDET) == 0U)
187 {
188 /* Case of Standard Downstream Port */
189#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
190 hpcd->BCDCallback(hpcd, PCD_BCD_STD_DOWNSTREAM_PORT);
191#else
192 HAL_PCDEx_BCD_Callback(hpcd, PCD_BCD_STD_DOWNSTREAM_PORT);
193#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
194 }
195 else
196 {
197 /* start secondary detection to check connection to Charging Downstream
198 Port or Dedicated Charging Port */
199 USBx->GCCFG &= ~(USB_OTG_GCCFG_PDEN);
200 HAL_Delay(50U);
201 USBx->GCCFG |= USB_OTG_GCCFG_SDEN;
202 HAL_Delay(50U);
203
205 {
206 /* case Dedicated Charging Port */
207#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
208 hpcd->BCDCallback(hpcd, PCD_BCD_DEDICATED_CHARGING_PORT);
209#else
210 HAL_PCDEx_BCD_Callback(hpcd, PCD_BCD_DEDICATED_CHARGING_PORT);
211#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
212 }
213 else
214 {
215 /* case Charging Downstream Port */
216#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
217 hpcd->BCDCallback(hpcd, PCD_BCD_CHARGING_DOWNSTREAM_PORT);
218#else
219 HAL_PCDEx_BCD_Callback(hpcd, PCD_BCD_CHARGING_DOWNSTREAM_PORT);
220#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
221 }
222 }
223
224 /* Battery Charging capability discovery finished */
225 (void)HAL_PCDEx_DeActivateBCD(hpcd);
226
227 /* Check for the Timeout, else start USB Device */
228 if ((HAL_GetTick() - tickstart) > 1000U)
229 {
230#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
231 hpcd->BCDCallback(hpcd, PCD_BCD_ERROR);
232#else
233 HAL_PCDEx_BCD_Callback(hpcd, PCD_BCD_ERROR);
234#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
235 }
236 else
237 {
238#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
239 hpcd->BCDCallback(hpcd, PCD_BCD_DISCOVERY_COMPLETED);
240#else
241 HAL_PCDEx_BCD_Callback(hpcd, PCD_BCD_DISCOVERY_COMPLETED);
242#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
243 }
244}
245
246/**
247 * @brief Activate BatteryCharging feature.
248 * @param hpcd PCD handle
249 * @retval HAL status
250 */
251HAL_StatusTypeDef HAL_PCDEx_ActivateBCD(PCD_HandleTypeDef *hpcd)
252{
253 USB_OTG_GlobalTypeDef *USBx = hpcd->Instance;
254
255 USBx->GCCFG &= ~(USB_OTG_GCCFG_PDEN);
256 USBx->GCCFG &= ~(USB_OTG_GCCFG_SDEN);
257
258 /* Power Down USB transceiver */
259 USBx->GCCFG &= ~(USB_OTG_GCCFG_PWRDWN);
260
261 /* Enable Battery charging */
262 USBx->GCCFG |= USB_OTG_GCCFG_BCDEN;
263
264 hpcd->battery_charging_active = 1U;
265
266 return HAL_OK;
267}
268
269/**
270 * @brief Deactivate BatteryCharging feature.
271 * @param hpcd PCD handle
272 * @retval HAL status
273 */
274HAL_StatusTypeDef HAL_PCDEx_DeActivateBCD(PCD_HandleTypeDef *hpcd)
275{
276 USB_OTG_GlobalTypeDef *USBx = hpcd->Instance;
277
278 USBx->GCCFG &= ~(USB_OTG_GCCFG_SDEN);
279 USBx->GCCFG &= ~(USB_OTG_GCCFG_PDEN);
280
281 /* Disable Battery charging */
282 USBx->GCCFG &= ~(USB_OTG_GCCFG_BCDEN);
283
284 hpcd->battery_charging_active = 0U;
285
286 return HAL_OK;
287}
288
289#endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */
290
291/**
292 * @brief Send LPM message to user layer callback.
293 * @param hpcd PCD handle
294 * @param msg LPM message
295 * @retval HAL status
296 */
297__weak void HAL_PCDEx_LPM_Callback(PCD_HandleTypeDef *hpcd, PCD_LPM_MsgTypeDef msg)
298{
299 /* Prevent unused argument(s) compilation warning */
300 UNUSED(hpcd);
301 UNUSED(msg);
302
303 /* NOTE : This function should not be modified, when the callback is needed,
304 the HAL_PCDEx_LPM_Callback could be implemented in the user file
305 */
306}
307
308/**
309 * @brief Send BatteryCharging message to user layer callback.
310 * @param hpcd PCD handle
311 * @param msg LPM message
312 * @retval HAL status
313 */
314__weak void HAL_PCDEx_BCD_Callback(PCD_HandleTypeDef *hpcd, PCD_BCD_MsgTypeDef msg)
315{
316 /* Prevent unused argument(s) compilation warning */
317 UNUSED(hpcd);
318 UNUSED(msg);
319
320 /* NOTE : This function should not be modified, when the callback is needed,
321 the HAL_PCDEx_BCD_Callback could be implemented in the user file
322 */
323}
324
325/**
326 * @}
327 */
328
329/**
330 * @}
331 */
332#endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */
333#endif /* HAL_PCD_MODULE_ENABLED */
334
335/**
336 * @}
337 */
338
339/**
340 * @}
341 */
void HAL_Delay(uint32_t Delay)
This function provides minimum delay (in milliseconds) based on variable incremented.
uint32_t HAL_GetTick(void)
Provides a tick value in millisecond.
#define USB_OTG_GCCFG_PWRDWN
Power down.
#define USB_OTG_GLPMCFG_ENBESL
Enable best effort service latency.
#define USB_OTG_GLPMCFG_LPMACK
LPM Token acknowledge enable.
#define USB_OTG_GINTMSK_LPMINTM
LPM interrupt Mask.
#define USB_OTG_GCCFG_PDEN
Primary detection (PD) mode enable.
#define USB_OTG_GCCFG_DCDET
Data contact detection (DCD) status.
#define USB_OTG_GCCFG_BCDEN
Battery charging detector (BCD) enable.
#define USB_OTG_GCCFG_SDET
Secondary detection (SD) status.
#define USB_OTG_GCCFG_SDEN
Secondary detection (SD) mode enable.
#define USB_OTG_GCCFG_PDET
Primary detection (PD) status.
#define USB_OTG_GLPMCFG_LPMEN
LPM support enable.
#define USB_OTG_GCCFG_DCDEN
Data contact detection (DCD) mode enable.
This file contains all the functions prototypes for the HAL module driver.
HAL_StatusTypeDef
HAL Status structures definition.
@ HAL_OK
#define UNUSED(x)
USB_OTG_Core_Registers.
__IO uint32_t GINTMSK
Core Interrupt Mask Register 018h.
__IO uint32_t GCCFG
General Purpose IO Register 038h.
__IO uint32_t GLPMCFG
LPM Register 054h.