?? chap_9.lst
字號:
768 1 }
769
770 //Set_Address設置地址
771 void set_address(void)
772 {
773 1 USB_Int_Flag.BITS.EP0RX = 0;
774 1 D14_Cntrl_Reg.D14_ADDRESS.BITS.DEVADDR = (USB_Device_Request.wValue >> 8);//設置地址
775 1 //狀態響應
776 1 ep0in_ack();
777 1 }
778
779 //Set_Config設置配置
780 void set_config(void)
781 {
782 1 USB_Int_Flag.BITS.EP0RX = 0;
783 1
784 1 if(USB_Device_Request.wValue == 0)
785 1 {
786 2 Device_Config_Value = 0;
787 2 ep0in_ack();
788 2 }
789 1 else if (USB_Device_Request.wValue == 0x0100)
790 1 {
791 2 //配置設備
792 2 Device_Config_Value = (UC) (USB_Device_Request.wValue >> 8);
793 2 // USB_Device.BITS.State = USB_Configured;
794 2 ep0in_ack();
795 2 }
796 1 else
797 1 {
798 2 D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
799 2 D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 1;
C51 COMPILER V7.06 CHAP_9 07/02/2003 10:05:13 PAGE 14
800 2 while(!USB_Int_Flag.BITS.EP0SETUP)
801 2 {
802 3 //讀取ISP1581中斷寄存器
803 3 USB_Int_Flag.VALUE |= D14_Cntrl_Reg.D14_INT.VALUE;
804 3 //回寫ISP1581中斷寄存器
805 3 D14_Cntrl_Reg.D14_INT.VALUE = USB_Int_Flag.VALUE;
806 3 if(USB_Int_Flag.BITS.SUSP || USB_Int_Flag.BITS.RESET)
807 3 return;
808 3 }
809 2 USB_Int_Flag.BITS.EP0TX = 0;
810 2 }
811 1 }
812
813
814 //Get_Config獲取配置
815 void get_config(void)
816 {
817 1 D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
818 1 D14_Cntrl_Reg.D14_DATA_PORT_LSB = Device_Config_Value;
819 1 D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.VENDP = 1;
820 1 wait_ep0tx();
821 1 ep0out_ack();
822 1 }
823
824 //Clear_Feature特性清除
825 void clear_feature(void)
826 {
827 1 unsigned char bRecipient = USB_Device_Request.bmRequestType & 0x0f;
828 1 //端點
829 1 if(bRecipient == 0x02 &&USB_Device_Request.wValue == 0x0000)
830 1 {
831 2 switch(USB_Device_Request.wIndex)
832 2 {
833 3 case 0x8000 :
834 3 D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
835 3 break;
836 3 case 0x0000 :
837 3 D14_Cntrl_Reg.D14_ENDPT_INDEX = 0;
838 3 break;
839 3 case 0x8100 :
840 3 D14_Cntrl_Reg.D14_ENDPT_INDEX = 3;
841 3 break;
842 3 case 0x0100 :
843 3 D14_Cntrl_Reg.D14_ENDPT_INDEX = 2;
844 3 break;
845 3 case 0x8200 :
846 3 D14_Cntrl_Reg.D14_ENDPT_INDEX = 5;
847 3 break;
848 3 case 0x0200 :
849 3 D14_Cntrl_Reg.D14_ENDPT_INDEX = 4;
850 3 break;
851 3 case 0x8300 :
852 3 D14_Cntrl_Reg.D14_ENDPT_INDEX = 7;
853 3 break;
854 3 case 0x0300 :
855 3 D14_Cntrl_Reg.D14_ENDPT_INDEX = 6;
856 3 break;
857 3 case 0x8400 :
858 3 D14_Cntrl_Reg.D14_ENDPT_INDEX = 9;
859 3 break;
860 3 case 0x0400 :
861 3 D14_Cntrl_Reg.D14_ENDPT_INDEX = 8;
C51 COMPILER V7.06 CHAP_9 07/02/2003 10:05:13 PAGE 15
862 3 break;
863 3 case 0x8500 :
864 3 D14_Cntrl_Reg.D14_ENDPT_INDEX = 11;
865 3 break;
866 3 case 0x0500 :
867 3 D14_Cntrl_Reg.D14_ENDPT_INDEX = 10;
868 3 break;
869 3 case 0x8600 :
870 3 D14_Cntrl_Reg.D14_ENDPT_INDEX = 13;
871 3 break;
872 3 case 0x0600 :
873 3 D14_Cntrl_Reg.D14_ENDPT_INDEX = 12;
874 3 break;
875 3 case 0x8700 :
876 3 D14_Cntrl_Reg.D14_ENDPT_INDEX = 15;
877 3 break;
878 3 case 0x0700 :
879 3 D14_Cntrl_Reg.D14_ENDPT_INDEX = 14;
880 3 break;
881 3 default :
882 3 break;
883 3 }
884 2 D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 0;
885 2 Kernel_Flag.BITS.Endpt_Stall = 0;
886 2 D14_Cntrl_Reg.D14_ENDPT_TYPE.BITS.ENABLE = OFF; //disable FIFO
887 2 D14_Cntrl_Reg.D14_ENDPT_TYPE.BITS.ENABLE = ON; //disable FIFO
888 2 ep0in_ack();
889 2 USB_Device.BITS.Halt = 0;
890 2 }
891 1 else if(bRecipient == 0x00 && USB_Device_Request.wValue == 0x0100)
892 1 { //遠程喚醒
893 2 USB_Device.BITS.Remote_Wakeup = 0;
894 2 ep0in_ack();
895 2 }
896 1 else
897 1 {
898 2 D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
899 2 D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 1;
900 2 while(!USB_Int_Flag.BITS.EP0SETUP)
901 2 {
902 3 //讀取ISP1581中斷寄存器
903 3 USB_Int_Flag.VALUE |= D14_Cntrl_Reg.D14_INT.VALUE;
904 3 //回寫ISP1581中斷寄存器
905 3 D14_Cntrl_Reg.D14_INT.VALUE = USB_Int_Flag.VALUE;
906 3 if(USB_Int_Flag.BITS.SUSP || USB_Int_Flag.BITS.RESET)
907 3 return;
908 3 }
909 2 USB_Int_Flag.BITS.EP0TX = 0;
910 2 }
911 1 }
912
913 //Get_Status獲取設備狀態
914 void get_status(void)
915 {
916 1 if(USB_Device_Request.bmRequestType == 0x80)
917 1 {
918 2 //端點0IN返回0x01,0x00兩字節
919 2 D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
920 2 D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB = 2;
921 2 D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB = 0;
922 2 D14_Cntrl_Reg.D14_DATA_PORT_LSB = 1;
923 2 D14_Cntrl_Reg.D14_DATA_PORT_MSB = 0;
C51 COMPILER V7.06 CHAP_9 07/02/2003 10:05:13 PAGE 16
924 2 //等待發送完畢
925 2 wait_ep0tx();
926 2 ep0out_ack();
927 2 }
928 1
929 1 if(USB_Device_Request.bmRequestType == 0x81)
930 1 {
931 2 //端點0IN返回0x00,0x00兩字節
932 2 D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
933 2 D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB = 2;
934 2 D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB = 0;
935 2 D14_Cntrl_Reg.D14_DATA_PORT_LSB = 0;
936 2 D14_Cntrl_Reg.D14_DATA_PORT_MSB = 0;
937 2 wait_ep0tx();
938 2 ep0out_ack();
939 2 }
940 1
941 1 if(USB_Device_Request.bmRequestType == 0x82)
942 1 {
943 2 Temp = 0;
944 2 Temp = USB_Device.BITS.Halt;
945 2 D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
946 2 D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB = 2;
947 2 D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB = 0;
948 2 D14_Cntrl_Reg.D14_DATA_PORT_LSB = (UC) Temp;
949 2 D14_Cntrl_Reg.D14_DATA_PORT_MSB = (UC) (Temp >> 8);
950 2 wait_ep0tx();
951 2 ep0out_ack();
952 2 }
953 1 }
954
955
956
957 //Set_Feature特性設置
958 //不支持測試模式
959 void set_feature(void)
960 {
961 1 unsigned char bRecipient = USB_Device_Request.bmR
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -