APM:Libraries
usb_core.c
Go to the documentation of this file.
1 
28 /* Includes ------------------------------------------------------------------*/
29 #include "usb_core.h"
30 #include "usb_bsp.h"
31 
32 #pragma GCC diagnostic ignored "-Wcast-align"
33 
97 {
98  USB_OTG_GINTMSK_TypeDef int_mask;
99 
100  int_mask.d32 = 0;
101  /* Clear any pending USB_OTG Interrupts */
102 #ifndef USE_OTG_MODE
103  USB_OTG_WRITE_REG32( &pdev->regs.GREGS->GOTGINT, 0xFFFFFFFF);
104 #endif
105  /* Clear any pending interrupts */
106  USB_OTG_WRITE_REG32( &pdev->regs.GREGS->GINTSTS, 0xBFFFFFFF);
107  /* Enable the interrupts in the INTMSK */
108  int_mask.b.wkupintr = 1;
109  int_mask.b.usbsuspend = 1;
110 
111 #ifdef USE_OTG_MODE
112  int_mask.b.otgintr = 1;
113  int_mask.b.sessreqintr = 1;
114  int_mask.b.conidstschng = 1;
115 #endif
116  USB_OTG_WRITE_REG32( &pdev->regs.GREGS->GINTMSK, int_mask.d32);
117 }
118 
125 {
126  USB_OTG_STS status = USB_OTG_OK;
127  __IO USB_OTG_GRSTCTL_TypeDef greset;
128  uint32_t count = 0;
129 
130  greset.d32 = 0;
131  /* Wait for AHB master IDLE state. */
132  do
133  {
135  greset.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GRSTCTL);
136  if (++count > 200000)
137  {
138  return USB_OTG_OK;
139  }
140  }
141  while (greset.b.ahbidle == 0);
142  /* Core Soft Reset */
143  count = 0;
144  greset.b.csftrst = 1;
145  USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GRSTCTL, greset.d32 );
146  do
147  {
148  greset.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GRSTCTL);
149  if (++count > 200000)
150  {
151  break;
152  }
153  }
154  while (greset.b.csftrst == 1);
155  /* Wait for 3 PHY Clocks*/
157  return status;
158 }
159 
170  const uint8_t *src,
171  uint8_t ch_ep_num,
172  uint16_t len)
173 {
174  USB_OTG_STS status = USB_OTG_OK;
175  if (pdev->cfg.dma_enable == 0)
176  {
177  uint32_t count32b= 0 , i= 0;
178  __IO uint32_t *fifo;
179 
180  count32b = (len + 3) / 4;
181  fifo = pdev->regs.DFIFO[ch_ep_num];
182  for (i = 0; i < count32b; i++, src+=4)
183  {
184  USB_OTG_WRITE_REG32( fifo, *((__packed uint32_t *)src) );
185  }
186  }
187  return status;
188 }
189 
190 
199  uint8_t *dest,
200  uint16_t len)
201 {
202  uint32_t i=0;
203  uint32_t count32b = (len + 3) / 4;
204 
205  __IO uint32_t *fifo = pdev->regs.DFIFO[0];
206 
207  for ( i = 0; i < count32b; i++, dest += 4 )
208  {
209  *(__packed uint32_t *)dest = USB_OTG_READ_REG32(fifo);
210 
211  }
212  return ((void *)dest);
213 }
214 
224 {
225  uint32_t i , baseAddress = 0;
226  USB_OTG_STS status = USB_OTG_OK;
227 
228  pdev->cfg.dma_enable = 0;
229 
230  /* at startup the core is in FS mode */
231  pdev->cfg.speed = USB_OTG_SPEED_FULL;
233 
234  /* initialize device cfg following its address */
235  if (coreID == USB_OTG_FS_CORE_ID)
236  {
237  baseAddress = USB_OTG_FS_BASE_ADDR;
238  pdev->cfg.coreID = USB_OTG_FS_CORE_ID;
239  pdev->cfg.host_channels = 8 ;
240  pdev->cfg.dev_endpoints = 4 ;
241  pdev->cfg.TotalFifoSize = 320; /* in 32-bits */
243 
244 #ifdef USB_OTG_FS_SOF_OUTPUT_ENABLED
245  pdev->cfg.Sof_output = 1;
246 #endif
247 
248 #ifdef USB_OTG_FS_LOW_PWR_MGMT_SUPPORT
249  pdev->cfg.low_power = 1;
250 #endif
251  }
252  else if (coreID == USB_OTG_HS_CORE_ID)
253  {
254  baseAddress = USB_OTG_HS_BASE_ADDR;
255  pdev->cfg.coreID = USB_OTG_HS_CORE_ID;
256  pdev->cfg.host_channels = 12 ;
257  pdev->cfg.dev_endpoints = 6 ;
258  pdev->cfg.TotalFifoSize = 1280;/* in 32-bits */
259 
260 #ifdef USB_OTG_ULPI_PHY_ENABLED
262 #else
263 #ifdef USB_OTG_EMBEDDED_PHY_ENABLED
265 #endif
266 #endif
267 
268 #ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
269  pdev->cfg.dma_enable = 1;
270 #endif
271 
272 #ifdef USB_OTG_HS_SOF_OUTPUT_ENABLED
273  pdev->cfg.Sof_output = 1;
274 #endif
275 
276 #ifdef USB_OTG_HS_LOW_PWR_MGMT_SUPPORT
277  pdev->cfg.low_power = 1;
278 #endif
279 
280  }
281 
282  pdev->regs.GREGS = (USB_OTG_GREGS *)(baseAddress + \
284  pdev->regs.DREGS = (USB_OTG_DREGS *) (baseAddress + \
286 
287  for (i = 0; i < pdev->cfg.dev_endpoints; i++)
288  {
289  pdev->regs.INEP_REGS[i] = (USB_OTG_INEPREGS *) \
290  (baseAddress + USB_OTG_DEV_IN_EP_REG_OFFSET + \
291  (i * USB_OTG_EP_REG_OFFSET));
292  pdev->regs.OUTEP_REGS[i] = (USB_OTG_OUTEPREGS *) \
293  (baseAddress + USB_OTG_DEV_OUT_EP_REG_OFFSET + \
294  (i * USB_OTG_EP_REG_OFFSET));
295  }
296  pdev->regs.HREGS = (USB_OTG_HREGS *)(baseAddress + \
298  pdev->regs.HPRT0 = (uint32_t *)(baseAddress + USB_OTG_HOST_PORT_REGS_OFFSET);
299 
300  for (i = 0; i < pdev->cfg.host_channels; i++)
301  {
302  pdev->regs.HC_REGS[i] = (USB_OTG_HC_REGS *)(baseAddress + \
305  }
306  for (i = 0; i < pdev->cfg.host_channels; i++)
307  {
308  pdev->regs.DFIFO[i] = (uint32_t *)(baseAddress + USB_OTG_DATA_FIFO_OFFSET +\
309  (i * USB_OTG_DATA_FIFO_SIZE));
310  }
311  pdev->regs.PCGCCTL = (uint32_t *)(baseAddress + USB_OTG_PCGCCTL_OFFSET);
312 
313  return status;
314 }
315 
316 
325 {
326  USB_OTG_STS status = USB_OTG_OK;
328  USB_OTG_GCCFG_TypeDef gccfg;
330 
331  usbcfg.d32 = 0;
332  gccfg.d32 = 0;
333  ahbcfg.d32 = 0;
334 
335 
336 
337  if (pdev->cfg.phy_itface == USB_OTG_ULPI_PHY) {
338  gccfg.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GCCFG);
339  gccfg.b.pwdn = 0;
340 
341  if (pdev->cfg.Sof_output)
342  {
343  gccfg.b.sofouten = 1;
344  }
345  USB_OTG_WRITE_REG32 (&pdev->regs.GREGS->GCCFG, gccfg.d32);
346 
347  /* Init The ULPI Interface */
348  usbcfg.d32 = 0;
349  usbcfg.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GUSBCFG);
350 
351  usbcfg.b.physel = 0; /* HS Interface */
352 #ifdef USB_OTG_INTERNAL_VBUS_ENABLED
353  usbcfg.b.ulpi_ext_vbus_drv = 0; /* Use internal VBUS */
354 #else
355 #ifdef USB_OTG_EXTERNAL_VBUS_ENABLED
356  usbcfg.b.ulpi_ext_vbus_drv = 1; /* Use external VBUS */
357 #endif
358 #endif
359  usbcfg.b.term_sel_dl_pulse = 0; /* Data line pulsing using utmi_txvalid */
360 
361  usbcfg.b.ulpi_fsls = 0;
362  usbcfg.b.ulpi_clk_sus_m = 0;
363  USB_OTG_WRITE_REG32 (&pdev->regs.GREGS->GUSBCFG, usbcfg.d32);
364 
365  /* Reset after a PHY select */
366  USB_OTG_CoreReset(pdev);
367 
368  if(pdev->cfg.dma_enable == 1) {
369 
370  ahbcfg.b.hburstlen = 5; /* 64 x 32-bits*/
371  ahbcfg.b.dmaenable = 1;
372  USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GAHBCFG, ahbcfg.d32);
373 
374  }
375  }
376  else /* FS interface (embedded Phy) */
377  {
378 
379  usbcfg.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GUSBCFG);;
380  usbcfg.b.physel = 1; /* FS Interface */
381  USB_OTG_WRITE_REG32 (&pdev->regs.GREGS->GUSBCFG, usbcfg.d32);
382  /* Reset after a PHY select and set Host mode */
383  USB_OTG_CoreReset(pdev);
384  /* Deactivate the power down*/
385  gccfg.d32 = 0;
386  gccfg.b.pwdn = 1;
387 
388  gccfg.b.vbussensingA = 1 ;
389  gccfg.b.vbussensingB = 1 ;
390 #ifndef VBUS_SENSING_ENABLED
391  gccfg.b.disablevbussensing = 1;
392 #endif
393 
394  if(pdev->cfg.Sof_output) {
395  gccfg.b.sofouten = 1;
396  }
397 
398  USB_OTG_WRITE_REG32 (&pdev->regs.GREGS->GCCFG, gccfg.d32);
399  USB_OTG_BSP_mDelay(20);
400  }
401  /* case the HS core is working in FS mode */
402  if(pdev->cfg.dma_enable == 1) {
403 
404  ahbcfg.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GAHBCFG);
405  ahbcfg.b.hburstlen = 5; /* 64 x 32-bits*/
406  ahbcfg.b.dmaenable = 1;
407  USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GAHBCFG, ahbcfg.d32);
408 
409  }
410  /* initialize OTG features */
411 #ifdef USE_OTG_MODE
412  usbcfg.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GUSBCFG);
413  usbcfg.b.hnpcap = 1;
414  usbcfg.b.srpcap = 1;
415  USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GUSBCFG, usbcfg.d32);
417 #endif
418  return status;
419 }
427 {
428  USB_OTG_STS status = USB_OTG_OK;
430 
431  ahbcfg.d32 = 0;
432  ahbcfg.b.glblintrmsk = 1; /* Enable interrupts */
433  USB_OTG_MODIFY_REG32(&pdev->regs.GREGS->GAHBCFG, 0, ahbcfg.d32);
434  return status;
435 }
436 
437 
445 {
446  USB_OTG_STS status = USB_OTG_OK;
448  ahbcfg.d32 = 0;
449  ahbcfg.b.glblintrmsk = 1; /* Enable interrupts */
450  USB_OTG_MODIFY_REG32(&pdev->regs.GREGS->GAHBCFG, ahbcfg.d32, 0);
451  return status;
452 }
453 
454 
462 {
463  USB_OTG_STS status = USB_OTG_OK;
464  __IO USB_OTG_GRSTCTL_TypeDef greset;
465 
466  uint32_t count = 0;
467  greset.d32 = 0;
468  greset.b.txfflsh = 1;
469  greset.b.txfnum = num;
470  USB_OTG_WRITE_REG32( &pdev->regs.GREGS->GRSTCTL, greset.d32 );
471  do
472  {
473  greset.d32 = USB_OTG_READ_REG32( &pdev->regs.GREGS->GRSTCTL);
474  if (++count > 200000)
475  {
476  break;
477  }
478  }
479  while (greset.b.txfflsh == 1);
480  /* Wait for 3 PHY Clocks*/
482  return status;
483 }
484 
485 
492 {
493  USB_OTG_STS status = USB_OTG_OK;
494  __IO USB_OTG_GRSTCTL_TypeDef greset;
495  uint32_t count = 0;
496 
497  greset.d32 = 0;
498  greset.b.rxfflsh = 1;
499  USB_OTG_WRITE_REG32( &pdev->regs.GREGS->GRSTCTL, greset.d32 );
500  do
501  {
502  greset.d32 = USB_OTG_READ_REG32( &pdev->regs.GREGS->GRSTCTL);
503  if (++count > 200000)
504  {
505  break;
506  }
507  }
508  while (greset.b.rxfflsh == 1);
509  /* Wait for 3 PHY Clocks*/
511  return status;
512 }
513 
514 
522 {
523  USB_OTG_STS status = USB_OTG_OK;
525 
526  usbcfg.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GUSBCFG);
527 
528  usbcfg.b.force_host = 0;
529  usbcfg.b.force_dev = 0;
530 
531  if ( mode == HOST_MODE)
532  {
533  usbcfg.b.force_host = 1;
534  }
535  else if ( mode == DEVICE_MODE)
536  {
537  usbcfg.b.force_dev = 1;
538  }
539 
540  USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GUSBCFG, usbcfg.d32);
541  USB_OTG_BSP_mDelay(50);
542  return status;
543 }
544 
545 
552 {
553  return (USB_OTG_READ_REG32(&pdev->regs.GREGS->GINTSTS ) & 0x1);
554 }
555 
556 
563 {
564  return (USB_OTG_GetMode(pdev) != HOST_MODE);
565 }
566 
567 
574 {
575  return (USB_OTG_GetMode(pdev) == HOST_MODE);
576 }
577 
578 
585 {
586  uint32_t v = 0;
587  v = USB_OTG_READ_REG32(&pdev->regs.GREGS->GINTSTS);
588  v &= USB_OTG_READ_REG32(&pdev->regs.GREGS->GINTMSK);
589  return v;
590 }
591 
592 
599 {
600  return (USB_OTG_READ_REG32 (&pdev->regs.GREGS->GOTGINT));
601 }
602 
603 #ifdef USE_HOST_MODE
604 
609 USB_OTG_STS USB_OTG_CoreInitHost(USB_OTG_CORE_HANDLE *pdev)
610 {
611  USB_OTG_STS status = USB_OTG_OK;
612  USB_OTG_FSIZ_TypeDef nptxfifosize;
613  USB_OTG_FSIZ_TypeDef ptxfifosize;
615 
616 #ifdef USE_OTG_MODE
617  USB_OTG_OTGCTL_TypeDef gotgctl;
618 #endif
619 
620  uint32_t i = 0;
621 
622  nptxfifosize.d32 = 0;
623  ptxfifosize.d32 = 0;
624 #ifdef USE_OTG_MODE
625  gotgctl.d32 = 0;
626 #endif
627  hcfg.d32 = 0;
628 
629 
630  /* configure charge pump IO */
631  USB_OTG_BSP_ConfigVBUS(pdev);
632 
633  /* Restart the Phy Clock */
634  USB_OTG_WRITE_REG32(pdev->regs.PCGCCTL, 0);
635 
636  /* Initialize Host Configuration Register */
637  if (pdev->cfg.phy_itface == USB_OTG_ULPI_PHY)
638  {
639  USB_OTG_InitFSLSPClkSel(pdev , HCFG_30_60_MHZ);
640  }
641  else
642  {
643  USB_OTG_InitFSLSPClkSel(pdev , HCFG_48_MHZ);
644  }
645  USB_OTG_ResetPort(pdev);
646 
647  hcfg.d32 = USB_OTG_READ_REG32(&pdev->regs.HREGS->HCFG);
648  hcfg.b.fslssupp = 0;
649  USB_OTG_WRITE_REG32(&pdev->regs.HREGS->HCFG, hcfg.d32);
650 
651  /* Configure data FIFO sizes */
652  /* Rx FIFO */
653 #ifdef USB_OTG_FS_CORE
654  if(pdev->cfg.coreID == USB_OTG_FS_CORE_ID)
655  {
656  /* set Rx FIFO size */
658  nptxfifosize.b.startaddr = RX_FIFO_FS_SIZE;
659  nptxfifosize.b.depth = TXH_NP_FS_FIFOSIZ;
660  USB_OTG_WRITE_REG32(&pdev->regs.GREGS->DIEPTXF0_HNPTXFSIZ, nptxfifosize.d32);
661 
662  ptxfifosize.b.startaddr = RX_FIFO_FS_SIZE + TXH_NP_FS_FIFOSIZ;
663  ptxfifosize.b.depth = TXH_P_FS_FIFOSIZ;
664  USB_OTG_WRITE_REG32(&pdev->regs.GREGS->HPTXFSIZ, ptxfifosize.d32);
665  }
666 #endif
667 #ifdef USB_OTG_HS_CORE
668  if (pdev->cfg.coreID == USB_OTG_HS_CORE_ID)
669  {
670  /* set Rx FIFO size */
671  USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GRXFSIZ, RX_FIFO_HS_SIZE);
672  nptxfifosize.b.startaddr = RX_FIFO_HS_SIZE;
673  nptxfifosize.b.depth = TXH_NP_HS_FIFOSIZ;
674  USB_OTG_WRITE_REG32(&pdev->regs.GREGS->DIEPTXF0_HNPTXFSIZ, nptxfifosize.d32);
675 
676  ptxfifosize.b.startaddr = RX_FIFO_HS_SIZE + TXH_NP_HS_FIFOSIZ;
677  ptxfifosize.b.depth = TXH_P_HS_FIFOSIZ;
678  USB_OTG_WRITE_REG32(&pdev->regs.GREGS->HPTXFSIZ, ptxfifosize.d32);
679  }
680 #endif
681 
682 #ifdef USE_OTG_MODE
683  /* Clear Host Set HNP Enable in the USB_OTG Control Register */
684  gotgctl.b.hstsethnpen = 1;
685  USB_OTG_MODIFY_REG32( &pdev->regs.GREGS->GOTGCTL, gotgctl.d32, 0);
686 #endif
687 
688  /* Make sure the FIFOs are flushed. */
689  USB_OTG_FlushTxFifo(pdev, 0x10 ); /* all Tx FIFOs */
690  USB_OTG_FlushRxFifo(pdev);
691 
692 
693  /* Clear all pending HC Interrupts */
694  for (i = 0; i < pdev->cfg.host_channels; i++)
695  {
696  USB_OTG_WRITE_REG32( &pdev->regs.HC_REGS[i]->HCINT, 0xFFFFFFFF );
697  USB_OTG_WRITE_REG32( &pdev->regs.HC_REGS[i]->HCINTMSK, 0 );
698  }
699 #ifndef USE_OTG_MODE
700  USB_OTG_DriveVbus(pdev, 1);
701 #endif
702 
703  USB_OTG_EnableHostInt(pdev);
704  return status;
705 }
706 
713 uint8_t USB_OTG_IsEvenFrame (USB_OTG_CORE_HANDLE *pdev)
714 {
715  return !(USB_OTG_READ_REG32(&pdev->regs.HREGS->HFNUM) & 0x1);
716 }
717 
724 void USB_OTG_DriveVbus (USB_OTG_CORE_HANDLE *pdev, uint8_t state)
725 {
726  USB_OTG_HPRT0_TypeDef hprt0;
727 
728  hprt0.d32 = 0;
729 
730  /* enable disable the external charge pump */
731  USB_OTG_BSP_DriveVBUS(pdev, state);
732 
733  /* Turn on the Host port power. */
734  hprt0.d32 = USB_OTG_ReadHPRT0(pdev);
735  if ((hprt0.b.prtpwr == 0 ) && (state == 1 ))
736  {
737  hprt0.b.prtpwr = 1;
738  USB_OTG_WRITE_REG32(pdev->regs.HPRT0, hprt0.d32);
739  }
740  if ((hprt0.b.prtpwr == 1 ) && (state == 0 ))
741  {
742  hprt0.b.prtpwr = 0;
743  USB_OTG_WRITE_REG32(pdev->regs.HPRT0, hprt0.d32);
744  }
745 
746  USB_OTG_BSP_mDelay(200);
747 }
753 USB_OTG_STS USB_OTG_EnableHostInt(USB_OTG_CORE_HANDLE *pdev)
754 {
755  USB_OTG_STS status = USB_OTG_OK;
757  intmsk.d32 = 0;
758  /* Disable all interrupts. */
760 
761  /* Clear any pending interrupts. */
762  USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GINTSTS, 0xFFFFFFFF);
763 
764  /* Enable the common interrupts */
766 
767  if (pdev->cfg.dma_enable == 0)
768  {
769  intmsk.b.rxstsqlvl = 1;
770  }
771  intmsk.b.portintr = 1;
772  intmsk.b.hcintr = 1;
773  intmsk.b.disconnect = 1;
774  intmsk.b.sofintr = 1;
775  intmsk.b.incomplisoout = 1;
776  USB_OTG_MODIFY_REG32(&pdev->regs.GREGS->GINTMSK, intmsk.d32, intmsk.d32);
777  return status;
778 }
779 
787 void USB_OTG_InitFSLSPClkSel(USB_OTG_CORE_HANDLE *pdev , uint8_t freq)
788 {
790 
791  hcfg.d32 = USB_OTG_READ_REG32(&pdev->regs.HREGS->HCFG);
792  hcfg.b.fslspclksel = freq;
793  USB_OTG_WRITE_REG32(&pdev->regs.HREGS->HCFG, hcfg.d32);
794 }
795 
796 
802 uint32_t USB_OTG_ReadHPRT0(USB_OTG_CORE_HANDLE *pdev)
803 {
804  USB_OTG_HPRT0_TypeDef hprt0;
805 
806  hprt0.d32 = USB_OTG_READ_REG32(pdev->regs.HPRT0);
807  hprt0.b.prtena = 0;
808  hprt0.b.prtconndet = 0;
809  hprt0.b.prtenchng = 0;
810  hprt0.b.prtovrcurrchng = 0;
811  return hprt0.d32;
812 }
813 
814 
820 uint32_t USB_OTG_ReadHostAllChannels_intr (USB_OTG_CORE_HANDLE *pdev)
821 {
822  return (USB_OTG_READ_REG32 (&pdev->regs.HREGS->HAINT));
823 }
824 
825 
833 uint32_t USB_OTG_ResetPort(USB_OTG_CORE_HANDLE *pdev)
834 {
835  USB_OTG_HPRT0_TypeDef hprt0;
836 
837  hprt0.d32 = USB_OTG_ReadHPRT0(pdev);
838  hprt0.b.prtrst = 1;
839  USB_OTG_WRITE_REG32(pdev->regs.HPRT0, hprt0.d32);
840  USB_OTG_BSP_mDelay (10); /* See Note #1 */
841  hprt0.b.prtrst = 0;
842  USB_OTG_WRITE_REG32(pdev->regs.HPRT0, hprt0.d32);
843  USB_OTG_BSP_mDelay (20);
844  return 1;
845 }
846 
847 
854 USB_OTG_STS USB_OTG_HC_Init(USB_OTG_CORE_HANDLE *pdev , uint8_t hc_num)
855 {
856  USB_OTG_STS status = USB_OTG_OK;
857  uint32_t intr_enable = 0;
858  USB_OTG_HCINTMSK_TypeDef hcintmsk;
859  USB_OTG_GINTMSK_TypeDef gintmsk;
860  USB_OTG_HCCHAR_TypeDef hcchar;
862 
863 
864  gintmsk.d32 = 0;
865  hcintmsk.d32 = 0;
866  hcchar.d32 = 0;
867 
868  /* Clear old interrupt conditions for this host channel. */
869  hcint.d32 = 0xFFFFFFFF;
870  USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[hc_num]->HCINT, hcint.d32);
871 
872  /* Enable channel interrupts required for this transfer. */
873  hcintmsk.d32 = 0;
874 
875  if (pdev->cfg.dma_enable == 1)
876  {
877  hcintmsk.b.ahberr = 1;
878  }
879 
880  switch (pdev->host.hc[hc_num].ep_type)
881  {
882  case EP_TYPE_CTRL:
883  case EP_TYPE_BULK:
884  hcintmsk.b.xfercompl = 1;
885  hcintmsk.b.stall = 1;
886  hcintmsk.b.xacterr = 1;
887  hcintmsk.b.datatglerr = 1;
888  hcintmsk.b.nak = 1;
889  if (pdev->host.hc[hc_num].ep_is_in)
890  {
891  hcintmsk.b.bblerr = 1;
892  }
893  else
894  {
895  hcintmsk.b.nyet = 1;
896  if (pdev->host.hc[hc_num].do_ping)
897  {
898  hcintmsk.b.ack = 1;
899  }
900  }
901  break;
902  case EP_TYPE_INTR:
903  hcintmsk.b.xfercompl = 1;
904  hcintmsk.b.nak = 1;
905  hcintmsk.b.stall = 1;
906  hcintmsk.b.xacterr = 1;
907  hcintmsk.b.datatglerr = 1;
908  hcintmsk.b.frmovrun = 1;
909 
910  if (pdev->host.hc[hc_num].ep_is_in)
911  {
912  hcintmsk.b.bblerr = 1;
913  }
914 
915  break;
916  case EP_TYPE_ISOC:
917  hcintmsk.b.xfercompl = 1;
918  hcintmsk.b.frmovrun = 1;
919  hcintmsk.b.ack = 1;
920 
921  if (pdev->host.hc[hc_num].ep_is_in)
922  {
923  hcintmsk.b.xacterr = 1;
924  hcintmsk.b.bblerr = 1;
925  }
926  break;
927  }
928 
929 
930  USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[hc_num]->HCINTMSK, hcintmsk.d32);
931 
932 
933  /* Enable the top level host channel interrupt. */
934  intr_enable = (1 << hc_num);
935  USB_OTG_MODIFY_REG32(&pdev->regs.HREGS->HAINTMSK, 0, intr_enable);
936 
937  /* Make sure host channel interrupts are enabled. */
938  gintmsk.b.hcintr = 1;
939  USB_OTG_MODIFY_REG32(&pdev->regs.GREGS->GINTMSK, 0, gintmsk.d32);
940 
941  /* Program the HCCHAR register */
942  hcchar.d32 = 0;
943  hcchar.b.devaddr = pdev->host.hc[hc_num].dev_addr;
944  hcchar.b.epnum = pdev->host.hc[hc_num].ep_num;
945  hcchar.b.epdir = pdev->host.hc[hc_num].ep_is_in;
946  hcchar.b.lspddev = (pdev->host.hc[hc_num].speed == HPRT0_PRTSPD_LOW_SPEED);
947  hcchar.b.eptype = pdev->host.hc[hc_num].ep_type;
948  hcchar.b.mps = pdev->host.hc[hc_num].max_packet;
949  if (pdev->host.hc[hc_num].ep_type == HCCHAR_INTR)
950  {
951  hcchar.b.oddfrm = 1;
952  }
953  USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[hc_num]->HCCHAR, hcchar.d32);
954  return status;
955 }
956 
957 
964 USB_OTG_STS USB_OTG_HC_StartXfer(USB_OTG_CORE_HANDLE *pdev , uint8_t hc_num)
965 {
966  USB_OTG_STS status = USB_OTG_OK;
967  USB_OTG_HCCHAR_TypeDef hcchar;
969  USB_OTG_HNPTXSTS_TypeDef hnptxsts;
970  USB_OTG_HPTXSTS_TypeDef hptxsts;
972  uint16_t len_words = 0;
973 
974  uint16_t num_packets;
975  uint16_t max_hc_pkt_count;
976 
977  max_hc_pkt_count = 256;
978  hctsiz.d32 = 0;
979  hcchar.d32 = 0;
980  intmsk.d32 = 0;
981 
982  /* Compute the expected number of packets associated to the transfer */
983  if (pdev->host.hc[hc_num].xfer_len > 0)
984  {
985  num_packets = (pdev->host.hc[hc_num].xfer_len + \
986  pdev->host.hc[hc_num].max_packet - 1) / pdev->host.hc[hc_num].max_packet;
987 
988  if (num_packets > max_hc_pkt_count)
989  {
990  num_packets = max_hc_pkt_count;
991  pdev->host.hc[hc_num].xfer_len = num_packets * \
992  pdev->host.hc[hc_num].max_packet;
993  }
994  }
995  else
996  {
997  num_packets = 1;
998  }
999  if (pdev->host.hc[hc_num].ep_is_in)
1000  {
1001  pdev->host.hc[hc_num].xfer_len = num_packets * \
1002  pdev->host.hc[hc_num].max_packet;
1003  }
1004  /* Initialize the HCTSIZn register */
1005  hctsiz.b.xfersize = pdev->host.hc[hc_num].xfer_len;
1006  hctsiz.b.pktcnt = num_packets;
1007  hctsiz.b.pid = pdev->host.hc[hc_num].data_pid;
1008  USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[hc_num]->HCTSIZ, hctsiz.d32);
1009 
1010  if (pdev->cfg.dma_enable == 1)
1011  {
1012  USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[hc_num]->HCDMA, (unsigned int)pdev->host.hc[hc_num].xfer_buff);
1013  }
1014 
1015 
1016  hcchar.d32 = USB_OTG_READ_REG32(&pdev->regs.HC_REGS[hc_num]->HCCHAR);
1017  hcchar.b.oddfrm = USB_OTG_IsEvenFrame(pdev);
1018 
1019  /* Set host channel enable */
1020  hcchar.b.chen = 1;
1021  hcchar.b.chdis = 0;
1022  USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[hc_num]->HCCHAR, hcchar.d32);
1023 
1024  if (pdev->cfg.dma_enable == 0) /* Slave mode */
1025  {
1026  if((pdev->host.hc[hc_num].ep_is_in == 0) &&
1027  (pdev->host.hc[hc_num].xfer_len > 0))
1028  {
1029  switch(pdev->host.hc[hc_num].ep_type)
1030  {
1031  /* Non periodic transfer */
1032  case EP_TYPE_CTRL:
1033  case EP_TYPE_BULK:
1034 
1035  hnptxsts.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->HNPTXSTS);
1036  len_words = (pdev->host.hc[hc_num].xfer_len + 3) / 4;
1037 
1038  /* check if there is enough space in FIFO space */
1039  if(len_words > hnptxsts.b.nptxfspcavail)
1040  {
1041  /* need to process data in nptxfempty interrupt */
1042  intmsk.b.nptxfempty = 1;
1043  USB_OTG_MODIFY_REG32( &pdev->regs.GREGS->GINTMSK, 0, intmsk.d32);
1044  }
1045 
1046  break;
1047  /* Periodic transfer */
1048  case EP_TYPE_INTR:
1049  case EP_TYPE_ISOC:
1050  hptxsts.d32 = USB_OTG_READ_REG32(&pdev->regs.HREGS->HPTXSTS);
1051  len_words = (pdev->host.hc[hc_num].xfer_len + 3) / 4;
1052  /* check if there is enough space in FIFO space */
1053  if(len_words > hptxsts.b.ptxfspcavail) /* split the transfer */
1054  {
1055  /* need to process data in ptxfempty interrupt */
1056  intmsk.b.ptxfempty = 1;
1057  USB_OTG_MODIFY_REG32( &pdev->regs.GREGS->GINTMSK, 0, intmsk.d32);
1058  }
1059  break;
1060 
1061  default:
1062  break;
1063  }
1064 
1065  /* Write packet into the Tx FIFO. */
1066  USB_OTG_WritePacket(pdev,
1067  pdev->host.hc[hc_num].xfer_buff ,
1068  hc_num, pdev->host.hc[hc_num].xfer_len);
1069  }
1070  }
1071  return status;
1072 }
1073 
1074 
1081 USB_OTG_STS USB_OTG_HC_Halt(USB_OTG_CORE_HANDLE *pdev , uint8_t hc_num)
1082 {
1083  USB_OTG_STS status = USB_OTG_OK;
1084  USB_OTG_HNPTXSTS_TypeDef nptxsts;
1085  USB_OTG_HPTXSTS_TypeDef hptxsts;
1086  USB_OTG_HCCHAR_TypeDef hcchar;
1087 
1088  nptxsts.d32 = 0;
1089  hptxsts.d32 = 0;
1090  hcchar.d32 = USB_OTG_READ_REG32(&pdev->regs.HC_REGS[hc_num]->HCCHAR);
1091  hcchar.b.chen = 1;
1092  hcchar.b.chdis = 1;
1093 
1094  /* Check for space in the request queue to issue the halt. */
1095  if (hcchar.b.eptype == HCCHAR_CTRL || hcchar.b.eptype == HCCHAR_BULK)
1096  {
1097  nptxsts.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->HNPTXSTS);
1098  if (nptxsts.b.nptxqspcavail == 0)
1099  {
1100  hcchar.b.chen = 0;
1101  }
1102  }
1103  else
1104  {
1105  hptxsts.d32 = USB_OTG_READ_REG32(&pdev->regs.HREGS->HPTXSTS);
1106  if (hptxsts.b.ptxqspcavail == 0)
1107  {
1108  hcchar.b.chen = 0;
1109  }
1110  }
1111  USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[hc_num]->HCCHAR, hcchar.d32);
1112  return status;
1113 }
1114 
1120 USB_OTG_STS USB_OTG_HC_DoPing(USB_OTG_CORE_HANDLE *pdev , uint8_t hc_num)
1121 {
1122  USB_OTG_STS status = USB_OTG_OK;
1123  USB_OTG_HCCHAR_TypeDef hcchar;
1124  USB_OTG_HCTSIZn_TypeDef hctsiz;
1125 
1126  hctsiz.d32 = 0;
1127  hctsiz.b.dopng = 1;
1128  hctsiz.b.pktcnt = 1;
1129  USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[hc_num]->HCTSIZ, hctsiz.d32);
1130 
1131  hcchar.d32 = USB_OTG_READ_REG32(&pdev->regs.HC_REGS[hc_num]->HCCHAR);
1132  hcchar.b.chen = 1;
1133  hcchar.b.chdis = 0;
1134  USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[hc_num]->HCCHAR, hcchar.d32);
1135  return status;
1136 }
1137 
1143 void USB_OTG_StopHost(USB_OTG_CORE_HANDLE *pdev)
1144 {
1145  USB_OTG_HCCHAR_TypeDef hcchar;
1146  uint32_t i;
1147 
1148  USB_OTG_WRITE_REG32(&pdev->regs.HREGS->HAINTMSK , 0);
1149  USB_OTG_WRITE_REG32(&pdev->regs.HREGS->HAINT, 0xFFFFFFFF);
1150  /* Flush out any leftover queued requests. */
1151 
1152  for (i = 0; i < pdev->cfg.host_channels; i++)
1153  {
1154  hcchar.d32 = USB_OTG_READ_REG32(&pdev->regs.HC_REGS[i]->HCCHAR);
1155  hcchar.b.chen = 0;
1156  hcchar.b.chdis = 1;
1157  hcchar.b.epdir = 0;
1158  USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[i]->HCCHAR, hcchar.d32);
1159  }
1160 
1161  /* Flush the FIFO */
1162  USB_OTG_FlushRxFifo(pdev);
1163  USB_OTG_FlushTxFifo(pdev , 0x10 );
1164 }
1165 #endif
1166 #ifdef USE_DEVICE_MODE
1167 /* PCD Core Layer */
1168 
1175 void USB_OTG_InitDevSpeed(USB_OTG_CORE_HANDLE *pdev , uint8_t speed)
1176 {
1177  USB_OTG_DCFG_TypeDef dcfg;
1178 
1179  dcfg.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DCFG);
1180  dcfg.b.devspd = speed;
1181  USB_OTG_WRITE_REG32(&pdev->regs.DREGS->DCFG, dcfg.d32);
1182 }
1183 
1184 
1192 {
1193  USB_OTG_STS status = USB_OTG_OK;
1194  USB_OTG_DEPCTL_TypeDef depctl;
1195  uint32_t i;
1196  USB_OTG_DCFG_TypeDef dcfg;
1197  USB_OTG_FSIZ_TypeDef nptxfifosize;
1198  USB_OTG_FSIZ_TypeDef txfifosize;
1200  USB_OTG_DTHRCTL_TypeDef dthrctl;
1201 
1202  depctl.d32 = 0;
1203  dcfg.d32 = 0;
1204  nptxfifosize.d32 = 0;
1205  txfifosize.d32 = 0;
1206  msk.d32 = 0;
1207 
1208  /* Restart the Phy Clock */
1209  USB_OTG_WRITE_REG32(pdev->regs.PCGCCTL, 0);
1210  /* Device configuration register */
1211  dcfg.d32 = USB_OTG_READ_REG32( &pdev->regs.DREGS->DCFG);
1213  USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DCFG, dcfg.d32 );
1214 
1215 #ifdef USB_OTG_FS_CORE
1216  if(pdev->cfg.coreID == USB_OTG_FS_CORE_ID )
1217  {
1218 
1219  /* Set Full speed phy */
1221 
1222  /* set Rx FIFO size */
1224 
1225  /* EP0 TX*/
1226  nptxfifosize.b.depth = TX0_FIFO_FS_SIZE;
1227  nptxfifosize.b.startaddr = RX_FIFO_FS_SIZE;
1228  USB_OTG_WRITE_REG32( &pdev->regs.GREGS->DIEPTXF0_HNPTXFSIZ, nptxfifosize.d32 );
1229 
1230 
1231  /* EP1 TX*/
1232  txfifosize.b.startaddr = nptxfifosize.b.startaddr + nptxfifosize.b.depth;
1233  txfifosize.b.depth = TX1_FIFO_FS_SIZE;
1234  USB_OTG_WRITE_REG32( &pdev->regs.GREGS->DIEPTXF[0], txfifosize.d32 );
1235 
1236 
1237  /* EP2 TX*/
1238  txfifosize.b.startaddr += txfifosize.b.depth;
1239  txfifosize.b.depth = TX2_FIFO_FS_SIZE;
1240  USB_OTG_WRITE_REG32( &pdev->regs.GREGS->DIEPTXF[1], txfifosize.d32 );
1241 
1242 
1243  /* EP3 TX*/
1244  txfifosize.b.startaddr += txfifosize.b.depth;
1245  txfifosize.b.depth = TX3_FIFO_FS_SIZE;
1246  USB_OTG_WRITE_REG32( &pdev->regs.GREGS->DIEPTXF[2], txfifosize.d32 );
1247  }
1248 #endif
1249 #ifdef USB_OTG_HS_CORE
1250  if(pdev->cfg.coreID == USB_OTG_HS_CORE_ID )
1251  {
1252 
1253  /* Set High speed phy */
1254 
1255  if(pdev->cfg.phy_itface == USB_OTG_ULPI_PHY)
1256  {
1258  }
1259  else /* set High speed phy in Full speed mode */
1260  {
1262  }
1263 
1264  /* set Rx FIFO size */
1265  USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GRXFSIZ, RX_FIFO_HS_SIZE);
1266 
1267  /* EP0 TX*/
1268  nptxfifosize.b.depth = TX0_FIFO_HS_SIZE;
1269  nptxfifosize.b.startaddr = RX_FIFO_HS_SIZE;
1270  USB_OTG_WRITE_REG32( &pdev->regs.GREGS->DIEPTXF0_HNPTXFSIZ, nptxfifosize.d32 );
1271 
1272 
1273  /* EP1 TX*/
1274  txfifosize.b.startaddr = nptxfifosize.b.startaddr + nptxfifosize.b.depth;
1275  txfifosize.b.depth = TX1_FIFO_HS_SIZE;
1276  USB_OTG_WRITE_REG32( &pdev->regs.GREGS->DIEPTXF[0], txfifosize.d32 );
1277 
1278 
1279  /* EP2 TX*/
1280  txfifosize.b.startaddr += txfifosize.b.depth;
1281  txfifosize.b.depth = TX2_FIFO_HS_SIZE;
1282  USB_OTG_WRITE_REG32( &pdev->regs.GREGS->DIEPTXF[1], txfifosize.d32 );
1283 
1284 
1285  /* EP3 TX*/
1286  txfifosize.b.startaddr += txfifosize.b.depth;
1287  txfifosize.b.depth = TX3_FIFO_HS_SIZE;
1288  USB_OTG_WRITE_REG32( &pdev->regs.GREGS->DIEPTXF[2], txfifosize.d32 );
1289 
1290  /* EP4 TX*/
1291  txfifosize.b.startaddr += txfifosize.b.depth;
1292  txfifosize.b.depth = TX4_FIFO_HS_SIZE;
1293  USB_OTG_WRITE_REG32( &pdev->regs.GREGS->DIEPTXF[3], txfifosize.d32 );
1294 
1295 
1296  /* EP5 TX*/
1297  txfifosize.b.startaddr += txfifosize.b.depth;
1298  txfifosize.b.depth = TX5_FIFO_HS_SIZE;
1299  USB_OTG_WRITE_REG32( &pdev->regs.GREGS->DIEPTXF[4], txfifosize.d32 );
1300  }
1301 #endif
1302  /* Flush the FIFOs */
1303  USB_OTG_FlushTxFifo(pdev , 0x10); /* all Tx FIFOs */
1304  USB_OTG_FlushRxFifo(pdev);
1305  /* Clear all pending Device Interrupts */
1306  USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DIEPMSK, 0 );
1307  USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DOEPMSK, 0 );
1308  USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DAINT, 0xFFFFFFFF );
1309  USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DAINTMSK, 0 );
1310 
1311  for (i = 0; i < pdev->cfg.dev_endpoints; i++)
1312  {
1313  depctl.d32 = USB_OTG_READ_REG32(&pdev->regs.INEP_REGS[i]->DIEPCTL);
1314  if (depctl.b.epena)
1315  {
1316  depctl.d32 = 0;
1317  depctl.b.epdis = 1;
1318  depctl.b.snak = 1;
1319  }
1320  else
1321  {
1322  depctl.d32 = 0;
1323  }
1324  USB_OTG_WRITE_REG32( &pdev->regs.INEP_REGS[i]->DIEPCTL, depctl.d32);
1325  USB_OTG_WRITE_REG32( &pdev->regs.INEP_REGS[i]->DIEPTSIZ, 0);
1326  USB_OTG_WRITE_REG32( &pdev->regs.INEP_REGS[i]->DIEPINT, 0xFF);
1327  }
1328  for (i = 0; i < pdev->cfg.dev_endpoints; i++)
1329  {
1330 // USB_OTG_DEPCTL_TypeDef depctl;
1331  depctl.d32 = USB_OTG_READ_REG32(&pdev->regs.OUTEP_REGS[i]->DOEPCTL);
1332  if (depctl.b.epena)
1333  {
1334  depctl.d32 = 0;
1335  depctl.b.epdis = 1;
1336  depctl.b.snak = 1;
1337  }
1338  else
1339  {
1340  depctl.d32 = 0;
1341  }
1342  USB_OTG_WRITE_REG32( &pdev->regs.OUTEP_REGS[i]->DOEPCTL, depctl.d32);
1343  USB_OTG_WRITE_REG32( &pdev->regs.OUTEP_REGS[i]->DOEPTSIZ, 0);
1344  USB_OTG_WRITE_REG32( &pdev->regs.OUTEP_REGS[i]->DOEPINT, 0xFF);
1345  }
1346  msk.d32 = 0;
1347  msk.b.txfifoundrn = 1;
1348  USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DIEPMSK, msk.d32, msk.d32);
1349 
1350  if (pdev->cfg.dma_enable == 1)
1351  {
1352  dthrctl.d32 = 0;
1353  dthrctl.b.non_iso_thr_en = 1;
1354  dthrctl.b.iso_thr_en = 1;
1355  dthrctl.b.tx_thr_len = 64;
1356  dthrctl.b.rx_thr_en = 1;
1357  dthrctl.b.rx_thr_len = 64;
1358  USB_OTG_WRITE_REG32(&pdev->regs.DREGS->DTHRCTL, dthrctl.d32);
1359  }
1360  USB_OTG_EnableDevInt(pdev);
1361  return status;
1362 }
1363 
1364 
1371 {
1372  USB_OTG_STS status = USB_OTG_OK;
1373  USB_OTG_GINTMSK_TypeDef intmsk;
1374 
1375  intmsk.d32 = 0;
1376 
1377  /* Disable all interrupts. */
1378  USB_OTG_WRITE_REG32( &pdev->regs.GREGS->GINTMSK, 0);
1379  /* Clear any pending interrupts */
1380  USB_OTG_WRITE_REG32( &pdev->regs.GREGS->GINTSTS, 0xBFFFFFFF);
1381  /* Enable the common interrupts */
1383 
1384  if (pdev->cfg.dma_enable == 0)
1385  {
1386  intmsk.b.rxstsqlvl = 1;
1387  }
1388 
1389  /* Enable interrupts matching to the Device mode ONLY */
1390  intmsk.b.usbsuspend = 1;
1391  intmsk.b.usbreset = 1;
1392  intmsk.b.enumdone = 1;
1393  intmsk.b.inepintr = 1;
1394  intmsk.b.outepintr = 1;
1395  intmsk.b.sofintr = 1;
1396 
1397  intmsk.b.incomplisoin = 1;
1398  intmsk.b.incomplisoout = 1;
1399 #ifdef VBUS_SENSING_ENABLED
1400  intmsk.b.sessreqintr = 1;
1401  intmsk.b.otgintr = 1;
1402 #endif
1403  USB_OTG_MODIFY_REG32( &pdev->regs.GREGS->GINTMSK, intmsk.d32, intmsk.d32);
1404  return status;
1405 }
1406 
1407 
1415 {
1416  USB_OTG_DSTS_TypeDef dsts;
1417  enum USB_OTG_SPEED speed = USB_SPEED_UNKNOWN;
1418 
1419 
1420  dsts.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DSTS);
1421 
1422  switch (dsts.b.enumspd)
1423  {
1425  speed = USB_SPEED_HIGH;
1426  break;
1429  speed = USB_SPEED_FULL;
1430  break;
1431 
1433  speed = USB_SPEED_LOW;
1434  break;
1435  }
1436 
1437  return speed;
1438 }
1446 {
1447  USB_OTG_STS status = USB_OTG_OK;
1448  USB_OTG_DSTS_TypeDef dsts;
1449  USB_OTG_DEPCTL_TypeDef diepctl;
1450  USB_OTG_DCTL_TypeDef dctl;
1451 
1452  dctl.d32 = 0;
1453  /* Read the Device Status and Endpoint 0 Control registers */
1454  dsts.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DSTS);
1455  diepctl.d32 = USB_OTG_READ_REG32(&pdev->regs.INEP_REGS[0]->DIEPCTL);
1456  /* Set the MPS of the IN EP based on the enumeration speed */
1457  switch (dsts.b.enumspd)
1458  {
1462  diepctl.b.mps = DEP0CTL_MPS_64;
1463  break;
1465  diepctl.b.mps = DEP0CTL_MPS_8;
1466  break;
1467  }
1468  USB_OTG_WRITE_REG32(&pdev->regs.INEP_REGS[0]->DIEPCTL, diepctl.d32);
1469  dctl.b.cgnpinnak = 1;
1470  USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DCTL, dctl.d32, dctl.d32);
1471  return status;
1472 }
1473 
1474 
1481 {
1482  USB_OTG_STS status = USB_OTG_OK;
1483  USB_OTG_DEPCTL_TypeDef depctl;
1484  USB_OTG_DAINT_TypeDef daintmsk;
1485  __IO uint32_t *addr;
1486 
1487 
1488  depctl.d32 = 0;
1489  daintmsk.d32 = 0;
1490  /* Read DEPCTLn register */
1491  if (ep->is_in == 1)
1492  {
1493  addr = &pdev->regs.INEP_REGS[ep->num]->DIEPCTL;
1494  daintmsk.ep.in = 1 << ep->num;
1495  }
1496  else
1497  {
1498  addr = &pdev->regs.OUTEP_REGS[ep->num]->DOEPCTL;
1499  daintmsk.ep.out = 1 << ep->num;
1500  }
1501  /* If the EP is already active don't change the EP Control
1502  * register. */
1503  depctl.d32 = USB_OTG_READ_REG32(addr);
1504  if (!depctl.b.usbactep)
1505  {
1506  depctl.b.mps = ep->maxpacket;
1507  depctl.b.eptype = ep->type;
1508  depctl.b.txfnum = ep->tx_fifo_num;
1509  depctl.b.setd0pid = 1;
1510  depctl.b.usbactep = 1;
1511  USB_OTG_WRITE_REG32(addr, depctl.d32);
1512  }
1513  /* Enable the Interrupt for this EP */
1514 #ifdef USB_OTG_HS_DEDICATED_EP1_ENABLED
1515  if((ep->num == 1)&&(pdev->cfg.coreID == USB_OTG_HS_CORE_ID))
1516  {
1517  USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DEACHMSK, 0, daintmsk.d32);
1518  }
1519  else
1520 #endif
1521  USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DAINTMSK, 0, daintmsk.d32);
1522  return status;
1523 }
1524 
1525 
1532 {
1533  USB_OTG_STS status = USB_OTG_OK;
1534  USB_OTG_DEPCTL_TypeDef depctl;
1535  USB_OTG_DAINT_TypeDef daintmsk;
1536  __IO uint32_t *addr;
1537 
1538  depctl.d32 = 0;
1539  daintmsk.d32 = 0;
1540  /* Read DEPCTLn register */
1541  if (ep->is_in == 1)
1542  {
1543  addr = &pdev->regs.INEP_REGS[ep->num]->DIEPCTL;
1544  daintmsk.ep.in = 1 << ep->num;
1545  }
1546  else
1547  {
1548  addr = &pdev->regs.OUTEP_REGS[ep->num]->DOEPCTL;
1549  daintmsk.ep.out = 1 << ep->num;
1550  }
1551  depctl.b.usbactep = 0;
1552  USB_OTG_WRITE_REG32(addr, depctl.d32);
1553  /* Disable the Interrupt for this EP */
1554 
1555 #ifdef USB_OTG_HS_DEDICATED_EP1_ENABLED
1556  if((ep->num == 1)&&(pdev->cfg.coreID == USB_OTG_HS_CORE_ID))
1557  {
1558  USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DEACHMSK, daintmsk.d32, 0);
1559  }
1560  else
1561 #endif
1562  USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DAINTMSK, daintmsk.d32, 0);
1563  return status;
1564 }
1565 
1566 
1574 {
1575  USB_OTG_STS status = USB_OTG_OK;
1576  USB_OTG_DEPCTL_TypeDef depctl;
1577  USB_OTG_DEPXFRSIZ_TypeDef deptsiz;
1578  USB_OTG_DSTS_TypeDef dsts;
1579  uint32_t fifoemptymsk = 0;
1580 
1581  depctl.d32 = 0;
1582  deptsiz.d32 = 0;
1583  /* IN endpoint */
1584  if (ep->is_in == 1)
1585  {
1586  depctl.d32 = USB_OTG_READ_REG32(&(pdev->regs.INEP_REGS[ep->num]->DIEPCTL));
1587  deptsiz.d32 = USB_OTG_READ_REG32(&(pdev->regs.INEP_REGS[ep->num]->DIEPTSIZ));
1588  /* Zero Length Packet? */
1589  if (ep->xfer_len == 0)
1590  {
1591  deptsiz.b.xfersize = 0;
1592  deptsiz.b.pktcnt = 1;
1593  }
1594  else
1595  {
1596  /* Program the transfer size and packet count
1597  * as follows: xfersize = N * maxpacket +
1598  * short_packet pktcnt = N + (short_packet
1599  * exist ? 1 : 0)
1600  */
1601  deptsiz.b.xfersize = ep->xfer_len;
1602  deptsiz.b.pktcnt = (ep->xfer_len - 1 + ep->maxpacket) / ep->maxpacket;
1603 
1604  if (ep->type == EP_TYPE_ISOC)
1605  {
1606  deptsiz.b.mc = 1;
1607  }
1608  }
1609  USB_OTG_WRITE_REG32(&pdev->regs.INEP_REGS[ep->num]->DIEPTSIZ, deptsiz.d32);
1610 
1611  if (pdev->cfg.dma_enable == 1)
1612  {
1614  }
1615  else
1616  {
1617  if (ep->type != EP_TYPE_ISOC)
1618  {
1619  /* Enable the Tx FIFO Empty Interrupt for this EP */
1620  if (ep->xfer_len > 0)
1621  {
1622  fifoemptymsk = 1 << ep->num;
1623  USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DIEPEMPMSK, 0, fifoemptymsk);
1624  }
1625  }
1626  }
1627 
1628 
1629  if (ep->type == EP_TYPE_ISOC)
1630  {
1631  dsts.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DSTS);
1632 
1633  if (((dsts.b.soffn)&0x1) == 0)
1634  {
1635  depctl.b.setd1pid = 1;
1636  }
1637  else
1638  {
1639  depctl.b.setd0pid = 1;
1640  }
1641  }
1642 
1643  /* EP enable, IN data in FIFO */
1644  depctl.b.cnak = 1;
1645  depctl.b.epena = 1;
1646  USB_OTG_WRITE_REG32(&pdev->regs.INEP_REGS[ep->num]->DIEPCTL, depctl.d32);
1647 
1648  if (ep->type == EP_TYPE_ISOC)
1649  {
1650  USB_OTG_WritePacket(pdev, ep->xfer_buff, ep->num, ep->xfer_len);
1651  }
1652  }
1653  else
1654  {
1655  /* OUT endpoint */
1656  depctl.d32 = USB_OTG_READ_REG32(&(pdev->regs.OUTEP_REGS[ep->num]->DOEPCTL));
1657  deptsiz.d32 = USB_OTG_READ_REG32(&(pdev->regs.OUTEP_REGS[ep->num]->DOEPTSIZ));
1658  /* Program the transfer size and packet count as follows:
1659  * pktcnt = N
1660  * xfersize = N * maxpacket
1661  */
1662  if (ep->xfer_len == 0)
1663  {
1664  deptsiz.b.xfersize = ep->maxpacket;
1665  deptsiz.b.pktcnt = 1;
1666  }
1667  else
1668  {
1669  deptsiz.b.pktcnt = (ep->xfer_len + (ep->maxpacket - 1)) / ep->maxpacket;
1670  deptsiz.b.xfersize = deptsiz.b.pktcnt * ep->maxpacket;
1671  }
1672  USB_OTG_WRITE_REG32(&pdev->regs.OUTEP_REGS[ep->num]->DOEPTSIZ, deptsiz.d32);
1673 
1674  if (pdev->cfg.dma_enable == 1)
1675  {
1677  }
1678 
1679  if (ep->type == EP_TYPE_ISOC)
1680  {
1681  if (ep->even_odd_frame)
1682  {
1683  depctl.b.setd1pid = 1;
1684  }
1685  else
1686  {
1687  depctl.b.setd0pid = 1;
1688  }
1689  }
1690  /* EP enable */
1691  depctl.b.cnak = 1;
1692  depctl.b.epena = 1;
1693  USB_OTG_WRITE_REG32(&pdev->regs.OUTEP_REGS[ep->num]->DOEPCTL, depctl.d32);
1694  }
1695  return status;
1696 }
1697 
1698 
1706 {
1707  USB_OTG_STS status = USB_OTG_OK;
1708  USB_OTG_DEPCTL_TypeDef depctl;
1710  USB_OTG_INEPREGS *in_regs;
1711  uint32_t fifoemptymsk = 0;
1712 
1713  depctl.d32 = 0;
1714  deptsiz.d32 = 0;
1715  /* IN endpoint */
1716  if (ep->is_in == 1)
1717  {
1718  in_regs = pdev->regs.INEP_REGS[0];
1719  depctl.d32 = USB_OTG_READ_REG32(&in_regs->DIEPCTL);
1720  deptsiz.d32 = USB_OTG_READ_REG32(&in_regs->DIEPTSIZ);
1721  /* Zero Length Packet? */
1722  if (ep->xfer_len == 0)
1723  {
1724  deptsiz.b.xfersize = 0;
1725  deptsiz.b.pktcnt = 1;
1726 
1727  }
1728  else
1729  {
1730  if (ep->xfer_len > ep->maxpacket)
1731  {
1732  ep->xfer_len = ep->maxpacket;
1733  deptsiz.b.xfersize = ep->maxpacket;
1734  }
1735  else
1736  {
1737  deptsiz.b.xfersize = ep->xfer_len;
1738  }
1739  deptsiz.b.pktcnt = 1;
1740  }
1741  USB_OTG_WRITE_REG32(&in_regs->DIEPTSIZ, deptsiz.d32);
1742 
1743  if (pdev->cfg.dma_enable == 1)
1744  {
1745  USB_OTG_WRITE_REG32(&pdev->regs.INEP_REGS[ep->num]->DIEPDMA, ep->dma_addr);
1746  }
1747 
1748  /* EP enable, IN data in FIFO */
1749  depctl.b.cnak = 1;
1750  depctl.b.epena = 1;
1751  USB_OTG_WRITE_REG32(&in_regs->DIEPCTL, depctl.d32);
1752 
1753 
1754 
1755  if (pdev->cfg.dma_enable == 0)
1756  {
1757  /* Enable the Tx FIFO Empty Interrupt for this EP */
1758  if (ep->xfer_len > 0)
1759  {
1760  {
1761  fifoemptymsk |= 1 << ep->num;
1762  USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DIEPEMPMSK, 0, fifoemptymsk);
1763  }
1764  }
1765  }
1766  }
1767  else
1768  {
1769  /* OUT endpoint */
1770  depctl.d32 = USB_OTG_READ_REG32(&pdev->regs.OUTEP_REGS[ep->num]->DOEPCTL);
1771  deptsiz.d32 = USB_OTG_READ_REG32(&pdev->regs.OUTEP_REGS[ep->num]->DOEPTSIZ);
1772  /* Program the transfer size and packet count as follows:
1773  * xfersize = N * (maxpacket + 4 - (maxpacket % 4))
1774  * pktcnt = N */
1775  if (ep->xfer_len == 0)
1776  {
1777  deptsiz.b.xfersize = ep->maxpacket;
1778  deptsiz.b.pktcnt = 1;
1779  }
1780  else
1781  {
1782  ep->xfer_len = ep->maxpacket;
1783  deptsiz.b.xfersize = ep->maxpacket;
1784  deptsiz.b.pktcnt = 1;
1785  }
1786  USB_OTG_WRITE_REG32(&pdev->regs.OUTEP_REGS[ep->num]->DOEPTSIZ, deptsiz.d32);
1787  if (pdev->cfg.dma_enable == 1)
1788  {
1790  }
1791  /* EP enable */
1792  depctl.b.cnak = 1;
1793  depctl.b.epena = 1;
1794  USB_OTG_WRITE_REG32 (&(pdev->regs.OUTEP_REGS[ep->num]->DOEPCTL), depctl.d32);
1795 
1796  }
1797  return status;
1798 }
1799 
1800 
1807 {
1808  USB_OTG_STS status = USB_OTG_OK;
1809  USB_OTG_DEPCTL_TypeDef depctl;
1810  __IO uint32_t *depctl_addr;
1811 
1812  depctl.d32 = 0;
1813  if (ep->is_in == 1)
1814  {
1815  depctl_addr = &(pdev->regs.INEP_REGS[ep->num]->DIEPCTL);
1816  depctl.d32 = USB_OTG_READ_REG32(depctl_addr);
1817  /* set the disable and stall bits */
1818  if (depctl.b.epena)
1819  {
1820  depctl.b.epdis = 1;
1821  }
1822  depctl.b.stall = 1;
1823  USB_OTG_WRITE_REG32(depctl_addr, depctl.d32);
1824  }
1825  else
1826  {
1827  depctl_addr = &(pdev->regs.OUTEP_REGS[ep->num]->DOEPCTL);
1828  depctl.d32 = USB_OTG_READ_REG32(depctl_addr);
1829  /* set the stall bit */
1830  depctl.b.stall = 1;
1831  USB_OTG_WRITE_REG32(depctl_addr, depctl.d32);
1832  }
1833  return status;
1834 }
1835 
1836 
1843 {
1844  USB_OTG_STS status = USB_OTG_OK;
1845  USB_OTG_DEPCTL_TypeDef depctl;
1846  __IO uint32_t *depctl_addr;
1847 
1848  depctl.d32 = 0;
1849 
1850  if (ep->is_in == 1)
1851  {
1852  depctl_addr = &(pdev->regs.INEP_REGS[ep->num]->DIEPCTL);
1853  }
1854  else
1855  {
1856  depctl_addr = &(pdev->regs.OUTEP_REGS[ep->num]->DOEPCTL);
1857  }
1858  depctl.d32 = USB_OTG_READ_REG32(depctl_addr);
1859  /* clear the stall bits */
1860  depctl.b.stall = 0;
1861  if (ep->type == EP_TYPE_INTR || ep->type == EP_TYPE_BULK)
1862  {
1863  depctl.b.setd0pid = 1; /* DATA0 */
1864  }
1865  USB_OTG_WRITE_REG32(depctl_addr, depctl.d32);
1866  return status;
1867 }
1868 
1869 
1876 {
1877  uint32_t v;
1878  v = USB_OTG_READ_REG32(&pdev->regs.DREGS->DAINT);
1879  v &= USB_OTG_READ_REG32(&pdev->regs.DREGS->DAINTMSK);
1880  return ((v & 0xffff0000) >> 16);
1881 }
1882 
1883 
1890 uint32_t USB_OTG_ReadDevOutEP_itr(USB_OTG_CORE_HANDLE *pdev , uint8_t epnum)
1891 {
1892  uint32_t v;
1893  v = USB_OTG_READ_REG32(&pdev->regs.OUTEP_REGS[epnum]->DOEPINT);
1894  v &= USB_OTG_READ_REG32(&pdev->regs.DREGS->DOEPMSK);
1895  return v;
1896 }
1897 
1898 
1905 {
1906  uint32_t v;
1907  v = USB_OTG_READ_REG32(&pdev->regs.DREGS->DAINT);
1908  v &= USB_OTG_READ_REG32(&pdev->regs.DREGS->DAINTMSK);
1909  return (v & 0xffff);
1910 }
1911 
1918 {
1919  USB_OTG_DEP0XFRSIZ_TypeDef doeptsize0;
1920  doeptsize0.d32 = 0;
1921  doeptsize0.b.supcnt = 3;
1922  doeptsize0.b.pktcnt = 1;
1923  doeptsize0.b.xfersize = 8 * 3;
1924  USB_OTG_WRITE_REG32( &pdev->regs.OUTEP_REGS[0]->DOEPTSIZ, doeptsize0.d32 );
1925 
1926  if (pdev->cfg.dma_enable == 1)
1927  {
1928  USB_OTG_DEPCTL_TypeDef doepctl;
1929  doepctl.d32 = 0;
1931  (uint32_t)&pdev->dev.setup_packet);
1932 
1933  /* EP enable */
1934  doepctl.d32 = USB_OTG_READ_REG32(&pdev->regs.OUTEP_REGS[0]->DOEPCTL);
1935  doepctl.b.epena = 1;
1936  doepctl.d32 = 0x80008000;
1937  USB_OTG_WRITE_REG32( &pdev->regs.OUTEP_REGS[0]->DOEPCTL, doepctl.d32);
1938  }
1939 }
1940 
1947 {
1948 
1949  USB_OTG_DCTL_TypeDef dctl;
1950  USB_OTG_DSTS_TypeDef dsts;
1951  USB_OTG_PCGCCTL_TypeDef power;
1952 
1953  if (pdev->dev.DevRemoteWakeup)
1954  {
1955  dsts.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DSTS);
1956  if(dsts.b.suspsts == 1)
1957  {
1958  if(pdev->cfg.low_power)
1959  {
1960  /* un-gate USB Core clock */
1961  power.d32 = USB_OTG_READ_REG32(&pdev->regs.PCGCCTL);
1962  power.b.gatehclk = 0;
1963  power.b.stoppclk = 0;
1964  USB_OTG_WRITE_REG32(pdev->regs.PCGCCTL, power.d32);
1965  }
1966  /* active Remote wakeup signaling */
1967  dctl.d32 = 0;
1968  dctl.b.rmtwkupsig = 1;
1969  USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DCTL, 0, dctl.d32);
1970  USB_OTG_BSP_mDelay(5);
1971  USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DCTL, dctl.d32, 0 );
1972  }
1973  }
1974 }
1975 
1976 
1983 {
1984  if(pdev->cfg.low_power)
1985  {
1986 
1987  USB_OTG_DSTS_TypeDef dsts;
1988  USB_OTG_PCGCCTL_TypeDef power;
1989 
1990  dsts.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DSTS);
1991 
1992  if(dsts.b.suspsts == 1)
1993  {
1994  /* un-gate USB Core clock */
1995  power.d32 = USB_OTG_READ_REG32(&pdev->regs.PCGCCTL);
1996  power.b.gatehclk = 0;
1997  power.b.stoppclk = 0;
1998  USB_OTG_WRITE_REG32(pdev->regs.PCGCCTL, power.d32);
1999 
2000  }
2001  }
2002 }
2003 
2010 {
2011  uint32_t i;
2012 
2013  pdev->dev.device_status = 1;
2014 
2015  for (i = 0; i < pdev->cfg.dev_endpoints ; i++)
2016  {
2017  USB_OTG_WRITE_REG32( &pdev->regs.INEP_REGS[i]->DIEPINT, 0xFF);
2018  USB_OTG_WRITE_REG32( &pdev->regs.OUTEP_REGS[i]->DOEPINT, 0xFF);
2019  }
2020 
2021  USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DIEPMSK, 0 );
2022  USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DOEPMSK, 0 );
2023  USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DAINTMSK, 0 );
2024  USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DAINT, 0xFFFFFFFF );
2025 
2026  /* Flush the FIFO */
2027  USB_OTG_FlushRxFifo(pdev);
2028  USB_OTG_FlushTxFifo(pdev , 0x10 );
2029 }
2030 
2039 {
2040  USB_OTG_DEPCTL_TypeDef depctl;
2041  __IO uint32_t *depctl_addr;
2042  uint32_t Status = 0;
2043 
2044  depctl.d32 = 0;
2045  if (ep->is_in == 1)
2046  {
2047  depctl_addr = &(pdev->regs.INEP_REGS[ep->num]->DIEPCTL);
2048  depctl.d32 = USB_OTG_READ_REG32(depctl_addr);
2049 
2050  if (depctl.b.stall == 1)
2051  Status = USB_OTG_EP_TX_STALL;
2052  else if (depctl.b.naksts == 1)
2053  Status = USB_OTG_EP_TX_NAK;
2054  else
2055  Status = USB_OTG_EP_TX_VALID;
2056 
2057  }
2058  else
2059  {
2060  depctl_addr = &(pdev->regs.OUTEP_REGS[ep->num]->DOEPCTL);
2061  depctl.d32 = USB_OTG_READ_REG32(depctl_addr);
2062  if (depctl.b.stall == 1)
2063  Status = USB_OTG_EP_RX_STALL;
2064  else if (depctl.b.naksts == 1)
2065  Status = USB_OTG_EP_RX_NAK;
2066  else
2067  Status = USB_OTG_EP_RX_VALID;
2068  }
2069 
2070  /* Return the current status */
2071  return Status;
2072 }
2073 
2081 void USB_OTG_SetEPStatus (USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep , uint32_t Status)
2082 {
2083  USB_OTG_DEPCTL_TypeDef depctl;
2084  __IO uint32_t *depctl_addr;
2085 
2086  depctl.d32 = 0;
2087 
2088  /* Process for IN endpoint */
2089  if (ep->is_in == 1)
2090  {
2091  depctl_addr = &(pdev->regs.INEP_REGS[ep->num]->DIEPCTL);
2092  depctl.d32 = USB_OTG_READ_REG32(depctl_addr);
2093 
2094  if (Status == USB_OTG_EP_TX_STALL)
2095  {
2096  USB_OTG_EPSetStall(pdev, ep); return;
2097  }
2098  else if (Status == USB_OTG_EP_TX_NAK)
2099  depctl.b.snak = 1;
2100  else if (Status == USB_OTG_EP_TX_VALID)
2101  {
2102  if (depctl.b.stall == 1)
2103  {
2104  ep->even_odd_frame = 0;
2105  USB_OTG_EPClearStall(pdev, ep);
2106  return;
2107  }
2108  depctl.b.cnak = 1;
2109  depctl.b.usbactep = 1;
2110  depctl.b.epena = 1;
2111  }
2112  else if (Status == USB_OTG_EP_TX_DIS)
2113  depctl.b.usbactep = 0;
2114  }
2115  else /* Process for OUT endpoint */
2116  {
2117  depctl_addr = &(pdev->regs.OUTEP_REGS[ep->num]->DOEPCTL);
2118  depctl.d32 = USB_OTG_READ_REG32(depctl_addr);
2119 
2120  if (Status == USB_OTG_EP_RX_STALL) {
2121  depctl.b.stall = 1;
2122  }
2123  else if (Status == USB_OTG_EP_RX_NAK)
2124  depctl.b.snak = 1;
2125  else if (Status == USB_OTG_EP_RX_VALID)
2126  {
2127  if (depctl.b.stall == 1)
2128  {
2129  ep->even_odd_frame = 0;
2130  USB_OTG_EPClearStall(pdev, ep);
2131  return;
2132  }
2133  depctl.b.cnak = 1;
2134  depctl.b.usbactep = 1;
2135  depctl.b.epena = 1;
2136  }
2137  else if (Status == USB_OTG_EP_RX_DIS)
2138  {
2139  depctl.b.usbactep = 0;
2140  }
2141  }
2142 
2143  USB_OTG_WRITE_REG32(depctl_addr, depctl.d32);
2144 }
2145 
2146 #endif
2147 
2159 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
static void USB_OTG_EnableCommonInt(USB_OTG_CORE_HANDLE *pdev)
USB_OTG_EnableCommonInt Initializes the commmon interrupts, used in both device and modes...
Definition: usb_core.c:96
USB_OTG_STS USB_OTG_FlushTxFifo(USB_OTG_CORE_HANDLE *pdev, uint32_t num)
USB_OTG_FlushTxFifo : Flush a Tx FIFO.
Definition: usb_core.c:461
uint32_t USB_OTG_ReadDevAllOutEp_itr(USB_OTG_CORE_HANDLE *pdev)
USB_OTG_ReadDevAllOutEp_itr : returns OUT endpoint interrupt bits.
Definition: usb_core.c:1875
USB_OTG_STS USB_OTG_EPSetStall(USB_OTG_CORE_HANDLE *pdev, USB_OTG_EP *ep)
USB_OTG_EPSetStall : Set the EP STALL.
Definition: usb_core.c:1806
#define HCCHAR_BULK
Definition: usb_defines.h:174
Specific api&#39;s relative to the used hardware platform.
struct _USB_OTG_GINTMSK_TypeDef::@56 b
__IO uint32_t DOEPCTL
Definition: usb_regs.h:167
struct _USB_OTG_GAHBCFG_TypeDef::@53 b
struct _USB_OTG_HPRT0_TypeDef::@80 b
#define __packed
Definition: hal_types.h:43
USB_OTG_STS USB_OTG_WritePacket(USB_OTG_CORE_HANDLE *pdev, const uint8_t *src, uint8_t ch_ep_num, uint16_t len)
USB_OTG_WritePacket : Writes a packet into the Tx FIFO associated with the EP.
Definition: usb_core.c:169
uint32_t disablevbussensing
Definition: usb_regs.h:640
uint32_t USB_OTG_ReadDevOutEP_itr(USB_OTG_CORE_HANDLE *pdev, uint8_t epnum)
USB_OTG_ReadDevOutEP_itr : returns Device OUT EP Interrupt register.
Definition: usb_core.c:1890
USB_OTG_STS USB_OTG_EnableGlobalInt(USB_OTG_CORE_HANDLE *pdev)
USB_OTG_EnableGlobalInt Enables the controller&#39;s Global Int in the AHB Config reg.
Definition: usb_core.c:426
uint8_t phy_itface
Definition: usb_core.h:170
#define USB_OTG_DATA_FIFO_OFFSET
Definition: usb_regs.h:63
struct _USB_OTG_HCINTMSK_TypeDef::@87 b
__IO uint32_t DIEPINT
Definition: usb_regs.h:149
USB_OTG_STS USB_OTG_SelectCore(USB_OTG_CORE_HANDLE *pdev, USB_OTG_CORE_ID_TypeDef coreID)
USB_OTG_SelectCore Initialize core registers address.
Definition: usb_core.c:222
__IO uint32_t DCFG
Definition: usb_regs.h:115
__IO uint32_t DIEPCTL
Definition: usb_regs.h:147
__IO uint32_t HCINT
Definition: usb_regs.h:207
void USB_OTG_StopDevice(USB_OTG_CORE_HANDLE *pdev)
Stop the device and clean up fifo&#39;s.
Definition: usb_core.c:2009
uint8_t num
Definition: usb_core.h:138
void USB_OTG_EP0_OutStart(USB_OTG_CORE_HANDLE *pdev)
configures EPO to receive SETUP packets
Definition: usb_core.c:1917
uint32_t fslspclksel
Definition: usb_regs.h:884
USB_OTG_SPEED
Definition: usb_defines.h:229
uint8_t setup_packet[8 *3]
Definition: usb_core.h:264
USB_OTG_STS USB_OTG_EP0Activate(USB_OTG_CORE_HANDLE *pdev)
enables EP0 OUT to receive SETUP packets and configures EP0 for transmitting packets ...
Definition: usb_core.c:1445
uint32_t DevRemoteWakeup
Definition: usb_core.h:261
#define USB_OTG_PCGCCTL_OFFSET
Definition: usb_regs.h:62
#define EP_TYPE_ISOC
Definition: usb_defines.h:141
#define USB_OTG_FS_BASE_ADDR
Definition: usb_regs.h:51
struct _USB_OTG_DIEPINTn_TypeDef::@68 b
#define TX3_FIFO_FS_SIZE
Definition: usb_conf.h:105
#define DCFG_FRAME_INTERVAL_80
Definition: usb_defines.h:126
__IO uint32_t DOEPINT
Definition: usb_regs.h:169
__IO uint32_t HCDMA
Definition: usb_regs.h:210
struct _USB_OTG_GCCFG_TypeDef::@64 b
enum USB_OTG_SPEED USB_OTG_GetDeviceSpeed(USB_OTG_CORE_HANDLE *pdev)
USB_OTG_GetDeviceSpeed Get the device speed from the device status register.
Definition: usb_core.c:1414
uint16_t TotalFifoSize
Definition: usb_core.h:169
#define USB_OTG_EP_RX_VALID
Definition: usb_core.h:68
#define USB_OTG_SPEED_PARAM_HIGH_IN_FULL
Definition: usb_defines.h:58
#define USB_OTG_EP_RX_NAK
Definition: usb_core.h:67
__IO uint32_t DIEPTXF[USB_OTG_MAX_TX_FIFOS]
Definition: usb_regs.h:102
#define DEP0CTL_MPS_64
Definition: usb_defines.h:131
__IO uint32_t DOEPTSIZ
Definition: usb_regs.h:171
__IO uint32_t DOEPMSK
Definition: usb_regs.h:120
#define USB_OTG_EP_RX_STALL
Definition: usb_core.h:66
#define USB_OTG_EP_REG_OFFSET
Definition: usb_regs.h:56
USB_OTG_STS USB_OTG_EPActivate(USB_OTG_CORE_HANDLE *pdev, USB_OTG_EP *ep)
USB_OTG_EPActivate : Activates an EP.
Definition: usb_core.c:1480
uint32_t dma_addr
Definition: usb_core.h:148
#define EP_TYPE_CTRL
Definition: usb_defines.h:140
uint8_t USB_OTG_IsHostMode(USB_OTG_CORE_HANDLE *pdev)
USB_OTG_IsHostMode : Check if it is host mode.
Definition: usb_core.c:573
#define USB_OTG_HOST_PORT_REGS_OFFSET
Definition: usb_regs.h:59
uint8_t USB_OTG_IsDeviceMode(USB_OTG_CORE_HANDLE *pdev)
USB_OTG_IsDeviceMode : Check if it is device mode.
Definition: usb_core.c:562
void USB_OTG_BSP_uDelay(const uint32_t usec)
Definition: usb.c:751
USB_OTG_STS USB_OTG_DisableGlobalInt(USB_OTG_CORE_HANDLE *pdev)
USB_OTG_DisableGlobalInt Enables the controller&#39;s Global Int in the AHB Config reg.
Definition: usb_core.c:444
#define DSTS_ENUMSPD_LS_PHY_6MHZ
Definition: usb_defines.h:123
USB_OTG_CORE_ID_TypeDef
Definition: usb_defines.h:186
__IO uint32_t GINTMSK
Definition: usb_regs.h:91
struct _USB_OTG_DSTS_TypeDef::@67 b
USB_OTG_STS
Definition: usb_core.h:79
#define USB_OTG_SPEED_FULL
Definition: usb_defines.h:62
uint8_t dev_endpoints
Definition: usb_core.h:165
#define EP_TYPE_BULK
Definition: usb_defines.h:142
#define DSTS_ENUMSPD_FS_PHY_48MHZ
Definition: usb_defines.h:124
#define USB_OTG_DEV_OUT_EP_REG_OFFSET
Definition: usb_regs.h:57
USB_OTG_INEPREGS * INEP_REGS[USB_OTG_MAX_TX_FIFOS]
Definition: usb_regs.h:227
__IO uint32_t DIEPMSK
Definition: usb_regs.h:119
uint32_t USB_OTG_ReadDevAllInEPItr(USB_OTG_CORE_HANDLE *pdev)
USB_OTG_ReadDevAllInEPItr : Get int status register.
Definition: usb_core.c:1904
USB_OTG_OUTEPREGS * OUTEP_REGS[USB_OTG_MAX_TX_FIFOS]
Definition: usb_regs.h:228
USB_OTG_CORE_CFGS cfg
Definition: usb_core.h:298
#define USB_OTG_CHAN_REGS_OFFSET
Definition: usb_regs.h:61
#define DSTS_ENUMSPD_FS_PHY_30MHZ_OR_60MHZ
Definition: usb_defines.h:122
__IO uint32_t DEACHMSK
Definition: usb_regs.h:130
#define USB_OTG_EP_TX_STALL
Definition: usb_core.h:61
uint32_t prtovrcurrchng
Definition: usb_regs.h:954
struct _USB_OTG_HCTSIZn_TypeDef::@86 b
uint16_t mps
Definition: usb_core.h:168
#define TX0_FIFO_FS_SIZE
Definition: usb_conf.h:102
uint8_t speed
Definition: usb_core.h:166
__IO uint32_t DOEPDMA
Definition: usb_regs.h:172
#define TX2_FIFO_FS_SIZE
Definition: usb_conf.h:104
#define USB_OTG_CORE_GLOBAL_REGS_OFFSET
Definition: usb_regs.h:53
__IO uint32_t GOTGINT
Definition: usb_regs.h:86
#define USB_OTG_DATA_FIFO_SIZE
Definition: usb_regs.h:64
__IO uint32_t DIEPEMPMSK
Definition: usb_regs.h:128
USB_OTG_STS USB_OTG_EPStartXfer(USB_OTG_CORE_HANDLE *pdev, USB_OTG_EP *ep)
USB_OTG_EPStartXfer : Handle the setup for data xfer for an EP and starts the xfer.
Definition: usb_core.c:1573
__IO uint32_t DIEPTXF0_HNPTXFSIZ
Definition: usb_regs.h:95
__IO uint32_t GOTGCTL
Definition: usb_regs.h:85
#define USB_OTG_HOST_GLOBAL_REG_OFFSET
Definition: usb_regs.h:58
uint8_t even_odd_frame
Definition: usb_core.h:143
#define HPRT0_PRTSPD_LOW_SPEED
Definition: usb_defines.h:166
#define USB_OTG_DEV_GLOBAL_REG_OFFSET
Definition: usb_regs.h:54
void USB_OTG_UngateClock(USB_OTG_CORE_HANDLE *pdev)
USB_OTG_UngateClock : active USB Core clock.
Definition: usb_core.c:1982
uint8_t host_channels
Definition: usb_core.h:164
#define USB_OTG_FS_MAX_PACKET_SIZE
Definition: usb_regs.h:70
struct _USB_OTG_DEP0XFRSIZ_TypeDef::@74 b
#define USB_OTG_WRITE_REG32(reg, value)
Definition: usb_defines.h:222
uint8_t * xfer_buff
Definition: usb_core.h:147
USB_OTG_STS USB_OTG_EP0StartXfer(USB_OTG_CORE_HANDLE *pdev, USB_OTG_EP *ep)
USB_OTG_EP0StartXfer : Handle the setup for a data xfer for EP0 and starts the xfer.
Definition: usb_core.c:1705
uint32_t xfer_len
Definition: usb_core.h:149
struct _USB_OTG_DCFG_TypeDef::@65 b
#define USB_OTG_EP_RX_DIS
Definition: usb_core.h:65
__IO uint32_t HNPTXSTS
Definition: usb_regs.h:96
__IO uint32_t HCFG
Definition: usb_regs.h:186
uint8_t type
Definition: usb_core.h:141
struct _USB_OTG_HCFG_TypeDef::@75 b
uint32_t USB_OTG_ReadCoreItr(USB_OTG_CORE_HANDLE *pdev)
USB_OTG_ReadCoreItr : returns the Core Interrupt register.
Definition: usb_core.c:584
struct _USB_OTG_DTHRCTL_TypeDef::@71 b
struct _USB_OTG_DAINT_TypeDef::@70 ep
__IO uint32_t HCINTMSK
Definition: usb_regs.h:208
__IO uint32_t DCTL
Definition: usb_regs.h:116
#define USB_OTG_READ_REG32(reg)
Definition: usb_defines.h:221
struct _USB_OTG_DCTL_TypeDef::@66 b
__IO uint32_t DIEPDMA
Definition: usb_regs.h:152
__IO uint32_t * PCGCCTL
Definition: usb_regs.h:232
USB_OTG_GREGS * GREGS
Definition: usb_regs.h:224
void USB_OTG_BSP_mDelay(const uint32_t msec)
Definition: usb.c:393
USB_OTG_STS USB_OTG_EPDeactivate(USB_OTG_CORE_HANDLE *pdev, USB_OTG_EP *ep)
USB_OTG_EPDeactivate : Deactivates an EP.
Definition: usb_core.c:1531
__IO uint32_t DAINTMSK
Definition: usb_regs.h:122
struct _USB_OTG_DEPCTL_TypeDef::@72 b
#define USB_OTG_EMBEDDED_PHY
Definition: usb_defines.h:65
#define USB_OTG_SPEED_PARAM_HIGH
Definition: usb_defines.h:57
__IO uint32_t HPTXSTS
Definition: usb_regs.h:190
struct _USB_OTG_GUSBCFG_TypeDef::@54 b
USB_OTG_STS USB_OTG_FlushRxFifo(USB_OTG_CORE_HANDLE *pdev)
USB_OTG_FlushRxFifo : Flush a Rx FIFO.
Definition: usb_core.c:491
#define DSTS_ENUMSPD_HS_PHY_30MHZ_OR_60MHZ
Definition: usb_defines.h:121
#define EP_TYPE_INTR
Definition: usb_defines.h:143
__IO uint32_t DAINT
Definition: usb_regs.h:121
static int state
Definition: Util.cpp:20
#define USB_OTG_EP_TX_DIS
Definition: usb_core.h:60
#define USB_OTG_HS_BASE_ADDR
Definition: usb_regs.h:50
__IO uint32_t HCCHAR
Definition: usb_regs.h:205
__IO uint32_t GCCFG
Definition: usb_regs.h:98
#define HCFG_30_60_MHZ
Definition: usb_defines.h:168
USB_OTG_STS USB_OTG_SetCurrentMode(USB_OTG_CORE_HANDLE *pdev, uint8_t mode)
USB_OTG_SetCurrentMode : Set ID line.
Definition: usb_core.c:521
#define USB_OTG_EP_TX_NAK
Definition: usb_core.h:62
static USB_OTG_STS USB_OTG_CoreReset(USB_OTG_CORE_HANDLE *pdev)
USB_OTG_CoreReset : Soft reset of the core.
Definition: usb_core.c:124
uint8_t Sof_output
Definition: usb_core.h:171
__IO uint32_t * DFIFO[USB_OTG_MAX_TX_FIFOS]
Definition: usb_regs.h:231
Header of the Core Layer.
DCD_DEV dev
Definition: usb_core.h:301
float v
Definition: Printf.cpp:15
__IO uint32_t HAINTMSK
Definition: usb_regs.h:192
__IO uint32_t GUSBCFG
Definition: usb_regs.h:88
void USB_OTG_ActiveRemoteWakeup(USB_OTG_CORE_HANDLE *pdev)
USB_OTG_RemoteWakeup : active remote wakeup signalling.
Definition: usb_core.c:1946
USB_OTG_STS USB_OTG_EPClearStall(USB_OTG_CORE_HANDLE *pdev, USB_OTG_EP *ep)
Clear the EP STALL.
Definition: usb_core.c:1842
#define HCFG_48_MHZ
Definition: usb_defines.h:169
uint32_t USB_OTG_GetEPStatus(USB_OTG_CORE_HANDLE *pdev, USB_OTG_EP *ep)
returns the EP Status
Definition: usb_core.c:2038
__IO uint32_t GINTSTS
Definition: usb_regs.h:90
__IO uint32_t HFNUM
Definition: usb_regs.h:188
uint8_t dma_enable
Definition: usb_core.h:167
#define USB_OTG_EP_TX_VALID
Definition: usb_core.h:63
__IO uint32_t GRSTCTL
Definition: usb_regs.h:89
__IO uint32_t GAHBCFG
Definition: usb_regs.h:87
#define TX1_FIFO_FS_SIZE
Definition: usb_conf.h:103
uint32_t maxpacket
Definition: usb_core.h:145
uint32_t term_sel_dl_pulse
Definition: usb_regs.h:356
__IO uint32_t HCTSIZ
Definition: usb_regs.h:209
uint16_t tx_fifo_num
Definition: usb_core.h:144
#define RX_FIFO_FS_SIZE
Definition: usb_conf.h:101
#define USB_OTG_HOST_CHAN_REGS_OFFSET
Definition: usb_regs.h:60
struct _USB_OTG_HNPTXSTS_TypeDef::@61 b
#define USB_OTG_SPEED_PARAM_FULL
Definition: usb_defines.h:59
#define USB_OTG_DEV_IN_EP_REG_OFFSET
Definition: usb_regs.h:55
void * USB_OTG_ReadPacket(USB_OTG_CORE_HANDLE *pdev, uint8_t *dest, uint16_t len)
USB_OTG_ReadPacket : Reads a packet from the Rx FIFO.
Definition: usb_core.c:198
#define HCCHAR_INTR
Definition: usb_defines.h:175
uint8_t coreID
Definition: usb_core.h:173
uint8_t device_status
Definition: usb_core.h:256
void USB_OTG_InitDevSpeed(USB_OTG_CORE_HANDLE *pdev, uint8_t speed)
USB_OTG_InitDevSpeed :Initializes the DevSpd field of DCFG register depending the PHY type and the en...
Definition: usb_core.c:1175
struct _USB_OTG_DEPXFRSIZ_TypeDef::@73 b
__IO uint32_t DTHRCTL
Definition: usb_regs.h:127
uint32_t USB_OTG_GetMode(USB_OTG_CORE_HANDLE *pdev)
USB_OTG_GetMode : Get current mode.
Definition: usb_core.c:551
USB_OTG_STS USB_OTG_CoreInitDev(USB_OTG_CORE_HANDLE *pdev)
USB_OTG_CoreInitDev : Initializes the USB_OTG controller registers for device mode.
Definition: usb_core.c:1191
__IO uint32_t DSTS
Definition: usb_regs.h:117
struct _USB_OTG_FSIZ_TypeDef::@60 b
#define DEVICE_MODE
Definition: usb_defines.h:110
struct _USB_OTG_HCCHAR_TypeDef::@83 b
__IO uint32_t DIEPTSIZ
Definition: usb_regs.h:151
void uint32_t num
Definition: systick.h:80
#define DEP0CTL_MPS_8
Definition: usb_defines.h:134
void USB_OTG_SetEPStatus(USB_OTG_CORE_HANDLE *pdev, USB_OTG_EP *ep, uint32_t Status)
Set the EP Status.
Definition: usb_core.c:2081
__IO uint32_t HAINT
Definition: usb_regs.h:191
uint8_t low_power
Definition: usb_core.h:172
struct _USB_OTG_PCGCCTL_TypeDef::@88 b
uint32_t ulpi_ext_vbus_drv
Definition: usb_regs.h:352
uint8_t is_in
Definition: usb_core.h:139
USB_OTG_CORE_REGS regs
Definition: usb_core.h:299
__IO uint32_t * HPRT0
Definition: usb_regs.h:230
USB_OTG_HC_REGS * HC_REGS[USB_OTG_MAX_TX_FIFOS]
Definition: usb_regs.h:229
#define HCCHAR_CTRL
Definition: usb_defines.h:172
__IO uint32_t GRXFSIZ
Definition: usb_regs.h:94
USB_OTG_HREGS * HREGS
Definition: usb_regs.h:226
#define USB_OTG_ULPI_PHY
Definition: usb_defines.h:64
USB_OTG_STS USB_OTG_CoreInit(USB_OTG_CORE_HANDLE *pdev)
USB_OTG_CoreInit Initializes the USB_OTG controller registers and prepares the core device mode or ho...
Definition: usb_core.c:324
USB_OTG_STS USB_OTG_EnableDevInt(USB_OTG_CORE_HANDLE *pdev)
USB_OTG_EnableDevInt : Enables the Device mode interrupts.
Definition: usb_core.c:1370
struct _USB_OTG_HPTXSTS_TypeDef::@78 b
__IO uint32_t HPTXFSIZ
Definition: usb_regs.h:101
#define HOST_MODE
Definition: usb_defines.h:111
#define USB_OTG_MODIFY_REG32(reg, clear_mask, set_mask)
Definition: usb_defines.h:223
USB_OTG_DREGS * DREGS
Definition: usb_regs.h:225
uint32_t USB_OTG_ReadOtgItr(USB_OTG_CORE_HANDLE *pdev)
USB_OTG_ReadOtgItr : returns the USB_OTG Interrupt register.
Definition: usb_core.c:598