⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usbcore.lst

📁 此源代码为双报表法USB键盘鼠标开发源代码
💻 LST
📖 第 1 页 / 共 5 页
字号:
 742   3         //不够最大包长,可以直接发送
 743   3         D12WriteEndpointBuffer(1,SendLength,pSendData);
 744   3         //发送完毕后,SendLength长度变为0
 745   3         SendLength=0;
 746   3        }
 747   2        else //如果要发送的数据包长度为0
 748   2        {
 749   3         if(NeedZeroPacket==1) //如果需要发送0长度数据
 750   3         {
 751   4          D12WriteEndpointBuffer(1,0,pSendData); //发送0长度数据包
 752   4          NeedZeroPacket=0; //清需要发送0长度数据包标志
 753   4         }
 754   3        }
 755   2       }
 756   1      }
 757          ////////////////////////End of function//////////////////////////////
 758          
 759          /********************************************************************
 760          函数功能:端点0输出中断处理函数。
 761          入口参数:无。
 762          返    回:无。
 763          备    注:无。
 764          ********************************************************************/
 765          void UsbEp0Out(void)
 766          {
 767   1      #ifdef DEBUG0
 768   1       Prints("USB端点0输出中断。\r\n");
 769   1      #endif
 770   1       //读取端点0输出最后传输状态,该操作清除中断标志
 771   1       //并判断第5位是否为1,如果是,则说明是建立包
 772   1       if(D12ReadEndpointLastStatus(0)&0x20)
 773   1       {
 774   2        D12ReadEndpointBuffer(0,16,Buffer); //读建立过程数据
 775   2        D12AcknowledgeSetup(); //应答建立包
 776   2        D12ClearBuffer(); //清缓冲区
 777   2        //将缓冲数据填到设备请求的各字段中
 778   2        bmRequestType=Buffer[0];
 779   2        bRequest=Buffer[1];
 780   2        wValue=Buffer[2]+(((uint16)Buffer[3])<<8);
 781   2        wIndex=Buffer[4]+(((uint16)Buffer[5])<<8);
 782   2        wLength=Buffer[6]+(((uint16)Buffer[7])<<8);
 783   2        //下面的代码判断具体的请求,并根据不同的请求进行相关操作
 784   2        //如果D7位为1,则说明是输入请求
 785   2        if((bmRequestType&0x80)==0x80)
 786   2        {
 787   3         //根据bmRequestType的D6~5位散转,D6~5位表示请求的类型
 788   3         //0为标准请求,1为类请求,2为厂商请求。
 789   3         switch((bmRequestType>>5)&0x03)
 790   3         {
 791   4          case 0:  //标准请求
 792   4           #ifdef DEBUG0
 793   4            Prints("USB标准输入请求:");
 794   4           #endif
 795   4           //USB协议定义了几个标准输入请求,我们实现这些标准请求即可
 796   4           //请求的代码在bRequest中,对不同的请求代码进行散转
 797   4           //事实上,我们还需要对接收者进行散转,因为不同的请求接收者
 798   4           //是不一样的。接收者在bmRequestType的D4~D0位中定义。
 799   4           //我们这里为了简化操作,有些就省略了对接收者的判断。
C51 COMPILER V7.06   USBCORE                                                               11/16/2008 16:00:01 PAGE 14  

 800   4           //例如获取描述符的请求,只根据描述符的类型来区别。
 801   4           switch(bRequest)
 802   4           {
 803   5            case GET_CONFIGURATION: //获取配置
 804   5             #ifdef DEBUG0
 805   5              Prints("获取配置。\r\n");
 806   5             #endif
 807   5            break;
 808   5            
 809   5            case GET_DESCRIPTOR:  //获取描述符
 810   5             #ifdef DEBUG0
 811   5              Prints("获取描述符——");
 812   5             #endif
 813   5             //对描述符类型进行散转,对于全速设备,
 814   5             //标准请求只支持发送到设备的设备、配置、字符串三种描述符
 815   5             switch((wValue>>8)&0xFF)
 816   5              {
 817   6               case DEVICE_DESCRIPTOR: //设备描述符
 818   6                #ifdef DEBUG0
 819   6                 Prints("设备描述符。\r\n");
 820   6                #endif
 821   6                pSendData=DeviceDescriptor;  //需要发送的数据
 822   6                //判断请求的字节数是否比实际需要发送的字节数多
 823   6                //这里请求的是设备描述符,因此数据长度就是
 824   6                //DeviceDescriptor[0]。如果请求的比实际的长,
 825   6                //那么只返回实际长度的数据
 826   6                if(wLength>DeviceDescriptor[0])
 827   6                {
 828   7                 SendLength=DeviceDescriptor[0];
 829   7                 if(SendLength%DeviceDescriptor[7]==0) //并且刚好是整数个数据包时
 830   7                 {
 831   8                  NeedZeroPacket=1; //需要返回0长度的数据包
 832   8                 }
 833   7                }
 834   6                else
 835   6                {
 836   7                 SendLength=wLength;
 837   7                }
 838   6                //将数据通过EP0返回
 839   6                UsbEp0SendData();
 840   6               break;
 841   6               
 842   6               case CONFIGURATION_DESCRIPTOR:  //配置描述符
 843   6                #ifdef DEBUG0
 844   6                 Prints("配置描述符。\r\n");
 845   6                #endif
 846   6                pSendData=ConfigurationDescriptor; //需要发送的数据为配置描述符
 847   6                //判断请求的字节数是否比实际需要发送的字节数多
 848   6                //这里请求的是配置描述符集合,因此数据长度就是
 849   6                //ConfigurationDescriptor[3]*256+ConfigurationDescriptor[2]。
 850   6                //如果请求的比实际的长,那么只返回实际长度的数据
 851   6                SendLength=ConfigurationDescriptor[3];
 852   6                SendLength=SendLength*256+ConfigurationDescriptor[2];
 853   6                if(wLength>SendLength)
 854   6                {
 855   7                 if(SendLength%DeviceDescriptor[7]==0) //并且刚好是整数个数据包时
 856   7                 {
 857   8                  NeedZeroPacket=1; //需要返回0长度的数据包
 858   8                 }
 859   7                }
 860   6                else
 861   6                {
C51 COMPILER V7.06   USBCORE                                                               11/16/2008 16:00:01 PAGE 15  

 862   7                 SendLength=wLength;
 863   7                }
 864   6                //将数据通过EP0返回
 865   6                UsbEp0SendData();
 866   6               break;
 867   6               
 868   6               case STRING_DESCRIPTOR:  //字符串描述符
 869   6                #ifdef DEBUG0
 870   6                 Prints("字符串描述符");
 871   6                #endif
 872   6                switch(wValue&0xFF)  //根据wValue的低字节(索引值)散转
 873   6                {
 874   7                 case 0:  //获取语言ID
 875   7                  #ifdef DEBUG0
 876   7                   Prints("(语言ID)。\r\n");
 877   7                  #endif
 878   7                  pSendData=LanguageId;
 879   7                  SendLength=LanguageId[0];
 880   7                 break;
 881   7                 
 882   7                 case 1:  //厂商字符串的索引值为1,所以这里为厂商字符串
 883   7                 #ifdef DEBUG0
 884   7                   Prints("(厂商描述)。\r\n");
 885   7                  #endif
 886   7                  pSendData=ManufacturerStringDescriptor;
 887   7                  SendLength=ManufacturerStringDescriptor[0];
 888   7                 break;
 889   7                 
 890   7                 case 2:  //产品字符串的索引值为2,所以这里为产品字符串
 891   7                 #ifdef DEBUG0
 892   7                   Prints("(产品描述)。\r\n");
 893   7                  #endif
 894   7                  pSendData=ProductStringDescriptor;
 895   7                  SendLength=ProductStringDescriptor[0];
 896   7                 break;
 897   7                 
 898   7                 case 3:  //产品序列号的索引值为3,所以这里为序列号
 899   7                 #ifdef DEBUG0
 900   7                   Prints("(产品序列号)。\r\n");
 901   7                  #endif
 902   7                  pSendData=SerialNumberStringDescriptor;
 903   7                  SendLength=SerialNumberStringDescriptor[0];
 904   7                 break;
 905   7                 
 906   7                 default :
 907   7                  #ifdef DEBUG0
 908   7                   Prints("(未知的索引值)。\r\n");
 909   7                  #endif
 910   7                  //对于未知索引值的请求,返回一个0长度的包
 911   7                  SendLength=0;
 912   7                  NeedZeroPacket=1;
 913   7                 break;
 914   7                }
 915   6                //判断请求的字节数是否比实际需要发送的字节数多
 916   6                //如果请求的比实际的长,那么只返回实际长度的数据
 917   6                if(wLength>SendLength)
 918   6                {
 919   7                 if(SendLength%DeviceDescriptor[7]==0) //并且刚好是整数个数据包时
 920   7                 {
 921   8                  NeedZeroPacket=1; //需要返回0长度的数据包
 922   8                 }
 923   7                }
C51 COMPILER V7.06   USBCORE                                                               11/16/2008 16:00:01 PAGE 16  

 924   6                else
 925   6                {
 926   7                 SendLength=wLength;
 927   7                }
 928   6                //将数据通过EP0返回
 929   6                UsbEp0SendData();         
 930   6               break;
 931   6      
 932   6               case REPORT_DESCRIPTOR:  //报告描述符
 933   6                #ifdef DEBUG0
 934   6                 Prints("报告描述符。\r\n");
 935   6                #endif
 936   6                pSendData=ReportDescriptor; //需要发送的数据为报告描述符
 937   6                SendLength=sizeof(ReportDescriptor); //需要返回的数据长度         
 938   6                //判断请求的字节数是否比实际需要发送的字节数多
 939   6                //如果请求的比实际的长,那么只返回实际长度的数据
 940   6                if(wLength>SendLength)
 941   6                {
 942   7                 if(SendLength%DeviceDescriptor[7]==0) //并且刚好是整数个数据包时
 943   7                 {
 944   8                  NeedZeroPacket=1; //需要返回0长度的数据包
 945   8                 }
 946   7                }
 947   6                else
 948   6                {
 949   7                 SendLength=wLength;
 950   7                }
 951   6                //将数据通过EP0返回
 952   6                UsbEp0SendData();
 953   6               break;
 954   6                       
 955   6               default:  //其它描述符
 956   6                #ifdef DEBUG0
 957   6                 Prints("其他描述符,描述符代码:");
 958   6                 PrintHex((wValue>>8)&0xFF);
 959   6                 Prints("\r\n");
 960   6                #endif
 961   6               break;
 962   6              }
 963   5             break;
 964   5            
 965   5            case GET_INTERFACE: //获取接口
 966   5             #ifdef DEBUG0
 967   5              Prints("获取接口。\r\n");
 968   5             #endif
 969   5            break;
 970   5            
 971   5            case GET_STATUS: //获取状态
 972   5             #ifdef DEBUG0
 973   5              Prints("获取状态。\r\n");
 974   5             #endif
 975   5            break;
 976   5            
 977   5            case SYNCH_FRAME: //同步帧
 978   5             #ifdef DEBUG0
 979   5              Prints("同步帧。\r\n");
 980   5             #endif
 981   5            break;
 982   5            
 983   5            default:  //未定义的标准请求
 984   5             #ifdef DEBUG0
 985   5              Prints("错误:未定义的标准输入请求。\r\n");
C51 COMPILER V7.06   USBCORE                                                               11/16/2008 16:00:01 PAGE 17  

 986   5             #endif       
 987   5            break;
 988   5           }
 989   4          break;
 990   4          
 991   4          case 1:  //类请求

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -