⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 f34x_msd_usb_std_req.src

📁 USB读写SD卡例程
💻 SRC
📖 第 1 页 / 共 4 页
字号:
	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 + -