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

📄 chap_9.lst

📁 嵌入式系统中一些外围设备驱动示例程序集
💻 LST
📖 第 1 页 / 共 5 页
字号:
 394   2              case  2        :  //获取配置描述符
 395   2                      USB_Int_Flag.BITS.EP0RX = 0;
 396   2                      Temp = 64;
 397   2                      Descriptor_Ptr = &Standard_Config_Descriptor[0];        //set pointer to configuration descriptor
 398   2                      count = *Descriptor_Ptr;                                                        //get configuration Descriptor length
 399   2                      //选择端点号1
 400   2                      D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
 401   2                      //check if only configuration descriptor required
 402   2                      //检查描述符长度,决定是只发送配置描述符还是描述符集合
 403   2                      if(count >= USB_Device_Request.wLength)                         //Send only Configuration descriptor
 404   2                      {
 405   3                              //写入发送字节数
 406   3                              D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB = (UC) USB_Device_Request.wLength;
 407   3                              D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB = (UC) (USB_Device_Request.wLength >> 8);
 408   3                              //send descriptor
 409   3                              //发送描述符
 410   3                              for(count = 0 ; count < USB_Device_Request.wLength ; count++)
 411   3                              {
 412   4                                      D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
 413   4                                      Descriptor_Ptr++;
 414   4                              }
 415   3                              wait_ep0tx();
 416   3                              ep0out_ack();
 417   3                      }
 418   2                      else //send Configuration,Interface and Endpoint descriptor
 419   2                      {
 420   3                              //发送描述符集合(配置+接口+端点)
 421   3                              if(USB_Device_Request.wLength >= 32)
 422   3                              {
 423   4                                      //写入配置描述符
 424   4                                      while(count != 0)
 425   4                                      {
 426   5                                              D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
 427   5                                              count--;
C51 COMPILER V7.06   CHAP_9                                                                07/02/2003 10:27:50 PAGE 8   

 428   5                                              Descriptor_Ptr++;
 429   5                                      }
 430   4                                      //选择高速还是全速接口描述符
 431   4                                      if(Kernel_Flag.BITS.HS_FS_State == FULL_SPEED)
 432   4                                              Descriptor_Ptr = &Bulk_Interface_Descriptor[0]; //set pointer to interface descriptor
 433   4                                      if(Kernel_Flag.BITS.HS_FS_State == HIGH_SPEED)
 434   4                                              Descriptor_Ptr = &HS_Bulk_Interface_Descriptor[0]; //set pointer to interface descriptor
 435   4                                      count = *Descriptor_Ptr;        //get the descriptor count
 436   4                                      //写入接口描述符
 437   4                                      while(count != 0)
 438   4                                      {
 439   5                                              D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
 440   5                                              count--;
 441   5                                              Descriptor_Ptr++;
 442   5                                      }
 443   4                                      //选择高速还是全速端点1IN描述符
 444   4                                      if(Kernel_Flag.BITS.HS_FS_State == FULL_SPEED)
 445   4                                              Descriptor_Ptr = &Int_In_Descriptor[0]; //set pointer to interface descriptor
 446   4                                      if(Kernel_Flag.BITS.HS_FS_State == HIGH_SPEED)
 447   4                                              Descriptor_Ptr = &HS_Int_In_Descriptor[0]; //set pointer to interface descriptor
 448   4                                      count = *Descriptor_Ptr;        //read in descriptor length
 449   4                                      //写入端点1IN描述符
 450   4                                      while(count != 0)
 451   4                                      {
 452   5                                              D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
 453   5                                              count--;
 454   5                                              Descriptor_Ptr++;
 455   5                                      }
 456   4                                      //选择高速还是全速端点1OUT描述符
 457   4                                      if(Kernel_Flag.BITS.HS_FS_State == FULL_SPEED)
 458   4                                              Descriptor_Ptr = &Int_Out_Descriptor[0]; //set pointer to interface descriptor
 459   4                                      if(Kernel_Flag.BITS.HS_FS_State == HIGH_SPEED)
 460   4                                              Descriptor_Ptr = &HS_Int_Out_Descriptor[0]; //set pointer to interface descriptor
 461   4                                      count = *Descriptor_Ptr;        //read in descriptor length
 462   4                                      //写入端点1OUT描述符
 463   4                                      while(count != 0)
 464   4                                      {
 465   5                                              D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
 466   5                                              count--;
 467   5                                              Descriptor_Ptr++;
 468   5                                      }
 469   4                                      //选择高速还是全速端点2IN描述符
 470   4                                      if(Kernel_Flag.BITS.HS_FS_State == FULL_SPEED)
 471   4                                              Descriptor_Ptr = &Bulk_In_Descriptor[0]; //set pointer to interface descriptor
 472   4                                      if(Kernel_Flag.BITS.HS_FS_State == HIGH_SPEED)
 473   4                                              Descriptor_Ptr = &HS_Bulk_In_Descriptor[0]; //set pointer to interface descriptor
 474   4                                      count = *Descriptor_Ptr;        //read in descriptor length
 475   4                                      //写入端点2IN描述符
 476   4                                      while(count != 0)
 477   4                                      {
 478   5                                              D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
 479   5                                              count--;
 480   5                                              Descriptor_Ptr++;
 481   5                                      }
 482   4                                      //选择高速还是全速端点2OUT描述符
 483   4                                      if(Kernel_Flag.BITS.HS_FS_State == FULL_SPEED)
 484   4                                              Descriptor_Ptr = &Bulk_Out_Descriptor[0]; //set pointer to interface descriptor
 485   4                                      if(Kernel_Flag.BITS.HS_FS_State == HIGH_SPEED)
 486   4                                              Descriptor_Ptr = &HS_Bulk_Out_Descriptor[0]; //set pointer to interface descriptor
 487   4                                      count = *Descriptor_Ptr;        //read in descriptor length
 488   4                                      //写入端点2OUT描述符
 489   4                                      while(count != 0)
C51 COMPILER V7.06   CHAP_9                                                                07/02/2003 10:27:50 PAGE 9   

 490   4                                      {
 491   5                                              D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
 492   5                                              count--;
 493   5                                              Descriptor_Ptr++;
 494   5                                      }
 495   4                              }
 496   3                              //使端点有效
 497   3                              D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.VENDP = 1;      //validate FIFO
 498   3                              wait_ep0tx();
 499   3                              ep0out_ack();
 500   3                      }
 501   2                      break;
 502   2                      
 503   2                      case  3:  //获取字符串描述符
 504   2                              Descriptor_Ptr = &Standard_String_ID[0];                //set pointer to interface descriptor
 505   2                              count = *Descriptor_Ptr;                //get length
 506   2                              D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
 507   2                              if(USB_Device_Request.wLength < count)
 508   2                                      count = USB_Device_Request.wLength;                     //get the remaining length
 509   2                              D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB = count;
 510   2                              D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB = 0;
 511   2                              //send string ID
 512   2                              while(count != 0)
 513   2                              {
 514   3                                      D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;      //fill up FIFO
 515   3                                      Descriptor_Ptr++;
 516   3                                      count--;
 517   3                              }
 518   2                              wait_ep0tx();
 519   2                              ep0out_ack();
 520   2                              break;
 521   2                              
 522   2                              
 523   2                      case  4:  
 524   2                              reserved();
 525   2                              break;
 526   2                              
 527   2                      case  5:  //获取端点描述符
 528   2                              Temp = 0;
 529   2                              if((USB_Device_Request.wValue & 0x00ff) > 0x0001)
 530   2                              {
 531   3                                      D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 1;
 532   3                                      while(!USB_Int_Flag.BITS.EP0SETUP)
 533   3                                      {
 534   4                                              //读取ISP1581中断寄存器
 535   4                                              USB_Int_Flag.VALUE |= D14_Cntrl_Reg.D14_INT.VALUE;
 536   4                                              //回写ISP1581中断寄存器
 537   4                                              D14_Cntrl_Reg.D14_INT.VALUE = USB_Int_Flag.VALUE;
 538   4                                              if(USB_Int_Flag.BITS.SUSP || USB_Int_Flag.BITS.RESET)
 539   4                                                      return;
 540   4                                      }
 541   3                                      USB_Int_Flag.BITS.EP0TX = 0;
 542   3                              }
 543   2                              else
 544   2                              {
 545   3                                      Descriptor_Ptr = &Bulk_Out_Descriptor[0]; //set pointer to Bulk Out endpoint descriptor
 546   3                                      count = *Descriptor_Ptr;        //read in descriptor length
 547   3                                      D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
 548   3                                      if(count >= USB_Device_Request.wLength)
 549   3                                      {
 550   4                                              Temp = USB_Device_Request.wLength;
 551   4                                              //send endpoint descriptor
C51 COMPILER V7.06   CHAP_9                                                                07/02/2003 10:27:50 PAGE 10  

 552   4                                              D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB = (UC) Temp;
 553   4                                              D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB = (UC) (Temp >> 8);
 554   4                                              for(count = 0 ; count < USB_Device_Request.wLength ; count++)
 555   4                                              {
 556   5                                                      D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
 557   5                                                      Descriptor_Ptr++;
 558   5                                              }
 559   4                                              wait_ep0tx();
 560   4                                              ep0out_ack();
 561   4                                      }
 562   3                                      else
 563   3                                      {
 564   4                                              USB_Device_Request.wLength -= count; //send Endpoint descriptor
 565   4                                              Temp += count;
 566   4                                              while(count != 0)
 567   4                                              {
 568   5                                                      D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
 569   5                                                      count--;
 570   5                                                      Descriptor_Ptr++;
 571   5                                              }
 572   4                                              Descriptor_Ptr = &Bulk_In_Descriptor[0]; //set pointer to Bulk In endpoint descriptor
 573   4                                              count = *Descriptor_Ptr;        //read in descriptor length
 574   4                                              if(count >= USB_Device_Request.wLength)
 575   4                                              {
 576   5                                                      Temp += USB_Device_Request.wLength;
 577   5                                                      //send endpoint descriptor
 578   5                                                      D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB = (UC) Temp;
 579   5                                                      D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB = (UC) (Temp >> 8);
 580   5                                                      for(count = 0 ; count < USB_Device_Request.wLength ; count++)
 581   5                                                      {
 582   6                                                              D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
 583   6                                                              Descriptor_Ptr++;
 584   6                                                      }
 585   5                                                      wait_ep0tx();
 586   5                                                      ep0out_ack();
 587   5                                              }
 588   4                                              else
 589   4                                              {
 590   5                                                      USB_Device_Request.wLength -= count; //send Endpoint descriptor
 591   5                                                      Temp += count;
 592   5                                                      D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB = (UC) Temp;
 593   5                                                      D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB = (UC) (Temp >> 8);
 594   5                                                      while(count != 0)

⌨️ 快捷键说明

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