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