1 /**
2   ******************************************************************************
3   * @file    stm32l1xx_ll_usb.h
4   * @author  MCD Application Team
5   * @brief   Header file of USB Low Layer HAL module.
6   ******************************************************************************
7   * @attention
8   *
9   * Copyright (c) 2016 STMicroelectronics.
10   * All rights reserved.
11   *
12   * This software is licensed under terms that can be found in the LICENSE file
13   * in the root directory of this software component.
14   * If no LICENSE file comes with this software, it is provided AS-IS.
15   *
16   ******************************************************************************
17   */
18 
19 /* Define to prevent recursive inclusion -------------------------------------*/
20 #ifndef STM32L1xx_LL_USB_H
21 #define STM32L1xx_LL_USB_H
22 
23 #ifdef __cplusplus
24 extern "C" {
25 #endif /* __cplusplus */
26 
27 /* Includes ------------------------------------------------------------------*/
28 #include "stm32l1xx_hal_def.h"
29 
30 #if defined (USB)
31 /** @addtogroup STM32L1xx_HAL_Driver
32   * @{
33   */
34 
35 /** @addtogroup USB_LL
36   * @{
37   */
38 
39 /* Exported types ------------------------------------------------------------*/
40 
41 /**
42   * @brief  USB Mode definition
43   */
44 
45 typedef enum
46 {
47   USB_DEVICE_MODE = 0
48 } USB_ModeTypeDef;
49 
50 
51 /**
52   * @brief  USB Instance Initialization Structure definition
53   */
54 typedef struct
55 {
56   uint32_t dev_endpoints;           /*!< Device Endpoints number.
57                                          This parameter depends on the used USB core.
58                                          This parameter must be a number between Min_Data = 1 and Max_Data = 15 */
59 
60   uint32_t speed;                   /*!< USB Core speed.
61                                          This parameter can be any value of @ref PCD_Speed/HCD_Speed
62                                                                                  (HCD_SPEED_xxx, HCD_SPEED_xxx) */
63 
64   uint32_t ep0_mps;                 /*!< Set the Endpoint 0 Max Packet size.                                    */
65 
66   uint32_t phy_itface;              /*!< Select the used PHY interface.
67                                          This parameter can be any value of @ref PCD_PHY_Module/HCD_PHY_Module  */
68 
69   uint32_t Sof_enable;              /*!< Enable or disable the output of the SOF signal.                        */
70 
71   uint32_t low_power_enable;        /*!< Enable or disable the low Power Mode.                                  */
72 
73   uint32_t lpm_enable;              /*!< Enable or disable Link Power Management.                               */
74 
75   uint32_t battery_charging_enable; /*!< Enable or disable Battery charging.                                    */
76 } USB_CfgTypeDef;
77 
78 typedef struct
79 {
80   uint8_t   num;                  /*!< Endpoint number
81                                        This parameter must be a number between Min_Data = 1 and Max_Data = 15   */
82 
83   uint8_t   is_in;                /*!< Endpoint direction
84                                        This parameter must be a number between Min_Data = 0 and Max_Data = 1    */
85 
86   uint8_t   is_stall;             /*!< Endpoint stall condition
87                                        This parameter must be a number between Min_Data = 0 and Max_Data = 1    */
88 
89   uint8_t   type;                 /*!< Endpoint type
90                                        This parameter can be any value of @ref USB_LL_EP_Type                   */
91 
92   uint8_t   data_pid_start;       /*!< Initial data PID
93                                        This parameter must be a number between Min_Data = 0 and Max_Data = 1    */
94 
95 
96   uint16_t  pmaadress;            /*!< PMA Address
97                                        This parameter can be any value between Min_addr = 0 and Max_addr = 1K   */
98 
99   uint16_t  pmaaddr0;             /*!< PMA Address0
100                                        This parameter can be any value between Min_addr = 0 and Max_addr = 1K   */
101 
102   uint16_t  pmaaddr1;             /*!< PMA Address1
103                                        This parameter can be any value between Min_addr = 0 and Max_addr = 1K   */
104 
105   uint8_t   doublebuffer;         /*!< Double buffer enable
106                                        This parameter can be 0 or 1                                             */
107 
108 
109   uint32_t  maxpacket;            /*!< Endpoint Max packet size
110                                        This parameter must be a number between Min_Data = 0 and Max_Data = 64KB */
111 
112   uint8_t   *xfer_buff;           /*!< Pointer to transfer buffer                                               */
113 
114   uint32_t  xfer_len;             /*!< Current transfer length                                                  */
115 
116   uint32_t  xfer_count;           /*!< Partial transfer length in case of multi packet transfer                 */
117 
118   uint32_t  xfer_len_db;          /*!< double buffer transfer length used with bulk double buffer in            */
119 
120   uint8_t   xfer_fill_db;         /*!< double buffer Need to Fill new buffer  used with bulk_in                 */
121 } USB_EPTypeDef;
122 
123 /* Exported constants --------------------------------------------------------*/
124 
125 /** @defgroup PCD_Exported_Constants PCD Exported Constants
126   * @{
127   */
128 /** @defgroup USB_LL_EP0_MPS USB Low Layer EP0 MPS
129   * @{
130   */
131 #define EP_MPS_64                              0U
132 #define EP_MPS_32                              1U
133 #define EP_MPS_16                              2U
134 #define EP_MPS_8                               3U
135 /**
136   * @}
137   */
138 
139 /** @defgroup USB_LL_EP_Type USB Low Layer EP Type
140   * @{
141   */
142 #define EP_TYPE_CTRL                           0U
143 #define EP_TYPE_ISOC                           1U
144 #define EP_TYPE_BULK                           2U
145 #define EP_TYPE_INTR                           3U
146 #define EP_TYPE_MSK                            3U
147 /**
148   * @}
149   */
150 
151 /** @defgroup USB_LL Device Speed
152   * @{
153   */
154 #define USBD_FS_SPEED                          2U
155 /**
156   * @}
157   */
158 
159 
160 #define BTABLE_ADDRESS                         0x000U
161 #define PMA_ACCESS                             2U
162 
163 #ifndef USB_EP_RX_STRX
164 #define USB_EP_RX_STRX                         (0x3U << 12)
165 #endif /* USB_EP_RX_STRX */
166 
167 #define EP_ADDR_MSK                            0x7U
168 
169 #ifndef USE_USB_DOUBLE_BUFFER
170 #define USE_USB_DOUBLE_BUFFER                  1U
171 #endif /* USE_USB_DOUBLE_BUFFER */
172 
173 
174 /**
175   * @}
176   */
177 
178 /* Exported macro ------------------------------------------------------------*/
179 /**
180   * @}
181   */
182 
183 /* Exported functions --------------------------------------------------------*/
184 /** @addtogroup USB_LL_Exported_Functions USB Low Layer Exported Functions
185   * @{
186   */
187 
188 
189 HAL_StatusTypeDef USB_CoreInit(USB_TypeDef *USBx, USB_CfgTypeDef cfg);
190 HAL_StatusTypeDef USB_DevInit(USB_TypeDef *USBx, USB_CfgTypeDef cfg);
191 HAL_StatusTypeDef USB_EnableGlobalInt(USB_TypeDef *USBx);
192 HAL_StatusTypeDef USB_DisableGlobalInt(USB_TypeDef *USBx);
193 HAL_StatusTypeDef USB_SetCurrentMode(USB_TypeDef *USBx, USB_ModeTypeDef mode);
194 
195 HAL_StatusTypeDef USB_FlushRxFifo(USB_TypeDef const *USBx);
196 HAL_StatusTypeDef USB_FlushTxFifo(USB_TypeDef const *USBx, uint32_t num);
197 
198 #if defined (HAL_PCD_MODULE_ENABLED)
199 HAL_StatusTypeDef USB_ActivateEndpoint(USB_TypeDef *USBx, USB_EPTypeDef *ep);
200 HAL_StatusTypeDef USB_DeactivateEndpoint(USB_TypeDef *USBx, USB_EPTypeDef *ep);
201 HAL_StatusTypeDef USB_EPStartXfer(USB_TypeDef *USBx, USB_EPTypeDef *ep);
202 HAL_StatusTypeDef USB_EPSetStall(USB_TypeDef *USBx, USB_EPTypeDef *ep);
203 HAL_StatusTypeDef USB_EPClearStall(USB_TypeDef *USBx, USB_EPTypeDef *ep);
204 HAL_StatusTypeDef USB_EPStopXfer(USB_TypeDef *USBx, USB_EPTypeDef *ep);
205 #endif /* defined (HAL_PCD_MODULE_ENABLED) */
206 
207 HAL_StatusTypeDef USB_SetDevAddress(USB_TypeDef *USBx, uint8_t address);
208 HAL_StatusTypeDef USB_DevConnect(USB_TypeDef *USBx);
209 HAL_StatusTypeDef USB_DevDisconnect(USB_TypeDef *USBx);
210 HAL_StatusTypeDef USB_StopDevice(USB_TypeDef *USBx);
211 uint32_t          USB_ReadInterrupts(USB_TypeDef const *USBx);
212 HAL_StatusTypeDef USB_ActivateRemoteWakeup(USB_TypeDef *USBx);
213 HAL_StatusTypeDef USB_DeActivateRemoteWakeup(USB_TypeDef *USBx);
214 
215 void              USB_WritePMA(USB_TypeDef const *USBx, uint8_t *pbUsrBuf,
216                                uint16_t wPMABufAddr, uint16_t wNBytes);
217 
218 void              USB_ReadPMA(USB_TypeDef const *USBx, uint8_t *pbUsrBuf,
219                               uint16_t wPMABufAddr, uint16_t wNBytes);
220 
221 /**
222   * @}
223   */
224 
225 /**
226   * @}
227   */
228 
229 /**
230   * @}
231   */
232 
233 /**
234   * @}
235   */
236 #endif /* defined (USB) */
237 
238 #ifdef __cplusplus
239 }
240 #endif /* __cplusplus */
241 
242 
243 #endif /* STM32L1xx_LL_USB_H */
244