📄 usbkeyboard.lst
字号:
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 + -