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

📄 usbkeyboard.lst

📁 51+pdiusbd12做的usb键盘
💻 LST
📖 第 1 页 / 共 3 页
字号:
 525          
 526          
 527          
 528          
 529          
 530          
 531          /**************************获取状态响应*****************************************/
 532          void get_status(uint8 receiver)
 533          {
 534   1       uint8 status[2];
 535   1       switch (receiver)
 536   1        {
 537   2         case 0:                        //获取设备状态
 538   2          status[0]=0x00;
 539   2          status[1]=0x00;
 540   2          break;
 541   2         case 1:                        //获取接口状态
 542   2          status[0]=0x00;
 543   2          status[0]=0x00;
 544   2          break;
 545   2         case 2:                        //获取端点状态
 546   2          status[0]=0x00;
 547   2          status[1]=0x00;
 548   2          break;
 549   2         }
 550   1        write_endpoint_buff(1,2,status);
C51 COMPILER V7.06   USBKEYBOARD                                                           09/03/2008 12:14:08 PAGE 10  

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

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

 675   3                               break;
 676   3                       default:
 677   3                           Prints("       获取其它描述符..................描述符索引为:",0);
 678   3                               PrintLongInt(MSB(Control_Data.DeviceRequest.wValue));
 679   3                               Prints("",1); 
 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              //Prints("发送前16个字节...................",0);
 688   2                write_endpoint_buff(1,MAX_CONTROL_DATA_SIZE,Control_Data.pData);
 689   2                Control_Data.pData+=MAX_CONTROL_DATA_SIZE;
 690   2            Control_Data.wCount-=MAX_CONTROL_DATA_SIZE;
 691   2                if(usb_flags.flags.set_addr)usb_flags.flags.not_end=1;
 692   2                 else usb_flags.flags.usb_endp0_in=0;
 693   2                return;
 694   2               }
 695   1          else
 696   1           {
 697   2              Prints("发送剩余的描述符字节...................",0);
 698   2                write_endpoint_buff(1,Control_Data.wCount,Control_Data.pData);
 699   2            usb_flags.flags.setup_packet_in=0;
 700   2                usb_flags.flags.usb_endp0_in=0;
 701   2                return;
 702   2               }      
 703   1      }
 704          /******************************************************************************/
 705          
 706          /*********************发到接口的获取描述符**************************************/
 707          void get_descriptor_interface(void)
 708          {
 709   1       Prints("    获取描述符(从接口)..............................",1);
 710   1        if(!usb_flags.flags.not_end)
 711   1           {
 712   2            switch(MSB(Control_Data.DeviceRequest.wValue))
 713   2                 {
 714   3             /* case HID_DESCRIPTOR:
 715   3                           Prints("        获取HID描述符................................",1);
 716   3                       Control_Data.wCount=sizeof(HID_DESCRIPTOR_STRUCT);
 717   3                       Control_Data.pData=(uint8 *)(&hid_descriptor);
 718   3                   break;*/            //重复,可以不要,在传配置描述符的时候一起将hid描述符给传了上去
 719   3              case REPORT_DESCRIPTOR:
 720   3                               Prints("        获取报告描述符................................",1);
 721   3                   Control_Data.wCount=sizeof(KeyBoardReportDescriptor);//SWAP16(sizeof(KeyBoardReportDescriptor
             -));
 722   3                               Control_Data.pData=(uint8 *)(KeyBoardReportDescriptor);
 723   3                               //Prints("比较报告描述符的长度!\n",1);
 724   3                               //Prints("Control_Data.wCount的长度为:             \n",1);
 725   3                               //PrintLongInt(SWAP16(Control_Data.wCount));   
 726   3                               //Prints("Control_Data.wLength的长度为:             \n",1);
 727   3                               //PrintLongInt(Control_Data.wLength);  
 728   3                   if(Control_Data.wLength<Control_Data.wCount)Control_Data.wCount=Control_Data.wLength;
 729   3                   break;
 730   3                      case PHYSICAL_DESCRIPTOR:
 731   3                           Prints("        获取物理描述符................................",1);
 732   3                               break;
 733   3                       default:
 734   3                           Prints("       获取其它描述符..................描述符索引为:",0);
 735   3                               PrintLongInt(MSB(Control_Data.DeviceRequest.wValue));
C51 COMPILER V7.06   USBKEYBOARD                                                           09/03/2008 12:14:08 PAGE 13  

 736   3                               Prints("",1); 
 737   3                        break;
 738   3                      }
 739   2            if(Control_Data.wLength<Control_Data.wCount)Control_Data.wCount=Control_Data.wLength;
 740   2               }
 741   1              //写数据到D12输入端点
 742   1      //      Prints("返回的报告描述符的长度为:",0);
 743   1      //      PrintLongInt(Control_Data.wCount);
 744   1          if(Control_Data.wCount>=MAX_CONTROL_DATA_SIZE)
 745   1           {
 746   2                write_endpoint_buff(1,MAX_CONTROL_DATA_SIZE,Control_Data.pData);
 747   2                Control_Data.pData+=MAX_CONTROL_DATA_SIZE;
 748   2            Control_Data.wCount-=MAX_CONTROL_DATA_SIZE;
 749   2                if(usb_flags.flags.set_addr)usb_flags.flags.not_end=1;
 750   2                 else usb_flags.flags.usb_endp0_in=0;
 751   2                return;
 752   2               }
 753   1          else
 754   1           {
 755   2                write_endpoint_buff(1,Control_Data.wCount,Control_Data.pData);
 756   2            usb_flags.flags.setup_packet_in=0;
 757   2                usb_flags.flags.usb_endp0_in=0;
 758   2                return;
 759   2               }      
 760   1      }
 761          /******************************************************************************/
 762          
 763          /************************终端点0输出中断处理************************************/
 764          void endp0_out(void)
 765          {
 766   1       Last_Status.Register=read_last_status(0);             //清除中断标志的同时又记录的具体中断到MCU
 767   1      if(Last_Status.Status.prestatus_not_read)
 768   1              {
 769   2              Prints("第一个状态处理之前来了第二个状态...........",1);
 770   2              } 
 771   1      if(Last_Status.Status.setup_packet)
 772   1        {
 773   2         Control_Data.wLength=0;
 774   2         Control_Data.wCount=0;
 775   2         if(read_endpoint_buff(0,sizeof(Control_Data.DeviceRequest),(uint8 *)(&(Control_Data.DeviceRequest)))!=s
             -izeof(REQUESTCMD))
 776   2          {
 777   3               set_endpoint_status(0,0);       //注意,在端点停止后再接到setup包时端点自动开启,不需要在
 778   3               set_endpoint_status(1,0);       //主循环开始的第一句再开启端点
 779   3               return;
 780   3              }                                //接受到的标准命令没有错误后,执行下面的语句
 781   2        Control_Data.DeviceRequest.wValue=SWAP16(Control_Data.DeviceRequest.wValue);//数据已经接受但是接受
 782   2        Control_Data.DeviceRequest.wIndex=SWAP16(Control_Data.DeviceRequest.wIndex);//到的数据是按小端放置的
 783   2        Control_Data.DeviceRequest.wLength=SWAP16(Control_Data.DeviceRequest.wLength);//要把高低字节数据置换
 784   2      
 785   2        ack_setup(0);     //setup事务处理的第三个阶段,这个阶段是设备向主机发送应答,这样
 786   2        ack_setup(1);     //端点才能继续接受和发送以后的数据,应答之前清缓冲和缓冲数据有效命令是无效的 
 787   2        Control_Data.wLength=Control_Data.DeviceRequest.wLength;   //要求传送回主机的描述符的长度,第一次长度可

⌨️ 快捷键说明

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