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