📄 f34x_msd_usb_std_req.src
字号:
MOV DPTR,#Ep_Status+01H
; }
; SOURCE LINE # 262
SJMP ?C0148
; else
; {
; SOURCE LINE # 264
?C0062:
; POLL_WRITE_BYTE (INDEX, EP2_OUT_IDX); // Set feature Ep2 halt
; SOURCE LINE # 265
MOV A,USB0ADR
JB ACC.7,?C0062
?C0063:
MOV USB0ADR,#0EH
MOV USB0DAT,#02H
?C0064:
; POLL_WRITE_BYTE (EOUTCSR1, rbOutSDSTL);
; SOURCE LINE # 266
MOV A,USB0ADR
JB ACC.7,?C0064
?C0065:
MOV USB0ADR,#014H
MOV USB0DAT,#020H
; Ep_Status[2] = EP_HALT;
; SOURCE LINE # 267
MOV DPTR,#Ep_Status+02H
?C0148:
MOV A,#03H
MOVX @DPTR,A
; }
; SOURCE LINE # 268
; }
; SOURCE LINE # 269
SJMP ?C0067
?C0054:
; else
; {
; SOURCE LINE # 271
; Force_Stall(); // Send procedural stall
; SOURCE LINE # 272
?C0147:
LCALL Force_Stall
; }
; SOURCE LINE # 273
; }
; SOURCE LINE # 274
?C0067:
; POLL_WRITE_BYTE(INDEX, EP0_IDX);
; SOURCE LINE # 275
MOV A,USB0ADR
JB ACC.7,?C0067
?C0068:
; if (Ep_Status[0] != EP_STALL)
; SOURCE LINE # 276
LCALL L?0161
JZ ?C0072
; {
; SOURCE LINE # 277
?C0070:
; POLL_WRITE_BYTE(E0CSR, (rbSOPRDY | rbDATAEND));
; SOURCE LINE # 278
MOV A,USB0ADR
JB ACC.7,?C0070
?C0071:
LCALL L?0167
; // Indicate setup packet has been serviced
; }
; SOURCE LINE # 280
; }
; SOURCE LINE # 281
?C0072:
RET
; END OF Set_Feature
;
; //----------------------------------------------------------------------------
; // Set_Address
; //----------------------------------------------------------------------------
; //
; // Set new function address
; //
; // Parameters :
; // Return Value :
; //----------------------------------------------------------------------------
;
; void Set_Address(void)
RSEG ?PR?Set_Address?F34X_MSD_USB_STD_REQ
Set_Address:
USING 0
; SOURCE LINE # 293
; {
; SOURCE LINE # 294
; if ((Setup.bmRequestType != IN_DEVICE) ||// Request must be directed to device
; SOURCE LINE # 295
MOV DPTR,#Setup
MOVX A,@DPTR
JNZ ?C0074
MOV DPTR,#Setup+04H
MOVX A,@DPTR
JNZ ?C0074
INC DPTR
MOVX A,@DPTR
JNZ ?C0074
INC DPTR
MOVX A,@DPTR
JNZ ?C0074
INC DPTR
MOVX A,@DPTR
JNZ ?C0074
MOV DPTR,#Setup+02H
MOVX A,@DPTR
JNZ ?C0074
INC DPTR
MOVX A,@DPTR
JNB ACC.7,?C0073
?C0074:
; Setup.wIndex.c[MSB] || Setup.wIndex.c[LSB]||// with index and length set to zero.
; Setup.wLength.c[MSB] || Setup.wLength.c[LSB]||
; Setup.wValue.c[MSB] || (Setup.wValue.c[LSB] & 0x80))
; {
; SOURCE LINE # 299
; Force_Stall(); // Send stall if setup data invalid
; SOURCE LINE # 300
LCALL Force_Stall
; }
; SOURCE LINE # 301
?C0073:
;
; Ep_Status[0] = EP_ADDRESS; // Set endpoint zero to update address next status phase
; SOURCE LINE # 303
MOV DPTR,#Ep_Status
MOV A,#05H
MOVX @DPTR,A
; if (Setup.wValue.c[LSB] != 0)
; SOURCE LINE # 304
MOV DPTR,#Setup+03H
MOVX A,@DPTR
MOV DPTR,#USB_State
JZ ?C0075
; {
; SOURCE LINE # 305
; USB_State = DEV_ADDRESS; // Indicate that device state is now address
; SOURCE LINE # 306
MOV A,#03H
MOVX @DPTR,A
; }
; SOURCE LINE # 307
SJMP ?C0076
?C0075:
; else
; {
; SOURCE LINE # 309
; USB_State = DEV_DEFAULT; // If new address was 0x00, return device to default
; SOURCE LINE # 310
MOV A,#02H
MOVX @DPTR,A
; } // state
; SOURCE LINE # 311
?C0076:
; if (Ep_Status[0] != EP_STALL)
; SOURCE LINE # 312
LCALL L?0162
JZ ?C0080
; {
; SOURCE LINE # 313
?C0078:
; POLL_WRITE_BYTE(E0CSR, (rbSOPRDY | rbDATAEND));
; SOURCE LINE # 314
MOV A,USB0ADR
JB ACC.7,?C0078
?C0079:
LCALL L?0168
; // Indicate setup packet has been serviced
; }
; SOURCE LINE # 316
; }
; SOURCE LINE # 317
?C0080:
RET
; END OF Set_Address
;
; //----------------------------------------------------------------------------
; // Get_Descriptor
; //----------------------------------------------------------------------------
; //
; // This routine sets the data pointer and size to correct
; // descriptor and sets the endpoint status to transmit
; //
; // Parameters :
; // Return Value :
; //----------------------------------------------------------------------------
;
; void Get_Descriptor(void)
RSEG ?PR?Get_Descriptor?F34X_MSD_USB_STD_REQ
Get_Descriptor:
USING 0
; SOURCE LINE # 330
; {
; SOURCE LINE # 331
;
; switch(Setup.wValue.c[MSB]) // Determine which type of descriptor
; SOURCE LINE # 333
MOV DPTR,#Setup+02H
MOVX A,@DPTR
ADD A,#0FEH
JZ ?C0083
DEC A
JZ ?C0084
DEC A
JZ ?C0085
DEC A
JNZ $ + 5H
LJMP ?C0086
ADD A,#04H
JZ $ + 5H
LJMP ?C0092
; { // was requested, and set data ptr and
; SOURCE LINE # 334
; case DSC_DEVICE: // size accordingly
; SOURCE LINE # 335
?C0082:
; Data_Ptr = (BYTE*) &Device_Desc;
; SOURCE LINE # 336
LCALL L?0169
MOV A,#HIGH (Device_Desc)
MOVX @DPTR,A
INC DPTR
MOV A,#LOW (Device_Desc)
MOVX @DPTR,A
; Data_Size = Device_Desc.bLength;
; SOURCE LINE # 337
MOV DPTR,#Device_Desc
; break;
; SOURCE LINE # 338
SJMP ?C0150
;
; case DSC_CONFIG:
; SOURCE LINE # 340
?C0083:
; Data_Ptr = (BYTE*) &Config_Desc;
; SOURCE LINE # 341
LCALL L?0169
MOV A,#HIGH (Config_Desc)
MOVX @DPTR,A
INC DPTR
MOV A,#LOW (Config_Desc)
MOVX @DPTR,A
; // Compiler Specific - The next statement reverses the
; // bytes in the configuration descriptor for the compiler
; Data_Size = Config_Desc.wTotalLength.c[MSB] + 256*Config_Desc.wTotalLength.c[LSB];
; SOURCE LINE # 344
MOV DPTR,#Config_Desc+03H
CLR A
MOVC A,@A+DPTR
MOV R6,A
MOV DPTR,#Config_Desc+02H
CLR A
MOVC A,@A+DPTR
MOV R4,#00H
ADD A,#00H
MOV R7,A
MOV A,R4
ADDC A,R6
MOV DPTR,#Data_Size
; break;
; SOURCE LINE # 345
LJMP ?C0153
;
; case DSC_STRING:
; SOURCE LINE # 347
?C0084:
; Data_Ptr = String_Desc_Table[Setup.wValue.c[LSB]];
; SOURCE LINE # 348
MOV DPTR,#Setup+03H
MOVX A,@DPTR
MOV B,#03H
MUL AB
ADD A,#LOW (String_Desc_Table)
MOV DPL,A
MOV A,B
ADDC A,#HIGH (String_Desc_Table)
MOV DPH,A
MOVX A,@DPTR
MOV R3,A
INC DPTR
MOVX A,@DPTR
MOV R2,A
INC DPTR
MOVX A,@DPTR
MOV R1,A
MOV DPTR,#Data_Ptr
MOV A,R3
MOVX @DPTR,A
INC DPTR
MOV A,R2
MOVX @DPTR,A
INC DPTR
MOV A,R1
MOVX @DPTR,A
; // Can have a maximum of 255 strings
; Data_Size = *Data_Ptr;
; SOURCE LINE # 350
LCALL ?C?CLDPTR
MOV R7,A
MOV DPTR,#Data_Size
CLR A
?C0151:
; break;
; SOURCE LINE # 351
SJMP ?C0153
;
; case DSC_INTERFACE:
; SOURCE LINE # 353
?C0085:
; Data_Ptr = (BYTE*) &Interface_Desc;
; SOURCE LINE # 354
LCALL L?0170
MOV A,#HIGH (Interface_Desc)
MOVX @DPTR,A
INC DPTR
MOV A,#LOW (Interface_Desc)
MOVX @DPTR,A
; Data_Size = Interface_Desc.bLength;
; SOURCE LINE # 355
MOV DPTR,#Interface_Desc
?C0150:
CLR A
MOVC A,@A+DPTR
MOV R7,A
MOV DPTR,#Data_Size
CLR A
?C0152:
; break;
; SOURCE LINE # 356
SJMP ?C0153
;
; case DSC_ENDPOINT:
; SOURCE LINE # 358
?C0086:
; if ((Setup.wValue.c[LSB] == IN_EP1) ||
; SOURCE LINE # 359
MOV DPTR,#Setup+03H
MOVX A,@DPTR
MOV R7,A
XRL A,#081H
JZ ?C0088
MOV A,R7
XRL A,#01H
JNZ ?C0154
?C0088:
; (Setup.wValue.c[LSB] == OUT_EP2))
; {
; SOURCE LINE # 361
; if (Setup.wValue.c[LSB] == IN_EP1)
; SOURCE LINE # 362
MOV A,R7
MOV DPTR,#Data_Ptr
CJNE A,#081H,?C0089
; {
; SOURCE LINE # 363
; Data_Ptr = (BYTE*) &Endpoint1_Desc;
; SOURCE LINE # 364
MOV A,#0FFH
MOVX @DPTR,A
INC DPTR
MOV A,#HIGH (Endpoint1_Desc)
MOVX @DPTR,A
INC DPTR
MOV A,#LOW (Endpoint1_Desc)
MOVX @DPTR,A
; Data_Size = Endpoint1_Desc.bLength;
; SOURCE LINE # 365
MOV DPTR,#Endpoint1_Desc
; }
; SOURCE LINE # 366
SJMP ?C0149
?C0089:
; else
; {
; SOURCE LINE # 368
; Data_Ptr = (BYTE*) &Endpoint2_Desc;
; SOURCE LINE # 369
MOV A,#0FFH
MOVX @DPTR,A
INC DPTR
MOV A,#HIGH (Endpoint2_Desc)
MOVX @DPTR,A
INC DPTR
MOV A,#LOW (Endpoint2_Desc)
MOVX @DPTR,A
; Data_Size = Endpoint2_Desc.bLength;
; SOURCE LINE # 370
MOV DPTR,#Endpoint2_Desc
?C0149:
CLR A
MOVC A,@A+DPTR
MOV R7,A
MOV DPTR,#Data_Size
CLR A
?C0153:
MOVX @DPTR,A
INC DPTR
MOV A,R7
MOVX @DPTR,A
; }
; SOURCE LINE # 371
; }
; SOURCE LINE # 372
SJMP ?C0081
; else
; {
; Force_Stall();
; }
; break;
;
; default:
; SOURCE LINE # 379
?C0092:
; Force_Stall(); // Send Stall if unsupported request
; SOURCE LINE # 380
?C0154:
LCALL Force_Stall
; break;
; SOURCE LINE # 381
; }
; SOURCE LINE # 382
?C0081:
;
; if (Setup.wValue.c[MSB] == DSC_DEVICE || // Verify that the requested descriptor is
; SOURCE LINE # 384
MOV DPTR,#Setup+02H
MOVX A,@DPTR
MOV R7,A
XRL A,#01H
JZ ?C0094
MOV A,R7
XRL A,#02H
JZ ?C0094
MOV A,R7
XRL A,#03H
JZ ?C0094
MOV A,R7
XRL A,#04H
JZ ?C0094
MOV A,R7
CJNE A,#05H,?C0093
?C0094:
; Setup.wValue.c[MSB] == DSC_CONFIG || // valid
; Setup.wValue.c[MSB] == DSC_STRING ||
; Setup.wValue.c[MSB] == DSC_INTERFACE ||
; Setup.wValue.c[MSB] == DSC_ENDPOINT)
; {
; SOURCE LINE # 389
; if ((Setup.wLength.c[LSB] < Data_Size) &&
; SOURCE LINE # 390
MOV DPTR,#Setup+07H
MOVX A,@DPTR
MOV R7,A
SETB C
MOV DPTR,#Data_Size+01H
MOVX A,@DPTR
SUBB A,R7
MOV DPTR,#Data_Size
MOVX A,@DPTR
SUBB A,#00H
JC ?C0093
MOV DPTR,#Setup+06H
MOVX A,@DPTR
JNZ ?C0093
; (Setup.wLength.c[MSB] == 0))
; {
; SOURCE LINE # 392
; Data_Size = Setup.wLength.i; // Send only requested amount of data
; SOURCE LINE # 393
MOVX A,@DPTR
MOV R6,A
MOV DPTR,#Data_Size
MOV A,R6
MOVX @DPTR,A
INC DPTR
MOV A,R7
MOVX @DPTR,A
; }
; SOURCE LINE # 394
; }
; SOURCE LINE # 395
?C0093:
; if (Ep_Status[0] != EP_STALL) // Make sure endpoint not in stall mode
; SOURCE LINE # 396
LCALL L?0162
JZ ?C0099
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -