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

📄 sl811.lst

📁 这是在SL811上实现的对U盘进行FAT32或FAT16读写的程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
C51 COMPILER V6.20c  SL811                                                                 04/07/2005 10:50:50 PAGE 1   


C51 COMPILER V6.20c, COMPILATION OF MODULE SL811
OBJECT MODULE PLACED IN SL811.OBJ
COMPILER INVOKED BY: D:\Hardware\Keilc620\C51\Bin\C51.EXE SL811.C DB OE SMALL ROM(LARGE) 

stmt level    source

   1          #include "common.h"
   2          #include "SL811.H"
   3          #include "HAL.H"
   4          #include "HPI.H"
   5          
   6          extern unsigned char xdata SL811H_ADDR _at_ SL811_ADDR_PORT;
   7          extern unsigned char xdata SL811H_DATA _at_ SL811_DATA_PORT;
   8          
   9          extern XXGFLAGS bdata bXXGFlags;
  10          
  11          XXGPKG usbstack;
  12          unsigned char remainder;
  13          extern UART_CMD_BLOCK xdata UartCmdBlock;
  14          extern UART_RSP_BLOCK xdata UartRspBlock;
  15          unsigned char xdata DBUF[BUFFER_LENGTH];
  16          extern unsigned char xdata UARTBUF[UARTBUF_LENGTH];
  17          pUSBDEV  idata	uDev;	// Multiple USB devices attributes, Max 5 devices
  18          extern unsigned char opLun;
  19          unsigned int  idata SL811_ERR_COUNTER=0;
  20          
  21          //*****************************************************************************************
  22          // SL811H variables initialization
  23          //*****************************************************************************************
  24          
  25          unsigned char SL811_GetRev(void)
  26          {
  27   1      	//SL811Write(SL811_ADDR_PORT, 0x0e);
  28   1      	return SL811Read(0x0e);
  29   1      }
  30          
  31          void USBReset(void)
  32          {
  33   1      	unsigned char temp;
  34   1          	temp=SL811Read(CtrlReg);   
  35   1          	temp=temp&0xe7;
  36   1       	SL811Write(CtrlReg,temp|0x08);
  37   1      	DelayMs(125);		
  38   1          	SL811Write(CtrlReg,temp);    
  39   1      }
  40          
  41          //*****************************************************************************************
  42          // usbXfer:
  43          // successful transfer = return TRUE
  44          // fail transfer = return FALSE
  45          //*****************************************************************************************
  46          unsigned char usbXfer(void)
  47          {  
  48   1      	
  49   1      	unsigned char	xferLen, data0, data1,cmd,offset;
  50   1      	unsigned char idata intr,result,remainder,dataX,bufLen,addr,timeout;
  51   1      	unsigned char idata bEnd;
  52   1      	
  53   1      	//------------------------------------------------
  54   1      	// Default setting for usb trasnfer
  55   1      	//------------------------------------------------
C51 COMPILER V6.20c  SL811                                                                 04/07/2005 10:50:50 PAGE 2   

  56   1      	dataX=timeout=bEnd=0;
  57   1      	offset=0;
  58   1      	//result 	  = SL811Read(EP0Status);	
  59   1      	data0 = EP0_Buf;					// DATA0 buffer address
  60   1      	//data1 = data0 + (unsigned char)usbstack.wPayload;	// DATA1 buffer address
  61   1      	data1=EP1_Buf;
  62   1      	bXXGFlags.DATA_STOP=FALSE;
  63   1      	bXXGFlags.TIMEOUT_ERR=FALSE;
  64   1      	//------------------------------------------------
  65   1      	// Define data transfer payload
  66   1      	//------------------------------------------------
  67   1      	if (usbstack.wLen >= usbstack.wPayload)  		// select proper data payload
  68   1      		xferLen = usbstack.wPayload;			// limit to wPayload size 
  69   1      	else							// else take < payload len
  70   1      		xferLen = usbstack.wLen;			//	
  71   1      	
  72   1      	// For IN token
  73   1      	if (usbstack.pid==PID_IN)				// for current IN tokens
  74   1      	{												//
  75   2      		cmd = sDATA0_RD;			// FS/FS on Hub, sync to sof
  76   2      	}
  77   1      	// For OUT token
  78   1      	else if(usbstack.pid==PID_OUT)				// for OUT tokens
  79   1      	{  	
  80   2      		SL811BufWrite(data0,usbstack.buffer,xferLen); 	// data to transfer on USB
  81   2      		cmd = sDATA0_WR;
  82   2      								// FS/FS on Hub, sync to sof
  83   2      		bXXGFlags.bData1 = uDev.bData1[usbstack.endpoint];
  84   2              	uDev.bData1[usbstack.endpoint] = (uDev.bData1[usbstack.endpoint] ? 0 : 1); // DataToggle
  85   2      		if(bXXGFlags.bData1==1)
  86   2                		cmd |= 0x40;                              // Set Data1 bit in command
  87   2                	//bXXGFlags.bData1=!bXXGFlags.bData1;
  88   2                	//dataX++;
  89   2                	
  90   2                	/*
  91   2                	usbstack.wLen  -= (WORD)xferLen;
  92   2      		usbstack.buffer += xferLen;
  93   2      		
  94   2                	if(usbstack.wLen)                               //write buffer for ping-pong
  95   2                      {
  96   2      			SL811BufWrite(data1,usbstack.buffer,64);
  97   2                              usbstack.wLen-= 64;
  98   2                              usbstack.buffer+=64;
  99   2                              dataX++;
 100   2                      }
 101   2                      else
 102   2                              bEnd = 1;
 103   2                      */       	            	
 104   2      	}
 105   1      	// For SETUP/OUT token
 106   1      	else											// for current SETUP/OUT tokens
 107   1      	{  	
 108   2      		if(xferLen)									// only when there are	
 109   2      			{
 110   3      			intr=usbstack.setup.wLength;
 111   3      			usbstack.setup.wValue=WordSwap(usbstack.setup.wValue);
 112   3      			usbstack.setup.wIndex=WordSwap(usbstack.setup.wIndex);
 113   3      			usbstack.setup.wLength=WordSwap(usbstack.setup.wLength);
 114   3      			SL811BufWrite(data0,(unsigned char *)&usbstack.setup,xferLen); 	// data to transfer on USB
 115   3      			usbstack.setup.wLength=intr;
 116   3      			}
 117   2      		cmd = sDATA0_WR;						// FS/FS on Hub, sync to sof
C51 COMPILER V6.20c  SL811                                                                 04/07/2005 10:50:50 PAGE 3   

 118   2      	}
 119   1      	//------------------------------------------------
 120   1      	// For EP0's IN/OUT token data, start with DATA1
 121   1      	// Control Endpoint0's status stage.
 122   1      	// For data endpoint, IN/OUT data, start ????
 123   1      	//------------------------------------------------
 124   1      	if (usbstack.endpoint == 0 && usbstack.pid != PID_SETUP) 	// for Ep0's IN/OUT token
 125   1      		cmd |= 0x40; 					// always set DATA1
 126   1      	//------------------------------------------------
 127   1      	// Arming of USB data transfer for the first pkt
 128   1      	//------------------------------------------------
 129   1      	SL811Write(EP0Status,((usbstack.endpoint&0x0F)|usbstack.pid));	// PID + EP address
 130   1      	SL811Write(EP0Counter,usbstack.usbaddr);			// USB address
 131   1      	SL811Write(EP0Address,data0);					// buffer address, start with "data0"
 132   1      	SL811Write(EP0XferLen,xferLen);					// data transfer length
 133   1      	SL811Write(IntStatus,INT_CLEAR); 				// clear interrupt status
 134   1      	SL811Write(EP0Control,cmd);					// Enable ARM and USB transfer start here
 135   1      	
 136   1      	SL811Write(EP1Status,((usbstack.endpoint&0x0F)|usbstack.pid));	// PID + EP address
 137   1      	SL811Write(EP1Counter,usbstack.usbaddr);			// USB address
 138   1      	SL811Write(EP1Address,data1);					// buffer address, start with "data0"
 139   1      	SL811Write(EP1XferLen,64);					// data transfer length
 140   1      	//SL811Write(IntStatus,INT_CLEAR); 				// clear interrupt status
 141   1      	//SL811Write(EP0Control,cmd);					// Enable ARM and USB transfer start here
 142   1      	
 143   1      	//------------------------------------------------
 144   1      	// Main loop for completing a wLen data trasnfer
 145   1      	//------------------------------------------------
 146   1      	while(TRUE)
 147   1      	{   
 148   2      		//---------------Wait for done interrupt------------------
 149   2      		while(TRUE)												// always ensure requested device is
 150   2      		{														// inserted at all time, then you will
 151   3      			intr = SL811Read(IntStatus);	
 152   3      								// wait for interrupt to be done, and 
 153   3      			if((intr & USB_RESET) || (intr & INSERT_REMOVE))	// proceed to parse result from slave 
 154   3      			{													// device.
 155   4      				bXXGFlags.DATA_STOP = TRUE;								// if device is removed, set DATA_STOP
 156   4      				return FALSE;									// flag true, so that main loop will 
 157   4      			}													// know this condition and exit gracefully
 158   3      			if((intr & USB_A_DONE)&&((offset==0)))								
 159   3      				break;		
 160   3      			if((intr & USB_B_DONE)&&((offset>0)))								
 161   3      				break;										// interrupt done !!!
 162   3      		}
 163   2      
 164   2      		SL811Write(IntStatus,INT_CLEAR); 						// clear interrupt status
 165   2      		result 	  = SL811Read(EP0Status);						// read EP0status register
 166   2      		remainder = SL811Read(EP0Counter);						// remainder value in last pkt xfer
 167   2      		//while
 168   2      		//-------------------------ACK----------------------------
 169   2      		if (result & EP0_ACK)									// Transmission ACK
 170   2      		{	
 171   3      
 172   3      			// SETUP TOKEN
 173   3      			if(usbstack.pid == PID_SETUP)								// do nothing for SETUP/OUT token 
 174   3      				break;											// exit while(1) immediately
 175   3      			// OUT TOKEN				
 176   3      			else if(usbstack.pid == PID_OUT)
 177   3      			{
 178   4      				usbstack.wLen  -= (WORD)xferLen;
 179   4      				usbstack.buffer += xferLen;
C51 COMPILER V6.20c  SL811                                                                 04/07/2005 10:50:50 PAGE 4   

 180   4      				
 181   4      				if(!usbstack.wLen)
 182   4      					{
 183   5      					//bXXGFlags.bits.bData1=!bXXGFlags.bits.bData1;
 184   5      					break;
 185   5      					}
 186   4      				////////////////////////////////////
 187   4      				if (usbstack.wLen >= usbstack.wPayload)  		// select proper data payload
 188   4      					xferLen = usbstack.wPayload;			// limit to wPayload size 
 189   4      				else							// else take < payload len
 190   4      					xferLen = usbstack.wLen;	
 191   4      				//addr=(dataX & 1) ? data1:data0;
 192   4      				addr=data0;	
 193   4      				SL811BufWrite(addr,usbstack.buffer,xferLen);
 194   4      				
 195   4      				cmd = sDATA0_WR;
 196   4      				bXXGFlags.bData1 = uDev.bData1[usbstack.endpoint];
 197   4              			uDev.bData1[usbstack.endpoint] = (uDev.bData1[usbstack.endpoint] ? 0 : 1); // DataToggle
 198   4      				//bXXGFlags.bits.bData1=!bXXGFlags.bits.bData1;
 199   4                			//cmd ^=0x40;
 200   4                			if(bXXGFlags.bData1==1)
 201   4                				cmd |= 0x40;    
 202   4      								// always sync SOF when FS, regardless 
 203   4      				SL811Write(EP0XferLen, xferLen); 		// select next xfer length
 204   4      				SL811Write(EP0Address, addr);           	// data buffer addr 
 205   4      				SL811Write(IntStatus,INT_CLEAR);		// is a LS is on Hub.
 206   4      				SL811Write(EP0Control,cmd);			// Enable USB transfer and re-arm
 207   4      			
 208   4      			/*	cmd ^=0x40;	
 209   4      									// always sync SOF when FS, regardless
 210   4      				//SL811Write(EP0XferLen, 64);
 211   4      				
 212   4      				offset=(dataX & 1) ? 0x8:0x0;
 213   4      				//SL811Write(EP0Address, (dataX & 1) ? EP1_Buf:EP0_Buf); // data buffer addr
 214   4                                      SL811Write(EP0Control+offset,cmd);
 215   4                                      bXXGFlags.bData1=!bXXGFlags.bData1;
 216   4                                      if(!usbstack.wLen)
 217   4      					bEnd =1;
 218   4      				else
 219   4      				{
 220   4                  			dataX++;
 221   4                                      SL811BufWrite((dataX & 1) ? EP1_Buf:EP0_Buf,usbstack.buffer,64);
 222   4                                      usbstack.wLen-= 64;
 223   4                              	usbstack.buffer+=64;
 224   4                              	//dataX++;
 225   4                                      }
 226   4      			*/	
 227   4      			} //PID OUT
 228   3      			// IN TOKEN
 229   3      			else if(usbstack.pid == PID_IN)
 230   3      			{													// for IN token only
 231   4      				usbstack.wLen  -= (WORD)xferLen;	// update remainding wLen value
 232   4      				cmd   ^= 0x40;    			// toggle DATA0/DATA1
 233   4      				dataX++;				// point to next dataX
 234   4      
 235   4      				//------------------------------------------------	
 236   4      				// If host requested for more data than the slave 
 237   4      				// have, and if the slave's data len is a multiple
 238   4      				// of its endpoint payload size/last xferLen. Do 
 239   4      				// not overwrite data in previous buffer.
 240   4      				//------------------------------------------------	
 241   4      				if(remainder==xferLen)			// empty data detected
C51 COMPILER V6.20c  SL811                                                                 04/07/2005 10:50:50 PAGE 5   

 242   4      					bufLen = 0;			// do not overwriten previous data
 243   4      				else					// reset bufLen to zero
 244   4      					bufLen = xferLen;		// update previous buffer length
 245   4      				
 246   4      				//------------------------------------------------	
 247   4      				// Arm for next data transfer when requested data 
 248   4      				// length have not reach zero, i.e. wLen!=0, and
 249   4      				// last xferlen of data was completed, i.e.
 250   4      				// remainder is equal to zero, not a short pkt
 251   4      				//------------------------------------------------	
 252   4      				if(!remainder && usbstack.wLen)							// remainder==0 when last xferLen
 253   4      				{												// was all completed or wLen!=0
 254   5      					addr    = (dataX & 1) ? data1:data0; 		// select next address for data
 255   5      					xferLen = (BYTE)(usbstack.wLen>=usbstack.wPayload) ? usbstack.wPayload:usbstack.wLen;	// get data len
             -gth required
 256   5      					//if (FULL_SPEED)								// sync with SOF transfer
 257   5      					cmd |= 0x20;					// always sync SOF when FS, regardless 
 258   5      					SL811Write(EP0XferLen, xferLen); 		// select next xfer length
 259   5      					SL811Write(EP0Address, addr);           	// data buffer addr 
 260   5      					SL811Write(IntStatus,INT_CLEAR);		// is a LS is on Hub.

⌨️ 快捷键说明

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