1 /**
2   ******************************************************************************
3   * @file    usb_bsp.c
4   * @author  MCD Application Team
5   * @version V1.0.0
6   * @date    19-September-2011
7   * @brief   This file is responsible to offer board support package and is
8   *          configurable by user.
9   ******************************************************************************
10   * @attention
11   *
12   * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
13   * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
14   * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
15   * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
16   * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
17   * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
18   *
19   * <h2><center>&copy; COPYRIGHT 2011 STMicroelectronics</center></h2>
20   ******************************************************************************
21   */
22 
23 /* Includes ------------------------------------------------------------------*/
24 #include "usb_bsp.h"
25 #include "usbd_conf.h"
26 #include "stm32f4xx_conf.h"
27 #include "stm32f4xx_gpio.h"
28 #include "stm32f4xx_exti.h"
29 #include "stm32f4xx_rcc.h"
30 #include "misc.h"
31 
32 
USB_OTG_BSP_ConfigVBUS(USB_OTG_CORE_HANDLE * pdev)33 void USB_OTG_BSP_ConfigVBUS(USB_OTG_CORE_HANDLE *pdev) {
34 
35 }
36 
USB_OTG_BSP_DriveVBUS(USB_OTG_CORE_HANDLE * pdev,uint8_t state)37 void USB_OTG_BSP_DriveVBUS(USB_OTG_CORE_HANDLE *pdev,uint8_t state) {
38 
39 }
40 
41 
42 /**
43 * @brief  USB_OTG_BSP_Init
44 *         Initilizes BSP configurations
45 * @param  None
46 * @retval None
47 */
48 
USB_OTG_BSP_Init(USB_OTG_CORE_HANDLE * pdev)49 void USB_OTG_BSP_Init(USB_OTG_CORE_HANDLE *pdev)
50 {
51   GPIO_InitTypeDef GPIO_InitStructure;
52 
53 #ifndef USE_ULPI_PHY
54 #ifdef USB_OTG_FS_LOW_PWR_MGMT_SUPPORT
55   EXTI_InitTypeDef EXTI_InitStructure;
56   NVIC_InitTypeDef NVIC_InitStructure;
57 #endif
58 #endif
59 
60 
61  #ifdef USE_USB_OTG_FS
62 
63   RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOA , ENABLE);
64 
65   /* Configure SOF VBUS ID DM DP Pins */
66   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8  |
67     GPIO_Pin_9  |
68       GPIO_Pin_11 |
69         GPIO_Pin_12;
70 
71   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
72   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
73   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
74   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
75   GPIO_Init(GPIOA, &GPIO_InitStructure);
76 
77   GPIO_PinAFConfig(GPIOA,GPIO_PinSource8,GPIO_AF_OTG1_FS) ;
78   GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_OTG1_FS) ;
79   GPIO_PinAFConfig(GPIOA,GPIO_PinSource11,GPIO_AF_OTG1_FS) ;
80   GPIO_PinAFConfig(GPIOA,GPIO_PinSource12,GPIO_AF_OTG1_FS) ;
81 
82   /* this for ID line debug */
83 
84 
85   GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_10;
86   GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
87   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;
88   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
89   GPIO_Init(GPIOA, &GPIO_InitStructure);
90   GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_OTG1_FS) ;
91 
92   RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
93   RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_OTG_FS, ENABLE) ;
94  #else // USE_USB_OTG_HS
95 
96   #ifdef USE_ULPI_PHY // ULPI
97   RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB |
98                          RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOH |
99                            RCC_AHB1Periph_GPIOI, ENABLE);
100 
101 
102   GPIO_PinAFConfig(GPIOA,GPIO_PinSource3, GPIO_AF_OTG2_HS) ; // D0
103   GPIO_PinAFConfig(GPIOA,GPIO_PinSource5, GPIO_AF_OTG2_HS) ; // CLK
104   GPIO_PinAFConfig(GPIOB,GPIO_PinSource0, GPIO_AF_OTG2_HS) ; // D1
105   GPIO_PinAFConfig(GPIOB,GPIO_PinSource1, GPIO_AF_OTG2_HS) ; // D2
106   GPIO_PinAFConfig(GPIOB,GPIO_PinSource5, GPIO_AF_OTG2_HS) ; // D7
107   GPIO_PinAFConfig(GPIOB,GPIO_PinSource10,GPIO_AF_OTG2_HS) ; // D3
108   GPIO_PinAFConfig(GPIOB,GPIO_PinSource11,GPIO_AF_OTG2_HS) ; // D4
109   GPIO_PinAFConfig(GPIOB,GPIO_PinSource12,GPIO_AF_OTG2_HS) ; // D5
110   GPIO_PinAFConfig(GPIOB,GPIO_PinSource13,GPIO_AF_OTG2_HS) ; // D6
111   GPIO_PinAFConfig(GPIOH,GPIO_PinSource4, GPIO_AF_OTG2_HS) ; // NXT
112   GPIO_PinAFConfig(GPIOI,GPIO_PinSource11,GPIO_AF_OTG2_HS) ; // DIR
113   GPIO_PinAFConfig(GPIOC,GPIO_PinSource0, GPIO_AF_OTG2_HS) ; // STP
114 
115   // CLK
116   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 ;
117   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
118   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
119   GPIO_Init(GPIOA, &GPIO_InitStructure);
120 
121   // D0
122   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3  ;
123   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
124   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
125   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
126   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
127   GPIO_Init(GPIOA, &GPIO_InitStructure);
128 
129 
130 
131   // D1 D2 D3 D4 D5 D6 D7
132   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1  |
133     GPIO_Pin_5 | GPIO_Pin_10 |
134       GPIO_Pin_11| GPIO_Pin_12 |
135         GPIO_Pin_13 ;
136 
137   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
138   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
139   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
140   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
141   GPIO_Init(GPIOB, &GPIO_InitStructure);
142 
143 
144   // STP
145   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0  ;
146   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
147   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
148   GPIO_Init(GPIOC, &GPIO_InitStructure);
149 
150   //NXT
151   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
152   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
153   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
154   GPIO_Init(GPIOH, &GPIO_InitStructure);
155 
156 
157   //DIR
158   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 ;
159   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
160   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
161   GPIO_Init(GPIOI, &GPIO_InitStructure);
162 
163 
164   RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_OTG_HS |
165                          RCC_AHB1Periph_OTG_HS_ULPI, ENABLE) ;
166 
167   #else
168    #ifdef USE_I2C_PHY
169   RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOB , ENABLE);
170   /* Configure RESET INTN SCL SDA (Phy/I2C) Pins */
171   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 |
172     GPIO_Pin_1 |
173       GPIO_Pin_10 |
174         GPIO_Pin_11;
175 
176   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
177   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
178   GPIO_Init(GPIOB, &GPIO_InitStructure);
179 
180   GPIO_PinAFConfig(GPIOB,GPIO_PinSource0,GPIO_AF_OTG2_FS) ;
181   GPIO_PinAFConfig(GPIOB,GPIO_PinSource1,GPIO_AF_OTG2_FS) ;
182   GPIO_PinAFConfig(GPIOB,GPIO_PinSource10,GPIO_AF_OTG2_FS) ;
183   GPIO_PinAFConfig(GPIOB,GPIO_PinSource11,GPIO_AF_OTG2_FS);
184   RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_OTG_HS, ENABLE) ;
185 
186    #else
187 
188   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB , ENABLE);
189 
190   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12  |
191     GPIO_Pin_13 |
192       GPIO_Pin_14 |
193         GPIO_Pin_15;
194 
195   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
196   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
197   GPIO_Init(GPIOB, &GPIO_InitStructure);
198 
199   GPIO_PinAFConfig(GPIOB,GPIO_PinSource12, GPIO_AF_OTG2_FS) ;
200   GPIO_PinAFConfig(GPIOB,GPIO_PinSource13,GPIO_AF_OTG2_FS) ;
201   GPIO_PinAFConfig(GPIOB,GPIO_PinSource14,GPIO_AF_OTG2_FS) ;
202   GPIO_PinAFConfig(GPIOB,GPIO_PinSource15,GPIO_AF_OTG2_FS) ;
203   RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_OTG_HS, ENABLE) ;
204    #endif
205   #endif // USE_ULPI_PHY
206 
207  #endif //USB_OTG_HS
208 
209 
210   /* enable the PWR clock */
211   RCC_APB1PeriphResetCmd(RCC_APB1Periph_PWR, ENABLE);
212 
213   /* Configure the Key button in EXTI mode */
214   //STM_EVAL_PBInit(BUTTON_USER, BUTTON_MODE_EXTI);
215 
216 #ifdef USB_OTG_FS_LOW_PWR_MGMT_SUPPORT
217   EXTI_ClearITPendingBit(EXTI_Line18);
218 
219   EXTI_InitStructure.EXTI_Line = EXTI_Line18;
220   EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
221   EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
222   EXTI_InitStructure.EXTI_LineCmd = ENABLE;
223   EXTI_Init(&EXTI_InitStructure);
224 
225   EXTI_ClearITPendingBit(EXTI_Line18);
226 
227   NVIC_InitStructure.NVIC_IRQChannel = OTG_FS_WKUP_IRQn;
228   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
229   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
230   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
231   NVIC_Init(&NVIC_InitStructure);
232 
233   EXTI_ClearITPendingBit(EXTI_Line18);
234 #endif
235 
236 #ifdef USB_OTG_HS_LOW_PWR_MGMT_SUPPORT
237   EXTI_ClearITPendingBit(EXTI_Line20);
238 
239   EXTI_InitStructure.EXTI_Line = EXTI_Line20;
240   EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
241   EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
242   EXTI_InitStructure.EXTI_LineCmd = ENABLE;
243   EXTI_Init(&EXTI_InitStructure);
244 
245   EXTI_ClearITPendingBit(EXTI_Line20);
246 
247   NVIC_InitStructure.NVIC_IRQChannel = OTG_HS_WKUP_IRQn;
248   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
249   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
250   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
251   NVIC_Init(&NVIC_InitStructure);
252 
253   EXTI_ClearITPendingBit(EXTI_Line20);
254 #endif
255 
256   EXTI_ClearITPendingBit(EXTI_Line0);
257 }
258 /**
259 * @brief  USB_OTG_BSP_EnableInterrupt
260 *         Enabele USB Global interrupt
261 * @param  None
262 * @retval None
263 */
USB_OTG_BSP_EnableInterrupt(USB_OTG_CORE_HANDLE * pdev)264 void USB_OTG_BSP_EnableInterrupt(USB_OTG_CORE_HANDLE *pdev)
265 {
266   NVIC_InitTypeDef NVIC_InitStructure;
267 
268   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
269 #ifdef USE_USB_OTG_HS
270   NVIC_InitStructure.NVIC_IRQChannel = OTG_HS_IRQn;
271 #else
272   NVIC_InitStructure.NVIC_IRQChannel = OTG_FS_IRQn;
273 #endif
274   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
275   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
276   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
277   NVIC_Init(&NVIC_InitStructure);
278 #ifdef USB_OTG_HS_DEDICATED_EP1_ENABLED
279   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
280   NVIC_InitStructure.NVIC_IRQChannel = OTG_HS_EP1_OUT_IRQn;
281   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
282   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
283   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
284   NVIC_Init(&NVIC_InitStructure);
285 
286   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
287   NVIC_InitStructure.NVIC_IRQChannel = OTG_HS_EP1_IN_IRQn;
288   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
289   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
290   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
291   NVIC_Init(&NVIC_InitStructure);
292 #endif
293 }
294 /**
295 * @brief  USB_OTG_BSP_uDelay
296 *         This function provides delay time in micro sec
297 * @param  usec : Value of delay required in micro sec
298 * @retval None
299 */
USB_OTG_BSP_uDelay(const uint32_t usec)300 void USB_OTG_BSP_uDelay (const uint32_t usec)
301 {
302   uint32_t count = 0;
303   const uint32_t utime = (120 * usec / 7);
304   do
305   {
306     if ( ++count > utime )
307     {
308       return ;
309     }
310   }
311   while (1);
312 }
313 
314 
315 /**
316 * @brief  USB_OTG_BSP_mDelay
317 *          This function provides delay time in milli sec
318 * @param  msec : Value of delay required in milli sec
319 * @retval None
320 */
USB_OTG_BSP_mDelay(const uint32_t msec)321 void USB_OTG_BSP_mDelay (const uint32_t msec)
322 {
323   USB_OTG_BSP_uDelay(msec * 1000);
324 }
325 /**
326 * @}
327 */
328 
329 /**
330 * @}
331 */
332 
333 /**
334 * @}
335 */
336 
337 /******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
338