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

📄 usbcore.lst

📁 此源代码为双接口法USB键盘鼠标开发源代码
💻 LST
📖 第 1 页 / 共 5 页
字号:
 996   7                  SendLength=SerialNumberStringDescriptor[0];
 997   7                 break;
 998   7                 
 999   7                 default :
1000   7                  #ifdef DEBUG0
1001   7                   Prints("(未知的索引值)。\r\n");
1002   7                  #endif
1003   7                  //对于未知索引值的请求,返回一个0长度的包
1004   7                  SendLength=0;
1005   7                  NeedZeroPacket=1;
1006   7                 break;
1007   7                }
1008   6                //判断请求的字节数是否比实际需要发送的字节数多
1009   6                //如果请求的比实际的长,那么只返回实际长度的数据
1010   6                if(wLength>SendLength)
1011   6                {
1012   7                 if(SendLength%DeviceDescriptor[7]==0) //并且刚好是整数个数据包时
1013   7                 {
1014   8                  NeedZeroPacket=1; //需要返回0长度的数据包
1015   8                 }
1016   7                }
1017   6                else
1018   6                {
1019   7                 SendLength=wLength;
1020   7                }
1021   6                //将数据通过EP0返回
1022   6                UsbEp0SendData();         
1023   6               break;
1024   6      
1025   6               case REPORT_DESCRIPTOR:  //报告描述符
1026   6                #ifdef DEBUG0
1027   6                 Prints("报告描述符。\r\n");
1028   6                #endif
1029   6                //获取报告描述符时,wIndex中保存的是请求的接口号。
1030   6                //我们这里有两个接口,接口0用来实现键盘,接口1实现鼠标。
1031   6                switch(wIndex)
1032   6                {
1033   7                 case 0:    //发送到接口0的请求
1034   7                  pSendData=KeyboardReportDescriptor; //需要发送的数据为报告描述符
1035   7                  SendLength=sizeof(KeyboardReportDescriptor); //需要返回的数据长度
1036   7                 break;
1037   7                 
1038   7                 case 1:    //发送到接口1的请求
1039   7                  pSendData=MouseReportDescriptor; //需要发送的数据为报告描述符
1040   7                  SendLength=sizeof(MouseReportDescriptor); //需要返回的数据长度
1041   7                 break;
1042   7                 
1043   7                 default : //其它为未定义的接口,返回0长度数据包
1044   7                  SendLength=0;
1045   7                  NeedZeroPacket=1;
1046   7                 break;
1047   7                }
C51 COMPILER V7.06   USBCORE                                                               11/16/2008 15:59:36 PAGE 18  

1048   6                //判断请求的字节数是否比实际需要发送的字节数多
1049   6                //如果请求的比实际的长,那么只返回实际长度的数据
1050   6                if(wLength>SendLength)
1051   6                {
1052   7                 if(SendLength%DeviceDescriptor[7]==0) //并且刚好是整数个数据包时
1053   7                 {
1054   8                  NeedZeroPacket=1; //需要返回0长度的数据包
1055   8                 }
1056   7                }
1057   6                else
1058   6                {
1059   7                 SendLength=wLength;
1060   7                }
1061   6                //将数据通过EP0返回
1062   6                UsbEp0SendData();
1063   6               break;
1064   6                       
1065   6               default:  //其它描述符
1066   6                #ifdef DEBUG0
1067   6                 Prints("其他描述符,描述符代码:");
1068   6                 PrintHex((wValue>>8)&0xFF);
1069   6                 Prints("\r\n");
1070   6                #endif
1071   6               break;
1072   6              }
1073   5             break;
1074   5            
1075   5            case GET_INTERFACE: //获取接口
1076   5             #ifdef DEBUG0
1077   5              Prints("获取接口。\r\n");
1078   5             #endif
1079   5            break;
1080   5            
1081   5            case GET_STATUS: //获取状态
1082   5             #ifdef DEBUG0
1083   5              Prints("获取状态。\r\n");
1084   5             #endif
1085   5            break;
1086   5            
1087   5            case SYNCH_FRAME: //同步帧
1088   5             #ifdef DEBUG0
1089   5              Prints("同步帧。\r\n");
1090   5             #endif
1091   5            break;
1092   5            
1093   5            default:  //未定义的标准请求
1094   5             #ifdef DEBUG0
1095   5              Prints("错误:未定义的标准输入请求。\r\n");
1096   5             #endif       
1097   5            break;
1098   5           }
1099   4          break;
1100   4          
1101   4          case 1:  //类请求
1102   4           #ifdef DEBUG0
1103   4            Prints("USB类输入请求:\r\n");
1104   4           #endif
1105   4          break;
1106   4          
1107   4          case 2:  //厂商请求
1108   4           #ifdef DEBUG0
1109   4            Prints("USB厂商输入请求:\r\n");
C51 COMPILER V7.06   USBCORE                                                               11/16/2008 15:59:36 PAGE 19  

1110   4           #endif
1111   4          break;
1112   4          
1113   4          default: //未定义的请求。这里只显示一个报错信息。
1114   4           #ifdef DEBUG0
1115   4            Prints("错误:未定义的输入请求。\r\n");
1116   4           #endif
1117   4          break;
1118   4         }
1119   3        }
1120   2        //否则说明是输出请求
1121   2        else //if(bmRequestType&0x80==0x80)之else
1122   2        {
1123   3         //根据bmRequestType的D6~5位散转,D6~5位表示请求的类型
1124   3         //0为标准请求,1为类请求,2为厂商请求。
1125   3         switch((bmRequestType>>5)&0x03)
1126   3         {
1127   4          case 0:  //标准请求
1128   4           #ifdef DEBUG0
1129   4            Prints("USB标准输出请求:");
1130   4           #endif
1131   4           //USB协议定义了几个标准输出请求,我们实现这些标准请求即可
1132   4           //请求的代码在bRequest中,对不同的请求代码进行散转
1133   4           switch(bRequest)
1134   4           {
1135   5            case CLEAR_FEATURE: //清除特性
1136   5             #ifdef DEBUG0
1137   5              Prints("清除特性。\r\n");
1138   5             #endif
1139   5            break;
1140   5            
1141   5            case SET_ADDRESS:  //设置地址
1142   5             #ifdef DEBUG0
1143   5              Prints("设置地址。地址为:");
1144   5              PrintHex(wValue&0xFF); //显示所设置的地址
1145   5              Prints("\r\n");
1146   5             #endif
1147   5             D12SetAddress(wValue&0xFF); //wValue中的低字节是设置的地址值
1148   5             //设置地址没有数据过程,直接进入到状态过程,返回一个0长度的数据包
1149   5             SendLength=0;
1150   5             NeedZeroPacket=1;
1151   5             //将数据通过EP0返回
1152   5             UsbEp0SendData();
1153   5            break;
1154   5            
1155   5            case SET_CONFIGURATION: //设置配置
1156   5             #ifdef DEBUG0
1157   5              Prints("设置配置。\r\n");
1158   5             #endif
1159   5             //使能非0端点。非0端点只有在设置为非0的配置后才能使能。
1160   5             //wValue的低字节为配置的值,如果该值为非0,才能使能非0端点。
1161   5             //保存当前配置值
1162   5             ConfigValue=wValue&0xFF;
1163   5             D12SetEndpointEnable(ConfigValue);
1164   5             //返回一个0长度的状态数据包
1165   5             SendLength=0;
1166   5             NeedZeroPacket=1;
1167   5             //将数据通过EP0返回
1168   5             UsbEp0SendData();
1169   5            break;
1170   5            
1171   5            case SET_DESCRIPTOR: //设置描述符
C51 COMPILER V7.06   USBCORE                                                               11/16/2008 15:59:36 PAGE 20  

1172   5             #ifdef DEBUG0
1173   5              Prints("设置描述符。\r\n");
1174   5             #endif
1175   5            break;
1176   5            
1177   5            case SET_FEATURE: //设置特性
1178   5             #ifdef DEBUG0
1179   5              Prints("设置特性。\r\n");
1180   5             #endif
1181   5            break;
1182   5      
1183   5            case SET_INTERFACE: //设置接口
1184   5             #ifdef DEBUG0
1185   5              Prints("设置接口。\r\n");
1186   5             #endif
1187   5            break;      
1188   5            
1189   5            default:  //未定义的标准请求
1190   5             #ifdef DEBUG0
1191   5              Prints("错误:未定义的标准输出请求。\r\n");
1192   5             #endif       
1193   5            break;
1194   5           }
1195   4          break;
1196   4          
1197   4          case 1:  //类请求
1198   4           #ifdef DEBUG0
1199   4            Prints("USB类输出请求:");
1200   4           #endif
1201   4           switch(bRequest)
1202   4           {
1203   5            case SET_IDLE:
1204   5             #ifdef DEBUG0
1205   5              Prints("设置空闲。\r\n");
1206   5             #endif
1207   5             //只需要返回一个0长度的数据包即可
1208   5             SendLength=0;
1209   5             NeedZeroPacket=1;
1210   5             //将数据通过EP0返回
1211   5             UsbEp0SendData();
1212   5            break;
1213   5            
1214   5            default:
1215   5             #ifdef DEBUG0
1216   5              Prints("未知请求。\r\n");
1217   5             #endif
1218   5            break;
1219   5           }
1220   4          break;
1221   4          
1222   4          case 2:  //厂商请求
1223   4           #ifdef DEBUG0
1224   4            Prints("USB厂商输出请求:\r\n");
1225   4           #endif
1226   4          break;
1227   4          
1228   4          default: //未定义的请求。这里只显示一个报错信息。
1229   4           #ifdef DEBUG0
1230   4            Prints("错误:未定义的输出请求。\r\n");
1231   4           #endif
1232   4          break;
1233   4         }
C51 COMPILER V7.06   USBCORE                                                               11/16/2008 15:59:36 PAGE 21  

1234   3        }
1235   2       }
1236   1       //普通数据输出
1237   1       else //if(D12ReadEndpointLastStatus(0)&0x20)之else
1238   1       {
1239   2        D12ReadEndpointBuffer(0,16,Buffer);
1240   2        D12ClearBuffer();
1241   2       }
1242   1      }
1243          ////////////////////////End of function//////////////////////////////
1244          
1245          /********************************************************************
1246          

⌨️ 快捷键说明

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