USB CDC library for MBED on STM32

Dependents:   PushToGo-F429

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers usbd_conf.c Source File

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>&copy; 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