📄 usbd_otghs.lst
字号:
657 //----------------------
658 case ENDPOINT_TYPE_BULK:
659 //----------------------
660 if (endpointDir) {
661 TRACE_INFO("Bulk In(%d)[%d] ",bEndpoint, pEpDesc->wMaxPacketSize);
662 //! Configure endpoint
663 #ifndef DMA
664 pInterface->OTGHS_DEVEPTCFG[bEndpoint] = AT91C_OTGHS_ALLOC |
665 sizeEpt | AT91C_OTGHS_EPT_DIR_IN | AT91C_OTGHS_EPT_TYPE_BUL_EPT | AT91C_OTGHS_BK_NUMBER_2;
666 #else
667 pInterface->OTGHS_DEVEPTCFG[bEndpoint] = AT91C_OTGHS_ALLOC | AT91C_OTGHS_AUTOSW |
668 sizeEpt | AT91C_OTGHS_EPT_DIR_IN | AT91C_OTGHS_EPT_TYPE_BUL_EPT | AT91C_OTGHS_BK_NUMBER_2;
669 #endif
670
671 }
672 else {
673 TRACE_INFO("Bulk Out(%d)[%d]\n\r",bEndpoint, pEpDesc->wMaxPacketSize);
674 //! Configure endpoint
675 #ifndef DMA
676 pInterface->OTGHS_DEVEPTCFG[bEndpoint] = AT91C_OTGHS_ALLOC |
677 sizeEpt | AT91C_OTGHS_EPT_DIR_OUT | AT91C_OTGHS_EPT_TYPE_BUL_EPT | AT91C_OTGHS_BK_NUMBER_2;
678 #else
679 pInterface->OTGHS_DEVEPTCFG[bEndpoint] = AT91C_OTGHS_ALLOC | AT91C_OTGHS_AUTOSW |
680 sizeEpt | AT91C_OTGHS_EPT_DIR_OUT | AT91C_OTGHS_EPT_TYPE_BUL_EPT | AT91C_OTGHS_BK_NUMBER_2;
681 #endif
682 }
683 break;
684
685 //---------------------------
686 case ENDPOINT_TYPE_INTERRUPT:
687 //---------------------------
688 if (endpointDir) {
689 TRACE_INFO("Interrupt In[%d]\n\r",bEndpoint);
690 //! Configure endpoint
691 #ifndef DMA
692 pInterface->OTGHS_DEVEPTCFG[bEndpoint] = AT91C_OTGHS_ALLOC |
693 sizeEpt | AT91C_OTGHS_EPT_DIR_IN | AT91C_OTGHS_EPT_TYPE_INT_EPT | AT91C_OTGHS_BK_NUMBER_2;
694 #else
695 pInterface->OTGHS_DEVEPTCFG[bEndpoint] = AT91C_OTGHS_ALLOC | AT91C_OTGHS_AUTOSW |
696 sizeEpt | AT91C_OTGHS_EPT_DIR_IN | AT91C_OTGHS_EPT_TYPE_INT_EPT | AT91C_OTGHS_BK_NUMBER_2;
697 #endif
698
699 }
700 else {
701 TRACE_INFO("Interrupt Out[%d]\n\r",bEndpoint);
702 //! Configure endpoint
703 #ifndef DMA
704 pInterface->OTGHS_DEVEPTCFG[bEndpoint] = AT91C_OTGHS_ALLOC |
705 sizeEpt | AT91C_OTGHS_EPT_DIR_OUT | AT91C_OTGHS_EPT_TYPE_INT_EPT | AT91C_OTGHS_BK_NUMBER_2;
706 #else
707 pInterface->OTGHS_DEVEPTCFG[bEndpoint] = AT91C_OTGHS_ALLOC | AT91C_OTGHS_AUTOSW |
708 sizeEpt | AT91C_OTGHS_EPT_DIR_OUT | AT91C_OTGHS_EPT_TYPE_INT_EPT | AT91C_OTGHS_BK_NUMBER_2;
709 #endif
710
711 }
712 break;
713
714 //------
715 default:
716 //------
717 TRACE_ERROR(" unknown endpoint type\n\r");
718 return false;
719 }
720
721 // Check if the configuration is ok
722 if (ISCLEARED(pInterface->OTGHS_DEVEPTCSR[bEndpoint], AT91C_OTGHS_CFGOK)) {
723
724 TRACE_FATAL("F: OTGHS_ConfigureEndpoint: Cannot configure endpoint\n\r");
725 return false;
726 }
727
728 return true;
729 }
730
731
732 //------------------------------------------------------------------------------
733 // Interrupt service routine
734 //------------------------------------------------------------------------------
735 #ifdef DMA
736 //----------------------------------------------------------------------------
737 //! \fn OTGHS_DmaHandler
738 //! \brief This function (ISR) handles DMA interrupts
739 //----------------------------------------------------------------------------
740 static void OTGHS_DmaHandler(const S_usb *pUsb, unsigned char endpoint)
741 {
742 AT91PS_OTGHS pInterface = OTGHS_GetDriverInterface(pUsb);
743 S_usb_endpoint *pEndpoint = USB_GetEndpoint(pUsb, endpoint);
744 unsigned int csr;
745
746 csr = pInterface->OTGHS_DEVDMA[endpoint].OTGHS_DEVDMASTATUS;
747 pInterface->OTGHS_DEVIDR = (1<<SHIFT_DMA<<endpoint);
748
749 if((csr & AT91C_OTGHS_END_BF_ST) || (csr & AT91C_OTGHS_END_TR_ST)) {
750 // READ
751 TRACE_DEBUG_M("END_BF_ST\n\r");
752 pEndpoint->dBytesTransferred = pEndpoint->dBytesBuffered;
753 pEndpoint->dBytesBuffered = 0;
754
755 TRACE_DEBUG_M("dBytesBuffered: 0x%x\n\r",pEndpoint->dBytesBuffered);
756 TRACE_DEBUG_M("dBytesRemaining: 0x%x\n\r",pEndpoint->dBytesRemaining);
757 TRACE_DEBUG_M("dBytesTransferred: 0x%x\n\r",pEndpoint->dBytesTransferred);
758
759 OTGHS_EndOfTransfer(pEndpoint, USB_STATUS_SUCCESS);
760 pEndpoint->dState = endpointStateIdle;
761 }
762 else {
763 TRACE_FATAL("Probleme IT DMA\n\r");
764 }
765 }
766 #endif
767
768
769 //------------------------------------------------------------------------------
770 // \brief OTGHS interrupt handler
771 //
772 // Manages device resume, suspend, end of bus reset. Forwards endpoint
773 // interrupts to the appropriate handler.
774 // \param pUsb Pointer to a S_usb instance
775 //------------------------------------------------------------------------------
776 static void OTGHS_Handler(const S_usb *pUsb)
777 {
778 AT91PS_OTGHS pInterface = OTGHS_GetDriverInterface(pUsb);
779 unsigned int dStatus;
780 unsigned char numIT;
781
782 if ( (!ISSET(USB_GetState(pUsb), USB_STATE_SUSPENDED))
783 && (ISSET(USB_GetState(pUsb), USB_STATE_POWERED))){
784
785 LED_TOGGLE(LED_USB);
786 }
787
788 TRACE_DEBUG_H("Hlr ");
789
790 // Get General interrupts status
791 dStatus = pInterface->OTGHS_SR & pInterface->OTGHS_CTRL & 0xFF;
792 while (dStatus != 0) {
793
794 if(ISSET(dStatus, AT91C_OTGHS_VBUSTI))
795 {
796 TRACE_DEBUG_M("__VBus\n\r");
797
798 USB_Attach(pUsb);
799
800 // Acknowledge the interrupt
801 pInterface->OTGHS_SCR = AT91C_OTGHS_VBUSTI;
802 }
803
804 // Don't treat others interrupt for this time
805 pInterface->OTGHS_SCR = AT91C_OTGHS_IDT | AT91C_OTGHS_SRP
806 | AT91C_OTGHS_VBERR | AT91C_OTGHS_BCERR
807 | AT91C_OTGHS_ROLEEX | AT91C_OTGHS_HNPERR
808 | AT91C_OTGHS_STO;
809
810 dStatus = pInterface->OTGHS_SR & pInterface->OTGHS_CTRL & 0xFF;
811 }
812
813
814 // Get OTG Device interrupts status
815 dStatus = pInterface->OTGHS_DEVISR & pInterface->OTGHS_DEVIMR;
816 TRACE_DEBUG_H("OTGHS_DEVISR:0x%X\n\r", pInterface->OTGHS_DEVISR);
817 while (dStatus != 0) {
818
819 // Start Of Frame (SOF)
820 if (ISSET(dStatus, AT91C_OTGHS_SOF)) {
821 TRACE_DEBUG_L("SOF ");
822
823 // Invoke the SOF callback
824 USB_StartOfFrameCallback(pUsb);
825
826 // Acknowledge interrupt
827 SET(pInterface->OTGHS_DEVICR, AT91C_OTGHS_SOF);
828 CLEAR(dStatus, AT91C_OTGHS_SOF);
829 }
830
831 // Suspend
832 else if (dStatus & AT91C_OTGHS_SUSP) {
833
834 TRACE_DEBUG_M("S ");
835
836 if (!ISSET(USB_GetState(pUsb), USB_STATE_SUSPENDED)) {
837
838 // The device enters the Suspended state
839 // MCK + UDPCK must be off
840 // Pull-Up must be connected
841 // Transceiver must be disabled
842
843 // Enable wakeup
844 SET(pInterface->OTGHS_DEVIER, AT91C_OTGHS_EORST | AT91C_OTGHS_WAKEUP | AT91C_OTGHS_EORSM);
845
846 // Acknowledge interrupt
847 pInterface->OTGHS_DEVICR = AT91C_OTGHS_SUSP;
848 SET(*(pUsb->pState), USB_STATE_SUSPENDED);
849 OTGHS_DisableTransceiver(pUsb);
850 OTGHS_DisableMCK(pUsb);
851 OTGHS_DisableOTGHSCK(pUsb);
852
853 // Invoke the Suspend callback
854
855 USB_SuspendCallback(pUsb);
856 }
857 }
858
859 // Resume
860 else if (ISSET(dStatus, AT91C_OTGHS_WAKEUP)
861 || ISSET(dStatus, AT91C_OTGHS_EORSM)) {
862
863 // Invoke the Resume callback
864 USB_ResumeCallback(pUsb);
865
866 TRACE_DEBUG_M("R ");
867
868 // The device enters Configured state
869 // MCK + UDPCK must be on
870 // Pull-Up must be connected
871 // Transceiver must be enabled
872
873 if (ISSET(USB_GetState(pUsb), USB_STATE_SUSPENDED)) {
874
875 // Powered state
876 OTGHS_EnableMCK(pUsb);
877 OTGHS_EnableOTGHSCK(pUsb);
878
879 // Default state
880 if (ISSET(USB_GetState(pUsb), USB_STATE_DEFAULT)) {
881
882 OTGHS_EnableTransceiver(pUsb);
883 }
884
885 CLEAR(*(pUsb->pState), USB_STATE_SUSPENDED);
886 }
887 pInterface->OTGHS_DEVICR =
888 (AT91C_OTGHS_WAKEUP | AT91C_OTGHS_EORSM | AT91C_OTGHS_SUSP);
889
890 pInterface->OTGHS_DEVIER = (AT91C_OTGHS_EORST | AT91C_OTGHS_SUSP);
891 pInterface->OTGHS_DEVICR = (AT91C_OTGHS_WAKEUP | AT91C_OTGHS_EORSM);
892 pInterface->OTGHS_DEVIDR = AT91C_OTGHS_WAKEUP;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -