📄 chap_9.lst
字号:
595 5 {
596 6 D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
597 6 count--;
598 6 Descriptor_Ptr++;
599 6 }
600 5 wait_ep0tx();
601 5 ep0out_ack();
602 5 }
603 4 }
604 3 }
605 2 break;
606 2
607 2 case 6: //获取设备限制描述符
608 2 Descriptor_Ptr = &HS_Device_Qualifier[0]; //set pointer to High Speed device descriptor
609 2 count = *Descriptor_Ptr; //read in descriptor length
610 2 D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
611 2 if(USB_Device_Request.wLength < count)
612 2 {
613 3 D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB = (UC) USB_Device_Request.wLength;
C51 COMPILER V7.06 CHAP_9 07/02/2003 10:27:50 PAGE 11
614 3 D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB = 0;
615 3 count = USB_Device_Request.wLength;
616 3 }
617 2 else
618 2 {
619 3 D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB = count;
620 3 D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB = 0;
621 3 }
622 2 while(count != 0)
623 2 {
624 3 D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr; //fill up FIFO
625 3 Descriptor_Ptr++;
626 3 count--;
627 3 };
628 2 wait_ep0tx();
629 2 ep0out_ack();
630 2 break;
631 2
632 2 case 7 ://获取速度配置描述符
633 2 Temp = 64;
634 2 Descriptor_Ptr = &Other_Speed_Config_Descriptor[0]; //set pointer to configuration descriptor
635 2 count = *Descriptor_Ptr; //get configuration Descriptor length
636 2 D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
637 2 if(count >= USB_Device_Request.wLength) //Send only Configuration descriptor
638 2 {
639 3 D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB = (UC) USB_Device_Request.wLength;
640 3 D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB = (UC) (USB_Device_Request.wLength >> 8);
641 3 for(count = 0 ; count < USB_Device_Request.wLength ; count++)
642 3 {
643 4 D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
644 4 Descriptor_Ptr++;
645 4 }
646 3 wait_ep0tx();
647 3 ep0out_ack();
648 3 }
649 2 else //send Configuration,Interface and Endpoint descriptor
650 2 {
651 3 if(USB_Device_Request.wLength >= 32)
652 3 {
653 4 while(count != 0)
654 4 {
655 5 D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
656 5 count--;
657 5 Descriptor_Ptr++;
658 5 }
659 4 Descriptor_Ptr = &Bulk_Interface_Descriptor[0]; //set pointer to interface descriptor
660 4 count = *Descriptor_Ptr; //get the descriptor count
661 4 while(count != 0)
662 4 {
663 5 D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
664 5 count--;
665 5 Descriptor_Ptr++;
666 5 }
667 4 Descriptor_Ptr = &Int_In_Descriptor[0]; //set pointer to interface descriptor
668 4 count = *Descriptor_Ptr; //read in descriptor length
669 4 while(count != 0)
670 4 {
671 5 D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
672 5 count--;
673 5 Descriptor_Ptr++;
674 5 }
675 4 Descriptor_Ptr = &Int_Out_Descriptor[0]; //set pointer to interface descriptor
C51 COMPILER V7.06 CHAP_9 07/02/2003 10:27:50 PAGE 12
676 4 count = *Descriptor_Ptr; //read in descriptor length
677 4 while(count != 0)
678 4 {
679 5 D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
680 5 count--;
681 5 Descriptor_Ptr++;
682 5 }
683 4 Descriptor_Ptr = &Bulk_In_Descriptor[0]; //set pointer to interface descriptor
684 4 count = *Descriptor_Ptr; //read in descriptor length
685 4 while(count != 0)
686 4 {
687 5 D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
688 5 count--;
689 5 Descriptor_Ptr++;
690 5 }
691 4 Descriptor_Ptr = &Bulk_Out_Descriptor[0]; //set pointer to interface descriptor
692 4 count = *Descriptor_Ptr; //read in descriptor length
693 4 while(count != 0)
694 4 {
695 5 D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
696 5 count--;
697 5 Descriptor_Ptr++;
698 5 }
699 4 }
700 3 D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.VENDP = 1; //validate FIFO
701 3 wait_ep0tx();
702 3 ep0out_ack();
703 3 }
704 2 break;
705 2
706 2 case 8:
707 2 break;
708 2
709 2 default :
710 2 D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
711 2 D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 1;
712 2 while(!USB_Int_Flag.BITS.EP0SETUP)
713 2 {
714 3 //读取ISP1581中断寄存器
715 3 USB_Int_Flag.VALUE |= D14_Cntrl_Reg.D14_INT.VALUE;
716 3 //回写ISP1581中断寄存器
717 3 D14_Cntrl_Reg.D14_INT.VALUE = USB_Int_Flag.VALUE;
718 3 if(USB_Int_Flag.BITS.SUSP || USB_Int_Flag.BITS.RESET)
719 3 return;
720 3 }
721 2 USB_Int_Flag.BITS.EP0TX = 0;
722 2 break;
723 2 }
724 1 }
725
726 //Set_Address设置地址
727 void set_address(void)
728 {
729 1 USB_Int_Flag.BITS.EP0RX = 0;
730 1 D14_Cntrl_Reg.D14_ADDRESS.BITS.DEVADDR = (USB_Device_Request.wValue >> 8);//设置地址
731 1 //状态响应
732 1 ep0in_ack();
733 1 }
734
735 //Set_Config设置配置
736 void set_config(void)
737 {
C51 COMPILER V7.06 CHAP_9 07/02/2003 10:27:50 PAGE 13
738 1 USB_Int_Flag.BITS.EP0RX = 0;
739 1
740 1 if(USB_Device_Request.wValue == 0)
741 1 {
742 2 Device_Config_Value = 0;
743 2 ep0in_ack();
744 2 }
745 1 else if (USB_Device_Request.wValue == 0x0100)
746 1 {
747 2 //配置设备
748 2 Device_Config_Value = (UC) (USB_Device_Request.wValue >> 8);
749 2 // USB_Device.BITS.State = USB_Configured;
750 2 ep0in_ack();
751 2 }
752 1 else
753 1 {
754 2 D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
755 2 D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 1;
756 2 while(!USB_Int_Flag.BITS.EP0SETUP)
757 2 {
758 3 //读取ISP1581中断寄存器
759 3 USB_Int_Flag.VALUE |= D14_Cntrl_Reg.D14_INT.VALUE;
760 3 //回写ISP1581中断寄存器
761 3 D14_Cntrl_Reg.D14_INT.VALUE = USB_Int_Flag.VALUE;
762 3 if(USB_Int_Flag.BITS.SUSP || USB_Int_Flag.BITS.RESET)
763 3 return;
764 3 }
765 2 USB_Int_Flag.BITS.EP0TX = 0;
766 2 }
767 1 }
768
769
770 //Get_Config获取配置
771 void get_config(void)
772 {
773 1 D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
774 1 D14_Cntrl_Reg.D14_DATA_PORT_LSB = Device_Config_Value;
775 1 D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.VENDP = 1;
776 1 wait_ep0tx();
777 1 ep0out_ack();
778 1 }
779
780 //Clear_Feature特性清除
781 void clear_feature(void)
782 {
783 1 unsigned char bRecipient = USB_Device_Request.bmRequestType & 0x0f;
784 1 //端点
785 1 if(bRecipient == 0x02 &&USB_Device_Request.wValue == 0x0000)
786 1 {
787 2 switch(USB_Device_Request.wIndex)
788 2 {
789 3 case 0x8000 :
790 3 D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
791 3 break;
792 3 case 0x0000 :
793 3 D14_Cntrl_Reg.D14_ENDPT_INDEX = 0;
794 3 break;
795 3 case 0x8100 :
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -