www.pudn.com > USBdiskRW.rar > D12Int.c


#include "def.h" 
#include "D12Def.h"  
#include "UsbDesc.h" 
#include "utils.h" 
 
#define	STATUS_ERR	1 
#define	STATUS_OK	0 
 
static U8 usb_remote_wake; 
static U8 usb_config; 
static U8 UsbSendDescF; 
 
static int send_remain; 
static U32 send_ptr; 
 
void Delay(U32 Time); 
 
U8 UsbInit() 
{ 
	UsbSendDescF = 0; 
 
	if(D12RdChipId()!=0x1210 ) 
		return STATUS_ERR; 
 
	D12SetDma(MyD12DmaCfg); 
	if(D12GetDma()!=MyD12DmaCfg) 
		return STATUS_ERR; 
 
	D12SetMode(MyD12EpCfgOff, D12Pll24M); 
	Delay(100); 
	D12SetMode(MyD12EpCfgOn, D12Pll24M); 
 
	return STATUS_OK; 
} 
 
/////////////////////////////// 
 
#define	UsbDevDescType	1 
#define	UsbCfgDescType	2 
#define	UsbStrDescType	3 
#define	UsbItfDescType	4 
#define	UsbEndpDescType	5 
#define	UsbPwrDescType	6 
 
#define	UsbDevDescSize	18 
#define	UsbCfgDescSize	9 
#define	UsbItfDescSize	9 
#define	UsbEndpDescSize	7 
 
#define	UsbEndpControl		0 
#define	UsbEndpIsochronous	1 
#define	UsbEndpBulk			2 
#define	UsbEndpInterrupt	3	 
 
//////////////////////////////////////// 
 
#define	UsbClassMassStorage	8 
 
#define	UsbSubClassRbc		1 
#define	UsbSubClassSff8020i	2 
#define	UsbSubClassQic157	3 
#define	UsbSubClassUfi		4 
#define	UsbSubClassSff8070i	5 
#define	UsbSubClassScsi		6 
 
#define	UsbProtocolCbi0	0 
#define	UsbProtocolCbi1	1 
#define	UsbProtocolBulk	0x50 
//////////////////////////////////////// 
 
#define	Ep0PacketSize	16 
#define	Ep2PacketSize	64 
#define	EndpCnt	2 
#define	UsbTotalCfgDescSize	UsbCfgDescSize+UsbItfDescSize+EndpCnt*UsbEndpDescSize 
static __packed struct{ 
	UsbDevDesc DevDesc; 
	U8 CfgDesc[9]; 
	U8 ItfDesc[9]; 
	U8 Endp4Desc[7]; 
	U8 Endp5Desc[7]; 
 
}ThisDevDesc = 
				{ 
					{ 
						UsbDevDescSize, 
						UsbDevDescType, 
						0x110, 
						0, 0, 0, 
						Ep0PacketSize, 
						0x471, 
						0x222, 
						0x113, 
						0, 0, 0, 
						1 
					}, 
					{ 
						UsbCfgDescSize, 
						UsbCfgDescType, 
						UsbTotalCfgDescSize, 0, 
						1, 
						1, 
						0, 
						0x80, 
						0x32 
					}, 
					{ 
						UsbItfDescSize, 
						UsbItfDescType, 
						0, 
						0, 
						EndpCnt, 
						UsbClassMassStorage, 
						UsbSubClassUfi, 
						UsbProtocolBulk, 
						0 
					}, 
					{ 
						UsbEndpDescSize, 
						UsbEndpDescType, 
						0x82, 
						UsbEndpBulk, 
						Ep2PacketSize, 
						0, 
						0 
					}, 
					{ 
						UsbEndpDescSize, 
						UsbEndpDescType, 
						0x2, 
						UsbEndpBulk, 
						Ep2PacketSize, 
						0, 
						0 
					}					 
				}; 
 
/****************** standard device request ****************/ 
U8 UsbGetStatus(U8 *SetupPkt) 
{ 
	if(SetupPkt[2]|SetupPkt[3]|SetupPkt[5]|SetupPkt[7]) 
		return 1; 
	if(SetupPkt[6]!=2) 
		return 1; 
	if(SetupPkt[0]==0x80) 
	{ 
		if(SetupPkt[4]) 
			return 1; 
		SetupPkt[0] = usb_remote_wake?1:0; 
		SetupPkt[1] = 0; 
	} 
	else 
	if(SetupPkt[0]==0x81) 
	{ 
		if(SetupPkt[4]) 
			return 1; 
		SetupPkt[0] = 0; 
		SetupPkt[1] = 0;		 
	} 
	else 
	if(SetupPkt[0]==0x82) 
	{ 
		D12SelEp((SetupPkt[4]*2)|((SetupPkt[4]&0x80)?1:0)); 
		SetupPkt[1] = (D12Dat&2)?1:0; 
		SetupPkt[0] = 0; 
	} 
	else 
		return 1; 
 
	D12WrEp(1, SetupPkt, 2); 
	return 0;		 
} 
 
U8 UsbClrFeature(U8 *SetupPkt) 
{ 
 
	if(SetupPkt[0]&0x80) 
		return STATUS_ERR; 
	if(SetupPkt[3]|SetupPkt[5]|SetupPkt[6]|SetupPkt[7])	 
		return STATUS_ERR; 
		 
	if(SetupPkt[0]&0x1f) 
	{ 
		if((SetupPkt[0]&0x1f)!=2) 
			return STATUS_ERR; 
		D12SetEpStat((SetupPkt[4]*2)|((SetupPkt[4]&0x80)?1:0),0); 
	} 
	else 
	{ 
		if(SetupPkt[4]) 
			return STATUS_ERR; 
		usb_remote_wake = 0; 
	} 
	 
	D12WrEp(1, SetupPkt, 0); 
	return STATUS_OK; 
} 
 
U8 UsbSetFeature(U8 *SetupPkt) 
{ 
	if(!(SetupPkt[0]&0x80)) 
		return STATUS_ERR; 
	if(SetupPkt[3]|SetupPkt[5]|SetupPkt[6]|SetupPkt[7]) 
		return STATUS_ERR; 
		 
	if(SetupPkt[0]&0x1f) 
	{ 
		if((SetupPkt[0]&0x1f)!=2) 
			return STATUS_ERR; 
		D12SetEpStat((SetupPkt[4]*2)|((SetupPkt[4]&0x80)?1:0),1); 
	} 
	else 
	{ 
		if(SetupPkt[4]) 
			return STATUS_ERR; 
		usb_remote_wake = 1; 
	} 
	 
	D12WrEp(1, SetupPkt, 0); 
	return STATUS_OK; 
} 
 
U8 UsbSetAddress(U8 *SetupPkt) 
{ 
 
	if(SetupPkt[0]|SetupPkt[3]|SetupPkt[4]|SetupPkt[5]|SetupPkt[6]|SetupPkt[7]) 
		return STATUS_ERR; 
		 
	D12SetAddr(SetupPkt[2]|0x80); 
	D12WrEp(1, SetupPkt, 0); 
	return STATUS_OK;	 
} 
 
void UsbSendDesc() 
{ 
//	U8 i; 
 
	UsbSendDescF = send_remain>=Ep0PacketSize;	 
	D12WrEp(1, (U8 *)send_ptr, (send_remain>Ep0PacketSize)?Ep0PacketSize:send_remain); 
	 
//	putch('@'); 
//	for(i=0; i<((send_remain>Ep0PacketSize)?Ep0PacketSize:send_remain); i++) 
//		printf("%x,", *(U8 *)(send_ptr+i));	 
		 
	send_remain -= Ep0PacketSize; 
	send_ptr    += Ep0PacketSize; 
	 
} 
 
U8 UsbGetDescriptor(U8 *SetupPkt) 
{ 
	 
	if(SetupPkt[0]!=0x80) 
		return STATUS_ERR; 
		 
	switch	(SetupPkt[3]) 
	{ 
	case UsbDevDescType: 
		send_ptr = (U32)&ThisDevDesc; 
		send_remain = UsbDevDescSize; 
		break; 
	case UsbCfgDescType: 
		send_ptr = (U32)&ThisDevDesc.CfgDesc; 
		send_remain = UsbTotalCfgDescSize; 
		break; 
	case UsbStrDescType:		 
		return STATUS_ERR;	 
	default: 
		return STATUS_ERR;	 
	} 
 
	if(!SetupPkt[7]&&(SetupPkt[6]