This example demonstrates the reading of the USB Gamepad in the Nucleo.

Dependencies:   mbed

Intro

This example demonstrates the reading of the USB Gamepad in the Nucleo.

Parts

STM32 Nucleo F446RE
USB Connector
LED 2pcs
Register 470 ohm 2pcs
Breadboard
Wires

Wiring diagram

/media/uploads/beaglescout007/nucleo_ex04_usbpad.png This circuit diagram was created by fritzing.

/media/uploads/beaglescout007/usbcon.jpg

USB con.Nucleo
GNDGND
+PA_12
-PA_11
5V5V

https://youtu.be/EYIukjwJSew

Original Library

Committer:
beaglescout007
Date:
Tue Mar 15 11:39:04 2016 +0000
Revision:
0:b5f79b4f741d
Release

Who changed what in which revision?

UserRevisionLine numberNew contents of line
beaglescout007 0:b5f79b4f741d 1 #if defined(TARGET_NUCLEO_F401RE)||defined(TARGET_NUCLEO_F411RE)||defined(TARGET_NUCLEO_F446RE)
beaglescout007 0:b5f79b4f741d 2 #include "USBHALHost.h"
beaglescout007 0:b5f79b4f741d 3
beaglescout007 0:b5f79b4f741d 4 // usbh_conf.c
beaglescout007 0:b5f79b4f741d 5 HCD_HandleTypeDef hhcd_USB_OTG_FS;
beaglescout007 0:b5f79b4f741d 6
beaglescout007 0:b5f79b4f741d 7 static void HAL_HCD_IRQHandler(HCD_HandleTypeDef *hhcd);
beaglescout007 0:b5f79b4f741d 8
beaglescout007 0:b5f79b4f741d 9 // stm32f4xx_it.c
beaglescout007 0:b5f79b4f741d 10 extern "C" {
beaglescout007 0:b5f79b4f741d 11 void OTG_FS_IRQHandler(void)
beaglescout007 0:b5f79b4f741d 12 {
beaglescout007 0:b5f79b4f741d 13 HAL_NVIC_ClearPendingIRQ(OTG_FS_IRQn);
beaglescout007 0:b5f79b4f741d 14 HAL_HCD_IRQHandler(&hhcd_USB_OTG_FS);
beaglescout007 0:b5f79b4f741d 15 }
beaglescout007 0:b5f79b4f741d 16 }
beaglescout007 0:b5f79b4f741d 17
beaglescout007 0:b5f79b4f741d 18 // stm32f4xx_hal_hcd.c
beaglescout007 0:b5f79b4f741d 19 static void HCD_HC_IN_IRQHandler(HCD_HandleTypeDef *hhcd, uint8_t chnum);
beaglescout007 0:b5f79b4f741d 20 static void HCD_HC_OUT_IRQHandler(HCD_HandleTypeDef *hhcd, uint8_t chnum);
beaglescout007 0:b5f79b4f741d 21 static void HCD_RXQLVL_IRQHandler(HCD_HandleTypeDef *hhcd);
beaglescout007 0:b5f79b4f741d 22 static void HCD_Port_IRQHandler(HCD_HandleTypeDef *hhcd);
beaglescout007 0:b5f79b4f741d 23
beaglescout007 0:b5f79b4f741d 24 /**
beaglescout007 0:b5f79b4f741d 25 * @brief This function handles HCD interrupt request.
beaglescout007 0:b5f79b4f741d 26 * @param hhcd: HCD handle
beaglescout007 0:b5f79b4f741d 27 * @retval none
beaglescout007 0:b5f79b4f741d 28 */
beaglescout007 0:b5f79b4f741d 29 static void HAL_HCD_IRQHandler(HCD_HandleTypeDef *hhcd)
beaglescout007 0:b5f79b4f741d 30 {
beaglescout007 0:b5f79b4f741d 31 USB_OTG_GlobalTypeDef *USBx = hhcd->Instance;
beaglescout007 0:b5f79b4f741d 32 uint32_t i = 0 , interrupt = 0;
beaglescout007 0:b5f79b4f741d 33
beaglescout007 0:b5f79b4f741d 34 /* ensure that we are in device mode */
beaglescout007 0:b5f79b4f741d 35 if (USB_GetMode(hhcd->Instance) == USB_OTG_MODE_HOST)
beaglescout007 0:b5f79b4f741d 36 {
beaglescout007 0:b5f79b4f741d 37 /* avoid spurious interrupt */
beaglescout007 0:b5f79b4f741d 38 if(__HAL_HCD_IS_INVALID_INTERRUPT(hhcd))
beaglescout007 0:b5f79b4f741d 39 {
beaglescout007 0:b5f79b4f741d 40 return;
beaglescout007 0:b5f79b4f741d 41 }
beaglescout007 0:b5f79b4f741d 42
beaglescout007 0:b5f79b4f741d 43 if(__HAL_HCD_GET_FLAG(hhcd, USB_OTG_GINTSTS_PXFR_INCOMPISOOUT))
beaglescout007 0:b5f79b4f741d 44 {
beaglescout007 0:b5f79b4f741d 45 /* incorrect mode, acknowledge the interrupt */
beaglescout007 0:b5f79b4f741d 46 __HAL_HCD_CLEAR_FLAG(hhcd, USB_OTG_GINTSTS_PXFR_INCOMPISOOUT);
beaglescout007 0:b5f79b4f741d 47 }
beaglescout007 0:b5f79b4f741d 48
beaglescout007 0:b5f79b4f741d 49 if(__HAL_HCD_GET_FLAG(hhcd, USB_OTG_GINTSTS_IISOIXFR))
beaglescout007 0:b5f79b4f741d 50 {
beaglescout007 0:b5f79b4f741d 51 /* incorrect mode, acknowledge the interrupt */
beaglescout007 0:b5f79b4f741d 52 __HAL_HCD_CLEAR_FLAG(hhcd, USB_OTG_GINTSTS_IISOIXFR);
beaglescout007 0:b5f79b4f741d 53 }
beaglescout007 0:b5f79b4f741d 54
beaglescout007 0:b5f79b4f741d 55 if(__HAL_HCD_GET_FLAG(hhcd, USB_OTG_GINTSTS_PTXFE))
beaglescout007 0:b5f79b4f741d 56 {
beaglescout007 0:b5f79b4f741d 57 /* incorrect mode, acknowledge the interrupt */
beaglescout007 0:b5f79b4f741d 58 __HAL_HCD_CLEAR_FLAG(hhcd, USB_OTG_GINTSTS_PTXFE);
beaglescout007 0:b5f79b4f741d 59 }
beaglescout007 0:b5f79b4f741d 60
beaglescout007 0:b5f79b4f741d 61 if(__HAL_HCD_GET_FLAG(hhcd, USB_OTG_GINTSTS_MMIS))
beaglescout007 0:b5f79b4f741d 62 {
beaglescout007 0:b5f79b4f741d 63 /* incorrect mode, acknowledge the interrupt */
beaglescout007 0:b5f79b4f741d 64 __HAL_HCD_CLEAR_FLAG(hhcd, USB_OTG_GINTSTS_MMIS);
beaglescout007 0:b5f79b4f741d 65 }
beaglescout007 0:b5f79b4f741d 66
beaglescout007 0:b5f79b4f741d 67 /* Handle Host Disconnect Interrupts */
beaglescout007 0:b5f79b4f741d 68 if(__HAL_HCD_GET_FLAG(hhcd, USB_OTG_GINTSTS_DISCINT))
beaglescout007 0:b5f79b4f741d 69 {
beaglescout007 0:b5f79b4f741d 70
beaglescout007 0:b5f79b4f741d 71 /* Cleanup HPRT */
beaglescout007 0:b5f79b4f741d 72 USBx_HPRT0 &= ~(USB_OTG_HPRT_PENA | USB_OTG_HPRT_PCDET |\
beaglescout007 0:b5f79b4f741d 73 USB_OTG_HPRT_PENCHNG | USB_OTG_HPRT_POCCHNG );
beaglescout007 0:b5f79b4f741d 74
beaglescout007 0:b5f79b4f741d 75 /* Handle Host Port Interrupts */
beaglescout007 0:b5f79b4f741d 76 HAL_HCD_Disconnect_Callback(hhcd);
beaglescout007 0:b5f79b4f741d 77 USB_InitFSLSPClkSel(hhcd->Instance ,HCFG_48_MHZ );
beaglescout007 0:b5f79b4f741d 78 __HAL_HCD_CLEAR_FLAG(hhcd, USB_OTG_GINTSTS_DISCINT);
beaglescout007 0:b5f79b4f741d 79 }
beaglescout007 0:b5f79b4f741d 80
beaglescout007 0:b5f79b4f741d 81 /* Handle Host Port Interrupts */
beaglescout007 0:b5f79b4f741d 82 if(__HAL_HCD_GET_FLAG(hhcd, USB_OTG_GINTSTS_HPRTINT))
beaglescout007 0:b5f79b4f741d 83 {
beaglescout007 0:b5f79b4f741d 84 HCD_Port_IRQHandler (hhcd);
beaglescout007 0:b5f79b4f741d 85 }
beaglescout007 0:b5f79b4f741d 86
beaglescout007 0:b5f79b4f741d 87 /* Handle Host SOF Interrupts */
beaglescout007 0:b5f79b4f741d 88 if(__HAL_HCD_GET_FLAG(hhcd, USB_OTG_GINTSTS_SOF))
beaglescout007 0:b5f79b4f741d 89 {
beaglescout007 0:b5f79b4f741d 90 HAL_HCD_SOF_Callback(hhcd);
beaglescout007 0:b5f79b4f741d 91 __HAL_HCD_CLEAR_FLAG(hhcd, USB_OTG_GINTSTS_SOF);
beaglescout007 0:b5f79b4f741d 92 }
beaglescout007 0:b5f79b4f741d 93
beaglescout007 0:b5f79b4f741d 94 /* Handle Host channel Interrupts */
beaglescout007 0:b5f79b4f741d 95 if(__HAL_HCD_GET_FLAG(hhcd, USB_OTG_GINTSTS_HCINT))
beaglescout007 0:b5f79b4f741d 96 {
beaglescout007 0:b5f79b4f741d 97
beaglescout007 0:b5f79b4f741d 98 interrupt = USB_HC_ReadInterrupt(hhcd->Instance);
beaglescout007 0:b5f79b4f741d 99 for (i = 0; i < hhcd->Init.Host_channels ; i++)
beaglescout007 0:b5f79b4f741d 100 {
beaglescout007 0:b5f79b4f741d 101 if (interrupt & (1 << i))
beaglescout007 0:b5f79b4f741d 102 {
beaglescout007 0:b5f79b4f741d 103 if ((USBx_HC(i)->HCCHAR) & USB_OTG_HCCHAR_EPDIR)
beaglescout007 0:b5f79b4f741d 104 {
beaglescout007 0:b5f79b4f741d 105 HCD_HC_IN_IRQHandler (hhcd, i);
beaglescout007 0:b5f79b4f741d 106 }
beaglescout007 0:b5f79b4f741d 107 else
beaglescout007 0:b5f79b4f741d 108 {
beaglescout007 0:b5f79b4f741d 109 HCD_HC_OUT_IRQHandler (hhcd, i);
beaglescout007 0:b5f79b4f741d 110 }
beaglescout007 0:b5f79b4f741d 111 }
beaglescout007 0:b5f79b4f741d 112 }
beaglescout007 0:b5f79b4f741d 113 __HAL_HCD_CLEAR_FLAG(hhcd, USB_OTG_GINTSTS_HCINT);
beaglescout007 0:b5f79b4f741d 114 }
beaglescout007 0:b5f79b4f741d 115
beaglescout007 0:b5f79b4f741d 116 /* Handle Rx Queue Level Interrupts */
beaglescout007 0:b5f79b4f741d 117 if(__HAL_HCD_GET_FLAG(hhcd, USB_OTG_GINTSTS_RXFLVL))
beaglescout007 0:b5f79b4f741d 118 {
beaglescout007 0:b5f79b4f741d 119 USB_MASK_INTERRUPT(hhcd->Instance, USB_OTG_GINTSTS_RXFLVL);
beaglescout007 0:b5f79b4f741d 120
beaglescout007 0:b5f79b4f741d 121 HCD_RXQLVL_IRQHandler (hhcd);
beaglescout007 0:b5f79b4f741d 122
beaglescout007 0:b5f79b4f741d 123 USB_UNMASK_INTERRUPT(hhcd->Instance, USB_OTG_GINTSTS_RXFLVL);
beaglescout007 0:b5f79b4f741d 124 }
beaglescout007 0:b5f79b4f741d 125
beaglescout007 0:b5f79b4f741d 126 }
beaglescout007 0:b5f79b4f741d 127 }
beaglescout007 0:b5f79b4f741d 128 /**
beaglescout007 0:b5f79b4f741d 129 * @brief This function handles Host Channel IN interrupt requests.
beaglescout007 0:b5f79b4f741d 130 * @param hhcd: HCD handle
beaglescout007 0:b5f79b4f741d 131 * @param chnum : Channel number
beaglescout007 0:b5f79b4f741d 132 * This parameter can be a value from 1 to 15
beaglescout007 0:b5f79b4f741d 133 * @retval none
beaglescout007 0:b5f79b4f741d 134 */
beaglescout007 0:b5f79b4f741d 135 static void HCD_HC_IN_IRQHandler (HCD_HandleTypeDef *hhcd, uint8_t chnum)
beaglescout007 0:b5f79b4f741d 136 {
beaglescout007 0:b5f79b4f741d 137 USB_OTG_GlobalTypeDef *USBx = hhcd->Instance;
beaglescout007 0:b5f79b4f741d 138
beaglescout007 0:b5f79b4f741d 139 if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_AHBERR)
beaglescout007 0:b5f79b4f741d 140 {
beaglescout007 0:b5f79b4f741d 141 __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_AHBERR);
beaglescout007 0:b5f79b4f741d 142 __HAL_HCD_UNMASK_HALT_HC_INT(chnum);
beaglescout007 0:b5f79b4f741d 143 }
beaglescout007 0:b5f79b4f741d 144 else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_ACK)
beaglescout007 0:b5f79b4f741d 145 {
beaglescout007 0:b5f79b4f741d 146 __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_ACK);
beaglescout007 0:b5f79b4f741d 147 }
beaglescout007 0:b5f79b4f741d 148
beaglescout007 0:b5f79b4f741d 149 else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_STALL)
beaglescout007 0:b5f79b4f741d 150 {
beaglescout007 0:b5f79b4f741d 151 __HAL_HCD_UNMASK_HALT_HC_INT(chnum);
beaglescout007 0:b5f79b4f741d 152 hhcd->hc[chnum].state = HC_STALL;
beaglescout007 0:b5f79b4f741d 153 __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_NAK);
beaglescout007 0:b5f79b4f741d 154 __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_STALL);
beaglescout007 0:b5f79b4f741d 155 USB_HC_Halt(hhcd->Instance, chnum);
beaglescout007 0:b5f79b4f741d 156 }
beaglescout007 0:b5f79b4f741d 157 else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_DTERR)
beaglescout007 0:b5f79b4f741d 158 {
beaglescout007 0:b5f79b4f741d 159 __HAL_HCD_UNMASK_HALT_HC_INT(chnum);
beaglescout007 0:b5f79b4f741d 160 USB_HC_Halt(hhcd->Instance, chnum);
beaglescout007 0:b5f79b4f741d 161 __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_NAK);
beaglescout007 0:b5f79b4f741d 162 hhcd->hc[chnum].state = HC_DATATGLERR;
beaglescout007 0:b5f79b4f741d 163 __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_DTERR);
beaglescout007 0:b5f79b4f741d 164 }
beaglescout007 0:b5f79b4f741d 165
beaglescout007 0:b5f79b4f741d 166 if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_FRMOR)
beaglescout007 0:b5f79b4f741d 167 {
beaglescout007 0:b5f79b4f741d 168 __HAL_HCD_UNMASK_HALT_HC_INT(chnum);
beaglescout007 0:b5f79b4f741d 169 USB_HC_Halt(hhcd->Instance, chnum);
beaglescout007 0:b5f79b4f741d 170 __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_FRMOR);
beaglescout007 0:b5f79b4f741d 171 }
beaglescout007 0:b5f79b4f741d 172
beaglescout007 0:b5f79b4f741d 173 else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_XFRC)
beaglescout007 0:b5f79b4f741d 174 {
beaglescout007 0:b5f79b4f741d 175
beaglescout007 0:b5f79b4f741d 176 if (hhcd->Init.dma_enable)
beaglescout007 0:b5f79b4f741d 177 {
beaglescout007 0:b5f79b4f741d 178 hhcd->hc[chnum].xfer_count = hhcd->hc[chnum].xfer_len - \
beaglescout007 0:b5f79b4f741d 179 (USBx_HC(chnum)->HCTSIZ & USB_OTG_HCTSIZ_XFRSIZ);
beaglescout007 0:b5f79b4f741d 180 }
beaglescout007 0:b5f79b4f741d 181
beaglescout007 0:b5f79b4f741d 182 hhcd->hc[chnum].state = HC_XFRC;
beaglescout007 0:b5f79b4f741d 183 __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_XFRC);
beaglescout007 0:b5f79b4f741d 184
beaglescout007 0:b5f79b4f741d 185
beaglescout007 0:b5f79b4f741d 186 if ((hhcd->hc[chnum].ep_type == EP_TYPE_CTRL)||
beaglescout007 0:b5f79b4f741d 187 (hhcd->hc[chnum].ep_type == EP_TYPE_BULK))
beaglescout007 0:b5f79b4f741d 188 {
beaglescout007 0:b5f79b4f741d 189 __HAL_HCD_UNMASK_HALT_HC_INT(chnum);
beaglescout007 0:b5f79b4f741d 190 USB_HC_Halt(hhcd->Instance, chnum);
beaglescout007 0:b5f79b4f741d 191 __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_NAK);
beaglescout007 0:b5f79b4f741d 192
beaglescout007 0:b5f79b4f741d 193 }
beaglescout007 0:b5f79b4f741d 194 else if(hhcd->hc[chnum].ep_type == EP_TYPE_INTR)
beaglescout007 0:b5f79b4f741d 195 {
beaglescout007 0:b5f79b4f741d 196 USBx_HC(chnum)->HCCHAR |= USB_OTG_HCCHAR_ODDFRM;
beaglescout007 0:b5f79b4f741d 197 __HAL_HCD_UNMASK_HALT_HC_INT(chnum);
beaglescout007 0:b5f79b4f741d 198 USB_HC_Halt(hhcd->Instance, chnum);
beaglescout007 0:b5f79b4f741d 199 __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_NAK);
beaglescout007 0:b5f79b4f741d 200 }
beaglescout007 0:b5f79b4f741d 201 else if(hhcd->hc[chnum].ep_type == EP_TYPE_ISOC)
beaglescout007 0:b5f79b4f741d 202 {
beaglescout007 0:b5f79b4f741d 203 USBx_HC(chnum)->HCCHAR |= USB_OTG_HCCHAR_ODDFRM;
beaglescout007 0:b5f79b4f741d 204 hhcd->hc[chnum].urb_state = URB_DONE;
beaglescout007 0:b5f79b4f741d 205 HAL_HCD_HC_NotifyURBChange_Callback(hhcd, chnum, hhcd->hc[chnum].urb_state);
beaglescout007 0:b5f79b4f741d 206 }
beaglescout007 0:b5f79b4f741d 207 hhcd->hc[chnum].toggle_in ^= 1;
beaglescout007 0:b5f79b4f741d 208
beaglescout007 0:b5f79b4f741d 209 }
beaglescout007 0:b5f79b4f741d 210 else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_CHH)
beaglescout007 0:b5f79b4f741d 211 {
beaglescout007 0:b5f79b4f741d 212 __HAL_HCD_MASK_HALT_HC_INT(chnum);
beaglescout007 0:b5f79b4f741d 213
beaglescout007 0:b5f79b4f741d 214 if(hhcd->hc[chnum].state == HC_XFRC)
beaglescout007 0:b5f79b4f741d 215 {
beaglescout007 0:b5f79b4f741d 216 hhcd->hc[chnum].urb_state = URB_DONE;
beaglescout007 0:b5f79b4f741d 217 }
beaglescout007 0:b5f79b4f741d 218
beaglescout007 0:b5f79b4f741d 219 else if (hhcd->hc[chnum].state == HC_NAK)
beaglescout007 0:b5f79b4f741d 220 {
beaglescout007 0:b5f79b4f741d 221 hhcd->hc[chnum].urb_state = URB_DONE;
beaglescout007 0:b5f79b4f741d 222 }
beaglescout007 0:b5f79b4f741d 223
beaglescout007 0:b5f79b4f741d 224 else if (hhcd->hc[chnum].state == HC_STALL)
beaglescout007 0:b5f79b4f741d 225 {
beaglescout007 0:b5f79b4f741d 226 hhcd->hc[chnum].urb_state = URB_STALL;
beaglescout007 0:b5f79b4f741d 227 }
beaglescout007 0:b5f79b4f741d 228
beaglescout007 0:b5f79b4f741d 229 else if (hhcd->hc[chnum].state == HC_XACTERR)
beaglescout007 0:b5f79b4f741d 230 {
beaglescout007 0:b5f79b4f741d 231 hhcd->hc[chnum].urb_state = URB_NOTREADY;
beaglescout007 0:b5f79b4f741d 232 }
beaglescout007 0:b5f79b4f741d 233
beaglescout007 0:b5f79b4f741d 234 else if (hhcd->hc[chnum].state == HC_DATATGLERR)
beaglescout007 0:b5f79b4f741d 235 {
beaglescout007 0:b5f79b4f741d 236 hhcd->hc[chnum].urb_state = URB_ERROR;
beaglescout007 0:b5f79b4f741d 237 }
beaglescout007 0:b5f79b4f741d 238
beaglescout007 0:b5f79b4f741d 239 __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_CHH);
beaglescout007 0:b5f79b4f741d 240 HAL_HCD_HC_NotifyURBChange_Callback(hhcd, chnum, hhcd->hc[chnum].urb_state);
beaglescout007 0:b5f79b4f741d 241 }
beaglescout007 0:b5f79b4f741d 242
beaglescout007 0:b5f79b4f741d 243 else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_TXERR)
beaglescout007 0:b5f79b4f741d 244 {
beaglescout007 0:b5f79b4f741d 245 __HAL_HCD_UNMASK_HALT_HC_INT(chnum);
beaglescout007 0:b5f79b4f741d 246 hhcd->hc[chnum].state = HC_XACTERR;
beaglescout007 0:b5f79b4f741d 247 USB_HC_Halt(hhcd->Instance, chnum);
beaglescout007 0:b5f79b4f741d 248 __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_TXERR);
beaglescout007 0:b5f79b4f741d 249 }
beaglescout007 0:b5f79b4f741d 250 else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_NAK)
beaglescout007 0:b5f79b4f741d 251 {
beaglescout007 0:b5f79b4f741d 252 if(hhcd->hc[chnum].ep_type == EP_TYPE_INTR)
beaglescout007 0:b5f79b4f741d 253 {
beaglescout007 0:b5f79b4f741d 254 __HAL_HCD_UNMASK_HALT_HC_INT(chnum);
beaglescout007 0:b5f79b4f741d 255 USB_HC_Halt(hhcd->Instance, chnum);
beaglescout007 0:b5f79b4f741d 256 }
beaglescout007 0:b5f79b4f741d 257 else if (hhcd->hc[chnum].ep_type == EP_TYPE_CTRL)
beaglescout007 0:b5f79b4f741d 258 {
beaglescout007 0:b5f79b4f741d 259 /* re-activate the channel */
beaglescout007 0:b5f79b4f741d 260 USBx_HC(chnum)->HCCHAR &= ~USB_OTG_HCCHAR_CHDIS;
beaglescout007 0:b5f79b4f741d 261 USBx_HC(chnum)->HCCHAR |= USB_OTG_HCCHAR_CHENA;
beaglescout007 0:b5f79b4f741d 262
beaglescout007 0:b5f79b4f741d 263 }
beaglescout007 0:b5f79b4f741d 264
beaglescout007 0:b5f79b4f741d 265 else if (hhcd->hc[chnum].ep_type == EP_TYPE_BULK)
beaglescout007 0:b5f79b4f741d 266 {
beaglescout007 0:b5f79b4f741d 267 __HAL_HCD_UNMASK_HALT_HC_INT(chnum);
beaglescout007 0:b5f79b4f741d 268 USB_HC_Halt(hhcd->Instance, chnum);
beaglescout007 0:b5f79b4f741d 269 }
beaglescout007 0:b5f79b4f741d 270
beaglescout007 0:b5f79b4f741d 271 hhcd->hc[chnum].state = HC_NAK;
beaglescout007 0:b5f79b4f741d 272 __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_NAK);
beaglescout007 0:b5f79b4f741d 273 }
beaglescout007 0:b5f79b4f741d 274 }
beaglescout007 0:b5f79b4f741d 275
beaglescout007 0:b5f79b4f741d 276 /**
beaglescout007 0:b5f79b4f741d 277 * @brief This function handles Host Channel OUT interrupt requests.
beaglescout007 0:b5f79b4f741d 278 * @param hhcd: HCD handle
beaglescout007 0:b5f79b4f741d 279 * @param chnum : Channel number
beaglescout007 0:b5f79b4f741d 280 * This parameter can be a value from 1 to 15
beaglescout007 0:b5f79b4f741d 281 * @retval none
beaglescout007 0:b5f79b4f741d 282 */
beaglescout007 0:b5f79b4f741d 283 static void HCD_HC_OUT_IRQHandler (HCD_HandleTypeDef *hhcd, uint8_t chnum)
beaglescout007 0:b5f79b4f741d 284 {
beaglescout007 0:b5f79b4f741d 285 USB_OTG_GlobalTypeDef *USBx = hhcd->Instance;
beaglescout007 0:b5f79b4f741d 286
beaglescout007 0:b5f79b4f741d 287 if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_AHBERR)
beaglescout007 0:b5f79b4f741d 288 {
beaglescout007 0:b5f79b4f741d 289 __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_AHBERR);
beaglescout007 0:b5f79b4f741d 290 __HAL_HCD_UNMASK_HALT_HC_INT(chnum);
beaglescout007 0:b5f79b4f741d 291 }
beaglescout007 0:b5f79b4f741d 292 else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_ACK)
beaglescout007 0:b5f79b4f741d 293 {
beaglescout007 0:b5f79b4f741d 294 __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_ACK);
beaglescout007 0:b5f79b4f741d 295
beaglescout007 0:b5f79b4f741d 296 if( hhcd->hc[chnum].do_ping == 1)
beaglescout007 0:b5f79b4f741d 297 {
beaglescout007 0:b5f79b4f741d 298 hhcd->hc[chnum].state = HC_NYET;
beaglescout007 0:b5f79b4f741d 299 __HAL_HCD_UNMASK_HALT_HC_INT(chnum);
beaglescout007 0:b5f79b4f741d 300 USB_HC_Halt(hhcd->Instance, chnum);
beaglescout007 0:b5f79b4f741d 301 hhcd->hc[chnum].urb_state = URB_NOTREADY;
beaglescout007 0:b5f79b4f741d 302 }
beaglescout007 0:b5f79b4f741d 303 }
beaglescout007 0:b5f79b4f741d 304
beaglescout007 0:b5f79b4f741d 305 else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_NYET)
beaglescout007 0:b5f79b4f741d 306 {
beaglescout007 0:b5f79b4f741d 307 hhcd->hc[chnum].state = HC_NYET;
beaglescout007 0:b5f79b4f741d 308 __HAL_HCD_UNMASK_HALT_HC_INT(chnum);
beaglescout007 0:b5f79b4f741d 309 USB_HC_Halt(hhcd->Instance, chnum);
beaglescout007 0:b5f79b4f741d 310 __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_NYET);
beaglescout007 0:b5f79b4f741d 311
beaglescout007 0:b5f79b4f741d 312 }
beaglescout007 0:b5f79b4f741d 313
beaglescout007 0:b5f79b4f741d 314 else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_FRMOR)
beaglescout007 0:b5f79b4f741d 315 {
beaglescout007 0:b5f79b4f741d 316 __HAL_HCD_UNMASK_HALT_HC_INT(chnum);
beaglescout007 0:b5f79b4f741d 317 USB_HC_Halt(hhcd->Instance, chnum);
beaglescout007 0:b5f79b4f741d 318 __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_FRMOR);
beaglescout007 0:b5f79b4f741d 319 }
beaglescout007 0:b5f79b4f741d 320
beaglescout007 0:b5f79b4f741d 321 else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_XFRC)
beaglescout007 0:b5f79b4f741d 322 {
beaglescout007 0:b5f79b4f741d 323 __HAL_HCD_UNMASK_HALT_HC_INT(chnum);
beaglescout007 0:b5f79b4f741d 324 USB_HC_Halt(hhcd->Instance, chnum);
beaglescout007 0:b5f79b4f741d 325 __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_XFRC);
beaglescout007 0:b5f79b4f741d 326 hhcd->hc[chnum].state = HC_XFRC;
beaglescout007 0:b5f79b4f741d 327
beaglescout007 0:b5f79b4f741d 328 }
beaglescout007 0:b5f79b4f741d 329
beaglescout007 0:b5f79b4f741d 330 else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_STALL)
beaglescout007 0:b5f79b4f741d 331 {
beaglescout007 0:b5f79b4f741d 332 __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_STALL);
beaglescout007 0:b5f79b4f741d 333 __HAL_HCD_UNMASK_HALT_HC_INT(chnum);
beaglescout007 0:b5f79b4f741d 334 USB_HC_Halt(hhcd->Instance, chnum);
beaglescout007 0:b5f79b4f741d 335 hhcd->hc[chnum].state = HC_STALL;
beaglescout007 0:b5f79b4f741d 336 }
beaglescout007 0:b5f79b4f741d 337
beaglescout007 0:b5f79b4f741d 338 else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_NAK)
beaglescout007 0:b5f79b4f741d 339 {
beaglescout007 0:b5f79b4f741d 340 __HAL_HCD_UNMASK_HALT_HC_INT(chnum);
beaglescout007 0:b5f79b4f741d 341 USB_HC_Halt(hhcd->Instance, chnum);
beaglescout007 0:b5f79b4f741d 342 hhcd->hc[chnum].state = HC_NAK;
beaglescout007 0:b5f79b4f741d 343 __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_NAK);
beaglescout007 0:b5f79b4f741d 344 }
beaglescout007 0:b5f79b4f741d 345
beaglescout007 0:b5f79b4f741d 346 else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_TXERR)
beaglescout007 0:b5f79b4f741d 347 {
beaglescout007 0:b5f79b4f741d 348 __HAL_HCD_UNMASK_HALT_HC_INT(chnum);
beaglescout007 0:b5f79b4f741d 349 USB_HC_Halt(hhcd->Instance, chnum);
beaglescout007 0:b5f79b4f741d 350 hhcd->hc[chnum].state = HC_XACTERR;
beaglescout007 0:b5f79b4f741d 351 __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_TXERR);
beaglescout007 0:b5f79b4f741d 352 }
beaglescout007 0:b5f79b4f741d 353
beaglescout007 0:b5f79b4f741d 354 else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_DTERR)
beaglescout007 0:b5f79b4f741d 355 {
beaglescout007 0:b5f79b4f741d 356 __HAL_HCD_UNMASK_HALT_HC_INT(chnum);
beaglescout007 0:b5f79b4f741d 357 USB_HC_Halt(hhcd->Instance, chnum);
beaglescout007 0:b5f79b4f741d 358 __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_NAK);
beaglescout007 0:b5f79b4f741d 359 __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_DTERR);
beaglescout007 0:b5f79b4f741d 360 hhcd->hc[chnum].state = HC_DATATGLERR;
beaglescout007 0:b5f79b4f741d 361 }
beaglescout007 0:b5f79b4f741d 362
beaglescout007 0:b5f79b4f741d 363
beaglescout007 0:b5f79b4f741d 364 else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_CHH)
beaglescout007 0:b5f79b4f741d 365 {
beaglescout007 0:b5f79b4f741d 366 __HAL_HCD_MASK_HALT_HC_INT(chnum);
beaglescout007 0:b5f79b4f741d 367
beaglescout007 0:b5f79b4f741d 368 if(hhcd->hc[chnum].state == HC_XFRC)
beaglescout007 0:b5f79b4f741d 369 {
beaglescout007 0:b5f79b4f741d 370 hhcd->hc[chnum].urb_state = URB_DONE;
beaglescout007 0:b5f79b4f741d 371 if (hhcd->hc[chnum].ep_type == EP_TYPE_BULK)
beaglescout007 0:b5f79b4f741d 372 {
beaglescout007 0:b5f79b4f741d 373 hhcd->hc[chnum].toggle_out ^= 1;
beaglescout007 0:b5f79b4f741d 374 }
beaglescout007 0:b5f79b4f741d 375 }
beaglescout007 0:b5f79b4f741d 376 else if (hhcd->hc[chnum].state == HC_NAK)
beaglescout007 0:b5f79b4f741d 377 {
beaglescout007 0:b5f79b4f741d 378 hhcd->hc[chnum].urb_state = URB_NOTREADY;
beaglescout007 0:b5f79b4f741d 379 }
beaglescout007 0:b5f79b4f741d 380
beaglescout007 0:b5f79b4f741d 381 else if (hhcd->hc[chnum].state == HC_NYET)
beaglescout007 0:b5f79b4f741d 382 {
beaglescout007 0:b5f79b4f741d 383 hhcd->hc[chnum].urb_state = URB_NOTREADY;
beaglescout007 0:b5f79b4f741d 384 hhcd->hc[chnum].do_ping = 0;
beaglescout007 0:b5f79b4f741d 385 }
beaglescout007 0:b5f79b4f741d 386
beaglescout007 0:b5f79b4f741d 387 else if (hhcd->hc[chnum].state == HC_STALL)
beaglescout007 0:b5f79b4f741d 388 {
beaglescout007 0:b5f79b4f741d 389 hhcd->hc[chnum].urb_state = URB_STALL;
beaglescout007 0:b5f79b4f741d 390 }
beaglescout007 0:b5f79b4f741d 391
beaglescout007 0:b5f79b4f741d 392 else if(hhcd->hc[chnum].state == HC_XACTERR)
beaglescout007 0:b5f79b4f741d 393 {
beaglescout007 0:b5f79b4f741d 394 hhcd->hc[chnum].urb_state = URB_NOTREADY;
beaglescout007 0:b5f79b4f741d 395 }
beaglescout007 0:b5f79b4f741d 396
beaglescout007 0:b5f79b4f741d 397 else if (hhcd->hc[chnum].state == HC_DATATGLERR)
beaglescout007 0:b5f79b4f741d 398 {
beaglescout007 0:b5f79b4f741d 399 hhcd->hc[chnum].urb_state = URB_ERROR;
beaglescout007 0:b5f79b4f741d 400 }
beaglescout007 0:b5f79b4f741d 401
beaglescout007 0:b5f79b4f741d 402 __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_CHH);
beaglescout007 0:b5f79b4f741d 403 HAL_HCD_HC_NotifyURBChange_Callback(hhcd, chnum, hhcd->hc[chnum].urb_state);
beaglescout007 0:b5f79b4f741d 404 }
beaglescout007 0:b5f79b4f741d 405 }
beaglescout007 0:b5f79b4f741d 406
beaglescout007 0:b5f79b4f741d 407 /**
beaglescout007 0:b5f79b4f741d 408 * @brief This function handles Rx Queue Level interrupt requests.
beaglescout007 0:b5f79b4f741d 409 * @param hhcd: HCD handle
beaglescout007 0:b5f79b4f741d 410 * @retval none
beaglescout007 0:b5f79b4f741d 411 */
beaglescout007 0:b5f79b4f741d 412 static void HCD_RXQLVL_IRQHandler (HCD_HandleTypeDef *hhcd)
beaglescout007 0:b5f79b4f741d 413 {
beaglescout007 0:b5f79b4f741d 414 USB_OTG_GlobalTypeDef *USBx = hhcd->Instance;
beaglescout007 0:b5f79b4f741d 415 uint8_t channelnum =0;
beaglescout007 0:b5f79b4f741d 416 uint32_t pktsts;
beaglescout007 0:b5f79b4f741d 417 uint32_t pktcnt;
beaglescout007 0:b5f79b4f741d 418 uint32_t temp = 0;
beaglescout007 0:b5f79b4f741d 419
beaglescout007 0:b5f79b4f741d 420 temp = hhcd->Instance->GRXSTSP ;
beaglescout007 0:b5f79b4f741d 421 channelnum = temp & USB_OTG_GRXSTSP_EPNUM;
beaglescout007 0:b5f79b4f741d 422 pktsts = (temp & USB_OTG_GRXSTSP_PKTSTS) >> 17;
beaglescout007 0:b5f79b4f741d 423 pktcnt = (temp & USB_OTG_GRXSTSP_BCNT) >> 4;
beaglescout007 0:b5f79b4f741d 424
beaglescout007 0:b5f79b4f741d 425 switch (pktsts)
beaglescout007 0:b5f79b4f741d 426 {
beaglescout007 0:b5f79b4f741d 427 case GRXSTS_PKTSTS_IN:
beaglescout007 0:b5f79b4f741d 428 /* Read the data into the host buffer. */
beaglescout007 0:b5f79b4f741d 429 if ((pktcnt > 0) && (hhcd->hc[channelnum].xfer_buff != (void *)0))
beaglescout007 0:b5f79b4f741d 430 {
beaglescout007 0:b5f79b4f741d 431
beaglescout007 0:b5f79b4f741d 432 USB_ReadPacket(hhcd->Instance, hhcd->hc[channelnum].xfer_buff, pktcnt);
beaglescout007 0:b5f79b4f741d 433
beaglescout007 0:b5f79b4f741d 434 /*manage multiple Xfer */
beaglescout007 0:b5f79b4f741d 435 hhcd->hc[channelnum].xfer_buff += pktcnt;
beaglescout007 0:b5f79b4f741d 436 hhcd->hc[channelnum].xfer_count += pktcnt;
beaglescout007 0:b5f79b4f741d 437
beaglescout007 0:b5f79b4f741d 438 if((USBx_HC(channelnum)->HCTSIZ & USB_OTG_HCTSIZ_PKTCNT) > 0)
beaglescout007 0:b5f79b4f741d 439 {
beaglescout007 0:b5f79b4f741d 440 /* re-activate the channel when more packets are expected */
beaglescout007 0:b5f79b4f741d 441 USBx_HC(channelnum)->HCCHAR &= ~USB_OTG_HCCHAR_CHDIS;
beaglescout007 0:b5f79b4f741d 442 USBx_HC(channelnum)->HCCHAR |= USB_OTG_HCCHAR_CHENA;
beaglescout007 0:b5f79b4f741d 443 hhcd->hc[channelnum].toggle_in ^= 1;
beaglescout007 0:b5f79b4f741d 444 }
beaglescout007 0:b5f79b4f741d 445 }
beaglescout007 0:b5f79b4f741d 446 break;
beaglescout007 0:b5f79b4f741d 447
beaglescout007 0:b5f79b4f741d 448 case GRXSTS_PKTSTS_DATA_TOGGLE_ERR:
beaglescout007 0:b5f79b4f741d 449 break;
beaglescout007 0:b5f79b4f741d 450 case GRXSTS_PKTSTS_IN_XFER_COMP:
beaglescout007 0:b5f79b4f741d 451 case GRXSTS_PKTSTS_CH_HALTED:
beaglescout007 0:b5f79b4f741d 452 default:
beaglescout007 0:b5f79b4f741d 453 break;
beaglescout007 0:b5f79b4f741d 454 }
beaglescout007 0:b5f79b4f741d 455 }
beaglescout007 0:b5f79b4f741d 456
beaglescout007 0:b5f79b4f741d 457 /**
beaglescout007 0:b5f79b4f741d 458 * @brief This function handles Host Port interrupt requests.
beaglescout007 0:b5f79b4f741d 459 * @param hhcd: HCD handle
beaglescout007 0:b5f79b4f741d 460 * @retval none
beaglescout007 0:b5f79b4f741d 461 */
beaglescout007 0:b5f79b4f741d 462 static void HCD_Port_IRQHandler (HCD_HandleTypeDef *hhcd)
beaglescout007 0:b5f79b4f741d 463 {
beaglescout007 0:b5f79b4f741d 464 USB_OTG_GlobalTypeDef *USBx = hhcd->Instance;
beaglescout007 0:b5f79b4f741d 465 __IO uint32_t hprt0, hprt0_dup;
beaglescout007 0:b5f79b4f741d 466
beaglescout007 0:b5f79b4f741d 467 /* Handle Host Port Interrupts */
beaglescout007 0:b5f79b4f741d 468 hprt0 = USBx_HPRT0;
beaglescout007 0:b5f79b4f741d 469 hprt0_dup = USBx_HPRT0;
beaglescout007 0:b5f79b4f741d 470
beaglescout007 0:b5f79b4f741d 471 hprt0_dup &= ~(USB_OTG_HPRT_PENA | USB_OTG_HPRT_PCDET |\
beaglescout007 0:b5f79b4f741d 472 USB_OTG_HPRT_PENCHNG | USB_OTG_HPRT_POCCHNG );
beaglescout007 0:b5f79b4f741d 473
beaglescout007 0:b5f79b4f741d 474 /* Check wether Port Connect Detected */
beaglescout007 0:b5f79b4f741d 475 if((hprt0 & USB_OTG_HPRT_PCDET) == USB_OTG_HPRT_PCDET)
beaglescout007 0:b5f79b4f741d 476 {
beaglescout007 0:b5f79b4f741d 477 if((hprt0 & USB_OTG_HPRT_PCSTS) == USB_OTG_HPRT_PCSTS)
beaglescout007 0:b5f79b4f741d 478 {
beaglescout007 0:b5f79b4f741d 479 USB_MASK_INTERRUPT(hhcd->Instance, USB_OTG_GINTSTS_DISCINT);
beaglescout007 0:b5f79b4f741d 480 HAL_HCD_Connect_Callback(hhcd);
beaglescout007 0:b5f79b4f741d 481 }
beaglescout007 0:b5f79b4f741d 482 hprt0_dup |= USB_OTG_HPRT_PCDET;
beaglescout007 0:b5f79b4f741d 483
beaglescout007 0:b5f79b4f741d 484 }
beaglescout007 0:b5f79b4f741d 485
beaglescout007 0:b5f79b4f741d 486 /* Check whether Port Enable Changed */
beaglescout007 0:b5f79b4f741d 487 if((hprt0 & USB_OTG_HPRT_PENCHNG) == USB_OTG_HPRT_PENCHNG)
beaglescout007 0:b5f79b4f741d 488 {
beaglescout007 0:b5f79b4f741d 489 hprt0_dup |= USB_OTG_HPRT_PENCHNG;
beaglescout007 0:b5f79b4f741d 490
beaglescout007 0:b5f79b4f741d 491 if((hprt0 & USB_OTG_HPRT_PENA) == USB_OTG_HPRT_PENA)
beaglescout007 0:b5f79b4f741d 492 {
beaglescout007 0:b5f79b4f741d 493 if(hhcd->Init.phy_itface == USB_OTG_EMBEDDED_PHY)
beaglescout007 0:b5f79b4f741d 494 {
beaglescout007 0:b5f79b4f741d 495 if ((hprt0 & USB_OTG_HPRT_PSPD) == (HPRT0_PRTSPD_LOW_SPEED << 17))
beaglescout007 0:b5f79b4f741d 496 {
beaglescout007 0:b5f79b4f741d 497 USB_InitFSLSPClkSel(hhcd->Instance ,HCFG_6_MHZ );
beaglescout007 0:b5f79b4f741d 498 }
beaglescout007 0:b5f79b4f741d 499 else
beaglescout007 0:b5f79b4f741d 500 {
beaglescout007 0:b5f79b4f741d 501 USB_InitFSLSPClkSel(hhcd->Instance ,HCFG_48_MHZ );
beaglescout007 0:b5f79b4f741d 502 }
beaglescout007 0:b5f79b4f741d 503 }
beaglescout007 0:b5f79b4f741d 504 else
beaglescout007 0:b5f79b4f741d 505 {
beaglescout007 0:b5f79b4f741d 506 if(hhcd->Init.speed == HCD_SPEED_FULL)
beaglescout007 0:b5f79b4f741d 507 {
beaglescout007 0:b5f79b4f741d 508 USBx_HOST->HFIR = (uint32_t)60000;
beaglescout007 0:b5f79b4f741d 509 }
beaglescout007 0:b5f79b4f741d 510 }
beaglescout007 0:b5f79b4f741d 511 HAL_HCD_Connect_Callback(hhcd);
beaglescout007 0:b5f79b4f741d 512
beaglescout007 0:b5f79b4f741d 513 if(hhcd->Init.speed == HCD_SPEED_HIGH)
beaglescout007 0:b5f79b4f741d 514 {
beaglescout007 0:b5f79b4f741d 515 USB_UNMASK_INTERRUPT(hhcd->Instance, USB_OTG_GINTSTS_DISCINT);
beaglescout007 0:b5f79b4f741d 516 }
beaglescout007 0:b5f79b4f741d 517 }
beaglescout007 0:b5f79b4f741d 518 else
beaglescout007 0:b5f79b4f741d 519 {
beaglescout007 0:b5f79b4f741d 520 /* Cleanup HPRT */
beaglescout007 0:b5f79b4f741d 521 USBx_HPRT0 &= ~(USB_OTG_HPRT_PENA | USB_OTG_HPRT_PCDET |\
beaglescout007 0:b5f79b4f741d 522 USB_OTG_HPRT_PENCHNG | USB_OTG_HPRT_POCCHNG );
beaglescout007 0:b5f79b4f741d 523
beaglescout007 0:b5f79b4f741d 524 USB_UNMASK_INTERRUPT(hhcd->Instance, USB_OTG_GINTSTS_DISCINT);
beaglescout007 0:b5f79b4f741d 525 }
beaglescout007 0:b5f79b4f741d 526 }
beaglescout007 0:b5f79b4f741d 527
beaglescout007 0:b5f79b4f741d 528 /* Check For an overcurrent */
beaglescout007 0:b5f79b4f741d 529 if((hprt0 & USB_OTG_HPRT_POCCHNG) == USB_OTG_HPRT_POCCHNG)
beaglescout007 0:b5f79b4f741d 530 {
beaglescout007 0:b5f79b4f741d 531 hprt0_dup |= USB_OTG_HPRT_POCCHNG;
beaglescout007 0:b5f79b4f741d 532 }
beaglescout007 0:b5f79b4f741d 533
beaglescout007 0:b5f79b4f741d 534 /* Clear Port Interrupts */
beaglescout007 0:b5f79b4f741d 535 USBx_HPRT0 = hprt0_dup;
beaglescout007 0:b5f79b4f741d 536 }
beaglescout007 0:b5f79b4f741d 537
beaglescout007 0:b5f79b4f741d 538 #endif
beaglescout007 0:b5f79b4f741d 539
beaglescout007 0:b5f79b4f741d 540