📄 fw.src
字号:
CLR C
LCALL ?C?ULCMP
JNC ?C0003
; *((BYTE xdata *)IntDescrAddr+i) = 0xCD;
; SOURCE LINE # 142
MOV A,IntDescrAddr?044+01H
ADD A,i?040+03H
MOV DPL,A
MOV A,IntDescrAddr?044
ADDC A,i?040+02H
MOV DPH,A
MOV A,#0CDH
MOVX @DPTR,A
MOV A,i?040+03H
ADD A,#01H
MOV i?040+03H,A
CLR A
ADDC A,i?040+02H
MOV i?040+02H,A
CLR A
ADDC A,i?040+01H
MOV i?040+01H,A
CLR A
ADDC A,i?040
MOV i?040,A
SJMP ?C0002
?C0003:
; for (i = 0; i < DevDescrLen; i++)
; SOURCE LINE # 143
CLR A
MOV i?040+03H,A
MOV i?040+02H,A
MOV i?040+01H,A
MOV i?040,A
?C0005:
MOV R7,DevDescrLen?042+03H
MOV R6,DevDescrLen?042+02H
MOV R5,DevDescrLen?042+01H
MOV R4,DevDescrLen?042
MOV R3,i?040+03H
MOV R2,i?040+02H
MOV R1,i?040+01H
MOV R0,i?040
CLR C
LCALL ?C?ULCMP
JNC ?C0006
; *((BYTE xdata *)IntDescrAddr+i) = *((BYTE xdata *)ExtDescrAddr+i);
; SOURCE LINE # 144
MOV A,ExtDescrAddr?045+01H
ADD A,i?040+03H
MOV DPL,A
MOV A,ExtDescrAddr?045
ADDC A,i?040+02H
MOV DPH,A
MOVX A,@DPTR
MOV R7,A
MOV A,IntDescrAddr?044+01H
ADD A,i?040+03H
MOV DPL,A
MOV A,IntDescrAddr?044
ADDC A,i?040+02H
MOV DPH,A
MOV A,R7
MOVX @DPTR,A
MOV A,i?040+03H
ADD A,#01H
MOV i?040+03H,A
CLR A
ADDC A,i?040+02H
MOV i?040+02H,A
CLR A
ADDC A,i?040+01H
MOV i?040+01H,A
CLR A
ADDC A,i?040
MOV i?040,A
SJMP ?C0005
?C0006:
; pDeviceDscr = IntDescrAddr;
; SOURCE LINE # 145
MOV pDeviceDscr,IntDescrAddr?044
MOV pDeviceDscr+01H,IntDescrAddr?044+01H
; offset = (WORD)&DeviceDscr - INTERNAL_DSCR_ADDR;
; SOURCE LINE # 146
MOV A,#LOW (DeviceDscr)
ADD A,#080H
MOV R7,A
MOV A,#HIGH (DeviceDscr)
ADDC A,#0FFH
MOV R6,A
;---- Variable 'offset?041' assigned to Register 'R6/R7' ----
; pDeviceQualDscr -= offset;
; SOURCE LINE # 147
CLR C
MOV A,pDeviceQualDscr+01H
SUBB A,R7
MOV pDeviceQualDscr+01H,A
MOV A,pDeviceQualDscr
SUBB A,R6
MOV pDeviceQualDscr,A
; pConfigDscr -= offset;
; SOURCE LINE # 148
CLR C
MOV A,pConfigDscr+01H
SUBB A,R7
MOV pConfigDscr+01H,A
MOV A,pConfigDscr
SUBB A,R6
MOV pConfigDscr,A
; pOtherConfigDscr -= offset;
; SOURCE LINE # 149
CLR C
MOV A,pOtherConfigDscr+01H
SUBB A,R7
MOV pOtherConfigDscr+01H,A
MOV A,pOtherConfigDscr
SUBB A,R6
MOV pOtherConfigDscr,A
; pHighSpeedConfigDscr -= offset;
; SOURCE LINE # 150
CLR C
MOV A,pHighSpeedConfigDscr+01H
SUBB A,R7
MOV pHighSpeedConfigDscr+01H,A
MOV A,pHighSpeedConfigDscr
SUBB A,R6
MOV pHighSpeedConfigDscr,A
; pFullSpeedConfigDscr -= offset;
; SOURCE LINE # 151
CLR C
MOV A,pFullSpeedConfigDscr+01H
SUBB A,R7
MOV pFullSpeedConfigDscr+01H,A
MOV A,pFullSpeedConfigDscr
SUBB A,R6
MOV pFullSpeedConfigDscr,A
; pStringDscr -= offset;
; SOURCE LINE # 152
CLR C
MOV A,pStringDscr+01H
SUBB A,R7
MOV pStringDscr+01H,A
MOV A,pStringDscr
SUBB A,R6
MOV pStringDscr,A
; }
; SOURCE LINE # 153
?C0001:
;
; EZUSB_IRQ_ENABLE(); // Enable USB interrupt (INT2)
; SOURCE LINE # 155
SETB EUSB
; EZUSB_ENABLE_RSMIRQ(); // Wake-up interrupt
; SOURCE LINE # 156
ORL EICON,#020H
;
; INTSETUP |= (bmAV2EN | bmAV4EN); // Enable INT 2 & 4 autovectoring
; SOURCE LINE # 158
MOV DPTR,#INTSETUP
MOVX A,@DPTR
ORL A,#09H
MOVX @DPTR,A
;
; USBIE |= bmSUDAV | bmSUTOK | bmSUSP | bmURES | bmHSGRANT; // Enable selected interrupts
; SOURCE LINE # 160
MOV DPTR,#USBIE
MOVX A,@DPTR
ORL A,#03DH
MOVX @DPTR,A
; EA = 1; // Enable 8051 interrupts
; SOURCE LINE # 161
SETB EA
;
; #ifndef NO_RENUM
; // Renumerate if necessary. Do this by checking the renum bit. If it
; // is already set, there is no need to renumerate. The renum bit will
; // already be set if this firmware was loaded from an eeprom.
; if(!(USBCS & bmRENUM))
; SOURCE LINE # 167
MOV DPTR,#USBCS
MOVX A,@DPTR
JB ACC.1,?C0008
; {
; SOURCE LINE # 168
; EZUSB_Discon(TRUE); // renumerate
; SOURCE LINE # 169
SETB ?EZUSB_Discon?BIT
LCALL EZUSB_Discon
; }
; SOURCE LINE # 170
?C0008:
; #endif
;
; // unconditionally re-connect. If we loaded from eeprom we are
; // disconnected and need to connect. If we just renumerated this
; // is not necessary but doesn't hurt anything
; USBCS &=~bmDISCON;
; SOURCE LINE # 176
MOV DPTR,#USBCS
MOVX A,@DPTR
ANL A,#0F7H
MOVX @DPTR,A
;
; CKCON = (CKCON&(~bmSTRETCH)) | FW_STRETCH_VALUE; // Set stretch to 0 (after renumeration)
; SOURCE LINE # 178
ANL CKCON,#0F8H
;
; // clear the Sleep flag.
; Sleep = FALSE;
; SOURCE LINE # 181
CLR Sleep
?C0009:
;
;
;
; // Task Dispatcher
; while(TRUE) // Main Loop
; SOURCE LINE # 186
; {
; SOURCE LINE # 187
; if(GotSUD) // Wait for SUDAV
; SOURCE LINE # 188
JNB GotSUD,?C0011
; {
; SOURCE LINE # 189
; SetupCommand(); // Implement setup command
; SOURCE LINE # 190
LCALL SetupCommand
; GotSUD = FALSE; // Clear SUDAV flag
; SOURCE LINE # 191
CLR GotSUD
; }
; SOURCE LINE # 192
?C0011:
;
; // Poll User Device
; // NOTE: Idle mode stops the processor clock. There are only two
; // ways out of idle mode, the WAKEUP pin, and detection of the USB
; // resume state on the USB bus. The timers will stop and the
; // processor will not wake up on any other interrupts.
; if (Sleep)
; SOURCE LINE # 199
JNB Sleep,?C0012
; {
; SOURCE LINE # 200
; if(TD_Suspend())
; SOURCE LINE # 201
LCALL TD_Suspend
JNC ?C0012
; {
; SOURCE LINE # 202
; Sleep = FALSE; // Clear the "go to sleep" flag. Do it here to prevent any race condition between wakeup and the next sleep.
; SOURCE LINE # 203
CLR Sleep
?C0016:
; do
; {
; SOURCE LINE # 205
; EZUSB_Susp(); // Place processor in idle mode.
; SOURCE LINE # 206
LCALL EZUSB_Susp
; }
; SOURCE LINE # 207
; while(!Rwuen && EZUSB_EXTWAKEUP());
; SOURCE LINE # 208
JB Rwuen,?C0015
MOV DPTR,#WAKEUPCS
MOVX A,@DPTR
JNB ACC.7,?C0018
MOVX A,@DPTR
JB ACC.1,?C0016
?C0018:
MOV DPTR,#WAKEUPCS
MOVX A,@DPTR
JNB ACC.6,?C0015
MOVX A,@DPTR
JB ACC.0,?C0016
?C0015:
; // Must continue to go back into suspend if the host has disabled remote wakeup
; // *and* the wakeup was caused by the external wakeup pin.
;
; // 8051 activity will resume here due to USB bus or Wakeup# pin activity.
; EZUSB_Resume(); // If source is the Wakeup# pin, signal the host to Resume.
; SOURCE LINE # 213
LCALL EZUSB_Resume
; TD_Resume();
; SOURCE LINE # 214
LCALL TD_Resume
; }
; SOURCE LINE # 215
; }
; SOURCE LINE # 216
?C0012:
; TD_Poll();
; SOURCE LINE # 217
LCALL TD_Poll
; }
; SOURCE LINE # 218
SJMP ?C0009
; END OF main
; }
;
; // Device request parser
; void SetupCommand(void)
RSEG ?PR?SetupCommand?FW
SetupCommand:
USING 0
; SOURCE LINE # 222
; {
; SOURCE LINE # 223
; void *dscr_ptr;
;
; switch(SETUPDAT[1])
; SOURCE LINE # 226
MOV DPTR,#SETUPDAT+01H
MOVX A,@DPTR
JNZ $ + 5H
LJMP ?C0037
DEC A
JNZ $ + 5H
LJMP ?C0046
ADD A,#0FEH
JNZ $ + 5H
LJMP ?C0057
ADD A,#0FBH
JNZ $ + 5H
LJMP ?C0036
DEC A
JNZ $ + 5H
LJMP ?C0035
DEC A
JZ ?C0033
DEC A
JZ ?C0034
ADD A,#05H
JZ $ + 5H
LJMP ?C0068
; {
; SOURCE LINE # 227
; case SC_GET_DESCRIPTOR: // *** Get Descriptor
; SOURCE LINE # 228
?C0022:
; if(DR_GetDescriptor())
; SOURCE LINE # 229
LCALL DR_GetDescriptor
JC $ + 5H
LJMP ?C0021
; switch(SETUPDAT[3])
; SOURCE LINE # 230
MOV DPTR,#SETUPDAT+03H
MOVX A,@DPTR
ADD A,#0FEH
JZ ?C0027
DEC A
JZ ?C0029
ADD A,#0FDH
JZ ?C0026
DEC A
JZ ?C0028
ADD A,#06H
JNZ ?C0032
; {
; SOURCE LINE # 231
; case GD_DEVICE: // Device
; SOURCE LINE # 232
?C0025:
; SUDPTRH = MSB(pDeviceDscr);
; SOURCE LINE # 233
MOV A,pDeviceDscr
MOV DPTR,#SUDPTRH
MOVX @DPTR,A
; SUDPTRL = LSB(pDeviceDscr);
; SOURCE LINE # 234
MOV A,pDeviceDscr+01H
; break;
; SOURCE LINE # 235
SJMP ?C0075
; case GD_DEVICE_QUALIFIER: // Device Qualifier
; SOURCE LINE # 236
?C0026:
; SUDPTRH = MSB(pDeviceQualDscr);
; SOURCE LINE # 237
MOV A,pDeviceQualDscr
MOV DPTR,#SUDPTRH
MOVX @DPTR,A
; SUDPTRL = LSB(pDeviceQualDscr);
; SOURCE LINE # 238
MOV A,pDeviceQualDscr+01H
?C0072:
; break;
; SOURCE LINE # 239
SJMP ?C0075
; case GD_CONFIGURATION: // Configuration
; SOURCE LINE # 240
?C0027:
; SUDPTRH = MSB(pConfigDscr);
; SOURCE LINE # 241
MOV A,pConfigDscr
MOV DPTR,#SUDPTRH
MOVX @DPTR,A
; SUDPTRL = LSB(pConfigDscr);
; SOURCE LINE # 242
MOV A,pConfigDscr+01H
?C0073:
; break;
; SOURCE LINE # 243
SJMP ?C0075
; case GD_OTHER_SPEED_CONFIGURATION: // Other Speed Configuration
; SOURCE LINE # 244
?C0028:
; SUDPTRH = MSB(pOtherConfigDscr);
; SOURCE LINE # 245
MOV A,pOtherConfigDscr
MOV DPTR,#SUDPTRH
MOVX @DPTR,A
; SUDPTRL = LSB(pOtherConfigDscr);
; SOURCE LINE # 246
MOV A,pOtherConfigDscr+01H
?C0074:
; break;
; SOURCE LINE # 247
SJMP ?C0075
; case GD_STRING: // String
; SOURCE LINE # 248
?C0029:
; if(dscr_ptr = (void *)EZUSB_GetStringDscr(SETUPDAT[2]))
; SOURCE LINE # 249
MOV DPTR,#SETUPDAT+02H
MOVX A,@DPTR
MOV R7,A
LCALL _EZUSB_GetStringDscr
MOV R2,AR6
MOV R1,AR7
MOV R3,#01H
;---- Variable 'dscr_ptr?146' assigned to Register 'R1/R2/R3' ----
MOV A,R2
ORL A,R1
ORL A,R3
JZ ?C0076
; {
; SOURCE LINE # 250
; SUDPTRH = MSB(dscr_ptr);
; SOURCE LINE # 251
MOV A,R6
MOV DPTR,#SUDPTRH
MOVX @DPTR,A
; SUDPTRL = LSB(dscr_ptr);
; SOURCE LINE # 252
MOV A,R7
?C0075:
MOV DPTR,#SUDPTRL
MOVX @DPTR,A
; }
; SOURCE LINE # 253
LJMP ?C0021
; else
; EZUSB_STALL_EP0(); // Stall End Point 0
; break;
; default: // Invalid request
; SOURCE LINE # 257
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -