📄 usbcore.lst
字号:
502 2 if(SendLength!=0)
503 2 {
504 3 //不够最大包长,可以直接发送
505 3 D12WriteEndpointBuffer(1,SendLength,pSendData);
506 3 //发送完毕后,SendLength长度变为0
507 3 SendLength=0;
508 3 }
509 2 else //如果要发送的数据包长度为0
510 2 {
511 3 if(NeedZeroPacket==1) //如果需要发送0长度数据
512 3 {
513 4 D12WriteEndpointBuffer(1,0,pSendData); //发送0长度数据包
514 4 NeedZeroPacket=0; //清需要发送0长度数据包标志
515 4 }
516 3 }
517 2 }
518 1 }
519 ////////////////////////End of function//////////////////////////////
520
521 /********************************************************************
522 函数功能:端点0输出中断处理函数。
523 入口参数:无。
524 返 回:无。
525 备 注:无。
526 ********************************************************************/
527 void UsbEp0Out(void)
528 {
529 1 #ifdef DEBUG0
530 1 Prints("USB端点0输出中断。\r\n");
531 1 #endif
532 1 //读取端点0输出最后传输状态,该操作清除中断标志
533 1 //并判断第5位是否为1,如果是,则说明是建立包
534 1 if(D12ReadEndpointLastStatus(0)&0x20)
535 1 {
536 2 D12ReadEndpointBuffer(0,16,Buffer); //读建立过程数据
537 2 D12AcknowledgeSetup(); //应答建立包
538 2 D12ClearBuffer(); //清缓冲区
539 2 //将缓冲数据填到设备请求的各字段中
540 2 bmRequestType=Buffer[0];
541 2 bRequest=Buffer[1];
542 2 wValue=Buffer[2]+(((uint16)Buffer[3])<<8);
543 2 wIndex=Buffer[4]+(((uint16)Buffer[5])<<8);
544 2 wLength=Buffer[6]+(((uint16)Buffer[7])<<8);
545 2 //下面的代码判断具体的请求,并根据不同的请求进行相关操作
546 2 //如果D7位为1,则说明是输入请求
547 2 if((bmRequestType&0x80)==0x80)
548 2 {
549 3 //根据bmRequestType的D6~5位散转,D6~5位表示请求的类型
550 3 //0为标准请求,1为类请求,2为厂商请求。
551 3 switch((bmRequestType>>5)&0x03)
C51 COMPILER V8.05a USBCORE 04/21/2009 19:44:21 PAGE 10
552 3 {
553 4 case 0: //标准请求
554 4 #ifdef DEBUG0
555 4 Prints("USB标准输入请求:");
556 4 #endif
557 4 //USB协议定义了几个标准输入请求,我们实现这些标准请求即可
558 4 //请求的代码在bRequest中,对不同的请求代码进行散转
559 4 //事实上,我们还需要对接收者进行散转,因为不同的请求接收者
560 4 //是不一样的。接收者在bmRequestType的D4~D0位中定义。
561 4 //我们这里为了简化操作,有些就省略了对接收者的判断。
562 4 //例如获取描述符的请求,只根据描述符的类型来区别。
563 4 switch(bRequest)
564 4 {
565 5 case GET_CONFIGURATION: //获取配置
566 5 #ifdef DEBUG0
567 5 Prints("获取配置。\r\n");
568 5 #endif
569 5 break;
570 5
571 5 case GET_DESCRIPTOR: //获取描述符
572 5 #ifdef DEBUG0
573 5 Prints("获取描述符——");
574 5 #endif
575 5 //对描述符类型进行散转,对于全速设备,
576 5 //标准请求只支持发送到设备的设备、配置、字符串三种描述符
577 5 switch((wValue>>8)&0xFF)
578 5 {
579 6 case DEVICE_DESCRIPTOR: //设备描述符
580 6 #ifdef DEBUG0
581 6 Prints("设备描述符。\r\n");
582 6 #endif
583 6 pSendData=DeviceDescriptor; //需要发送的数据
584 6 //判断请求的字节数是否比实际需要发送的字节数多
585 6 //这里请求的是设备描述符,因此数据长度就是
586 6 //DeviceDescriptor[0]。如果请求的比实际的长,
587 6 //那么只返回实际长度的数据
588 6 if(wLength>DeviceDescriptor[0])
589 6 {
590 7 SendLength=DeviceDescriptor[0];
591 7 if(SendLength%DeviceDescriptor[7]==0) //并且刚好是整数个数据包时
592 7 {
593 8 NeedZeroPacket=1; //需要返回0长度的数据包
594 8 }
595 7 }
596 6 else
597 6 {
598 7 SendLength=wLength;
599 7 }
600 6 //将数据通过EP0返回
601 6 UsbEp0SendData();
602 6 break;
603 6
604 6 case CONFIGURATION_DESCRIPTOR: //配置描述符
605 6 #ifdef DEBUG0
606 6 Prints("配置描述符。\r\n");
607 6 #endif
608 6 pSendData=ConfigurationDescriptor; //需要发送的数据为配置描述符
609 6 //判断请求的字节数是否比实际需要发送的字节数多
610 6 //这里请求的是配置描述符集合,因此数据长度就是
611 6 //ConfigurationDescriptor[3]*256+ConfigurationDescriptor[2]。
612 6 //如果请求的比实际的长,那么只返回实际长度的数据
613 6 SendLength=ConfigurationDescriptor[3];
C51 COMPILER V8.05a USBCORE 04/21/2009 19:44:21 PAGE 11
614 6 SendLength=SendLength*256+ConfigurationDescriptor[2];
615 6 if(wLength>SendLength)
616 6 {
617 7 if(SendLength%DeviceDescriptor[7]==0) //并且刚好是整数个数据包时
618 7 {
619 8 NeedZeroPacket=1; //需要返回0长度的数据包
620 8 }
621 7 }
622 6 else
623 6 {
624 7 SendLength=wLength;
625 7 }
626 6 //将数据通过EP0返回
627 6 UsbEp0SendData();
628 6 break;
629 6
630 6 case STRING_DESCRIPTOR: //字符串描述符
631 6 #ifdef DEBUG0
632 6 Prints("字符串描述符");
633 6 #endif
634 6 switch(wValue&0xFF) //根据wValue的低字节(索引值)散转
635 6 {
636 7 case 0: //获取语言ID
637 7 #ifdef DEBUG0
638 7 Prints("(语言ID)。\r\n");
639 7 #endif
640 7 pSendData=LanguageId;
641 7 SendLength=LanguageId[0];
642 7 break;
643 7
644 7 case 1: //厂商字符串的索引值为1,所以这里为厂商字符串
645 7 #ifdef DEBUG0
646 7 Prints("(厂商描述)。\r\n");
647 7 #endif
648 7 pSendData=ManufacturerStringDescriptor;
649 7 SendLength=ManufacturerStringDescriptor[0];
650 7 break;
651 7
652 7 case 2: //产品字符串的索引值为2,所以这里为产品字符串
653 7 #ifdef DEBUG0
654 7 Prints("(产品描述)。\r\n");
655 7 #endif
656 7 pSendData=ProductStringDescriptor;
657 7 SendLength=ProductStringDescriptor[0];
658 7 break;
659 7
660 7 case 3: //产品序列号的索引值为3,所以这里为序列号
661 7 #ifdef DEBUG0
662 7 Prints("(产品序列号)。\r\n");
663 7 #endif
664 7 pSendData=SerialNumberStringDescriptor;
665 7 SendLength=SerialNumberStringDescriptor[0];
666 7 break;
667 7
668 7 default :
669 7 #ifdef DEBUG0
670 7 Prints("(未知的索引值)。\r\n");
671 7 #endif
672 7 //对于未知索引值的请求,返回一个0长度的包
673 7 SendLength=0;
674 7 NeedZeroPacket=1;
675 7 break;
C51 COMPILER V8.05a USBCORE 04/21/2009 19:44:21 PAGE 12
676 7 }
677 6 //判断请求的字节数是否比实际需要发送的字节数多
678 6 //如果请求的比实际的长,那么只返回实际长度的数据
679 6 if(wLength>SendLength)
680 6 {
681 7 if(SendLength%DeviceDescriptor[7]==0) //并且刚好是整数个数据包时
682 7 {
683 8 NeedZeroPacket=1; //需要返回0长度的数据包
684 8 }
685 7 }
686 6 else
687 6 {
688 7 SendLength=wLength;
689 7 }
690 6 //将数据通过EP0返回
691 6 UsbEp0SendData();
692 6 break;
693 6
694 6 case REPORT_DESCRIPTOR: //报告描述符
695 6 #ifdef DEBUG0
696 6 Prints("报告描述符。\r\n");
697 6 #endif
698 6 break;
699 6
700 6 default: //其它描述符
701 6 #ifdef DEBUG0
702 6 Prints("其他描述符,描述符代码:");
703 6 PrintHex((wValue>>8)&0xFF);
704 6 Prints("\r\n");
705 6 #endif
706 6 break;
707 6 }
708 5 break;
709 5
710 5 case GET_INTERFACE: //获取接口
711 5 #ifdef DEBUG0
712 5 Prints("获取接口。\r\n");
713 5 #endif
714 5 break;
715 5
716 5 case GET_STATUS: //获取状态
717 5 #ifdef DEBUG0
718 5 Prints("获取状态。\r\n");
719 5 #endif
720 5 break;
721 5
722 5 case SYNCH_FRAME: //同步帧
723 5 #ifdef DEBUG0
724 5 Prints("同步帧。\r\n");
725 5 #endif
726 5 break;
727 5
728 5 default: //未定义的标准请求
729 5 #ifdef DEBUG0
730 5 Prints("错误:未定义的标准输入请求。\r\n");
731 5 #endif
732 5 break;
733 5 }
734 4 break;
735 4
736 4 case 1: //类请求
737 4 #ifdef DEBUG0
C51 COMPILER V8.05a USBCORE 04/21/2009 19:44:21 PAGE 13
738 4 Prints("USB类输入请求:\r\n");
739 4 #endif
740 4 break;
741 4
742 4 case 2: //厂商请求
743 4 #ifdef DEBUG0
744 4 Prints("USB厂商输入请求:\r\n");
745 4 #endif
746 4 break;
747 4
748 4 default: //未定义的请求。这里只显示一个报错信息。
749 4 #ifdef DEBUG0
750 4 Prints("错误:未定义的输入请求。\r\n");
751 4 #endif
752 4 break;
753 4 }
754 3 }
755 2 //否则说明是输出请求
756 2 else //if(bmRequestType&0x80==0x80)之else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -