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>© 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