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

📄 sl811.lst

📁 这是在SL811上实现的对U盘进行FAT32或FAT16读写的程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
 261   5      					SL811Write(EP0Control,cmd);			// Enable USB transfer and re-arm
 262   5      				}				
 263   4      
 264   4      				//------------------------------------------------
 265   4      				// Copy last IN token data pkt from prev transfer
 266   4      				// Check if there was data available during the
 267   4      				// last data transfer
 268   4      				//------------------------------------------------
 269   4      				if(bufLen)										
 270   4      				{	
 271   5      					SL811BufRead(((dataX&1)?data0:data1), usbstack.buffer, bufLen);
 272   5      					usbstack.buffer += bufLen;								
 273   5      				}
 274   4      
 275   4      				//------------------------------------------------
 276   4      				// Terminate on short packets, i.e. remainder!=0
 277   4      				// a short packet or empty data packet OR when 
 278   4      				// requested data len have completed, i.e.wLen=0
 279   4      				// For a LOWSPEED device, the 1st device descp,
 280   4      				// wPayload is default to 64-byte, LS device will
 281   4      				// only send back a max of 8-byte device descp,
 282   4      				// and host detect this as a short packet, and 
 283   4      				// terminate with OUT status stage
 284   4      				//------------------------------------------------
 285   4      				if(remainder || !usbstack.wLen)
 286   4      					break;
 287   4      			}// PID IN	
 288   3      			else if((usbstack.pid == PID_OUT)&&(bEnd))
 289   3                                      break;
 290   3      			else if(usbstack.pid == PID_SETUP)								// do nothing for SETUP/OUT token
 291   3      				break;						
 292   3      		}
 293   2      			
 294   2      		//-------------------------NAK----------------------------
 295   2      		if (result & EP0_NAK)									// NAK Detected
 296   2      		{														
 297   3      			//if(usbstack.endpoint==0)										// on ep0 during enumeration of LS device
 298   3      			{													// happen when slave is not fast enough,
 299   4      			//if(usbstack.pid == PID_IN)	
 300   4      			//	offset=(dataX & 1) ? 0x8:0x0;
 301   4      			//if(usbstack.pid == PID_OUT)
 302   4      			//	offset=(dataX & 1) ? 0x0:0x8;
C51 COMPILER V6.20c  SL811                                                                 04/07/2005 10:50:50 PAGE 6   

 303   4      			//else
 304   4      			//	offset=(dataX & 1) ? 0x8:0x0;
 305   4      			offset=0;
 306   4      			SL811Write(IntStatus,INT_CLEAR);				// clear interrupt status, need to
 307   4      			SL811Write(EP0Control+offset,cmd);						// re-arm and request for last cmd, IN token
 308   4                      		//result = 0;                                     // respond to NAK status only
 309   4      			}
 310   3      			//else												// normal data endpoint, exit now !!! , non-zero ep
 311   3      			//	break;											// main loop control the interval polling
 312   3      		}
 313   2      	
 314   2      		//-----------------------TIMEOUT--------------------------
 315   2      		if (result & EP0_TIMEOUT)								// TIMEOUT Detected
 316   2      		{														
 317   3      			if(usbstack.endpoint==0)										// happens when hub enumeration
 318   3      			{
 319   4      				if(++timeout >= TIMEOUT_RETRY)
 320   4      				{	
 321   5      				    timeout--;
 322   5      					break;										// exit on the timeout detected	
 323   5      				}
 324   4      				SL811Write(IntStatus,INT_CLEAR);				// clear interrupt status, need to
 325   4      				SL811Write(EP0Control,cmd);						// re-arm and request for last cmd again
 326   4      			}
 327   3      			else												
 328   3      			{													// all other data endpoint, data transfer 
 329   4      				bXXGFlags.TIMEOUT_ERR = TRUE;								// failed, set flag to terminate transfer
 330   4      				break;											// happens when data transfer on a device
 331   4      			}													// through the hub
 332   3      		}
 333   2      
 334   2      		//-----------------------STALL----------------------------
 335   2      		if (result & EP0_STALL)  								// STALL detected
 336   2      			return TRUE;										// for unsupported request.
 337   2      																		
 338   2      		//----------------------OVEFLOW---------------------------
 339   2      		if (result & EP0_OVERFLOW)  							// OVERFLOW detected
 340   2      			//result=result;
 341   2      			break;
 342   2      		//-----------------------ERROR----------------------------
 343   2      		//if (result & EP0_ERROR)  								// ERROR detected
 344   2      			//result=result;
 345   2      		//	break;
 346   2      	}	// end of While(1)
 347   1         
 348   1      	if (result & EP0_ACK) 	// on ACK transmission
 349   1      		return TRUE;		// return OK
 350   1      
 351   1      	return FALSE;			// fail transmission
 352   1      
 353   1      
 354   1      }
 355          //*****************************************************************************************
 356          // Control Endpoint 0's USB Data Xfer
 357          // ep0Xfer, endpoint 0 data transfer
 358          //*****************************************************************************************
 359          unsigned char ep0Xfer(void)
 360          {
 361   1      	//unsigned char wLen;
 362   1      	
 363   1      	//wLen=usbstack.wLen;
 364   1      	usbstack.endpoint=0;
C51 COMPILER V6.20c  SL811                                                                 04/07/2005 10:50:50 PAGE 7   

 365   1      	//----------------------------------------------------
 366   1      	// SETUP token with 8-byte request on endpoint 0
 367   1      	//----------------------------------------------------
 368   1      	usbstack.pid=PID_SETUP;
 369   1      	usbstack.wLen=8;
 370   1      	//usbstack.buffer=&usbstack.setup;
 371   1      	if (!usbXfer()) 
 372   1         		return FALSE;
 373   1      	//DelayMs(10);
 374   1      	usbstack.pid  = PID_IN;
 375   1      	//----------------------------------------------------
 376   1      	// IN or OUT data stage on endpoint 0	
 377   1      	//----------------------------------------------------
 378   1      	usbstack.wLen=usbstack.setup.wLength;
 379   1         	if (usbstack.wLen)											// if there are data for transfer
 380   1      	{
 381   2      		if (usbstack.setup.bmRequest & 0x80)		// host-to-device : IN token
 382   2      		{
 383   3      			usbstack.pid  = PID_IN;	
 384   3      			
 385   3      			if(!usbXfer())
 386   3      				return FALSE;
 387   3      			//usbstack.wPayload = 0;
 388   3      			usbstack.pid  = PID_OUT;
 389   3      		}
 390   2      		else											// device-to-host : OUT token
 391   2         		{							
 392   3      			usbstack.pid  = PID_OUT;
 393   3      				
 394   3      			if(!usbXfer())
 395   3      				return FALSE;
 396   3      			usbstack.pid  = PID_IN;
 397   3      		}
 398   2      	}
 399   1      	//DelayMs(10);
 400   1      	//----------------------------------------------------
 401   1      	// Status stage IN or OUT zero-length data packet
 402   1      	//----------------------------------------------------
 403   1      	usbstack.wLen=0;
 404   1      	if(!usbXfer())
 405   1      		return FALSE;
 406   1      
 407   1      	return TRUE;											
 408   1      					
 409   1      }
 410          
 411          
 412          unsigned char epBulkSend(unsigned char *pBuffer,unsigned int len)
 413          {
 414   1      	usbstack.usbaddr=0x1;
 415   1      	usbstack.endpoint=usbstack.epbulkout;
 416   1      	usbstack.pid=PID_OUT;
 417   1      	usbstack.wPayload=64;
 418   1      	usbstack.wLen=len;
 419   1      	usbstack.buffer=pBuffer;
 420   1      	
 421   1      	if(usbstack.wLen)
 422   1      		return usbXfer();
 423   1      	
 424   1      	return TRUE;	
 425   1      }
 426          
C51 COMPILER V6.20c  SL811                                                                 04/07/2005 10:50:50 PAGE 8   

 427          unsigned char epBulkRcv(unsigned char *pBuffer,unsigned int len)
 428          {
 429   1      	usbstack.usbaddr=0x1;
 430   1      	usbstack.endpoint=usbstack.epbulkin;
 431   1      	usbstack.pid=PID_IN;
 432   1      	usbstack.wPayload=64;
 433   1      	usbstack.wLen=len;
 434   1      	usbstack.buffer=pBuffer;
 435   1      	if(usbstack.wLen)
 436   1      		//while(!usbXfer());
 437   1      		return usbXfer();
 438   1      	return TRUE;
 439   1      }
 440          //*****************************************************************************************
 441          // Control endpoint
 442          //*****************************************************************************************
 443          //void VendorCmd(void)
 444          //{ 
 445          //      ep0Xfer();
 446          //}
 447          
 448          //*****************************************************************************************
 449          // Set Device Address : 
 450          //*****************************************************************************************
 451          unsigned char SetAddress(unsigned char addr)
 452          {
 453   1      	usbstack.usbaddr=0;
 454   1      	usbstack.setup.bmRequest=0;
 455   1      	usbstack.setup.bRequest=SET_ADDRESS;
 456   1      	usbstack.setup.wValue=addr;
 457   1      	usbstack.setup.wIndex=0;
 458   1      	usbstack.setup.wLength=0;
 459   1      	//usbstack.buffer=&usbstack.setup;
 460   1      	return ep0Xfer();
 461   1      
 462   1      }
 463          
 464          //*****************************************************************************************
 465          // Set Device Configuration : 
 466          //*****************************************************************************************
 467          unsigned char Set_Configuration(void)
 468          {
 469   1      	//usbstack.usbaddr=usbaddr;
 470   1      	//usbstack.
 471   1      	usbstack.setup.bmRequest=0;
 472   1      	usbstack.setup.bRequest=SET_CONFIG;
 473   1      	usbstack.setup.wValue=DEVICE;
 474   1      	usbstack.setup.wIndex=0;
 475   1      	usbstack.setup.wLength=0;
 476   1      	usbstack.buffer=NULL;
 477   1      	return ep0Xfer();
 478   1      
 479   1      }
 480          //*****************************************************************************************/
 481          // Set Device Interface : 
 482          //*****************************************************************************************/
 483          unsigned char Set_Interface(void)
 484          {
 485   1      	usbstack.setup.bmRequest=1;
 486   1      	usbstack.setup.bRequest=SET_INTERFACE;
 487   1      	usbstack.setup.wValue=0;
 488   1      	usbstack.setup.wIndex=0;
C51 COMPILER V6.20c  SL811                                                                 04/07/2005 10:50:50 PAGE 9   

 489   1      	usbstack.setup.wLength=0;
 490   1      	usbstack.buffer=NULL;
 491   1      	return ep0Xfer();
 492   1      
 493   1      }
 494          //*****************************************************************************************
 495          // Get Device Descriptor : Device, Configuration, String
 496          //*****************************************************************************************
 497          unsigned char GetDesc(void)
 498          { 
 499   1      	
 500   1      	usbstack.setup.bmRequest=0x80;
 501   1      	usbstack.setup.bRequest=GET_DESCRIPTOR;
 502   1      	usbstack.setup.wValue=WordSwap(usbstack.setup.wValue);
 503   1      	
 504   1      	usbstack.wPayload=uDev.wPayLoad[0];
 505   1      	//usbstack.buffer=&usbstack.setup;
 506   1      	return ep0Xfer();
 507   1      }
 508          
 509          unsigned int GetMaxLUN(void)
 510          {
 511   1      
 512   1      	usbstack.setup.bmRequest=0xa1;
 513   1      	usbstack.setup.bRequest=0xfe;
 514   1      	usbstack.setup.wValue=0;
 515   1      	usbstack.setup.wIndex=0;
 516   1      	usbstack.setup.wLength=1;
 517   1      	return ep0Xfer();
 518   1      }
 519          //*****************************************************************************************
 520          // USB Data Endpoint Read/Write
 521          // wLen is in low byte first format
 522          //*****************************************************************************************
 523          
 524          
 525          //*****************************************************************************************
 526          // USB Device Enumeration Process
 527          // Support 1 confguration and interface #0 and alternate setting #0 only
 528          // Support up to 1 control endpoint + 4 data endpoint only
 529          //*****************************************************************************************
 530          unsigned char EnumUsbDev(BYTE usbaddr)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -