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

📄 usbkeyboard.lst

📁 EDN USB学习板之实战第一个USB程序: USB键盘
💻 LST
📖 第 1 页 / 共 5 页
字号:
 507   1      }
 508          /******************************************************************************/
 509          
 510          /***************************设置地址***************************************/
 511          void set_usb_address(void)
 512          {
 513   1       usb_flags.flags.set_addr=1;
 514   1       set_usb_addr(Control_Data.DeviceRequest.wValue);
 515   1       while(select_endpoint(1)&0x01);
 516   1       write_endpoint_buff(1,0,0);
 517   1       while(select_endpoint(1)&0x01);
 518   1       usb_flags.flags.usb_endp0_in=0;
 519   1       usb_flags.flags.setup_packet_out=0;
 520   1      }
 521          /******************************************************************************/
 522          
 523          /**************************获取状态响应*****************************************/
 524          void get_status(uint8 receiver)
 525          {
 526   1       uint8 status[2];
 527   1       switch (receiver)
 528   1        {
 529   2         case 0:                        //获取设备状态
 530   2          status[0]=0x00;
 531   2          status[1]=0x00;
 532   2          break;
 533   2         case 1:                        //获取接口状态
 534   2          status[0]=0x00;
 535   2          status[0]=0x00;
 536   2          break;
 537   2         case 2:                        //获取端点状态
 538   2          status[0]=0x00;
 539   2          status[1]=0x00;
 540   2          break;
 541   2         }
 542   1        write_endpoint_buff(1,2,status);
 543   1        usb_flags.flags.usb_endp0_in=0;
 544   1      }
 545          /******************************************************************************/
 546          
 547          /*********************清除特性*******************************************/
 548          void clear_feature(uint8 receiver)    
 549          {
 550   1       Prints("    清除特性.\r\n");
C51 COMPILER V8.02   USBKEYBOARD                                                           12/12/2007 21:37:17 PAGE 10  

 551   1       receiver=0;
 552   1       write_endpoint_buff(1,0,0);
 553   1       usb_flags.flags.usb_endp0_in=0;
 554   1       usb_flags.flags.setup_packet_out=0;
 555   1      }
 556          /******************************************************************************/
 557          
 558          /*******************设置特性**************************************************/
 559          void set_feature(uint8 receiver)
 560          {
 561   1       Prints("    设置特性.\r\n");
 562   1       receiver=0;
 563   1       write_endpoint_buff(1,0,0);
 564   1       usb_flags.flags.usb_endp0_in=0;
 565   1       usb_flags.flags.setup_packet_out=0;
 566   1      }
 567          /******************************************************************************/
 568          
 569          /*****************************设置描述*****************************************/
 570          void set_descriptor(void)
 571          {
 572   1       Prints("    设置描述符.\r\n");
 573   1       usb_flags.flags.usb_endp0_in=0;
 574   1       usb_flags.flags.setup_packet_out=0;
 575   1      }
 576          /******************************************************************************/
 577          
 578          /***************************设置配置*******************************************/
 579          void set_configuration(void)
 580          {
 581   1       Prints("    设置配置.\r\n");
 582   1       write_endpoint_buff(1,0,0);
 583   1       usb_flags.flags.usb_endp0_in=0;
 584   1       usb_flags.flags.setup_packet_out=0;
 585   1      }
 586          /******************************************************************************/
 587          
 588          /************************获取配置状态******************************************/
 589          void get_configuration(void)
 590          { 
 591   1       uint8 value=0x01;
 592   1       Prints("    获取配置.\r\n");
 593   1       write_endpoint_buff(1,1,&value);
 594   1       usb_flags.flags.usb_endp0_in=0;
 595   1      }
 596          /******************************************************************************/
 597          
 598          /****************************设置接口************************************/
 599          void set_interface(void)
 600          {
 601   1       Prints("    设置接口.\r\n");
 602   1       write_endpoint_buff(1,0,0);
 603   1       usb_flags.flags.usb_endp0_in=0;
 604   1       usb_flags.flags.setup_packet_out=0;
 605   1      }
 606          /******************************************************************************/
 607          
 608          /***************************获取接口状态***************************************/
 609          void get_interface(void)
 610          {
 611   1       uint8 value=0x01;
 612   1       Prints("    获取接口.\r\n");
C51 COMPILER V8.02   USBKEYBOARD                                                           12/12/2007 21:37:17 PAGE 11  

 613   1       write_endpoint_buff(1,1,&value);
 614   1       usb_flags.flags.usb_endp0_in=0;
 615   1      }
 616          /******************************************************************************/
 617          
 618          /***********************获取描述符*********************************************/
 619          void get_descriptor(void)
 620          {
 621   1       Prints("    获取描述符.\r\n");
 622   1        if(!usb_flags.flags.not_end)
 623   1           {
 624   2            switch(MSB(Control_Data.DeviceRequest.wValue))
 625   2                 {
 626   3              case DEVICE_DESCRIPTOR:
 627   3                           Prints("        获取设备描述符.\r\n");
 628   3                       Control_Data.wCount=sizeof(DEVICE_DESCRIPTOR_STRUCT);
 629   3                       Control_Data.pData=(uint8 *)(&device_descriptor);
 630   3                   break;
 631   3              case CONFIGURATION_DESCRIPTOR:
 632   3                               Prints("        获取配置描述符.\r\n");
 633   3                   Control_Data.wCount=SWAP16(con_int_endp_descriptor.configuration_descriptor.wTotalLength);
 634   3                               Control_Data.pData=(uint8 *)(&con_int_endp_descriptor);
 635   3                   if(Control_Data.wLength<Control_Data.wCount)Control_Data.wCount=Control_Data.wLength;
 636   3                   break;
 637   3                      case STRING_DESCRIPTOR:
 638   3                           Prints("        获取字符串描述符.\r\n");
 639   3                               switch(LSB(Control_Data.DeviceRequest.wValue))
 640   3                                {
 641   4                                 case 0:
 642   4                                  Prints("            获取语言ID.\r\n");
 643   4                                  Control_Data.wCount=LANGUAGE_ID[0];
 644   4                      Control_Data.pData=LANGUAGE_ID;
 645   4                                  break;
 646   4      
 647   4                                 case 1:
 648   4                                  Prints("            获取厂商字符串.\r\n");
 649   4                                  Control_Data.wCount=ManufacturerString[0];
 650   4                      Control_Data.pData=ManufacturerString;
 651   4                                  break;
 652   4      
 653   4                                 case 2:
 654   4                                  Prints("            获取产品字符串.\r\n");
 655   4                                  Control_Data.wCount=ProducterString[0];
 656   4                      Control_Data.pData=ProducterString;
 657   4                                  break;
 658   4      
 659   4                                 case 3:
 660   4                       Prints("            获取设备序列号.\r\n");
 661   4                                   Control_Data.wCount=device_serial_number[0];
 662   4                                   Control_Data.pData=device_serial_number;
 663   4                                 break;
 664   4      
 665   4                                 default:
 666   4                       Prints("            其它描述符(未知).\r\n");
 667   4                       Prints("文件");
 668   4                                       Prints(__FILE__);
 669   4                                       Prints("\r\n");
 670   4                                       Prints("行:");
 671   4                                       Prints(__LINE__);
 672   4                                       Prints("\r\n");
 673   4                     break;
 674   4                                }
C51 COMPILER V8.02   USBKEYBOARD                                                           12/12/2007 21:37:17 PAGE 12  

 675   3                               break;
 676   3                       default:
 677   3                           Prints("       获取其它描述符..................描述符索引为:");
 678   3                               PrintLongInt(MSB(Control_Data.DeviceRequest.wValue));
 679   3                               Prints("\r\n"); 
 680   3                        break;
 681   3                      }
 682   2            if(Control_Data.wLength<Control_Data.wCount)Control_Data.wCount=Control_Data.wLength;
 683   2               }
 684   1              //写数据到D12输入端点
 685   1          if(Control_Data.wCount>=MAX_CONTROL_DATA_SIZE)
 686   1           {
 687   2                write_endpoint_buff(1,MAX_CONTROL_DATA_SIZE,Control_Data.pData);
 688   2                Control_Data.pData+=MAX_CONTROL_DATA_SIZE;
 689   2            Control_Data.wCount-=MAX_CONTROL_DATA_SIZE;
 690   2                if(usb_flags.flags.set_addr)usb_flags.flags.not_end=1;
 691   2                 else usb_flags.flags.usb_endp0_in=0;
 692   2                return;
 693   2               }
 694   1          else
 695   1           {
 696   2                write_endpoint_buff(1,Control_Data.wCount,Control_Data.pData);
 697   2            usb_flags.flags.setup_packet_in=0;
 698   2                usb_flags.flags.usb_endp0_in=0;
 699   2                return;
 700   2               }      
 701   1      }
 702          /******************************************************************************/
 703          
 704          /*********************发到接口的获取描述符**************************************/
 705          void get_descriptor_interface(void)
 706          {
 707   1       Prints("    获取描述符(从接口).\r\n");
 708   1        if(!usb_flags.flags.not_end)
 709   1           {
 710   2            switch(MSB(Control_Data.DeviceRequest.wValue))
 711   2                 {
 712   3              case HID_DESCRIPTOR:
 713   3                           Prints("        获取HID描述符.\r\n");
 714   3                       Control_Data.wCount=sizeof(HID_DESCRIPTOR_STRUCT);
 715   3                       //Control_Data.pData=(uint8 *)(&hid_descriptor);
 716   3                   break;
 717   3              case REPORT_DESCRIPTOR:
 718   3                               Prints("        获取报告描述符.\r\n");
 719   3                   Control_Data.wCount=sizeof(KeyBoardReportDescriptor);
 720   3                               Control_Data.pData=(uint8 *)(KeyBoardReportDescriptor);
 721   3                   if(Control_Data.wLength<Control_Data.wCount)Control_Data.wCount=Control_Data.wLength;
 722   3                   break;
 723   3                      case PHYSICAL_DESCRIPTOR:
 724   3                           Prints("        获取物理描述符.\r\n");
 725   3                               break;
 726   3                       default:
 727   3                           Prints("       获取其它描述符..................描述符索引为:");
 728   3                               PrintLongInt(MSB(Control_Data.DeviceRequest.wValue));
 729   3                               Prints("\r\n"); 
 730   3                        break;
 731   3                      }
 732   2            if(Control_Data.wLength<Control_Data.wCount)Control_Data.wCount=Control_Data.wLength;
 733   2               }
 734   1              //写数据到D12输入端点
 735   1          if(Control_Data.wCount>=MAX_CONTROL_DATA_SIZE)
 736   1           {
C51 COMPILER V8.02   USBKEYBOARD                                                           12/12/2007 21:37:17 PAGE 13  

 737   2                write_endpoint_buff(1,MAX_CONTROL_DATA_SIZE,Control_Data.pData);
 738   2                Control_Data.pData+=MAX_CONTROL_DATA_SIZE;
 739   2            Control_Data.wCount-=MAX_CONTROL_DATA_SIZE;
 740   2                if(usb_flags.flags.set_addr)usb_flags.flags.not_end=1;
 741   2                 else usb_flags.flags.usb_endp0_in=0;
 742   2                return;
 743   2               }
 744   1          else
 745   1           {
 746   2                write_endpoint_buff(1,Control_Data.wCount,Control_Data.pData);
 747   2            usb_flags.flags.setup_packet_in=0;
 748   2                usb_flags.flags.usb_endp0_in=0;
 749   2                return;
 750   2               }      
 751   1      }
 752          /******************************************************************************/
 753          
 754          /************************终端点0输出中断处理************************************/
 755          void endp0_out(void)
 756          {
 757   1       Last_Status.Register=read_last_status(0);
 758   1       if(Last_Status.Status.setup_packet)
 759   1        {
 760   2         Control_Data.wLength=0;
 761   2         Control_Data.wCount=0;
 762   2         if(read_endpoint_buff(0,sizeof(Control_Data.DeviceRequest),(uint8 *)(&(Control_Data.DeviceRequest)))!=s
             -izeof(REQUESTCMD))
 763   2          {

⌨️ 快捷键说明

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