📄 fw.ls1
字号:
014E E0 622 MOVX A,@DPTR
014F 4409 623 ORL A,#09H
0151 F0 624 MOVX @DPTR,A
625 ;
626 ; USBIE |= bmSUDAV | bmSUTOK | bmSUSP | bmURES | bmHSGRANT; // Enable selected interru
pts
627 ; SOURCE LINE # 160
0152 900000 F 628 MOV DPTR,#USBIE
0155 E0 629 MOVX A,@DPTR
0156 443D 630 ORL A,#03DH
0158 F0 631 MOVX @DPTR,A
632 ; EA = 1; // Enable 8051 interrupts
633 ; SOURCE LINE # 161
0159 D2AF 634 SETB EA
635 ;
636 ; #ifndef NO_RENUM
637 ; // Renumerate if necessary. Do this by checking the renum bit. If it
638 ; // is already set, there is no need to renumerate. The renum bit will
639 ; // already be set if this firmware was loaded from an eeprom.
640 ; if(!(USBCS & bmRENUM))
641 ; SOURCE LINE # 167
015B 900000 F 642 MOV DPTR,#USBCS
015E E0 643 MOVX A,@DPTR
015F 20E105 644 JB ACC.1,?C0008
645 ; {
646 ; SOURCE LINE # 168
647 ; EZUSB_Discon(TRUE); // renumerate
648 ; SOURCE LINE # 169
0162 D200 F 649 SETB ?EZUSB_Discon?BIT
0164 120000 F 650 LCALL EZUSB_Discon
651 ; }
A51 MACRO ASSEMBLER FW 12/29/2005 11:19:53 PAGE 11
652 ; SOURCE LINE # 170
0167 653 ?C0008:
654 ; #endif
655 ;
656 ; // unconditionally re-connect. If we loaded from eeprom we are
657 ; // disconnected and need to connect. If we just renumerated this
658 ; // is not necessary but doesn't hurt anything
659 ; USBCS &=~bmDISCON;
660 ; SOURCE LINE # 176
0167 900000 F 661 MOV DPTR,#USBCS
016A E0 662 MOVX A,@DPTR
016B 54F7 663 ANL A,#0F7H
016D F0 664 MOVX @DPTR,A
665 ;
666 ; CKCON = (CKCON&(~bmSTRETCH)) | FW_STRETCH_VALUE; // Set stretch to 0 (after renumerati
on)
667 ; SOURCE LINE # 178
016E 538EF8 668 ANL CKCON,#0F8H
669 ;
670 ; // clear the Sleep flag.
671 ; Sleep = FALSE;
672 ; SOURCE LINE # 181
0171 C200 F 673 CLR Sleep
0173 674 ?C0009:
675 ;
676 ;
677 ;
678 ; // Task Dispatcher
679 ; while(TRUE) // Main Loop
680 ; SOURCE LINE # 186
681 ; {
682 ; SOURCE LINE # 187
683 ; if(GotSUD) // Wait for SUDAV
684 ; SOURCE LINE # 188
0173 300005 F 685 JNB GotSUD,?C0011
686 ; {
687 ; SOURCE LINE # 189
688 ; SetupCommand(); // Implement setup command
689 ; SOURCE LINE # 190
0176 120000 F 690 LCALL SetupCommand
691 ; GotSUD = FALSE; // Clear SUDAV flag
692 ; SOURCE LINE # 191
0179 C200 F 693 CLR GotSUD
694 ; }
695 ; SOURCE LINE # 192
017B 696 ?C0011:
697 ;
698 ; // Poll User Device
699 ; // NOTE: Idle mode stops the processor clock. There are only two
700 ; // ways out of idle mode, the WAKEUP pin, and detection of the USB
701 ; // resume state on the USB bus. The timers will stop and the
702 ; // processor will not wake up on any other interrupts.
703 ; if (Sleep)
704 ; SOURCE LINE # 199
017B 300029 F 705 JNB Sleep,?C0012
706 ; {
707 ; SOURCE LINE # 200
708 ; if(TD_Suspend())
709 ; SOURCE LINE # 201
017E 120000 F 710 LCALL TD_Suspend
0181 5024 711 JNC ?C0012
712 ; {
713 ; SOURCE LINE # 202
714 ; Sleep = FALSE; // Clear the "go to sleep" flag. Do it here to p
revent any race condition between wakeup and the next sleep.
715 ; SOURCE LINE # 203
A51 MACRO ASSEMBLER FW 12/29/2005 11:19:53 PAGE 12
0183 C200 F 716 CLR Sleep
0185 717 ?C0016:
718 ; do
719 ; {
720 ; SOURCE LINE # 205
721 ; EZUSB_Susp(); // Place processor in idle mode.
722 ; SOURCE LINE # 206
0185 120000 F 723 LCALL EZUSB_Susp
724 ; }
725 ; SOURCE LINE # 207
726 ; while(!Rwuen && EZUSB_EXTWAKEUP());
727 ; SOURCE LINE # 208
0188 200016 F 728 JB Rwuen,?C0015
018B 900000 F 729 MOV DPTR,#WAKEUPCS
018E E0 730 MOVX A,@DPTR
018F 30E704 731 JNB ACC.7,?C0018
0192 E0 732 MOVX A,@DPTR
0193 20E1EF 733 JB ACC.1,?C0016
0196 734 ?C0018:
0196 900000 F 735 MOV DPTR,#WAKEUPCS
0199 E0 736 MOVX A,@DPTR
019A 30E604 737 JNB ACC.6,?C0015
019D E0 738 MOVX A,@DPTR
019E 20E0E4 739 JB ACC.0,?C0016
01A1 740 ?C0015:
741 ; // Must continue to go back into suspend if the host has disabled remote
wakeup
742 ; // *and* the wakeup was caused by the external wakeup pin.
743 ;
744 ; // 8051 activity will resume here due to USB bus or Wakeup# pin activity.
745 ; EZUSB_Resume(); // If source is the Wakeup# pin, signal the host to Resume
.
746 ; SOURCE LINE # 213
01A1 120000 F 747 LCALL EZUSB_Resume
748 ; TD_Resume();
749 ; SOURCE LINE # 214
01A4 120000 F 750 LCALL TD_Resume
751 ; }
752 ; SOURCE LINE # 215
753 ; }
754 ; SOURCE LINE # 216
01A7 755 ?C0012:
756 ; TD_Poll();
757 ; SOURCE LINE # 217
01A7 120000 F 758 LCALL TD_Poll
759 ; }
760 ; SOURCE LINE # 218
01AA 80C7 761 SJMP ?C0009
762 ; END OF main
763
764 ; }
765 ;
766 ; // Device request parser
767 ; void SetupCommand(void)
768
---- 769 RSEG ?PR?SetupCommand?FW
0000 770 SetupCommand:
771 USING 0
772 ; SOURCE LINE # 222
773 ; {
774 ; SOURCE LINE # 223
775 ; void *dscr_ptr;
776 ;
777 ; switch(SETUPDAT[1])
778 ; SOURCE LINE # 226
0000 900000 F 779 MOV DPTR,#SETUPDAT+01H
A51 MACRO ASSEMBLER FW 12/29/2005 11:19:53 PAGE 13
0003 E0 780 MOVX A,@DPTR
0004 7003 781 JNZ $ + 5H
0006 020000 F 782 LJMP ?C0037
0009 14 783 DEC A
000A 7003 784 JNZ $ + 5H
000C 020000 F 785 LJMP ?C0046
000F 24FE 786 ADD A,#0FEH
0011 7003 787 JNZ $ + 5H
0013 020000 F 788 LJMP ?C0057
0016 24FB 789 ADD A,#0FBH
0018 7003 790 JNZ $ + 5H
001A 020000 F 791 LJMP ?C0036
001D 14 792 DEC A
001E 7003 793 JNZ $ + 5H
0020 020000 F 794 LJMP ?C0035
0023 14 795 DEC A
0024 6073 796 JZ ?C0033
0026 14 797 DEC A
0027 6076 798 JZ ?C0034
0029 2405 799 ADD A,#05H
002B 6003 800 JZ $ + 5H
002D 020000 F 801 LJMP ?C0068
802 ; {
803 ; SOURCE LINE # 227
804 ; case SC_GET_DESCRIPTOR: // *** Get Descriptor
805 ; SOURCE LINE # 228
0030 806 ?C0022:
807 ; if(DR_GetDescriptor())
808 ; SOURCE LINE # 229
0030 120000 F 809 LCALL DR_GetDescriptor
0033 4003 810 JC $ + 5H
0035 020000 F 811 LJMP ?C0021
812 ; switch(SETUPDAT[3])
813 ; SOURCE LINE # 230
0038 900000 F 814 MOV DPTR,#SETUPDAT+03H
003B E0 815 MOVX A,@DPTR
003C 24FE 816 ADD A,#0FEH
003E 6022 817 JZ ?C0027
0040 14 818 DEC A
0041 6033 819 JZ ?C0029
0043 24FD 820 ADD A,#0FDH
0045 6011 821 JZ ?C0026
0047 14 822 DEC A
0048 6022 823 JZ ?C0028
004A 2406 824 ADD A,#06H
004C 7048 825 JNZ ?C0032
826 ; {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -