File indexing completed on 2025-05-11 08:23:08
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024 #include "stm32h7xx_hal.h"
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036 #ifdef HAL_PCD_MODULE_ENABLED
0037
0038 #if defined (USB_OTG_FS) || defined (USB_OTG_HS)
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065 #if defined (USB_OTG_FS) || defined (USB_OTG_HS)
0066
0067
0068
0069
0070
0071
0072
0073 HAL_StatusTypeDef HAL_PCDEx_SetTxFiFo(PCD_HandleTypeDef *hpcd, uint8_t fifo, uint16_t size)
0074 {
0075 uint8_t i;
0076 uint32_t Tx_Offset;
0077
0078
0079
0080
0081
0082
0083
0084
0085
0086
0087
0088 Tx_Offset = hpcd->Instance->GRXFSIZ;
0089
0090 if (fifo == 0U)
0091 {
0092 hpcd->Instance->DIEPTXF0_HNPTXFSIZ = ((uint32_t)size << 16) | Tx_Offset;
0093 }
0094 else
0095 {
0096 Tx_Offset += (hpcd->Instance->DIEPTXF0_HNPTXFSIZ) >> 16;
0097 for (i = 0U; i < (fifo - 1U); i++)
0098 {
0099 Tx_Offset += (hpcd->Instance->DIEPTXF[i] >> 16);
0100 }
0101
0102
0103 hpcd->Instance->DIEPTXF[fifo - 1U] = ((uint32_t)size << 16) | Tx_Offset;
0104 }
0105
0106 return HAL_OK;
0107 }
0108
0109
0110
0111
0112
0113
0114
0115 HAL_StatusTypeDef HAL_PCDEx_SetRxFiFo(PCD_HandleTypeDef *hpcd, uint16_t size)
0116 {
0117 hpcd->Instance->GRXFSIZ = size;
0118
0119 return HAL_OK;
0120 }
0121
0122
0123
0124
0125
0126
0127 HAL_StatusTypeDef HAL_PCDEx_ActivateLPM(PCD_HandleTypeDef *hpcd)
0128 {
0129 USB_OTG_GlobalTypeDef *USBx = hpcd->Instance;
0130
0131 hpcd->lpm_active = 1U;
0132 hpcd->LPM_State = LPM_L0;
0133 USBx->GINTMSK |= USB_OTG_GINTMSK_LPMINTM;
0134 USBx->GLPMCFG |= (USB_OTG_GLPMCFG_LPMEN | USB_OTG_GLPMCFG_LPMACK | USB_OTG_GLPMCFG_ENBESL);
0135
0136 return HAL_OK;
0137 }
0138
0139
0140
0141
0142
0143
0144 HAL_StatusTypeDef HAL_PCDEx_DeActivateLPM(PCD_HandleTypeDef *hpcd)
0145 {
0146 USB_OTG_GlobalTypeDef *USBx = hpcd->Instance;
0147
0148 hpcd->lpm_active = 0U;
0149 USBx->GINTMSK &= ~USB_OTG_GINTMSK_LPMINTM;
0150 USBx->GLPMCFG &= ~(USB_OTG_GLPMCFG_LPMEN | USB_OTG_GLPMCFG_LPMACK | USB_OTG_GLPMCFG_ENBESL);
0151
0152 return HAL_OK;
0153 }
0154
0155
0156
0157
0158
0159
0160
0161 void HAL_PCDEx_BCD_VBUSDetect(PCD_HandleTypeDef *hpcd)
0162 {
0163 USB_OTG_GlobalTypeDef *USBx = hpcd->Instance;
0164 uint32_t tickstart = HAL_GetTick();
0165
0166
0167 USBx->GCCFG |= USB_OTG_GCCFG_DCDEN;
0168
0169
0170 HAL_Delay(300U);
0171
0172
0173 if ((USBx->GCCFG & USB_OTG_GCCFG_DCDET) == USB_OTG_GCCFG_DCDET)
0174 {
0175 #if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
0176 hpcd->BCDCallback(hpcd, PCD_BCD_CONTACT_DETECTION);
0177 #else
0178 HAL_PCDEx_BCD_Callback(hpcd, PCD_BCD_CONTACT_DETECTION);
0179 #endif
0180 }
0181
0182
0183
0184 USBx->GCCFG &= ~USB_OTG_GCCFG_DCDEN;
0185 HAL_Delay(50U);
0186 USBx->GCCFG |= USB_OTG_GCCFG_PDEN;
0187 HAL_Delay(50U);
0188
0189 if ((USBx->GCCFG & USB_OTG_GCCFG_PDET) == 0U)
0190 {
0191
0192 #if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
0193 hpcd->BCDCallback(hpcd, PCD_BCD_STD_DOWNSTREAM_PORT);
0194 #else
0195 HAL_PCDEx_BCD_Callback(hpcd, PCD_BCD_STD_DOWNSTREAM_PORT);
0196 #endif
0197 }
0198 else
0199 {
0200
0201
0202 USBx->GCCFG &= ~(USB_OTG_GCCFG_PDEN);
0203 HAL_Delay(50U);
0204 USBx->GCCFG |= USB_OTG_GCCFG_SDEN;
0205 HAL_Delay(50U);
0206
0207 if ((USBx->GCCFG & USB_OTG_GCCFG_SDET) == USB_OTG_GCCFG_SDET)
0208 {
0209
0210 #if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
0211 hpcd->BCDCallback(hpcd, PCD_BCD_DEDICATED_CHARGING_PORT);
0212 #else
0213 HAL_PCDEx_BCD_Callback(hpcd, PCD_BCD_DEDICATED_CHARGING_PORT);
0214 #endif
0215 }
0216 else
0217 {
0218
0219 #if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
0220 hpcd->BCDCallback(hpcd, PCD_BCD_CHARGING_DOWNSTREAM_PORT);
0221 #else
0222 HAL_PCDEx_BCD_Callback(hpcd, PCD_BCD_CHARGING_DOWNSTREAM_PORT);
0223 #endif
0224 }
0225 }
0226
0227
0228 (void)HAL_PCDEx_DeActivateBCD(hpcd);
0229
0230
0231 if ((HAL_GetTick() - tickstart) > 1000U)
0232 {
0233 #if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
0234 hpcd->BCDCallback(hpcd, PCD_BCD_ERROR);
0235 #else
0236 HAL_PCDEx_BCD_Callback(hpcd, PCD_BCD_ERROR);
0237 #endif
0238 }
0239 else
0240 {
0241 #if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
0242 hpcd->BCDCallback(hpcd, PCD_BCD_DISCOVERY_COMPLETED);
0243 #else
0244 HAL_PCDEx_BCD_Callback(hpcd, PCD_BCD_DISCOVERY_COMPLETED);
0245 #endif
0246 }
0247 }
0248
0249
0250
0251
0252
0253
0254 HAL_StatusTypeDef HAL_PCDEx_ActivateBCD(PCD_HandleTypeDef *hpcd)
0255 {
0256 USB_OTG_GlobalTypeDef *USBx = hpcd->Instance;
0257
0258 USBx->GCCFG &= ~(USB_OTG_GCCFG_PDEN);
0259 USBx->GCCFG &= ~(USB_OTG_GCCFG_SDEN);
0260
0261
0262 USBx->GCCFG &= ~(USB_OTG_GCCFG_PWRDWN);
0263
0264
0265 USBx->GCCFG |= USB_OTG_GCCFG_BCDEN;
0266
0267 hpcd->battery_charging_active = 1U;
0268
0269 return HAL_OK;
0270 }
0271
0272
0273
0274
0275
0276
0277 HAL_StatusTypeDef HAL_PCDEx_DeActivateBCD(PCD_HandleTypeDef *hpcd)
0278 {
0279 USB_OTG_GlobalTypeDef *USBx = hpcd->Instance;
0280
0281 USBx->GCCFG &= ~(USB_OTG_GCCFG_SDEN);
0282 USBx->GCCFG &= ~(USB_OTG_GCCFG_PDEN);
0283
0284
0285 USBx->GCCFG &= ~(USB_OTG_GCCFG_BCDEN);
0286
0287 hpcd->battery_charging_active = 0U;
0288
0289 return HAL_OK;
0290 }
0291
0292 #endif
0293
0294
0295
0296
0297
0298
0299
0300 __weak void HAL_PCDEx_LPM_Callback(PCD_HandleTypeDef *hpcd, PCD_LPM_MsgTypeDef msg)
0301 {
0302
0303 UNUSED(hpcd);
0304 UNUSED(msg);
0305
0306
0307
0308
0309 }
0310
0311
0312
0313
0314
0315
0316
0317 __weak void HAL_PCDEx_BCD_Callback(PCD_HandleTypeDef *hpcd, PCD_BCD_MsgTypeDef msg)
0318 {
0319
0320 UNUSED(hpcd);
0321 UNUSED(msg);
0322
0323
0324
0325
0326 }
0327
0328
0329
0330
0331
0332
0333
0334
0335 #endif
0336 #endif
0337
0338
0339
0340
0341
0342
0343
0344