?? usbcore.lst
字號(hào):
552 ********************************************************************/
553 void UsbConnect(void)
554 {
555 1 #ifdef DEBUG0
556 1 Prints("連接USB。\r\n");
557 1 #endif
558 1 D12WriteCommand(D12_SET_MODE); //寫(xiě)設(shè)置模式命令
559 1 D12WriteByte(0x16); //設(shè)置模式的第一字節(jié)
560 1 D12WriteByte(0x47); //設(shè)置模式的第二字節(jié)
561 1 }
562 ////////////////////////End of function//////////////////////////////
563
564 /********************************************************************
565 函數(shù)功能:總線(xiàn)掛起中斷處理函數(shù)。
566 入口參數(shù):無(wú)。
567 返 回:無(wú)。
568 備 注:無(wú)。
569 ********************************************************************/
570 void UsbBusSuspend(void)
571 {
572 1 #ifdef DEBUG0
573 1 Prints("USB總線(xiàn)掛起。\r\n");
574 1 #endif
575 1 }
576 ////////////////////////End of function//////////////////////////////
577
578 /********************************************************************
579 函數(shù)功能:總線(xiàn)復(fù)位中斷處理函數(shù)。
580 入口參數(shù):無(wú)。
581 返 回:無(wú)。
582 備 注:無(wú)。
583 ********************************************************************/
584 void UsbBusReset(void)
585 {
586 1 #ifdef DEBUG0
587 1 Prints("USB總線(xiàn)復(fù)位。\r\n");
588 1 #endif
589 1 Ep1InIsBusy=0; //復(fù)位后端點(diǎn)1輸入緩沖區(qū)空閑。
590 1 }
591 ////////////////////////End of function//////////////////////////////
592
593 /********************************************************************
594 函數(shù)功能:根據(jù)pData和SendLength將數(shù)據(jù)發(fā)送到端點(diǎn)0的函數(shù)。
595 入口參數(shù):無(wú)。
596 返 回:無(wú)。
597 備 注:無(wú)。
598 ********************************************************************/
599 void UsbEp0SendData(void)
600 {
601 1 //將數(shù)據(jù)寫(xiě)到端點(diǎn)中去準(zhǔn)備發(fā)送
602 1 //寫(xiě)之前要先判斷一下需要發(fā)送的數(shù)據(jù)是否比端點(diǎn)0
603 1 //最大長(zhǎng)度大,如果超過(guò)端點(diǎn)大小,則一次只能發(fā)送
604 1 //最大包長(zhǎng)的數(shù)據(jù)。端點(diǎn)0的最大包長(zhǎng)在DeviceDescriptor[7]
605 1 if(SendLength>DeviceDescriptor[7])
606 1 {
607 2 //按最大包長(zhǎng)度發(fā)送
608 2 D12WriteEndpointBuffer(1,DeviceDescriptor[7],pSendData);
609 2 //發(fā)送后剩余字節(jié)數(shù)減少最大包長(zhǎng)
610 2 SendLength-=DeviceDescriptor[7];
611 2 //發(fā)送一次后指針位置要調(diào)整
612 2 pSendData+= DeviceDescriptor[7];
613 2 }
C51 COMPILER V7.06 USBCORE 11/16/2008 16:00:31 PAGE 11
614 1 else
615 1 {
616 2 if(SendLength!=0)
617 2 {
618 3 //不夠最大包長(zhǎng),可以直接發(fā)送
619 3 D12WriteEndpointBuffer(1,SendLength,pSendData);
620 3 //發(fā)送完畢后,SendLength長(zhǎng)度變?yōu)?
621 3 SendLength=0;
622 3 }
623 2 else //如果要發(fā)送的數(shù)據(jù)包長(zhǎng)度為0
624 2 {
625 3 if(NeedZeroPacket==1) //如果需要發(fā)送0長(zhǎng)度數(shù)據(jù)
626 3 {
627 4 D12WriteEndpointBuffer(1,0,pSendData); //發(fā)送0長(zhǎng)度數(shù)據(jù)包
628 4 NeedZeroPacket=0; //清需要發(fā)送0長(zhǎng)度數(shù)據(jù)包標(biāo)志
629 4 }
630 3 }
631 2 }
632 1 }
633 ////////////////////////End of function//////////////////////////////
634
635 /********************************************************************
636 函數(shù)功能:端點(diǎn)0輸出中斷處理函數(shù)。
637 入口參數(shù):無(wú)。
638 返 回:無(wú)。
639 備 注:無(wú)。
640 ********************************************************************/
641 void UsbEp0Out(void)
642 {
643 1 #ifdef DEBUG0
644 1 Prints("USB端點(diǎn)0輸出中斷。\r\n");
645 1 #endif
646 1 //讀取端點(diǎn)0輸出最后傳輸狀態(tài),該操作清除中斷標(biāo)志
647 1 //并判斷第5位是否為1,如果是,則說(shuō)明是建立包
648 1 if(D12ReadEndpointLastStatus(0)&0x20)
649 1 {
650 2 D12ReadEndpointBuffer(0,16,Buffer); //讀建立過(guò)程數(shù)據(jù)
651 2 D12AcknowledgeSetup(); //應(yīng)答建立包
652 2 D12ClearBuffer(); //清緩沖區(qū)
653 2 //將緩沖數(shù)據(jù)填到設(shè)備請(qǐng)求的各字段中
654 2 bmRequestType=Buffer[0];
655 2 bRequest=Buffer[1];
656 2 wValue=Buffer[2]+(((uint16)Buffer[3])<<8);
657 2 wIndex=Buffer[4]+(((uint16)Buffer[5])<<8);
658 2 wLength=Buffer[6]+(((uint16)Buffer[7])<<8);
659 2 //下面的代碼判斷具體的請(qǐng)求,并根據(jù)不同的請(qǐng)求進(jìn)行相關(guān)操作
660 2 //如果D7位為1,則說(shuō)明是輸入請(qǐng)求
661 2 if((bmRequestType&0x80)==0x80)
662 2 {
663 3 //根據(jù)bmRequestType的D6~5位散轉(zhuǎn),D6~5位表示請(qǐng)求的類(lèi)型
664 3 //0為標(biāo)準(zhǔn)請(qǐng)求,1為類(lèi)請(qǐng)求,2為廠(chǎng)商請(qǐng)求。
665 3 switch((bmRequestType>>5)&0x03)
666 3 {
667 4 case 0: //標(biāo)準(zhǔn)請(qǐng)求
668 4 #ifdef DEBUG0
669 4 Prints("USB標(biāo)準(zhǔn)輸入請(qǐng)求:");
670 4 #endif
671 4 //USB協(xié)議定義了幾個(gè)標(biāo)準(zhǔn)輸入請(qǐng)求,我們實(shí)現(xiàn)這些標(biāo)準(zhǔn)請(qǐng)求即可
672 4 //請(qǐng)求的代碼在bRequest中,對(duì)不同的請(qǐng)求代碼進(jìn)行散轉(zhuǎn)
673 4 //事實(shí)上,我們還需要對(duì)接收者進(jìn)行散轉(zhuǎn),因?yàn)椴煌恼?qǐng)求接收者
674 4 //是不一樣的。接收者在bmRequestType的D4~D0位中定義。
675 4 //我們這里為了簡(jiǎn)化操作,有些就省略了對(duì)接收者的判斷。
C51 COMPILER V7.06 USBCORE 11/16/2008 16:00:31 PAGE 12
676 4 //例如獲取描述符的請(qǐng)求,只根據(jù)描述符的類(lèi)型來(lái)區(qū)別。
677 4 switch(bRequest)
678 4 {
679 5 case GET_CONFIGURATION: //獲取配置
680 5 #ifdef DEBUG0
681 5 Prints("獲取配置。\r\n");
682 5 #endif
683 5 break;
684 5
685 5 case GET_DESCRIPTOR: //獲取描述符
686 5 #ifdef DEBUG0
687 5 Prints("獲取描述符——");
688 5 #endif
689 5 //對(duì)描述符類(lèi)型進(jìn)行散轉(zhuǎn),對(duì)于全速設(shè)備,
690 5 //標(biāo)準(zhǔn)請(qǐng)求只支持發(fā)送到設(shè)備的設(shè)備、配置、字符串三種描述符
691 5 switch((wValue>>8)&0xFF)
692 5 {
693 6 case DEVICE_DESCRIPTOR: //設(shè)備描述符
694 6 #ifdef DEBUG0
695 6 Prints("設(shè)備描述符。\r\n");
696 6 #endif
697 6 pSendData=DeviceDescriptor; //需要發(fā)送的數(shù)據(jù)
698 6 //判斷請(qǐng)求的字節(jié)數(shù)是否比實(shí)際需要發(fā)送的字節(jié)數(shù)多
699 6 //這里請(qǐng)求的是設(shè)備描述符,因此數(shù)據(jù)長(zhǎng)度就是
700 6 //DeviceDescriptor[0]。如果請(qǐng)求的比實(shí)際的長(zhǎng),
701 6 //那么只返回實(shí)際長(zhǎng)度的數(shù)據(jù)
702 6 if(wLength>DeviceDescriptor[0])
703 6 {
704 7 SendLength=DeviceDescriptor[0];
705 7 if(SendLength%DeviceDescriptor[7]==0) //并且剛好是整數(shù)個(gè)數(shù)據(jù)包時(shí)
706 7 {
707 8 NeedZeroPacket=1; //需要返回0長(zhǎng)度的數(shù)據(jù)包
708 8 }
709 7 }
710 6 else
711 6 {
712 7 SendLength=wLength;
713 7 }
714 6 //將數(shù)據(jù)通過(guò)EP0返回
715 6 UsbEp0SendData();
716 6 break;
717 6
718 6 case CONFIGURATION_DESCRIPTOR: //配置描述符
719 6 #ifdef DEBUG0
720 6 Prints("配置描述符。\r\n");
721 6 #endif
722 6 pSendData=ConfigurationDescriptor; //需要發(fā)送的數(shù)據(jù)為配置描述符
723 6 //判斷請(qǐng)求的字節(jié)數(shù)是否比實(shí)際需要發(fā)送的字節(jié)數(shù)多
724 6 //這里請(qǐng)求的是配置描述符集合,因此數(shù)據(jù)長(zhǎng)度就是
725 6 //ConfigurationDescriptor[3]*256+ConfigurationDescriptor[2]。
726 6 //如果請(qǐng)求的比實(shí)際的長(zhǎng),那么只返回實(shí)際長(zhǎng)度的數(shù)據(jù)
727 6 SendLength=ConfigurationDescriptor[3];
728 6 SendLength=SendLength*256+ConfigurationDescriptor[2];
729 6 if(wLength>SendLength)
730 6 {
731 7 if(SendLength%DeviceDescriptor[7]==0) //并且剛好是整數(shù)個(gè)數(shù)據(jù)包時(shí)
732 7 {
733 8 NeedZeroPacket=1; //需要返回0長(zhǎng)度的數(shù)據(jù)包
734 8 }
735 7 }
736 6 else
737 6 {
C51 COMPILER V7.06 USBCORE 11/16/2008 16:00:31 PAGE 13
738 7 SendLength=wLength;
739 7 }
740 6 //將數(shù)據(jù)通過(guò)EP0返回
741 6 UsbEp0SendData();
742 6 break;
743 6
744 6 case STRING_DESCRIPTOR: //字符串描述符
745 6 #ifdef DEBUG0
746 6 Prints("字符串描述符");
747 6 #endif
748 6 switch(wValue&0xFF) //根據(jù)wValue的低字節(jié)(索引值)散轉(zhuǎn)
749 6 {
750 7 case 0: //獲取語(yǔ)言ID
751 7 #ifdef DEBUG0
752 7 Prints("(語(yǔ)言ID)。\r\n");
753 7 #endif
754 7 pSendData=LanguageId;
755 7 SendLength=LanguageId[0];
756 7 break;
757 7
758 7 case 1: //廠(chǎng)商字符串的索引值為1,所以這里為廠(chǎng)商字符串
759 7 #ifdef DEBUG0
760 7 Prints("(廠(chǎng)商描述)。\r\n");
761 7 #endif
762 7 pSendData=ManufacturerStringDescriptor;
763 7 SendLength=ManufacturerStringDescriptor[0];
764 7 break;
765 7
766 7 case 2: //產(chǎn)品字符串的索引值為2,所以這里為產(chǎn)品字符串
767 7 #ifdef DEBUG0
768 7 Prints("(產(chǎn)品描述)。\r\n");
769 7 #endif
770 7 pSendData=ProductStringDescriptor;
771 7 SendLength=ProductStringDescriptor[0];
772 7 break;
773 7
774 7 case 3: //產(chǎn)品序列號(hào)的索引值為3,所以這里為序列號(hào)
775 7 #ifdef DEBUG0
776 7 Prints("(產(chǎn)品序列號(hào))。\r\n");
777 7 #endif
778 7 pSendData=SerialNumberStringDescriptor;
779 7 SendLength=SerialNumberStringDescriptor[0];
780 7 break;
781 7
782 7 default :
783 7 #ifdef DEBUG0
784 7 Prints("(未知的索引值)。\r\n");
785 7 #endif
786 7 //對(duì)于未知索引值的請(qǐng)求,返回一個(gè)0長(zhǎng)度的包
787 7 SendLength=0;
788 7 NeedZeroPacket=1;
789 7 break;
790 7 }
791 6 //判斷請(qǐng)求的字節(jié)數(shù)是否比實(shí)際需要發(fā)送的字節(jié)數(shù)多
792 6 //如果請(qǐng)求的比實(shí)際的長(zhǎng),那么只返回實(shí)際長(zhǎng)度的數(shù)據(jù)
793 6 if(wLength>SendLength)
794 6 {
795 7 if(SendLength%DeviceDescriptor[7]==0) //并且剛好是整數(shù)個(gè)數(shù)據(jù)包時(shí)
796 7 {
797 8 NeedZeroPacket=1; //需要返回0長(zhǎng)度的數(shù)據(jù)包
798 8 }
799 7 }
C51 COMPILER V7.06 USBCORE 11/16/2008 16:00:31 PAGE 14
800 6 else
801 6 {
802 7 SendLength=wLength;
803 7 }
804 6 //將數(shù)據(jù)通過(guò)EP0返回
805 6 UsbEp0SendData();
806 6 break;
807 6
808 6 case REPORT_DESCRIPTOR: //報(bào)告描述符
809 6 #ifdef DEBUG0
810 6 Prints("報(bào)告描述符。\r\n");
811 6 #endif
812 6 pSendData=ReportDescriptor; //需要發(fā)送的數(shù)據(jù)為報(bào)告描述符
813 6 SendLength=sizeof(ReportDescriptor); //需要返回的數(shù)據(jù)長(zhǎng)度
814 6 //判斷請(qǐng)求的字節(jié)數(shù)是否比實(shí)際需要發(fā)送的字節(jié)數(shù)多
815 6 //如果請(qǐng)求的比實(shí)際的長(zhǎng),那么只返回實(shí)際長(zhǎng)度的數(shù)據(jù)
816 6 if(wLength>SendLength)
817 6 {
818 7 if(SendLength%DeviceDescriptor[7]==0) //并且剛好是整數(shù)個(gè)數(shù)據(jù)包時(shí)
819 7 {
820 8 NeedZeroPacket=1; //需要返回0長(zhǎng)度的數(shù)據(jù)包
821 8 }
822 7 }
823 6 else
824 6 {
825 7 SendLength=wLength;
826 7 }
827 6 //將數(shù)據(jù)通過(guò)EP0返回
828 6 UsbEp0SendData();
829 6 break;
830 6
831 6 default: //其它描述符
832 6 #ifdef DEBUG0
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -