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

📄 sl811.c

📁 ls811的USB FAT文件系统
💻 C
📖 第 1 页 / 共 2 页
字号:
			
			if(!usbXfer())
				return FALSE;
				
			usbstack.pid  = PID_OUT;
		}
		else											// device-to-host : OUT token
   		{							
			usbstack.pid  = PID_OUT;
				
			if(!usbXfer())
				return FALSE;
			usbstack.pid  = PID_IN;
		}
	}
	usbstack.wLen=0;
	
	if(!usbXfer())
		return FALSE;

	return TRUE;											
}


unsigned char epBulkSend(unsigned char *pBuffer,unsigned int len)
{
	usbstack.usbaddr=0x1;
	usbstack.endpoint=usbstack.epbulkout;
	usbstack.pid=PID_OUT;
	usbstack.wPayload=64;
	usbstack.wLen=len;
	usbstack.buffer=pBuffer;
	
	if(usbstack.wLen)
	{
	      while(!usbXfer());
	}
	return TRUE;	
}

unsigned char epBulkRcv(unsigned char *pBuffer,unsigned int len)
{
	usbstack.usbaddr=0x1;
	usbstack.endpoint=usbstack.epbulkin;
	usbstack.pid=PID_IN;
	usbstack.wPayload=64;
	usbstack.wLen=len;
	usbstack.buffer=pBuffer;
	if(usbstack.wLen)
	{
		while(!usbXfer());
	}
	return TRUE;
}

unsigned char SetAddress(unsigned char addr)
{
	usbstack.usbaddr=0;
	usbstack.setup.bmRequest=0;
	usbstack.setup.bRequest=SET_ADDRESS;
	usbstack.setup.wValue=addr;
	usbstack.setup.wIndex=0;
	usbstack.setup.wLength=0;
	
	return ep0Xfer();
}

unsigned char Set_Configuration(void)
{
	usbstack.setup.bmRequest=0;
	usbstack.setup.bRequest=SET_CONFIG;
	usbstack.setup.wIndex=0;
	usbstack.setup.wLength=0;
	usbstack.buffer=NULL;
	
	return ep0Xfer();
}

unsigned char GetDesc(void)
{ 
	usbstack.setup.bmRequest=0x80;
	usbstack.setup.bRequest=GET_DESCRIPTOR;
	usbstack.setup.wValue=WordSwap(usbstack.setup.wValue);
	usbstack.wPayload=uDev.wPayLoad[0];
	
	return ep0Xfer();
}

unsigned char EnumUsbDev(BYTE usbaddr)
{  
	unsigned char i;											// always reset USB transfer address 
	unsigned char uAddr = 0;							// for enumeration to Address #0
	unsigned char epLen;
	
	pDevDesc  pDev;	
	pCfgDesc pCfg;
	pIntfDesc pIfc;
	pEPDesc pEnp;
	uDev.wPayLoad[0] = 64;	// default 64-byte payload of Endpoint 0, address #0
	
	if(usbaddr == 1)		// bus reset for the device attached to SL811HS only
		USBReset();		// that will always have the USB address = 0x01 (for a hub)
    	
    DelayMs(25);
	pDev =(pDevDesc)DBUF;					// ask for 64 bytes on Addr #0
	
	usbstack.usbaddr=uAddr;
	usbstack.setup.wValue=DEVICE;
	usbstack.setup.wIndex=0;
	usbstack.setup.wLength=18;
	usbstack.buffer=DBUF;
	
	if (!GetDesc())			// and determine the wPayload size
		return FALSE;								// get correct wPayload of Endpoint 0
	
	uDev.wPayLoad[0]=pDev->bMaxPacketSize0;// on current non-zero USB address

	if (!SetAddress(usbaddr)) 						// set to specific USB address
		return FALSE;								//
	
	uAddr = usbaddr;								// transfer using this new address

	pDev =(pDevDesc)DBUF;
	usbstack.usbaddr=uAddr;
	
	usbstack.setup.wLength=pDev->bLength;
	usbstack.setup.wValue=DEVICE;
	usbstack.setup.wIndex=0;
	
	usbstack.buffer=DBUF;
	
	if (!GetDesc()) 	
		return FALSE;								// For this current device:
	uDev.wVID  = pDev->idVendor;			// save VID
	uDev.wPID  = pDev->idProduct;			// save PID
	uDev.iMfg  = pDev->iManufacturer;		// save Mfg Index
	uDev.iPdt  = pDev->iProduct;			// save Product Index

	pCfg = (pCfgDesc)DBUF;	
	
	usbstack.usbaddr=uAddr;
	usbstack.setup.wValue=CONFIGURATION;
	usbstack.setup.wIndex=0;
	usbstack.setup.wLength=64;
	usbstack.buffer=DBUF;
		
	if (!GetDesc()) 		
		return FALSE;	
	
	pIfc = (pIntfDesc)(DBUF + 9);					// point to Interface Descp
	uDev.bClass 	= pIfc->iClass;			// update to class type
	uDev.bNumOfEPs = (pIfc->bEndPoints <= MAX_EP) ? pIfc->bEndPoints : MAX_EP;
	
	if(uDev.bClass==8) //mass storage device
		bXXGFlags.bits.bMassDevice=TRUE;

	usbstack.usbaddr=uAddr;
	usbstack.setup.wValue=DEVICE;
	
	if(!Set_Configuration())		// connected directly to SL811HS
		return FALSE;

	epLen = 0;
	
	for (i=1; i<=uDev.bNumOfEPs; i++)				// For each data endpoint
	{
		pEnp = (pEPDesc)(DBUF + 9 + 9 + epLen);	   			// point to Endpoint Descp(non-HID)
		uDev.bEPAddr[i]  	= pEnp->bEPAdd;			// Ep address and direction
		uDev.bAttr[i]		= pEnp->bAttr;			// Attribute of Endpoint
		uDev.wPayLoad[i] 	= WordSwap(pEnp->wPayLoad);		// Payload of Endpoint
		uDev.bInterval[i] 	= pEnp->bInterval;		// Polling interval
	    uDev.bData1[i] = 0;			            // init data toggle
		epLen += 7;

		if(uDev.bAttr[i]==0x2)
		{
		    if(uDev.bEPAddr[i]&0x80)
		    	usbstack.epbulkin=uDev.bEPAddr[i];
		    else
		    	usbstack.epbulkout=uDev.bEPAddr[i];
		}
	}
	return TRUE;
}

void SL811_Init(void)
{	
	bXXGFlags.bits.SLAVE_ONLINE = FALSE;
	bXXGFlags.bits.SLAVE_FOUND = FALSE;
	bXXGFlags.bits.SLAVE_REMOVED=FALSE;
	
	bXXGFlags.bits.SLAVE_ENUMERATED = FALSE;
	bXXGFlags.bits.SLAVE_IS_ATTACHED = FALSE;
	
	SL811_CS=0;
	
	SL811Write(cDATASet,0xe0);
	SL811Write(cSOFcnt,0xae);
	SL811Write(CtrlReg,0x5);
			
	SL811Write(EP0Status,0x50);
	SL811Write(EP0Counter,0);
	SL811Write(EP0Control,0x01);
			
	
	SL811Write(IntEna,0x20);      		// USB-A, Insert/Remove, USB_Resume.
	SL811Write(IntStatus,INT_CLEAR);	// Clear Interrupt enable status
}

/*-----------------------------------------------------------------------------------
名称: void check_key_LED(void)
功能: 检测磁盘状态.
-----------------------------------------------------------------------------------*/
void check_key_LED(void)
{
	static unsigned char last_key=0x7;
	unsigned char *pBuf;						//=(unsigned char *)&UartCmdBlock;
	unsigned int *wpBuf;
	unsigned char intr;
	unsigned int i,len;
	
	intr=SL811Read(IntStatus);					//读取SL811状态
	
	if(intr & USB_RESET)
	{
		if(bXXGFlags.bits.SLAVE_ONLINE ==TRUE)	//磁盘连接状态
		{
			bXXGFlags.bits.SLAVE_REMOVED=TRUE;	//磁盘移除
		   	bXXGFlags.bits.SLAVE_ONLINE =FALSE;
		}
	}
	else
	{
		if(bXXGFlags.bits.SLAVE_ONLINE == FALSE)
		{
			bXXGFlags.bits.SLAVE_FOUND=TRUE;	//创建磁盘
			bXXGFlags.bits.SLAVE_ONLINE =TRUE;	//创建连接
		}
	}
	SL811Write(IntStatus,INT_CLEAR);
	SL811Write(IntStatus,INSERT_REMOVE);
	
	intr=SWM0;
	intr&=0x1;
			
	if(intr!=last_key)		//假如SWM0被按下,则产生创建文件命令,模拟串口进行测试
	{
		if(intr==0)
		{
			pBuf=(unsigned char *)&UartCmdBlock;
					
			for(i=0;i<64;i++)
				*(pBuf+i)=*(cmd_test_createfile+i);
						
			bXXGFlags.bits.bUartInDone=1;
			last_key=0;
		}
		else
			last_key=1;
	}
			
	intr=SWM1;
	intr&=0x1;
			
	if(intr!=last_key)		//假如SWM1被按下,则产生写入数据到磁盘命令,模拟串口进行测试
	{
		if(intr==0)
		{
			pBuf=(unsigned char *)&UartCmdBlock;
					
			for(i=0;i<64;i++)
				*(pBuf+i)=*(cmd_test_writefile+i);
						
			wpBuf=(unsigned int *)UARTBUF;
			len=SwapINT16(UartCmdBlock.CmdBlock.Cmd_WriteFile.writeLength)/2;
					
			for(i=0;i<len;i++)
				*(wpBuf+i)=i;
						
			bXXGFlags.bits.bUartInDone=1;
			last_key=0;
		}
		else
			last_key=1;
	}
}

⌨️ 快捷键说明

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