📄 chap_9.lst
字号:
649 5 }
650 4 Descriptor_Ptr = &Bulk_Out_Descriptor[0]; //set pointer to interface descriptor
651 4 count = *Descriptor_Ptr; //read in descriptor length
652 4 while(count != 0)
653 4 {
654 5 D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
655 5 count--;
656 5 Descriptor_Ptr++;
657 5 }
658 4 }
659 3 D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.VENDP = 1; //validate FIFO
660 3 wait_ep0tx();
661 3 ep0out_ack();
662 3 }
663 2 break;
664 2
665 2 case 8:
666 2 break;
667 2
668 2 default :
669 2 D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
670 2 D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 1;
671 2 while(!USB_Int_Flag.BITS.EP0SETUP)
672 2 {
673 3 //读取ISP1581中断寄存器
674 3 USB_Int_Flag.VALUE |= D14_Cntrl_Reg.D14_INT.VALUE;
C51 COMPILER V7.50 CHAP_9 10/30/2007 16:17:28 PAGE 12
675 3 //回写ISP1581中断寄存器
676 3 D14_Cntrl_Reg.D14_INT.VALUE = USB_Int_Flag.VALUE;
677 3 if(USB_Int_Flag.BITS.SUSP || USB_Int_Flag.BITS.RESET)
678 3 return;
679 3 }
680 2 USB_Int_Flag.BITS.EP0TX = 0;
681 2 break;
682 2 }
683 1 }
684
685
686 //Set_Address设置地址
687 void set_address(void)
688 {
689 1 USB_Int_Flag.BITS.EP0RX = 0;
690 1 D14_Cntrl_Reg.D14_ADDRESS.BITS.DEVADDR = (USB_Device_Request.wValue >> 8);//设置地址
691 1 //状态响应
692 1 ep0in_ack();
693 1 }
694
695
696
697 //Set_Config设置配置
698 void set_config(void)
699 {
700 1 USB_Int_Flag.BITS.EP0RX = 0;
701 1
702 1 if(USB_Device_Request.wValue == 0)
703 1 {
704 2 Device_Config_Value = 0;
705 2 ep0in_ack();
706 2 }
707 1 else if (USB_Device_Request.wValue == 0x0100)
708 1 {
709 2 //配置设备
710 2 Device_Config_Value = (UC) (USB_Device_Request.wValue >> 8);
711 2 ep0in_ack();
712 2 }
713 1 else
714 1 {
715 2 D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
716 2 D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 1;
717 2 while(!USB_Int_Flag.BITS.EP0SETUP)
718 2 {
719 3 //读取ISP1581中断寄存器
720 3 USB_Int_Flag.VALUE |= D14_Cntrl_Reg.D14_INT.VALUE;
721 3 //回写ISP1581中断寄存器
722 3 D14_Cntrl_Reg.D14_INT.VALUE = USB_Int_Flag.VALUE;
723 3 if(USB_Int_Flag.BITS.SUSP || USB_Int_Flag.BITS.RESET)
724 3 return;
725 3 }
726 2 USB_Int_Flag.BITS.EP0TX = 0;
727 2 }
728 1 }
729
730
731 //Get_Config获取配置
732 void get_config(void)
733 {
734 1 D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
735 1 D14_Cntrl_Reg.D14_DATA_PORT_LSB = Device_Config_Value;
736 1 D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.VENDP = 1;
C51 COMPILER V7.50 CHAP_9 10/30/2007 16:17:28 PAGE 13
737 1 wait_ep0tx();
738 1 ep0out_ack();
739 1 }
740
741
742
743 //Clear_Feature特性清除
744 void clear_feature(void)
745 {
746 1 unsigned char bRecipient = USB_Device_Request.bmRequestType & 0x0f;
747 1 //端点
748 1 if(bRecipient == 0x02 &&USB_Device_Request.wValue == 0x0000)
749 1 {
750 2 switch(USB_Device_Request.wIndex)
751 2 {
752 3 case 0x8000 :
753 3 D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
754 3 break;
755 3 case 0x0000 :
756 3 D14_Cntrl_Reg.D14_ENDPT_INDEX = 0;
757 3 break;
758 3 case 0x8100 :
759 3 D14_Cntrl_Reg.D14_ENDPT_INDEX = 3;
760 3 break;
761 3 case 0x0100 :
762 3 D14_Cntrl_Reg.D14_ENDPT_INDEX = 2;
763 3 break;
764 3 case 0x8200 :
765 3 D14_Cntrl_Reg.D14_ENDPT_INDEX = 5;
766 3 break;
767 3 case 0x0200 :
768 3 D14_Cntrl_Reg.D14_ENDPT_INDEX = 4;
769 3 break;
770 3 case 0x8300 :
771 3 D14_Cntrl_Reg.D14_ENDPT_INDEX = 7;
772 3 break;
773 3 case 0x0300 :
774 3 D14_Cntrl_Reg.D14_ENDPT_INDEX = 6;
775 3 break;
776 3 case 0x8400 :
777 3 D14_Cntrl_Reg.D14_ENDPT_INDEX = 9;
778 3 break;
779 3 case 0x0400 :
780 3 D14_Cntrl_Reg.D14_ENDPT_INDEX = 8;
781 3 break;
782 3 case 0x8500 :
783 3 D14_Cntrl_Reg.D14_ENDPT_INDEX = 11;
784 3 break;
785 3 case 0x0500 :
786 3 D14_Cntrl_Reg.D14_ENDPT_INDEX = 10;
787 3 break;
788 3 case 0x8600 :
789 3 D14_Cntrl_Reg.D14_ENDPT_INDEX = 13;
790 3 break;
791 3 case 0x0600 :
792 3 D14_Cntrl_Reg.D14_ENDPT_INDEX = 12;
793 3 break;
794 3 case 0x8700 :
795 3 D14_Cntrl_Reg.D14_ENDPT_INDEX = 15;
796 3 break;
797 3 case 0x0700 :
798 3 D14_Cntrl_Reg.D14_ENDPT_INDEX = 14;
C51 COMPILER V7.50 CHAP_9 10/30/2007 16:17:28 PAGE 14
799 3 break;
800 3 default :
801 3 break;
802 3 }
803 2 D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 0;
804 2 Kernel_Flag.BITS.Endpt_Stall = 0;
805 2 D14_Cntrl_Reg.D14_ENDPT_TYPE.BITS.ENABLE = OFF; //disable FIFO
806 2 D14_Cntrl_Reg.D14_ENDPT_TYPE.BITS.ENABLE = ON; //disable FIFO
807 2 ep0in_ack();
808 2 USB_Device.BITS.Halt = 0;
809 2 }
810 1 else if(bRecipient == 0x00 && USB_Device_Request.wValue == 0x0100)
811 1 { //远程唤醒
812 2 USB_Device.BITS.Remote_Wakeup = 0;
813 2 ep0in_ack();
814 2 }
815 1 else
816 1 {
817 2 D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
818 2 D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 1;
819 2 while(!USB_Int_Flag.BITS.EP0SETUP)
820 2 {
821 3 //读取ISP1581中断寄存器
822 3 USB_Int_Flag.VALUE |= D14_Cntrl_Reg.D14_INT.VALUE;
823 3 //回写ISP1581中断寄存器
824 3 D14_Cntrl_Reg.D14_INT.VALUE = USB_Int_Flag.VALUE;
825 3 if(USB_Int_Flag.BITS.SUSP || USB_Int_Flag.BITS.RESET)
826 3 return;
827 3 }
828 2 USB_Int_Flag.BITS.EP0TX = 0;
829 2 }
830 1 }
831
832
833
834 //Get_Status获取设备状态
835 void get_status(void)
836 {
837 1 if(USB_Device_Request.bmRequestType == 0x80)
838 1 {
839 2 //端点0IN返回0x01,0x00两字节
840 2 D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
841 2 D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB = 2;
842 2 D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB = 0;
843 2 D14_Cntrl_Reg.D14_DATA_PORT_LSB = 1;
844 2 D14_Cntrl_Reg.D14_DATA_PORT_MSB = 0;
845 2 //等待发送完毕
846 2 wait_ep0tx();
847 2 ep0out_ack();
848 2 }
849 1
850 1 if(USB_Device_Request.bmRequestType == 0x81)
851 1 {
852 2 //端点0IN返回0x00,0x00两字节
853 2 D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
854 2 D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB = 2;
855 2 D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB = 0;
856 2 D14_Cntrl_Reg.D14_DATA_PORT_LSB = 0;
857 2 D14_Cntrl_Reg.D14_DATA_PORT_MSB = 0;
858 2 wait_ep0tx();
859 2 ep0out_ack();
860 2 }
C51 COMPILER V7.50 CHAP_9 10/30/2007 16:17:28 PAGE 15
861 1
862 1 if(USB_Device_Request.bmRequestType == 0x82)
863 1 {
864 2 Temp = 0;
865 2 Temp = USB_Device.BITS.Halt;
866 2 D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -