?? usbcore.lst
字號:
745 /********************************************************************
746 函數功能:USB斷開連接函數。
747 入口參數:無。
748 返 回:無。
749 備 注:無。
750 ********************************************************************/
751 void UsbDisconnect(void)
752 {
753 1 #ifdef DEBUG0
754 1 Prints("斷開USB連接。\r\n");
755 1 #endif
756 1 D12WriteCommand(D12_SET_MODE); //寫設置模式命令
757 1 D12WriteByte(0x06); //設置模式的第一字節
758 1 D12WriteByte(0x47); //設置模式的第二字節
759 1 DelayXms(1000); //延遲1秒
760 1 }
761 ////////////////////////End of function//////////////////////////////
762
763 /********************************************************************
764 函數功能:USB連接函數。
765 入口參數:無。
766 返 回:無。
767 備 注:無。
768 ********************************************************************/
769 void UsbConnect(void)
770 {
771 1 #ifdef DEBUG0
772 1 Prints("連接USB。\r\n");
773 1 #endif
774 1 D12WriteCommand(D12_SET_MODE); //寫設置模式命令
775 1 D12WriteByte(0x16); //設置模式的第一字節
776 1 D12WriteByte(0x47); //設置模式的第二字節
777 1 }
778 ////////////////////////End of function//////////////////////////////
779
780 /********************************************************************
781 函數功能:總線掛起中斷處理函數。
782 入口參數:無。
783 返 回:無。
784 備 注:無。
785 ********************************************************************/
786 void UsbBusSuspend(void)
787 {
788 1 #ifdef DEBUG0
789 1 Prints("USB總線掛起。\r\n");
790 1 #endif
791 1 }
792 ////////////////////////End of function//////////////////////////////
793
794 /********************************************************************
795 函數功能:總線復位中斷處理函數。
796 入口參數:無。
797 返 回:無。
798 備 注:無。
799 ********************************************************************/
C51 COMPILER V7.06 USBCORE 11/16/2008 15:59:36 PAGE 14
800 void UsbBusReset(void)
801 {
802 1 #ifdef DEBUG0
803 1 Prints("USB總線復位。\r\n");
804 1 #endif
805 1 Ep1InIsBusy=0; //復位后端點1輸入緩沖區空閑。
806 1 Ep2InIsBusy=0; //復位后端點2輸入緩沖區空閑。
807 1 }
808 ////////////////////////End of function//////////////////////////////
809
810 /********************************************************************
811 函數功能:根據pData和SendLength將數據發送到端點0的函數。
812 入口參數:無。
813 返 回:無。
814 備 注:無。
815 ********************************************************************/
816 void UsbEp0SendData(void)
817 {
818 1 //將數據寫到端點中去準備發送
819 1 //寫之前要先判斷一下需要發送的數據是否比端點0
820 1 //最大長度大,如果超過端點大小,則一次只能發送
821 1 //最大包長的數據。端點0的最大包長在DeviceDescriptor[7]
822 1 if(SendLength>DeviceDescriptor[7])
823 1 {
824 2 //按最大包長度發送
825 2 D12WriteEndpointBuffer(1,DeviceDescriptor[7],pSendData);
826 2 //發送后剩余字節數減少最大包長
827 2 SendLength-=DeviceDescriptor[7];
828 2 //發送一次后指針位置要調整
829 2 pSendData+= DeviceDescriptor[7];
830 2 }
831 1 else
832 1 {
833 2 if(SendLength!=0)
834 2 {
835 3 //不夠最大包長,可以直接發送
836 3 D12WriteEndpointBuffer(1,SendLength,pSendData);
837 3 //發送完畢后,SendLength長度變為0
838 3 SendLength=0;
839 3 }
840 2 else //如果要發送的數據包長度為0
841 2 {
842 3 if(NeedZeroPacket==1) //如果需要發送0長度數據
843 3 {
844 4 D12WriteEndpointBuffer(1,0,pSendData); //發送0長度數據包
845 4 NeedZeroPacket=0; //清需要發送0長度數據包標志
846 4 }
847 3 }
848 2 }
849 1 }
850 ////////////////////////End of function//////////////////////////////
851
852 /********************************************************************
853 函數功能:端點0輸出中斷處理函數。
854 入口參數:無。
855 返 回:無。
856 備 注:無。
857 ********************************************************************/
858 void UsbEp0Out(void)
859 {
860 1 #ifdef DEBUG0
861 1 Prints("USB端點0輸出中斷。\r\n");
C51 COMPILER V7.06 USBCORE 11/16/2008 15:59:36 PAGE 15
862 1 #endif
863 1 //讀取端點0輸出最后傳輸狀態,該操作清除中斷標志
864 1 //并判斷第5位是否為1,如果是,則說明是建立包
865 1 if(D12ReadEndpointLastStatus(0)&0x20)
866 1 {
867 2 D12ReadEndpointBuffer(0,16,Buffer); //讀建立過程數據
868 2 D12AcknowledgeSetup(); //應答建立包
869 2 D12ClearBuffer(); //清緩沖區
870 2 //將緩沖數據填到設備請求的各字段中
871 2 bmRequestType=Buffer[0];
872 2 bRequest=Buffer[1];
873 2 wValue=Buffer[2]+(((uint16)Buffer[3])<<8);
874 2 wIndex=Buffer[4]+(((uint16)Buffer[5])<<8);
875 2 wLength=Buffer[6]+(((uint16)Buffer[7])<<8);
876 2 //下面的代碼判斷具體的請求,并根據不同的請求進行相關操作
877 2 //如果D7位為1,則說明是輸入請求
878 2 if((bmRequestType&0x80)==0x80)
879 2 {
880 3 //根據bmRequestType的D6~5位散轉,D6~5位表示請求的類型
881 3 //0為標準請求,1為類請求,2為廠商請求。
882 3 switch((bmRequestType>>5)&0x03)
883 3 {
884 4 case 0: //標準請求
885 4 #ifdef DEBUG0
886 4 Prints("USB標準輸入請求:");
887 4 #endif
888 4 //USB協議定義了幾個標準輸入請求,我們實現這些標準請求即可
889 4 //請求的代碼在bRequest中,對不同的請求代碼進行散轉
890 4 //事實上,我們還需要對接收者進行散轉,因為不同的請求接收者
891 4 //是不一樣的。接收者在bmRequestType的D4~D0位中定義。
892 4 //我們這里為了簡化操作,有些就省略了對接收者的判斷。
893 4 //例如獲取描述符的請求,只根據描述符的類型來區別。
894 4 switch(bRequest)
895 4 {
896 5 case GET_CONFIGURATION: //獲取配置
897 5 #ifdef DEBUG0
898 5 Prints("獲取配置。\r\n");
899 5 #endif
900 5 break;
901 5
902 5 case GET_DESCRIPTOR: //獲取描述符
903 5 #ifdef DEBUG0
904 5 Prints("獲取描述符——");
905 5 #endif
906 5 //對描述符類型進行散轉,對于全速設備,
907 5 //標準請求只支持發送到設備的設備、配置、字符串三種描述符
908 5 switch((wValue>>8)&0xFF)
909 5 {
910 6 case DEVICE_DESCRIPTOR: //設備描述符
911 6 #ifdef DEBUG0
912 6 Prints("設備描述符。\r\n");
913 6 #endif
914 6 pSendData=DeviceDescriptor; //需要發送的數據
915 6 //判斷請求的字節數是否比實際需要發送的字節數多
916 6 //這里請求的是設備描述符,因此數據長度就是
917 6 //DeviceDescriptor[0]。如果請求的比實際的長,
918 6 //那么只返回實際長度的數據
919 6 if(wLength>DeviceDescriptor[0])
920 6 {
921 7 SendLength=DeviceDescriptor[0];
922 7 if(SendLength%DeviceDescriptor[7]==0) //并且剛好是整數個數據包時
923 7 {
C51 COMPILER V7.06 USBCORE 11/16/2008 15:59:36 PAGE 16
924 8 NeedZeroPacket=1; //需要返回0長度的數據包
925 8 }
926 7 }
927 6 else
928 6 {
929 7 SendLength=wLength;
930 7 }
931 6 //將數據通過EP0返回
932 6 UsbEp0SendData();
933 6 break;
934 6
935 6 case CONFIGURATION_DESCRIPTOR: //配置描述符
936 6 #ifdef DEBUG0
937 6 Prints("配置描述符。\r\n");
938 6 #endif
939 6 pSendData=ConfigurationDescriptor; //需要發送的數據為配置描述符
940 6 //判斷請求的字節數是否比實際需要發送的字節數多
941 6 //這里請求的是配置描述符集合,因此數據長度就是
942 6 //ConfigurationDescriptor[3]*256+ConfigurationDescriptor[2]。
943 6 //如果請求的比實際的長,那么只返回實際長度的數據
944 6 SendLength=ConfigurationDescriptor[3];
945 6 SendLength=SendLength*256+ConfigurationDescriptor[2];
946 6 if(wLength>SendLength)
947 6 {
948 7 if(SendLength%DeviceDescriptor[7]==0) //并且剛好是整數個數據包時
949 7 {
950 8 NeedZeroPacket=1; //需要返回0長度的數據包
951 8 }
952 7 }
953 6 else
954 6 {
955 7 SendLength=wLength;
956 7 }
957 6 //將數據通過EP0返回
958 6 UsbEp0SendData();
959 6 break;
960 6
961 6 case STRING_DESCRIPTOR: //字符串描述符
962 6 #ifdef DEBUG0
963 6 Prints("字符串描述符");
964 6 #endif
965 6 switch(wValue&0xFF) //根據wValue的低字節(索引值)散轉
966 6 {
967 7 case 0: //獲取語言ID
968 7 #ifdef DEBUG0
969 7 Prints("(語言ID)。\r\n");
970 7 #endif
971 7 pSendData=LanguageId;
972 7 SendLength=LanguageId[0];
973 7 break;
974 7
975 7 case 1: //廠商字符串的索引值為1,所以這里為廠商字符串
976 7 #ifdef DEBUG0
977 7 Prints("(廠商描述)。\r\n");
978 7 #endif
979 7 pSendData=ManufacturerStringDescriptor;
980 7 SendLength=ManufacturerStringDescriptor[0];
981 7 break;
982 7
983 7 case 2: //產品字符串的索引值為2,所以這里為產品字符串
984 7 #ifdef DEBUG0
985 7 Prints("(產品描述)。\r\n");
C51 COMPILER V7.06 USBCORE 11/16/2008 15:59:36 PAGE 17
986 7 #endif
987 7 pSendData=ProductStringDescriptor;
988 7 SendLength=ProductStringDescriptor[0];
989 7 break;
990 7
991 7 case 3: //產品序列號的索引值為3,所以這里為序列號
992 7 #ifdef DEBUG0
993 7 Prints("(產品序列號)。\r\n");
994 7 #endif
995 7 pSendData=SerialNumberStringDescriptor;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -