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