?? ctrlrequest.lst
字號:
595 2 {
596 3 CSRWrite(USB_BASE + EP0_TXCNT, 1);
597 3 CSRWrite(USB_BASE + EP0_TXDATA, 0x00);
598 3 CSRWrite(USB_BASE + EP0_TXCSR, EN_TX0);
599 3 pSotaUsbRequest->LoadInDataOk = false;
600 3 }
601 2 CSRWrite(USB_BASE + EP0_RXCSR, EN_RX0);
602 2 break;
603 2
604 2 case IN_OK_TOKEN:
605 2 CSRWrite(USB_BASE + EP0_RXCSR, EN_RX0);
606 2 CSRWrite(USB_BASE + EP0_TXCSR, EN_TX0_STL);
607 2 break;
608 2
609 2 case OUT_TOKEN:
610 2 default:
611 2 // Ctrl Read End
612 2 pSotaUsbRequest->InProgress = false;
C51 COMPILER V7.02b CTRLREQUEST 02/01/2007 10:35:43 PAGE 11
613 2 break;
614 2 }
615 1 }
616
617 //----------------------------------------------------------------------------
618 // Set Interface Request
619 //----------------------------------------------------------------------------
620 void CtrlReqSetInterface()
621 {
622 1 BYTE Token = pSotaUsbRequest->Token;
623 1
624 1 switch(Token)
625 1 {
626 2 case SETUP_TOKEN:
627 2 // Because we don't support Alternate-IF-Set, we do nothing here.
628 2 CSRWrite(USB_BASE + EP0_RXCSR, EN_RX0_STL);
629 2 break;
630 2
631 2 case IN_TOKEN:
632 2 CtrlClearHaltFeature();
633 2 CSRWrite(USB_BASE + EP0_TXCNT, 0);
634 2 CSRWrite(USB_BASE + EP0_TXCSR, EN_TX0);
635 2 break;
636 2
637 2 case IN_OK_TOKEN:
638 2 CSRWrite(USB_BASE + EP0_RXCSR, EN_RX0);
639 2 CSRWrite(USB_BASE + EP0_TXCSR, EN_TX0_STL);
640 2
641 2 case OUT_TOKEN:
642 2 default:
643 2 pSotaUsbRequest->InProgress = false;
644 2 break;
645 2 }
646 1 }
647
648 //----------------------------------------------------------------------------
649 // Sync Frame Request
650 //----------------------------------------------------------------------------
651 void CtrlReqSyncFrame()
652 {
653 1 BYTE Token = pSotaUsbRequest->Token;
654 1
655 1 switch(Token)
656 1 {
657 2 case SETUP_TOKEN:
658 2 // We do not support isochronous mode.
659 2 CSRWrite(USB_BASE + EP0_RXCSR, EN_RX0_STL);
660 2 CSRWrite(USB_BASE + EP0_TXCSR, EN_TX0_STL);
661 2 break;
662 2
663 2 case IN_OK_TOKEN:
664 2 case IN_TOKEN:
665 2 case OUT_TOKEN:
666 2 default:
667 2 pSotaUsbRequest->InProgress = false;
668 2 break;
669 2 }
670 1 }
671
672 //----------------------------------------------------------------------------
673 // Get Max Lun Request
674 //----------------------------------------------------------------------------
C51 COMPILER V7.02b CTRLREQUEST 02/01/2007 10:35:43 PAGE 12
675 void CtrlReqGetMaxLun()
676 {
677 1 BYTE Token = pSotaUsbRequest->Token;
678 1
679 1 switch(Token)
680 1 {
681 2 case SETUP_TOKEN:
682 2 pSotaUsbRequest->LoadInDataOk = true;
683 2 CSRWrite(USB_BASE + EP0_RXCSR, EN_RX0_STL);
684 2 break;
685 2
686 2 case IN_TOKEN:
687 2 if (pSotaUsbRequest->LoadInDataOk)
688 2 {
689 3 CSRWrite(USB_BASE + EP0_TXCNT, 1);
690 3 CSRWrite(USB_BASE + EP0_TXDATA, LastDevice);
691 3 CSRWrite(USB_BASE + EP0_TXCSR, EN_TX0);
692 3 pSotaUsbRequest->LoadInDataOk = false;
693 3 }
694 2 CSRWrite(USB_BASE + EP0_RXCSR, EN_RX0);
695 2 break;
696 2
697 2 case IN_OK_TOKEN:
698 2 CSRWrite(USB_BASE + EP0_RXCSR, EN_RX0);
699 2 CSRWrite(USB_BASE + EP0_TXCSR, EN_TX0_STL);
700 2 break;
701 2
702 2 case OUT_TOKEN:
703 2 default:
704 2 // Ctrl Read End
705 2 pSotaUsbRequest->InProgress = false;
706 2 break;
707 2 }
708 1 }
709
710 //----------------------------------------------------------------------------
711 // Bulk Only Reset Request
712 //----------------------------------------------------------------------------
713 void CtrlReqBulkReset()
714 {
715 1 BYTE Token = pSotaUsbRequest->Token;
716 1
717 1 switch(Token)
718 1 {
719 2 case SETUP_TOKEN:
720 2 #ifndef CTRL_SIMULATION
721 2 BulkState = CBW_GET_COMPLETED;
722 2 CmdStatus = COMMAND_PASSED;
723 2 #endif
724 2 break;
725 2
726 2 case IN_TOKEN:
727 2 CSRWrite(USB_BASE + EP0_TXCNT, 0);
728 2 CSRWrite(USB_BASE + EP0_TXCSR, EN_TX0);
729 2 break;
730 2
731 2 case IN_OK_TOKEN:
732 2 CSRWrite(USB_BASE + EP0_RXCSR, EN_RX0);
733 2 CSRWrite(USB_BASE + EP0_TXCSR, EN_TX0_STL);
734 2
735 2 case OUT_TOKEN:
736 2 default:
C51 COMPILER V7.02b CTRLREQUEST 02/01/2007 10:35:43 PAGE 13
737 2 // Ctrl Read End
738 2 pSotaUsbRequest->InProgress = false;
739 2 break;
740 2 }
741 1 }
742
743 //----------------------------------------------------------------------------
744 // Request Setup
745 //----------------------------------------------------------------------------
746 void CtrlReqSetup()
747 {
748 1 PUSB_REQUEST pReq = &(pSotaUsbRequest->Request);
749 1
750 1 memcpy((void *)pReq, (void *)UsbBuf, sizeof(USB_REQUEST));
751 1 pSotaUsbRequest->InProgress = true;
752 1 pSotaUsbRequest->FinishedDataLen = 0;
753 1 pReq->wLength = ConvertEndian16(pReq->wLength);
754 1 }
755
756 //----------------------------------------------------------------------------
757 // Rx Transation Check
758 //----------------------------------------------------------------------------
759 void CtrlRxCheck()
760 {
761 1 BYTE i;
762 1 BYTE Len;
763 1 BYTE RxTokenType = 0;
764 1
765 1 Len = CSRRead(USB_BASE + EP0_RXCNT);
766 1 for (i=0; i < Len; i++)
767 1 {
768 2 UsbBuf[i] = CSRRead(USB_BASE + EP0_RXDATA);
769 2 }
770 1
771 1 RxTokenType = CSRRead(USB_BASE + EP0_RXTOKEN);
772 1 if (RxTokenType & (STS_SETUP0 | STS_SETUP0_OW))
773 1 {
774 2 if (Len == USB_REQUEST_LEN)
775 2 {
776 3 CtrlReqSetup();
777 3 pSotaUsbRequest->Token = SETUP_TOKEN;
778 3 }
779 2 else
780 2 {
781 3 pSotaUsbRequest->Token = BAD_SETUP_TOKEN;
782 3 }
783 2 // Add delay may resolve SE1 issue if using H/W incurred this issue.
784 2 // Delay(30);
785 2 }
786 1 else // Out Token Coming
787 1 pSotaUsbRequest->Token = OUT_TOKEN;
788 1 CSRWrite(USB_BASE + EP0_RXTOKEN, 0x00);
789 1 }
790
791 //--------------------------------------------------------------------
792 //
793 //--------------------------------------------------------------------
794 void CtrlRequestProcess()
795 {
796 1 BYTE RequestCode = pSotaUsbRequest->Request.bRequest;
797 1 BYTE RequestType = pSotaUsbRequest->Request.bmRequestType;
798 1
C51 COMPILER V7.02b CTRLREQUEST 02/01/2007 10:35:43 PAGE 14
799 1 if((RequestType & 0x60) == 0) // Standard Request
800 1 {
801 2 switch (RequestCode)
802 2 {
803 3 case GET_STATUS : CtrlReqGetStatus(); return;
804 3 case CLEAR_FEATURE : CtrlReqClearFeature(); return;
805 3 case SET_FEATURE : CtrlReqSetFeature(); return;
806 3 case SET_ADDRESS : CtrlReqSetAddress(); return;
807 3 case GET_DESCRIPTOR : CtrlReqGetDescriptor(); return;
808 3 case GET_CONFIGURATION: CtrlReqGetConfiguration(); return;
809 3 case SET_CONFIGURATION: CtrlReqSetConfiguration(); return;
810 3 case GET_INTERFACE : CtrlReqGetInterface(); return;
811 3 case SET_INTERFACE : CtrlReqSetInterface(); return;
812 3 case SYNCH_FRAME : CtrlReqSyncFrame(); return;
813 3 }
814 2 }
815 1
816 1 else if((RequestType & 0x60) == 0x20) // Class Request
817 1 {
818 2 switch (RequestCode)
819 2 {
820 3 case BULKONLY_GET_MAX_LUN: CtrlReqGetMaxLun(); return;
821 3 case BULKONLY_RESET : CtrlReqBulkReset(); return;
822 3 }
823 2 }
824 1
825 1 pSotaUsbRequest->InProgress = false;
826 1 CSRWrite(USB_BASE + EP0_RXCSR, EN_RX0);
827 1 CSRWrite(USB_BASE + EP0_TXCSR, EN_TX0_STL);
828 1 }
829
830 //----------------------------------------------------------------------------
831 // Ctrl Pipe Check
832 //----------------------------------------------------------------------------
833 void UsbCtrlIntHandler(BYTE IntEvent)
834 {
835 1 // Clear IRQs.
836 1 CSRWrite(USB_BASE + EPIE, ~IntEvent);
837 1
838 1 if (IntEvent & IRQ_IN0)
839 1 {
840 2 pSotaUsbRequest->Token = IN_TOKEN;
841 2 CSRWrite(USB_BASE + EP0_RXCSR, 0); // Fix the PHY miss IN ACK problem
842 2 }
843 1 if (IntEvent & IRQ_TX0) // This irq mean IN packet Completed
844 1 pSotaUsbRequest->Token = IN_OK_TOKEN;
845 1 if (IntEvent & IRQ_RX0)
846 1 CtrlRxCheck();
847 1
848 1 if (pSotaUsbRequest->InProgress)
849 1 CtrlRequestProcess();
850 1 else
851 1 CSRWrite(USB_BASE + EP0_RXCSR, EN_RX0);
852 1 }
853
854 //----------------------------------------------------------------------------
855 // Init USB
856 //----------------------------------------------------------------------------
857 void UsbInit()
858 {
859 1 BYTE Reg;
860 1
C51 COMPILER V7.02b CTRLREQUEST 02/01/2007 10:35:43 PAGE 15
861 1 CtrlPktSize = CTRL_PKT_SIZE;
862 1
863 1 CSRWrite(USB_BASE + EPIM, 0xdf);
864 1 CSRWrite(USB_BASE + EPCTL, EN_EP0 | EN_EP1 | EN_EP2);
865 1 pSotaUsbRequest = &SotaUsbRequest;
866 1 pSotaUsbRequest->InProgress = false;
867 1 pSotaUsbRequest->LoadInDataOk = false;
868 1 pSotaUsbRequest->HaltStatus = false;
869 1
870 1 InitBulkPipe();
871 1
872 1 while(1) // Detect USB Link Speed
873 1 {
874 2 Reg = CSRRead(USB_BASE + USB_SPEED);
875 2 if(Reg & SPEED_READY)
876 2 break;
877 2 }
878 1 }
879
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1941 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = 84 ----
PDATA SIZE = ---- ----
DATA SIZE = 1 45
IDATA SIZE = ---- ----
BIT SIZE = 2 7
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -