HEBOCON machine

Dependencies:   mbed Motorfader Servo WT2003M03

Committer:
abanum
Date:
Mon Jul 29 05:51:31 2019 +0000
Revision:
1:312b63cf250e
Parent:
0:a30ec7d94c3a
first pubrish

Who changed what in which revision?

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