📄 usb_main.lst
字号:
528 1 outportdata(0);
529 1
530 1 if(bEPPflags.bits.in_isr == 0)
531 1 ENABLE;
532 1 }
533
534 void D12_SetMode(unsigned char bConfig, unsigned char bClkDiv)
535 {
536 1 if(bEPPflags.bits.in_isr == 0)
537 1 DISABLE;
538 1 outportcmd(0xF3);
539 1 outportdata(bConfig);
540 1 outportdata(bClkDiv);
541 1 if(bEPPflags.bits.in_isr == 0)
542 1 ENABLE;
543 1
544 1 }
545
546 void D12_SetDMA(unsigned char bMode)
547 {
548 1
549 1 if(bEPPflags.bits.in_isr == 0)
550 1 DISABLE;
551 1 outportcmd(0xFB);
C51 COMPILER V6.23a USB_MAIN 12/24/2005 14:35:50 PAGE 10
552 1 outportdata(bMode);
553 1 if(bEPPflags.bits.in_isr == 0)
554 1 ENABLE;
555 1
556 1 }
557
558 //unsigned char D12_GetDMA(void)
559 //{
560 // outportcmd(0xFB);
561 // return(inportb());
562 //}
563 /*
564 unsigned char D12_ReadEndpointStatus(unsigned char bEndp)
565 {
566 unsigned char c;
567
568 if(bEPPflags.bits.in_isr == 0)
569 DISABLE;
570
571 outportcmd(0x80 + bEndp);
572 c = inportb();
573
574 if(bEPPflags.bits.in_isr == 0)
575 ENABLE;
576
577 return c;
578 }
579 */
580 void D12_SetEndpointStatus(unsigned char bEndp, unsigned char bStalled)
581 {
582 1 if(bEPPflags.bits.in_isr == 0)
583 1 DISABLE;
584 1
585 1 outportcmd(0x40 + bEndp);
586 1 outportdata(bStalled);
587 1
588 1 if(bEPPflags.bits.in_isr == 0)
589 1 ENABLE;
590 1 }
591
592
593
594 //void D12_SendResume(void)
595 //{
596 // outportcmd(0xF6);
597 //}
598
599
600 unsigned char D12_WriteEndpoint(unsigned char endp, unsigned char len, unsigned char * buf)
601 {
602 1 unsigned char i;
603 1
604 1 if(bEPPflags.bits.in_isr == 0)
605 1 DISABLE;
606 1 //---------------------
607 1 outportcmd(endp); //选择端点
608 1 inportb(); //读入满/空状态
609 1
610 1 outportcmd(0xF0); //写缓冲区命令
611 1 outportdata(0);
612 1 outportdata(len);
613 1
C51 COMPILER V6.23a USB_MAIN 12/24/2005 14:35:50 PAGE 11
614 1 for(i=0; i<len; i++)
615 1 outportdata(*(buf+i));
616 1
617 1 outportcmd(0xFA); //驶购冲区有效
618 1
619 1 //--------------------------------
620 1 if(bEPPflags.bits.in_isr == 0)
621 1 ENABLE;
622 1
623 1 return len;
624 1 }
625 void D12_AcknowledgeEndpoint(unsigned char endp)
626 {
627 1 outportcmd( endp); //选择端点
628 1 outportcmd(0xF1); //应答设置
629 1 if(endp == 0)
630 1 outportcmd(0xF2); //缓冲区清零
631 1 }
632 unsigned char D12_ReadInterruptRegister(void)
633 {
634 1 unsigned char b1;
635 1 unsigned int j;
636 1 j=0;
637 1 //outportb(D12_COMMAND, 0xF4);
638 1 outportcmd(0xF4);
639 1 b1 = inportb();
640 1 j = inportb();
641 1 return b1;
642 1 //j = inportb();
643 1 //j <<= 8;
644 1 //j += b1;
645 1 //return j;
646 1 }
647
648 unsigned char D12_ReadLastTransactionStatus(unsigned char bEndp)
649 {
650 1 //outportb(D12_COMMAND, 0x40 + bEndp);
651 1 outportcmd(0x40 + bEndp);
652 1 return inportb();
653 1 }
654 unsigned char D12_ReadEndpoint(unsigned char endp, unsigned char len, unsigned char * buf)
655 {
656 1 unsigned char i, j;
657 1
658 1 if(bEPPflags.bits.in_isr == 0)
659 1 DISABLE;
660 1 //--------------------------------
661 1 outportcmd(endp); //选择端点
662 1 if((inportb() & D12_FULLEMPTY) == 0) { //如果缓冲区为空,则返回
663 2 if(bEPPflags.bits.in_isr == 0)
664 2 ENABLE;
665 2 return 0;
666 2 }
667 1
668 1 outportcmd(0xF0); //读缓冲区
669 1 j = inportb();
670 1 j = inportb();
671 1
672 1 if(j > len)
673 1 j = len;
674 1
675 1 for(i=0; i<j; i++)
C51 COMPILER V6.23a USB_MAIN 12/24/2005 14:35:50 PAGE 12
676 1 *(buf+i) = inportb();
677 1
678 1 outportcmd(0xF2); //缓冲区清空
679 1 //-------------------------------
680 1 if(bEPPflags.bits.in_isr == 0)
681 1 ENABLE;
682 1
683 1 return j;
684 1 }
685
686 unsigned char D12_SelectEndpoint(unsigned char bEndp)
687 {
688 1 unsigned char c;
689 1
690 1 if(bEPPflags.bits.in_isr == 0)
691 1 DISABLE;
692 1
693 1 outportcmd(bEndp);
694 1 c = inportb();
695 1
696 1 if(bEPPflags.bits.in_isr == 0)
697 1 ENABLE;
698 1
699 1 return c;
700 1 }
701
702 //P57命令接口-D12CI.C ----结束
703 //===============================================================
704 //===============================================================
705
706
707 //P61中断服务程序-ISR.C
708 //===============================================================
709 //===============================================================
710
711
712 void bus_reset(void)
713 {
714 1 }
715 //void dma_eot(void)
716 //{
717 //}
718 //---------------------------------
719 void ep0_rxdone(void)
720 {
721 1 unsigned char ep_last, i;
722 1
723 1 ep_last = D12_ReadLastTransactionStatus(0); // Clear interrupt flag
724 1 if (ep_last & D12_SETUPPACKET) {
725 2
726 2 ControlData.wLength = 0;
727 2 ControlData.wCount = 0;
728 2 //判断端点是否满,如是,则取出
729 2 if( D12_ReadEndpoint(0, sizeof(ControlData.DeviceRequest),
730 2 (unsigned char *)(&(ControlData.DeviceRequest))) != sizeof(DEVICE_REQUEST) ) {
731 3
732 3 D12_SetEndpointStatus(0, 1);
733 3 D12_SetEndpointStatus(1, 1);
734 3 bEPPflags.bits.control_state = USB_IDLE;
735 3
736 3 return;
737 3 }
C51 COMPILER V6.23a USB_MAIN 12/24/2005 14:35:50 PAGE 13
738 2
739 2 ControlData.DeviceRequest.wValue = SWAP(ControlData.DeviceRequest.wValue);
740 2 ControlData.DeviceRequest.wIndex = SWAP(ControlData.DeviceRequest.wIndex);
741 2 ControlData.DeviceRequest.wLength = SWAP(ControlData.DeviceRequest.wLength);
742 2
743 2 // Acknowledge setup here to unlock in/out endp
744 2 //向控制输出端点发送应答建立命令以重新使能下一个建立阶段
745 2 D12_AcknowledgeEndpoint(0);
746 2 D12_AcknowledgeEndpoint(1);
747 2
748 2 ControlData.wLength = ControlData.DeviceRequest.wLength;
749 2 ControlData.wCount = 0;
750 2 //需要证实控制传输是控制读还是写,如果是读:
751 2 //如果控制传输是一个控制读类型那就是说器件需要在下一个数据阶段向
752 2 //主机发回数据包.MCU需要设置一个标志以指示USB 设备现在正处于传输
753 2 //模式即准备在主机发送请求时发送数据
754 2
755 2 if (ControlData.DeviceRequest.bmRequestType & (unsigned char)USB_ENDPOINT_DIRECTION_MASK) {
756 3 bEPPflags.bits.setup_packet = 1;
757 3 bEPPflags.bits.control_state = USB_IDLE; /* get command */
758 3 }
759 2 //如果是写
760 2 else {
761 3 if (ControlData.DeviceRequest.wLength == 0) {
762 4 bEPPflags.bits.setup_packet = 1;
763 4 bEPPflags.bits.control_state = USB_IDLE; /* set command */
764 4 }
765 3 else {
766 4 if(ControlData.DeviceRequest.wLength > MAX_CONTROLDATA_SIZE) {
767 5 bEPPflags.bits.control_state = USB_IDLE;
768 5 D12_SetEndpointStatus(0, 1);
769 5 D12_SetEndpointStatus(1, 1);
770 5 }
771 4 else {
772 5 bEPPflags.bits.control_state = USB_RECEIVE; /* set command with OUT token */
773 5 }
774 4 } // set command with data
775 3 } // else set command
776 2 } // if setup packet
777 1
778 1 else if (bEPPflags.bits.control_state == USB_RECEIVE) {
779 2 i = D12_ReadEndpoint(0, EP0_PACKET_SIZE,
780 2 ControlData.dataBuffer + ControlData.wCount);
781 2
782 2 ControlData.wCount += i;
783 2 if( i != EP0_PACKET_SIZE || ControlData.wCount >= ControlData.wLength) {
784 3 bEPPflags.bits.setup_packet = 1;
785 3 bEPPflags.bits.control_state = USB_IDLE;
786 3 }
787 2 }
788 1
789 1 else {
790 2 bEPPflags.bits.control_state = USB_IDLE;
791 2 }
792 1
793 1 }
794 //----------------------------------
795 void ep0_txdone(void)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -