USB CDC library for MBED on STM32
Embed:
(wiki syntax)
Show/hide line numbers
usbd_conf.c
00001 /** 00002 ****************************************************************************** 00003 * @file usbd_conf_template.c 00004 * @author MCD Application Team 00005 * @version V2.4.2 00006 * @date 11-December-2015 00007 * @brief USB Device configuration and interface file 00008 * This template should be copied to the user folder, renamed and customized 00009 * following user needs. 00010 ****************************************************************************** 00011 * @attention 00012 * 00013 * <h2><center>© COPYRIGHT 2015 STMicroelectronics</center></h2> 00014 * 00015 * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); 00016 * You may not use this file except in compliance with the License. 00017 * You may obtain a copy of the License at: 00018 * 00019 * http://www.st.com/software_license_agreement_liberty_v2 00020 * 00021 * Unless required by applicable law or agreed to in writing, software 00022 * distributed under the License is distributed on an "AS IS" BASIS, 00023 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 00024 * See the License for the specific language governing permissions and 00025 * limitations under the License. 00026 * 00027 ****************************************************************************** 00028 */ 00029 00030 /* Includes ------------------------------------------------------------------*/ 00031 #include "usbd_core.h" 00032 #include "stm32f4xx_hal.h" 00033 #include "pinmap.h" 00034 /* Private typedef -----------------------------------------------------------*/ 00035 /* Private define ------------------------------------------------------------*/ 00036 /* Private macro -------------------------------------------------------------*/ 00037 /* Private variables ---------------------------------------------------------*/ 00038 /* Private function prototypes -----------------------------------------------*/ 00039 /* Private functions ---------------------------------------------------------*/ 00040 PCD_HandleTypeDef hpcd; 00041 void HAL_PCD_MspInit(PCD_HandleTypeDef *hpcd) 00042 { 00043 pin_function(PB_14, 00044 STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_OTG_HS_FS)); // DM 00045 pin_function(PB_15, 00046 STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_OTG_HS_FS)); // DP 00047 pin_function(PB_13, 00048 STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF12_OTG_HS_FS)); // VBUS 00049 __HAL_RCC_USB_OTG_HS_CLK_ENABLE() 00050 ; 00051 00052 NVIC_SetPriority(OTG_HS_IRQn, 1); 00053 } 00054 00055 /** 00056 * @brief DeInitializes the PCD MSP. 00057 * @param hpcd: PCD handle 00058 * @retval None 00059 */ 00060 void HAL_PCD_MspDeInit(PCD_HandleTypeDef *hpcd) 00061 { 00062 /* Disable USB FS Clocks */ 00063 __HAL_RCC_USB_OTG_HS_CLK_ENABLE() 00064 ; 00065 } 00066 00067 /******************************************************************************* 00068 LL Driver Callbacks (PCD -> USB Device Library) 00069 *******************************************************************************/ 00070 00071 /** 00072 * @brief SOF callback. 00073 * @param hpcd: PCD handle 00074 * @retval None 00075 */ 00076 void HAL_PCD_SetupStageCallback(PCD_HandleTypeDef *hpcd) 00077 { 00078 USBD_LL_SetupStage(hpcd->pData, (uint8_t *) hpcd->Setup); 00079 } 00080 00081 /** 00082 * @brief SOF callback. 00083 * @param hpcd: PCD handle 00084 * @retval None 00085 */ 00086 void HAL_PCD_DataOutStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) 00087 { 00088 USBD_LL_DataOutStage(hpcd->pData, epnum, hpcd->OUT_ep[epnum].xfer_buff); 00089 } 00090 00091 /** 00092 * @brief SOF callback. 00093 * @param hpcd: PCD handle 00094 * @retval None 00095 */ 00096 void HAL_PCD_DataInStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) 00097 { 00098 USBD_LL_DataInStage(hpcd->pData, epnum, hpcd->IN_ep[epnum].xfer_buff); 00099 } 00100 00101 /** 00102 * @brief SOF callback. 00103 * @param hpcd: PCD handle 00104 * @retval None 00105 */ 00106 void HAL_PCD_SOFCallback(PCD_HandleTypeDef *hpcd) 00107 { 00108 USBD_LL_SOF(hpcd->pData); 00109 } 00110 00111 /** 00112 * @brief SOF callback. 00113 * @param hpcd: PCD handle 00114 * @retval None 00115 */ 00116 void HAL_PCD_ResetCallback(PCD_HandleTypeDef *hpcd) 00117 { 00118 USBD_SpeedTypeDef speed = USBD_SPEED_FULL; 00119 00120 /*Set USB Current Speed*/ 00121 switch (hpcd->Init.speed) 00122 { 00123 case PCD_SPEED_HIGH: 00124 speed = USBD_SPEED_HIGH; 00125 break; 00126 00127 case PCD_SPEED_FULL: 00128 speed = USBD_SPEED_FULL; 00129 break; 00130 00131 default: 00132 speed = USBD_SPEED_FULL; 00133 break; 00134 } 00135 USBD_LL_SetSpeed(hpcd->pData, speed); 00136 00137 /*Reset Device*/ 00138 USBD_LL_Reset(hpcd->pData); 00139 } 00140 00141 /** 00142 * @brief SOF callback. 00143 * @param hpcd: PCD handle 00144 * @retval None 00145 */ 00146 void HAL_PCD_SuspendCallback(PCD_HandleTypeDef *hpcd) 00147 { 00148 USBD_LL_Suspend(hpcd->pData); 00149 } 00150 00151 /** 00152 * @brief SOF callback. 00153 * @param hpcd: PCD handle 00154 * @retval None 00155 */ 00156 void HAL_PCD_ResumeCallback(PCD_HandleTypeDef *hpcd) 00157 { 00158 USBD_LL_Resume(hpcd->pData); 00159 } 00160 00161 /** 00162 * @brief SOF callback. 00163 * @param hpcd: PCD handle 00164 * @retval None 00165 */ 00166 void HAL_PCD_ISOOUTIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) 00167 { 00168 USBD_LL_IsoOUTIncomplete(hpcd->pData, epnum); 00169 } 00170 00171 /** 00172 * @brief SOF callback. 00173 * @param hpcd: PCD handle 00174 * @retval None 00175 */ 00176 void HAL_PCD_ISOINIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) 00177 { 00178 USBD_LL_IsoINIncomplete(hpcd->pData, epnum); 00179 } 00180 00181 /** 00182 * @brief SOF callback. 00183 * @param hpcd: PCD handle 00184 * @retval None 00185 */ 00186 void HAL_PCD_ConnectCallback(PCD_HandleTypeDef *hpcd) 00187 { 00188 USBD_LL_DevConnected(hpcd->pData); 00189 } 00190 00191 /** 00192 * @brief SOF callback. 00193 * @param hpcd: PCD handle 00194 * @retval None 00195 */ 00196 void HAL_PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd) 00197 { 00198 USBD_LL_DevDisconnected(hpcd->pData); 00199 } 00200 00201 /** 00202 * @brief Initializes the Low Level portion of the Device driver. 00203 * @param pdev: Device handle 00204 * @retval USBD Status 00205 */ 00206 USBD_StatusTypeDef USBD_LL_Init(USBD_HandleTypeDef *pdev) 00207 { 00208 /*Set LL Driver parameters */ 00209 hpcd.Instance = USB_OTG_HS; 00210 hpcd.Init.dev_endpoints = 4; 00211 hpcd.Init.use_dedicated_ep1 = 0; 00212 hpcd.Init.ep0_mps = 0x40; 00213 hpcd.Init.dma_enable = 0; 00214 hpcd.Init.low_power_enable = 0; 00215 hpcd.Init.phy_itface = PCD_PHY_EMBEDDED; 00216 hpcd.Init.Sof_enable = 0; 00217 hpcd.Init.speed = PCD_SPEED_HIGH; 00218 hpcd.Init.vbus_sensing_enable = 1; 00219 /* Link The driver to the stack */ 00220 hpcd.pData = pdev; 00221 pdev->pData = &hpcd; 00222 /*Initialize LL Driver */ 00223 HAL_PCD_Init(&hpcd); 00224 00225 HAL_PCDEx_SetRxFiFo(&hpcd, 0x80); 00226 HAL_PCDEx_SetTxFiFo(&hpcd, 0, 0x40); 00227 HAL_PCDEx_SetTxFiFo(&hpcd, 1, 0x80); 00228 HAL_PCDEx_SetTxFiFo(&hpcd, 2, 0x80); 00229 HAL_PCDEx_SetTxFiFo(&hpcd, 3, 0x80); 00230 return USBD_OK; 00231 } 00232 00233 /** 00234 * @brief De-Initializes the Low Level portion of the Device driver. 00235 * @param pdev: Device handle 00236 * @retval USBD Status 00237 */ 00238 USBD_StatusTypeDef USBD_LL_DeInit(USBD_HandleTypeDef *pdev) 00239 { 00240 HAL_PCD_DeInit(pdev->pData); 00241 return USBD_OK; 00242 } 00243 00244 /** 00245 * @brief Starts the Low Level portion of the Device driver. 00246 * @param pdev: Device handle 00247 * @retval USBD Status 00248 */ 00249 USBD_StatusTypeDef USBD_LL_Start(USBD_HandleTypeDef *pdev) 00250 { 00251 HAL_PCD_Start(pdev->pData); 00252 NVIC_EnableIRQ(OTG_HS_IRQn); 00253 return USBD_OK; 00254 } 00255 00256 /** 00257 * @brief Stops the Low Level portion of the Device driver. 00258 * @param pdev: Device handle 00259 * @retval USBD Status 00260 */ 00261 USBD_StatusTypeDef USBD_LL_Stop(USBD_HandleTypeDef *pdev) 00262 { 00263 HAL_PCD_Stop(pdev->pData); 00264 NVIC_DisableIRQ(OTG_HS_IRQn); 00265 return USBD_OK; 00266 } 00267 00268 /** 00269 * @brief Opens an endpoint of the Low Level Driver. 00270 * @param pdev: Device handle 00271 * @param ep_addr: Endpoint Number 00272 * @param ep_type: Endpoint Type 00273 * @param ep_mps: Endpoint Max Packet Size 00274 * @retval USBD Status 00275 */ 00276 USBD_StatusTypeDef USBD_LL_OpenEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr, 00277 uint8_t ep_type, uint16_t ep_mps) 00278 { 00279 HAL_PCD_EP_Open(pdev->pData, ep_addr, ep_mps, ep_type); 00280 return USBD_OK; 00281 } 00282 00283 /** 00284 * @brief Closes an endpoint of the Low Level Driver. 00285 * @param pdev: Device handle 00286 * @param ep_addr: Endpoint Number 00287 * @retval USBD Status 00288 */ 00289 USBD_StatusTypeDef USBD_LL_CloseEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr) 00290 { 00291 HAL_PCD_EP_Close(pdev->pData, ep_addr); 00292 return USBD_OK; 00293 } 00294 00295 /** 00296 * @brief Flushes an endpoint of the Low Level Driver. 00297 * @param pdev: Device handle 00298 * @param ep_addr: Endpoint Number 00299 * @retval USBD Status 00300 */ 00301 USBD_StatusTypeDef USBD_LL_FlushEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr) 00302 { 00303 HAL_PCD_EP_Flush(pdev->pData, ep_addr); 00304 return USBD_OK; 00305 } 00306 00307 /** 00308 * @brief Sets a Stall condition on an endpoint of the Low Level Driver. 00309 * @param pdev: Device handle 00310 * @param ep_addr: Endpoint Number 00311 * @retval USBD Status 00312 */ 00313 USBD_StatusTypeDef USBD_LL_StallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr) 00314 { 00315 HAL_PCD_EP_SetStall(pdev->pData, ep_addr); 00316 return USBD_OK; 00317 } 00318 00319 /** 00320 * @brief Clears a Stall condition on an endpoint of the Low Level Driver. 00321 * @param pdev: Device handle 00322 * @param ep_addr: Endpoint Number 00323 * @retval USBD Status 00324 */ 00325 USBD_StatusTypeDef USBD_LL_ClearStallEP(USBD_HandleTypeDef *pdev, 00326 uint8_t ep_addr) 00327 { 00328 HAL_PCD_EP_ClrStall(pdev->pData, ep_addr); 00329 return USBD_OK; 00330 } 00331 00332 /** 00333 * @brief Returns Stall condition. 00334 * @param pdev: Device handle 00335 * @param ep_addr: Endpoint Number 00336 * @retval Stall (1: Yes, 0: No) 00337 */ 00338 uint8_t USBD_LL_IsStallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr) 00339 { 00340 PCD_HandleTypeDef *hpcd = pdev->pData; 00341 00342 if ((ep_addr & 0x80) == 0x80) 00343 { 00344 return hpcd->IN_ep[ep_addr & 0x7F].is_stall; 00345 } 00346 else 00347 { 00348 return hpcd->OUT_ep[ep_addr & 0x7F].is_stall; 00349 } 00350 return 0; 00351 } 00352 00353 /** 00354 * @brief Assigns a USB address to the device. 00355 * @param pdev: Device handle 00356 * @param ep_addr: Endpoint Number 00357 * @retval USBD Status 00358 */ 00359 USBD_StatusTypeDef USBD_LL_SetUSBAddress(USBD_HandleTypeDef *pdev, 00360 uint8_t dev_addr) 00361 { 00362 HAL_PCD_SetAddress(pdev->pData, dev_addr); 00363 return USBD_OK; 00364 } 00365 00366 /** 00367 * @brief Transmits data over an endpoint. 00368 * @param pdev: Device handle 00369 * @param ep_addr: Endpoint Number 00370 * @param pbuf: Pointer to data to be sent 00371 * @param size: Data size 00372 * @retval USBD Status 00373 */ 00374 USBD_StatusTypeDef USBD_LL_Transmit(USBD_HandleTypeDef *pdev, uint8_t ep_addr, 00375 uint8_t *pbuf, uint16_t size) 00376 { 00377 HAL_PCD_EP_Transmit(pdev->pData, ep_addr, pbuf, size); 00378 return USBD_OK; 00379 } 00380 00381 /** 00382 * @brief Prepares an endpoint for reception. 00383 * @param pdev: Device handle 00384 * @param ep_addr: Endpoint Number 00385 * @param pbuf: Pointer to data to be received 00386 * @param size: Data size 00387 * @retval USBD Status 00388 */ 00389 USBD_StatusTypeDef USBD_LL_PrepareReceive(USBD_HandleTypeDef *pdev, 00390 uint8_t ep_addr, uint8_t *pbuf, uint16_t size) 00391 { 00392 HAL_PCD_EP_Receive(pdev->pData, ep_addr, pbuf, size); 00393 return USBD_OK; 00394 } 00395 00396 /** 00397 * @brief Returns the last transferred packet size. 00398 * @param pdev: Device handle 00399 * @param ep_addr: Endpoint Number 00400 * @retval Recived Data Size 00401 */ 00402 uint32_t USBD_LL_GetRxDataSize(USBD_HandleTypeDef *pdev, uint8_t ep_addr) 00403 { 00404 return HAL_PCD_EP_GetRxCount(pdev->pData, ep_addr); 00405 } 00406 00407 /** 00408 * @brief Delays routine for the USB Device Library. 00409 * @param Delay: Delay in ms 00410 * @retval None 00411 */ 00412 void USBD_LL_Delay(uint32_t Delay) 00413 { 00414 HAL_Delay(Delay); 00415 } 00416 00417 void OTG_HS_IRQHandler(void) 00418 { 00419 HAL_PCD_IRQHandler(&hpcd); 00420 } 00421 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ 00422 00423
Generated on Thu Jul 14 2022 15:47:45 by 1.7.2