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

📄 usb.lst

📁 this procedure is a game of basketball or subsystems time, the competition will record the entire ti
💻 LST
📖 第 1 页 / 共 2 页
字号:
 267                            ControlData.DeviceRequest.wLength=SWAP(ControlData.DeviceRequest.wLength);
 268          
 269                            
 270                               
 271                            D12_AcknowledgeEndpoint(0);
 272                            D12_AcknowledgeEndpoint(1);
 273                            ControlData.wLength=ControlData.DeviceRequest.wLength;
 274                            ControlData.wCount=0;                            
 275                            if(ControlData.DeviceRequest.bmRequestType&(unsigned char)USB_ENDPOINT_DIRECTION_MASK)
 276                            {
 277                                     EventFlags.Bits.SetupPacket=1; //recv from host? --by newer
 278                                     EventFlags.Bits.ControlState=1; //by newer
 279                            }
 280                            else
 281                            {
 282                                     if(ControlData.DeviceRequest.wLength==0)
 283                                     {
 284                                              EventFlags.Bits.SetupPacket=1;
 285                                              EventFlags.Bits.ControlState=0; //by newer
 286                                     }
 287                                     else
 288                                     {
 289                                              if(ControlData.DeviceRequest.wLength>16)//最大传16byte
 290                                              {
 291                                                       EventFlags.Bits.ControlState=0; //by newer
 292                                                       D12_SetEndpointStatus(0,1);
 293                                                       D12_SetEndpointStatus(1,1);
 294                                              }
 295                                              else
C51 COMPILER V8.02   USB                                                                   11/27/2007 19:16:39 PAGE 6   

 296                                                  {
 297                                                       EventFlags.Bits.ControlState=2;//by newer                
 298                                              }
 299                                     }
 300                            }
 301                  }
 302                  else if(EventFlags.Bits.ControlState==2)
 303                  {
 304                           i=D12_ReadEndpoint_Int(0,EP0_PACKET_SIZE,ControlData.dataBuffer+ControlData.wCount);
 305                           ControlData.wCount+=i;
 306                           if(i!=EP0_PACKET_SIZE||ControlData.wCount>=ControlData.wLength)
 307                           {
 308                                   EventFlags.Bits.SetupPacket=1;
 309                                   EventFlags.Bits.ControlState=0;
 310                           }
 311                  }
 312                  else
 313                            EventFlags.Bits.ControlState=0;
 314          }
 315          
 316          void EP0_In(void)
 317          {
 318                   short i=ControlData.wLength-ControlData.wCount;
 319                   D12_ReadLastTransactionStatus(1);
 320                   if(EventFlags.Bits.ControlState!=1) return;
 321                   if(i>=EP0_PACKET_SIZE)
 322                   {
 323                            D12_WriteEndpoint_Int(1,EP0_PACKET_SIZE,ControlData.pData+ControlData.wCount);
 324                            ControlData.wCount+=EP0_PACKET_SIZE;
 325                            EventFlags.Bits.ControlState=1;
 326                            return;
 327                   }
 328                   if(i!=0)
 329                   {
 330                            D12_WriteEndpoint_Int(1,i,ControlData.pData+ControlData.wCount);
 331                            ControlData.wCount+=i;
 332                            EventFlags.Bits.ControlState=0;
 333                            return;
 334                   }
 335                   D12_WriteEndpoint_Int(1,0,0);
 336                   EventFlags.Bits.ControlState=0;
 337          }
 338          void EP1_Out(void)
 339          {
 340           unsigned char Length;
 341           D12_ReadLastTransactionStatus(2); /* Clear interrupt flag */
 342           Length = D12_ReadEndpoint_Int(2, sizeof(EndPoint1Buffer),EndPoint1Buffer);
 343           if(Length != 0)
 344            EventFlags.Bits.Port1RxDone = 1;
 345          }
 346          
 347          void EP1_In(void)
 348          {
 349           D12_ReadLastTransactionStatus(3);
 350          }
 351          
 352          void EP2_Out(void)
 353          {
 354           unsigned char Length,EP2Status;
 355           D12_ReadLastTransactionStatus(4); /* Clear interrupt flag */
 356          
 357           EP2Status = D12_ReadEndpointStatus(4);
C51 COMPILER V8.02   USB                                                                   11/27/2007 19:16:39 PAGE 7   

 358           EP2Status&=0x60;
 359           Length = D12_ReadEndpoint(4,sizeof(EndPoint2Buffer),EndPoint2Buffer);
 360           if(EP2Status==0x60)
 361            Length = D12_ReadEndpoint(4,sizeof(EndPoint2Buffer),EndPoint2Buffer);
 362           if(Length != 0)
 363            EventFlags.Bits.Port2RxDone = 1;
 364          }
 365          
 366          void EP2_In(void)
 367          {
 368           D12_ReadLastTransactionStatus(5); /* Clear interrupt flag */
 369          }
 370          //**************************************************************************
 371          //请求处理
 372          
 373          code USB_DEVICE_DESCRIPTOR DeviceDescr=
 374          {
 375                   sizeof(USB_DEVICE_DESCRIPTOR),
 376                      0x01,//USB_DEVICE_DESCRIPTOR_TYPE,
 377                      SWAP(0x0100),
 378                      0xDC,//USB_CLASS_CODE_TEST_CLASS_DEVICE,
 379                      0, 0,
 380                   EP0_PACKET_SIZE,
 381                   SWAP(0x0471),
 382                   SWAP(0x0666),
 383                   SWAP(0x0100),
 384                      0, 0, 0,
 385                   25
 386          };
 387          
 388          code USB_CONFIGURATION_DESCRIPTOR ConfigDescr=
 389          {
 390           0x09,0x02,0x2e,0x00,0x01,0x01,0x00,0xa0,0x32,
 391           0x09,0x04,0x00,0x00,0x04,0xdc,0xa0,0xb0,0x00,
 392           0x07,0x05,0x81,0x03,0x02,0x00,0x0a,
 393           0x07,0x05,0x01,0x03,0x02,0x00,0x0a,
 394           0x07,0x05,0x82,0x02,0x40,0x00,0x0a,
 395           0x07,0x05,0x02,0x02,0x40,0x00,0x0a
 396          };
 397          
 398          //code_tramsit
 399          void code_transmit(unsigned char code *pRomData,unsigned short len)
 400          {
 401                   ControlData.wCount=0;
 402                   if(ControlData.wLength>len)
 403                            ControlData.wLength=len;
 404                   ControlData.pData=pRomData;
 405                   if(ControlData.wLength>=EP0_PACKET_SIZE)
 406                   {
 407                            D12_WriteEndpoint(1,EP0_PACKET_SIZE,ControlData.pData);
 408                            ControlData.wCount+=EP0_PACKET_SIZE;
 409                            EA = 0;
 410                            EventFlags.Bits.ControlState=1;
 411                            EA = 1;
 412                   }
 413                   else
 414                   {
 415                            D12_WriteEndpoint(1,ControlData.wLength,pRomData);
 416                            ControlData.wCount+=ControlData.wLength;
 417                            EA = 0;
 418                            EventFlags.Bits.ControlState=0;
 419                            EA = 1;
C51 COMPILER V8.02   USB                                                                   11/27/2007 19:16:39 PAGE 8   

 420                   }
 421          }
 422          //获取描述符
 423          void get_descriptor(void)
 424          {
 425                   if(MSB(ControlData.DeviceRequest.wValue)==USB_DEVICE_DESCRIPTOR_TYPE)
 426                   {
 427                            code_transmit((unsigned char code*)&DeviceDescr,sizeof(USB_DEVICE_DESCRIPTOR));
 428                            return;
 429                   }
 430                   if(MSB(ControlData.DeviceRequest.wValue)==USB_CONFIGURATION_DESCRIPTOR_TYPE)
 431                   { 
 432                            if(ControlData.DeviceRequest.wLength>CONFIG_DESCRIPTOR_LENGTH)
 433                            {
 434                                     ControlData.DeviceRequest.wLength=CONFIG_DESCRIPTOR_LENGTH;
 435                                     //标识符总大小2E byte,第二次请求时wlength=0x00ff
 436                            }
 437                            //这里的ConfigDescr其实应该包括其他标识符!
 438                            code_transmit((unsigned char code*)&ConfigDescr,ControlData.DeviceRequest.wLength);
 439                            return;
 440                   }
 441          }
 442          //single transmit
 443          void single_transmit(unsigned char *buf,unsigned char len)
 444          {
 445                   if(len<=EP0_PACKET_SIZE)
 446                   {
 447                            D12_WriteEndpoint(1,len,buf);
 448                   }
 449          }
 450          //设置地址
 451          void set_address(void)
 452          {
 453                   D12_SetAddressEnable((unsigned char)(ControlData.DeviceRequest.wValue&0xff),1);
 454                   //比如wValue是"02 00" 应该得到02
 455                   single_transmit(0,0);
 456          }
 457          
 458          //设置配置
 459          void set_configuration(void)
 460          {
 461                   if(ControlData.DeviceRequest.wValue==0)
 462                   {
 463                            single_transmit(0,0);
 464                            EventFlags.Bits.Configuration=0;
 465                            D12_SetEndpointEnable(0);
 466                   }
 467                   else if(ControlData.DeviceRequest.wValue==1)
 468                   {
 469                            single_transmit(0,0);
 470                            D12_SetEndpointEnable(0);
 471                            D12_SetEndpointEnable(1);
 472                            EventFlags.Bits.Configuration=1;
 473                   }
 474          }
 475          //读取配置
 476          void get_configuration(void)
 477          {
 478                   unsigned char c=EventFlags.Bits.Configuration;  
 479                   single_transmit(&c,1);
 480          }
 481          //读取设备接口信息
C51 COMPILER V8.02   USB                                                                   11/27/2007 19:16:39 PAGE 9   

 482          void get_interface(void)
 483          {
 484                   unsigned char txdat=0;
 485                   single_transmit(&txdat,1);
 486          }
 487          
 488          static code void (*StandardDeviceRequest[])(void)=
 489          { 
 490                  0,0,0,0,
 491             0,set_address,get_descriptor,0,
 492             get_configuration,set_configuration,get_interface,0,
 493             0,0,0,0
 494          };
 495          
 496          static code void (*VendorDeviceRequest[])(void)=
 497          { 
 498                  0,0,0,0,
 499             0,0,0,0,
 500             0,0,0,0,
 501             0,0,0,0
 502          };
 503          
 504          void ControlHandler(void)
 505          {
 506                   unsigned char type,req;
 507                   type=ControlData.DeviceRequest.bmRequestType&USB_REQUEST_TYPE_MASK;//0011,0000b
 508                   req=ControlData.DeviceRequest.bRequest&USB_REQUEST_MASK;//0000,1111b
 509                   if(type==USB_STANDARD_REQUEST)
 510                    (*StandardDeviceRequest[req])();
 511                   else if(type==USB_VENDOR_REQUEST)
 512                    (*VendorDeviceRequest[req])();
 513          }
 514          
 515          void USB_ISR(void) interrupt 0
 516          {
 517                   unsigned int i_st,d;
 518                   
 519                   EA = 0;
 520                   EventFlags.Bits.InISR=1;
 521                   i_st=D12_ReadInterruptRegister();
 522          
 523                   printf("i_st=%x\n",i_st);
 524                   if(i_st!=0) 
 525                   {
 526                            if(i_st&D12_INT_ENDP0OUT) 
 527                             EP0_Out();
 528                            if(i_st&D12_INT_ENDP0IN) 
 529                             EP0_In();
 530                            if(i_st&D12_INT_ENDP1OUT)
 531                             EP1_Out();
 532                            if(i_st&D12_INT_ENDP1IN) 
 533                             EP1_In();
 534                            if(i_st&D12_INT_ENDP2OUT)
 535                             EP2_Out();
 536                            if(i_st&D12_INT_ENDP2IN) 
 537                             EP2_In();   
 538                   }
 539                   EventFlags.Bits.InISR=0;
 540                   EA = 1;        
 541          }
 542          
 543          
C51 COMPILER V8.02   USB                                                                   11/27/2007 19:16:39 PAGE 10  

 544           

C51 COMPILATION COMPLETE.  4 WARNING(S),  1 ERROR(S)

⌨️ 快捷键说明

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