📄 upsd_usb.src
字号:
MOV A,B
ADDC A,#HIGH (stringDescTable)
MOV DPH,A
CLR A
MOVC A,@A+DPTR
MOV R3,A
MOV A,#01H
MOVC A,@A+DPTR
MOV R2,A
MOV A,#02H
MOVC A,@A+DPTR
MOV R1,A
MOV DPTR,#pTransmitBufferEP0
MOV A,R3
MOVX @DPTR,A
INC DPTR
MOV A,R2
MOVX @DPTR,A
INC DPTR
MOV A,R1
MOVX @DPTR,A
; bytesToTransmitEP0 = *pTransmitBufferEP0;// choose requested string
; SOURCE LINE # 596
LCALL ?C?CLDPTR
; break;
; SOURCE LINE # 597
SJMP ?C0115
;
; #if HID_DEVICE
; case
; DT_HID_CLASS:
; SOURCE LINE # 601
?C0074:
; pTransmitBufferEP0 = (uchar*) &hidClassDesc;
; SOURCE LINE # 602
MOV DPTR,#pTransmitBufferEP0
MOV A,#0FFH
MOVX @DPTR,A
INC DPTR
MOV A,#HIGH (hidClassDesc)
MOVX @DPTR,A
INC DPTR
MOV A,#LOW (hidClassDesc)
MOVX @DPTR,A
; bytesToTransmitEP0 = hidClassDescSize;
; SOURCE LINE # 603
MOV DPTR,#hidClassDescSize
?C0112:
CLR A
MOVC A,@A+DPTR
?C0113:
; break;
; SOURCE LINE # 604
SJMP ?C0115
;
; case
; DT_HID_REPORT:
; SOURCE LINE # 607
?C0075:
; pTransmitBufferEP0 = (uchar*) &reportDesc;
; SOURCE LINE # 608
MOV DPTR,#pTransmitBufferEP0
MOV A,#0FFH
MOVX @DPTR,A
INC DPTR
MOV A,#HIGH (reportDesc)
MOVX @DPTR,A
INC DPTR
MOV A,#LOW (reportDesc)
MOVX @DPTR,A
; bytesToTransmitEP0 = reportDescSize;
; SOURCE LINE # 609
MOV DPTR,#reportDescSize
CLR A
MOVC A,@A+DPTR
?C0114:
; break;
; SOURCE LINE # 610
SJMP ?C0115
;
; case
; DT_HID_PHYSICALD:
; SOURCE LINE # 613
?C0076:
; pTransmitBufferEP0 = (uchar*) &PhysicalReportDesc;
; SOURCE LINE # 614
MOV DPTR,#pTransmitBufferEP0
MOV A,#0FFH
MOVX @DPTR,A
INC DPTR
MOV A,#HIGH (PhysicalReportDesc)
MOVX @DPTR,A
INC DPTR
MOV A,#LOW (PhysicalReportDesc)
MOVX @DPTR,A
; bytesToTransmitEP0 = PhysicalReportDescSize;
; SOURCE LINE # 615
MOV DPTR,#PhysicalReportDescSize
CLR A
MOVC A,@A+DPTR
?C0115:
MOV R7,A
MOV DPTR,#bytesToTransmitEP0
CLR A
MOVX @DPTR,A
INC DPTR
MOV A,R7
MOVX @DPTR,A
; break;
; SOURCE LINE # 616
SJMP ?C0068
;
; #endif
;
; default:
; SOURCE LINE # 620
?C0077:
; STALL_EP0(); // Unrecognized descriptor, so stall EP0
; SOURCE LINE # 621
LJMP STALL_EP0
; return;
; }
; SOURCE LINE # 623
?C0068:
;
; bytesRequested = (setupPacket.wLength.hi << 8) | setupPacket.wLength.lo;
; SOURCE LINE # 625
MOV DPTR,#setupPacket+07H
MOVX A,@DPTR
MOV R6,A
MOV DPTR,#setupPacket+06H
MOVX A,@DPTR
MOV R5,A
MOV A,R6
MOV bytesRequested?1449,A
MOV A,R5
MOV bytesRequested?1449+01H,A
; shortTransfer = (bytesToTransmitEP0 < bytesRequested);
; SOURCE LINE # 626
MOV DPTR,#bytesToTransmitEP0
MOVX A,@DPTR
MOV R6,A
INC DPTR
MOVX A,@DPTR
MOV R7,A
CLR C
SUBB A,bytesRequested?1449+01H
MOV A,R6
SUBB A,bytesRequested?1449
JNC ?C0079
MOV R5,#01H
SJMP ?C0080
?C0079:
MOV R5,#00H
?C0080:
MOV DPTR,#shortTransfer
MOV A,R5
MOVX @DPTR,A
; if (bytesToTransmitEP0 > bytesRequested)
; SOURCE LINE # 627
SETB C
MOV A,R7
SUBB A,bytesRequested?1449+01H
MOV A,R6
SUBB A,bytesRequested?1449
JC ?C0081
; {
; SOURCE LINE # 628
; bytesToTransmitEP0 = bytesRequested;
; SOURCE LINE # 629
INC DPTR
MOV A,bytesRequested?1449
MOVX @DPTR,A
INC DPTR
MOV A,bytesRequested?1449+01H
MOVX @DPTR,A
; }
; SOURCE LINE # 630
?C0081:
; UCON0 &= ~uTSEQ0; // TransmitDataEP0 will toggle sequence bit to DATA1
; SOURCE LINE # 631
ANL UCON0,#07FH
; TransmitBufferEP0();
; SOURCE LINE # 632
LCALL TransmitBufferEP0
; }
; SOURCE LINE # 633
?C0078:
RET
; END OF OnGetDescriptor
;
;
;
;
;
;
; static void OnSetDescriptor()
RSEG ?PR?OnSetDescriptor?UPSD_USB
OnSetDescriptor:
; SOURCE LINE # 640
; /******************************************************************************
; Function : static void OnSetDescriptor()
; Parameters : none
; Description: Handler for SET_DESCRIPTOR() control requests
; ******************************************************************************/
; {
; SOURCE LINE # 646
; STALL_EP0(); // No features currently implemented, so stall EP0
; SOURCE LINE # 647
LJMP STALL_EP0
; END OF OnSetDescriptor
; }
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
; BOOL ReadSetupPacket()
RSEG ?PR?ReadSetupPacket?UPSD_USB
ReadSetupPacket:
USING 0
; SOURCE LINE # 666
; /******************************************************************************
; Function : BOOL ReadSetupPacket()
; Parameters : none
; Description: Reads a setup packet from EP0.
; Returns TRUE if successful; stalls the endpoint and returns
; FALSE on an invalid packet size.
; ******************************************************************************/
; {
; SOURCE LINE # 674
; data int i;
; uchar* p = (uchar*) &setupPacket;
; SOURCE LINE # 676
MOV DPTR,#p?1651
MOV A,#01H
MOVX @DPTR,A
INC DPTR
MOV A,#HIGH (setupPacket)
MOVX @DPTR,A
INC DPTR
MOV A,#LOW (setupPacket)
MOVX @DPTR,A
;
; if ((USTA & 0x0F) != 8) // Stall EP0 if SETUP packet is not the correct size
; SOURCE LINE # 678
MOV A,USTA
ANL A,#0FH
XRL A,#08H
JZ ?C0083
; {
; SOURCE LINE # 679
; STALL_EP0();
; SOURCE LINE # 680
LCALL STALL_EP0
; return FALSE;
; SOURCE LINE # 681
MOV R7,#00H
RET
; }
; SOURCE LINE # 682
?C0083:
;
; for (i = 0; i < 8; i++) // Read the setup packet
; SOURCE LINE # 684
CLR A
MOV i?1650,A
MOV i?1650+01H,A
?C0085:
; {
; SOURCE LINE # 685
; *p++ = UDR0;
; SOURCE LINE # 686
MOV DPTR,#p?1651
MOVX A,@DPTR
MOV R3,A
INC DPTR
CLR A
MOV B,#01H
LCALL ?C?ILDIX
MOV R1,B
MOV R2,A
MOV A,UDR0
LCALL ?C?CSTPTR
; }
; SOURCE LINE # 687
INC i?1650+01H
MOV A,i?1650+01H
JNZ ?C0108
INC i?1650
?C0108:
XRL A,#08H
ORL A,i?1650
JNZ ?C0085
?C0086:
; USTA |= uRSEQ; // Set data toggle bit (expecting DATA1)
; SOURCE LINE # 688
ORL USTA,#080H
;
; return TRUE;
; SOURCE LINE # 690
MOV R7,#01H
; }
; SOURCE LINE # 691
?C0084:
RET
; END OF ReadSetupPacket
;
;
;
;
;
;
;
;
;
;
;
; void OnSetupPacket()
RSEG ?PR?OnSetupPacket?UPSD_USB
OnSetupPacket:
USING 0
; SOURCE LINE # 703
; /******************************************************************************
; Function : void OnSetupPacket()
; Parameters : none
; Description: Basic handler for SETUP packets received on EP0.
; ******************************************************************************/
; {
; SOURCE LINE # 709
; pTransmitBufferEP0 = NULL;
; SOURCE LINE # 710
MOV DPTR,#pTransmitBufferEP0
CLR A
MOVX @DPTR,A
INC DPTR
MOVX @DPTR,A
INC DPTR
MOVX @DPTR,A
; bytesToTransmitEP0 = 0;
; SOURCE LINE # 711
MOV DPTR,#bytesToTransmitEP0
MOVX @DPTR,A
INC DPTR
MOVX @DPTR,A
; // If it's a standard request...
; if ((setupPacket.bmRequestType & 0x60) == 0)
; SOURCE LINE # 713
INC DPTR
MOVX A,@DPTR
ANL A,#060H
JNZ ?C0088
; {
; SOURCE LINE # 714
; switch (setupPacket.bRequest) // Handle the request
; SOURCE LINE # 715
INC DPTR
MOVX A,@DPTR
CJNE A,#0CH,?C0109
?C0109:
JNC ?C0088
MOV DPTR,#?C0110
MOV R0,A
ADD A,R0
ADD A,R0
JMP @A+DPTR
?C0110:
LJMP ?C0090
LJMP ?C0092
LJMP ?C0088
LJMP ?C0093
LJMP ?C0088
LJMP ?C0094
LJMP ?C0095
LJMP ?C0096
LJMP ?C0097
LJMP ?C0098
LJMP ?C0099
LJMP ?C0100
; {
; SOURCE LINE # 716
; case GET_STATUS: OnGetStatus(); return;
; SOURCE LINE # 717
?C0090:
LJMP OnGetStatus
; case CLEAR_FEATURE: OnClearFeature(); return;
; SOURCE LINE # 718
?C0092:
LJMP OnClearFeature
; case SET_FEATURE: OnSetFeature(); return;
; SOURCE LINE # 719
?C0093:
LJMP OnSetFeature
; case SET_ADDRESS: OnSetAddress(); return;
; SOURCE LINE # 720
?C0094:
LJMP OnSetAddress
; case GET_DESCRIPTOR: OnGetDescriptor(); return;
; SOURCE LINE # 721
?C0095:
LJMP OnGetDescriptor
; case SET_DESCRIPTOR: OnSetDescriptor(); return;
; SOURCE LINE # 722
?C0096:
LJMP OnSetDescriptor
; case GET_CONFIGURATION: OnGetConfiguration(); return;
; SOURCE LINE # 723
?C0097:
LJMP OnGetConfiguration
; case SET_CONFIGURATION: OnSetConfiguration(); return;
; SOURCE LINE # 724
?C0098:
LJMP OnSetConfiguration
; case GET_INTERFACE: OnGetInterface(); return;
; SOURCE LINE # 725
?C0099:
LJMP OnGetInterface
; case SET_INTERFACE: OnSetInterface(); return;
; SOURCE LINE # 726
?C0100:
LJMP OnSetInterface
; default:
; SOURCE LINE # 727
; break;
; SOURCE LINE # 728
; }
; SOURCE LINE # 729
; }
; SOURCE LINE # 730
?C0088:
; STALL_EP0(); // It's not a request we handle, so stall endpoint
; SOURCE LINE # 731
LCALL STALL_EP0
; }
; SOURCE LINE # 732
?C0091:
RET
; END OF OnSetupPacket
;
;
;
;
;
;
;
;
;
;
;
;
;
; void BaseEp0TxHandler()
RSEG ?PR?BaseEp0TxHandler?UPSD_USB
BaseEp0TxHandler:
USING 0
; SOURCE LINE # 746
; /******************************************************************************
; Function : void BaseEp0TxHandler()
; Parameters : none
; Description: Handler for successful data transmission on control endpoint (EP0).
; Use it only for control transfers !!!
; ******************************************************************************/
; {
; SOURCE LINE # 753
;
; if (!TransmitBufferEP0()) // Send next chunk of data in transaction
; SOURCE LINE # 755
LCALL TransmitBufferEP0
MOV A,R7
JNZ ?C0106
; {
; SOURCE LINE # 756
; // The current request has finished
; if (setupPacket.bRequest == SET_ADDRESS) // The current request has finished
; SOURCE LINE # 758
MOV DPTR,#setupPacket+01H
MOVX A,@DPTR
CJNE A,#05H,?C0103
; {
; SOURCE LINE # 759
; UADR = setupPacket.wValue.lo | uUSBEN;
; SOURCE LINE # 760
INC DPTR
MOVX A,@DPTR
MOV R7,A
ORL A,#080H
MOV UADR,A
; if (setupPacket.wValue.lo != 0)
; SOURCE LINE # 761
MOV A,R7
MOV R0,#LOW (usbState)
JZ ?C0104
; usbState = US_ADDRESSED;
; SOURCE LINE # 762
MOV @R0,#03H
SJMP ?C0103
?C0104:
; else
; usbState = US_DEFAULT;
; SOURCE LINE # 764
MOV @R0,#02H
; }
; SOURCE LINE # 765
?C0103:
; setupPacket.bRequest = REQUEST_COMPLETE;
; SOURCE LINE # 766
MOV DPTR,#setupPacket+01H
MOV A,#0FFH
MOVX @DPTR,A
; }
; SOURCE LINE # 767
; }
; SOURCE LINE # 768
?C0106:
RET
; END OF BaseEp0TxHandler
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -