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

📄 usb_core.c

📁 arm(str710)usb功能的实现
💻 C
📖 第 1 页 / 共 4 页
字号:
	USB_StatusOut();	/* Expect the host to abort the data IN stage */
	pInformation->ControlState = ControlState;
}/* DataStageIn */

/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
	NAME:	NoData_Setup0
	INPUT:
	OUTPUT:	none
	DESCRIPTION:
		Proceed the processing of setup request without data stage
 *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
void NoData_Setup0()
{
	DEVICE_INFO	*pInfo = pInformation;
	RESULT	Result;
	BYTE	RequestNo = pInfo->USBbRequest;
	BYTE	ControlState;

	if (RequestNo == CLEAR_FEATURE)
		Result = Standard_ClearFeature();
	else if (RequestNo == SET_FEATURE)
		Result = Standard_SetFeature();
	else if (RequestNo == SET_ADDRESS && Type_Recipient == (STANDARD_REQUEST | DEVICE_RECIPIENT) )
			Result = SUCCESS;
	else
		{
			Result = UNSUPPORT;
			uart_printf("NoData_Setup0 UNSUPPORT %d  call",RequestNo);
		}

	if (Result != SUCCESS) {
		Result = (*pProperty->Class_NoData_Setup)(RequestNo);
		if (Result == NOT_READY) {
			ControlState = PAUSE;
			goto exit_NoData_Setup0;
		}
	}

	if (Result != SUCCESS) {
		ControlState = STALLED;
		goto exit_NoData_Setup0;
	}

	ControlState = WAIT_STATUS_IN;	/* After no data stage SETUP */
	USB_StatusIn();

exit_NoData_Setup0:
	pInformation->ControlState = ControlState;
	return;
} /* NoData_Setup0 */


/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
	NAME:	Data_Setup0
	INPUT:
	OUTPUT:	none
	DESCRIPTION:
		Proceed the processing of setup request with data stage
 *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
void Data_Setup0()
{
	DEVICE_INFO		*pInfo = pInformation;
	DEVICE_PROP		*pProp = pProperty;
	BYTE	*(*CopyRoutine)(WORD);
	WORD	wOffset;
	RESULT	Result;
	BYTE Request_No = pInfo->USBbRequest;
BYTE *pbLen;
WORD wLen;

	CopyRoutine = NULL;
	wOffset = 0;

	if (Request_No == GET_DESCRIPTOR) {
		if (Type_Recipient == (STANDARD_REQUEST | DEVICE_RECIPIENT)) {
			BYTE wValue1 = pInfo->USBwValue1;
			if (wValue1 == DEVICE_DESCRIPTOR)
				CopyRoutine = pProp->GetDeviceDescriptor;
			else if (wValue1 == CONFIG_DESCRIPTOR)
				CopyRoutine = pProp->GetConfigDescriptor;
			else if (wValue1 == STRING_DESCRIPTOR) {
				wOffset = pInfo->USBwValue0;
				CopyRoutine = pProp->GetStringDescriptor;
			}		/* End of GET_DESCRIPTOR */
		}
	}
	else if (Request_No == GET_STATUS) {
		if (Type_Recipient == (STANDARD_REQUEST | DEVICE_RECIPIENT)
				|| Type_Recipient == (STANDARD_REQUEST | ENDPOINT_RECIPIENT)) {
			CopyRoutine = Standard_GetStatus;
		}
	}
	else if(pInfo->USBbmRequestType ==0xfe)//0xA1 )
		{
			CopyRoutine = Standard_GetMaxLun;
		}
/***************************************************************************
	else if (Request_No == GET_CONFIGURATION) {
		if ( Type_Recipient == (STANDARD_REQUEST | DEVICE_RECIPIENT) )
			CopyRoutine = Standard_GetConfiguration;
	}
	else if (Request_No == GET_INTERFACE) {
		if (Type_Recipient == (STANDARD_REQUEST | INTERFACE_RECIPIENT))
			CopyRoutine = Standard_GetInterface;
	}
	else if (Request_No == SET_DESCRIPTOR:) {
		if (Type_Recipient == (STANDARD_REQUEST | DEVICE_RECIPIENT)) {
			BYTE *SetDeviceDescriptor(WORD Length);
			BYTE wValue1 = pInfo->USBwValue1;
			if ( wValue1 == DEVICE_DESCRIPTOR)
				CopyRoutine = SetDeviceDescriptor;
			else if (wValue1 == CONFIG_DESCRIPTOR)
				CopyRoutine = SetConfigDescriptor;
			else if (wValue1 == STRING_DESCRIPTOR) {
				CopyRoutine = SetStringDescriptor;
				wOffset = pInfo->USBwValue0;
			}
		}
	}
***************************************************************************/

	if (CopyRoutine) {
		pInfo->Ctrl_Info.Usb_wOffset = wOffset;
		pInfo->Ctrl_Info.CopyData = CopyRoutine;
		/* sb in the original the cast to word was directly */
		/* now the cast is made step by step */
		pbLen = (*CopyRoutine)(0);
		wLen = (WORD)((DWORD)pbLen);
		pInfo->Ctrl_Info.Usb_wLength = wLen;
		Result = SUCCESS;
	}
	else {
		uart_printf("InData_Setup0 UNSUPPORT %d call",Request_No);
		Result = (*pProp->Class_Data_Setup)(pInfo->USBbRequest);
		if (Result == NOT_READY) {
			pInfo->ControlState = PAUSE;
			return;
		}
	}

	if (pInfo->Ctrl_Info.Usb_wLength == 0xffff) {	/* Data is not ready, wait it */
		pInfo->ControlState = PAUSE;
		return;
	}
	if (Result == UNSUPPORT || pInfo->Ctrl_Info.Usb_wLength == 0) {
		/* Unsupported request */
		pInfo->ControlState = STALLED;
		return;
	}

	if (ValBit(pInfo->USBbmRequestType, 7)) {
		/* Device ==> Host */
		WORD	wLength = pInfo->USBwLength;

		/* Restrict the data length to be the one host asks */
		if (pInfo->Ctrl_Info.Usb_wLength > wLength)
			pInfo->Ctrl_Info.Usb_wLength = wLength;

		pInfo->Ctrl_Info.PacketSize = pProp->MaxPacketSize;
		DataStageIn();
	}
	else {
		pInfo->ControlState = OUT_DATA;
/*		SetEPRxCount(EPindex, STD_MAXPACKETSIZE);	*/
		vSetEPRxStatus(EP_RX_VALID);
								/* reenable for next data reception */
	}

	return;
} /* Data_Setup0 */

/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
	NAME:	Setup0_Process
	INPUT:
	OUTPUT:	none
	DESCRIPTION:
		Get the device request data and dispatch to individual process
 *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
BYTE Setup0_Process()
{
	DEVICE_INFO	*pInfo = pInformation;
	union {
		BYTE*	b;
		WORD*	w;
	} pBuf;
/* sb	pBuf.b = pProperty->RxEP_buffer; */
		pBuf.b = PMAAddr + (BYTE *)(_GetEPRxAddr(ENDP0)*2); /* *2 for 32 bits addr */

	if (pInfo->ControlState != PAUSE) {
		pInfo->USBbmRequestType = *pBuf.b++;	/* bmRequestType */
		pInfo->USBbRequest		= *pBuf.b++;	/* bRequest */
		pBuf.w++;  /* sb word not accessed because of 32 bits addressing */
		pInfo->USBwValue		= ByteSwap(*pBuf.w++);	/* wValue */
		pBuf.w++;  /* word not accessed because of 32 bits addressing */
		pInfo->USBwIndex		= ByteSwap(*pBuf.w++);	/* wIndex */
		pBuf.w++;  /* word not accessed because of 32 bits addressing */
/* sb		pInfo->USBwLength		= ByteSwap(*pBuf.w);*/	/* wLength */
		pInfo->USBwLength		= *pBuf.w;	/* wLength */
	}

	pInfo->ControlState	= SETTING_UP;

	/*	uart_printf("pInfo->USBbRequest= %d l",pInfo->USBbRequest);
		uart_printf("pInfo->USBwValue= %d l",pInfo->USBwValue);
		uart_printf("pInfo->USBwIndex= %d l",pInfo->USBwIndex);
		uart_printf("pInfo->USBwLength= %d l",pInfo->USBwLength);
*/

	if (pInfo->USBwLength == 0)
	{	/* No data statge processing */
		NoData_Setup0();
	}
	else {			/* Setup with data stage */
		Data_Setup0();
	}
	return Post0_Process();
} /* Setup0_Process */


BYTE Setup1_Process()
{
	int i;
	ENDPOINT_INFO	*pEPinfo ;

	//BYTE*	pBuf;
union {
		BYTE*	b;
		WORD*	w;
	} pBuf;
	DEVICE_INFO	*pInfo = pInformation;
	i=0;
	pEPinfo = &pInformation->Ctrl_Info;
	// uart_printf("Setup1_Process",0);
/* sb	pBuf.b = pProperty->RxEP_buffer; */
		pBuf.b = PMAAddr + (BYTE *)(_GetEPRxAddr(ENDP2)*2); /* *2 for 32 bits addr */
	uart_printf("Setup1_Process setup size cal=%d l", _GetEPRxCount(ENDP2));

	if (pInfo->ControlState != PAUSE)
	{
		
			pInfo->cbw.dCBWSignature_0 = *pBuf.b++;
			pInfo->cbw.dCBWSignature_1 = *pBuf.b++;
			pBuf.w++;
			
			pInfo->cbw.dCBWSignature_2 = *pBuf.b++;
			pInfo->cbw.dCBWSignature_3 = *pBuf.b++;
			pBuf.w++;
			
			pInfo->cbw.dCBWTag_0 = *pBuf.b++;
			pInfo->cbw.dCBWTag_1 = *pBuf.b++;
			pBuf.w++;

			pInfo->cbw.dCBWTag_2 = *pBuf.b++;
			pInfo->cbw.dCBWTag_3 = *pBuf.b++;
			pBuf.w++;

			pInfo->cbw.dCBWDataTransferLength_0 = *pBuf.b++;
			pInfo->cbw.dCBWDataTransferLength_1 = *pBuf.b++;
			pBuf.w++;

			pInfo->cbw.dCBWDataTransferLength_2 = *pBuf.b++;
			pInfo->cbw.dCBWDataTransferLength_3 = *pBuf.b++;
			pBuf.w++;

			pInfo->cbw.bmCBWFlags = *pBuf.b++;
			pInfo->cbw.bCBWLUN = *pBuf.b++;
			pBuf.w++;

			pInfo->cbw.bCBWCBLength = *pBuf.b++;
			for(i=0;i<16;i+=2)
			{
				pInfo->cbw.CBWCB[i] = *pBuf.b++;
				pBuf.w++;
				pInfo->cbw.CBWCB[i+1] = *pBuf.b++;
			}
		}
		pInfo->pbot_cdb = (T_USBMS_BOT_CDB*)pInfo->cbw.CBWCB;
	pInfo->ControlState	= OUT_DATA;
	
		uart_printf("pInfo->cbw.dCBWSignature_0= %d l",pInfo->cbw.dCBWSignature_0);

/*		uart_printf("pInfo->cbw.dCBWSignature_1= %d l",pInfo->cbw.dCBWSignature_1);
		uart_printf("pInfo->cbw.dCBWSignature_2= %d l",pInfo->cbw.dCBWSignature_2);
		uart_printf("pInfo->cbw.dCBWSignature_3= %d l",pInfo->cbw.dCBWSignature_3);
		uart_printf("pInfo->cbw.dCBWTag_0= %d l",pInfo->cbw.dCBWTag_0);
		uart_printf("pInfo->cbw.dCBWTag_1= %d l",pInfo->cbw.dCBWTag_1);
		uart_printf("pInfo->cbw.dCBWTag_2= %d l",pInfo->cbw.dCBWTag_2);
		uart_printf("pInfo->cbw.dCBWTag_3= %d l",pInfo->cbw.dCBWTag_3);

		uart_printf("pInfo->cbw.dCBWDataTransferLength_0=%d",pInfo->cbw.dCBWDataTransferLength_0);
		uart_printf("pInfo->cbw.dCBWDataTransferLength_1=%d",pInfo->cbw.dCBWDataTransferLength_1);
		uart_printf("pInfo->cbw.dCBWDataTransferLength_2=%d",pInfo->cbw.dCBWDataTransferLength_2);
		uart_printf("pInfo->cbw.dCBWDataTransferLength_3=%d",pInfo->cbw.dCBWDataTransferLength_3);
		uart_printf("pInfo->cbw.bCBWCBLength %d l",pInfo->cbw.bCBWCBLength);
		uart_printf("pInfo->cbw.bCBWLUN= %d l",pInfo->cbw.bCBWLUN);
		uart_printf("pInfo->cbw.bmCBWFlags= %d l",pInfo->cbw.bmCBWFlags);
*/
	switch (pInfo->pbot_cdb->generic_rbc.operation_code)
		{
			case INQUIRY://1
				uart_printf("INQUIRY call", 0);
				uart_printf("inquiry->enable_vpd= %d", pInfo->pbot_cdb->inquiry.enable_vpd);
				uart_printf("inquiry->page_code= %d", pInfo->pbot_cdb->inquiry.page_code);
				pInfo->senddata[0] = pInfo->inquiry_data.device					= 0x00;
				pInfo->senddata[1] = pInfo->inquiry_data.removable					= 0x80;
				pInfo->senddata[2] = pInfo->inquiry_data.version					= 0x00;//0x02
				pInfo->senddata[3] = pInfo->inquiry_data.rdf_hisup_naca			= 0x01;
				pInfo->senddata[4] = pInfo->inquiry_data.additionnal_length		= 0x1f/*sizeof(T_USBMS_INQUIRY_DATA)-5*/;
				pInfo->senddata[5] = pInfo->inquiry_data.protect_tpc_alua_acc_sccs	= 0x00;
				pInfo->senddata[6] = pInfo->inquiry_data.mchngr_multip_vs_es_bq	= 0x00;//0x02
				pInfo->senddata[7] = pInfo->inquiry_data.vs_cmdque_linked			= 0x00;
				pInfo->senddata[8] = pInfo->inquiry_data.vendor_id[0]='h';
				pInfo->senddata[9] = pInfo->inquiry_data.vendor_id[1]='h';
				pInfo->senddata[10] = pInfo->inquiry_data.vendor_id[2]='h';
				pInfo->senddata[11] = pInfo->inquiry_data.vendor_id[3]='h';
				pInfo->senddata[12] = pInfo->inquiry_data.vendor_id[4]='h';
				pInfo->senddata[13] = pInfo->inquiry_data.vendor_id[5]='h';
				pInfo->senddata[14] = pInfo->inquiry_data.vendor_id[6]='\0';
				pInfo->senddata[15] = pInfo->inquiry_data.vendor_id[7]='\0';

				pInfo->senddata[16] = pInfo->inquiry_data.product_id[0]='U';
				pInfo->senddata[17] = pInfo->inquiry_data.product_id[1]='u';
				pInfo->senddata[18] = pInfo->inquiry_data.product_id[2]='U';
				pInfo->senddata[19] = pInfo->inquiry_data.product_id[3]='u';
				pInfo->senddata[20] = pInfo->inquiry_data.product_id[4]='U';
				pInfo->senddata[21] = pInfo->inquiry_data.product_id[5]='u';
				pInfo->senddata[22] = pInfo->inquiry_data.product_id[6]='U';
				pInfo->senddata[23] = pInfo->inquiry_data.product_id[7]='u';
				pInfo->senddata[24] = pInfo->inquiry_data.product_id[8]='U';
				pInfo->senddata[25] = pInfo->inquiry_data.product_id[9]='u';
				pInfo->senddata[26] = pInfo->inquiry_data.product_id[10]='U';
				pInfo->senddata[27] = pInfo->inquiry_data.product_id[11]='u';
				pInfo->senddata[28] = pInfo->inquiry_data.product_id[12]='U';
				pInfo->senddata[29] = pInfo->inquiry_data.product_id[13]='u';
				pInfo->senddata[30] = pInfo->inquiry_data.product_id[14]='\0';
				pInfo->senddata[31] = pInfo->inquiry_data.product_id[15]='\0';

				pInfo->senddata[32] = pInfo->inquiry_data.product_revision_level[0]='1';
				pInfo->senddata[33] = pInfo->inquiry_data.product_revision_level[1]='0';
				pInfo->senddata[34] = pInfo->inquiry_data.product_revision_level[2]='\0';
				pInfo->senddata[35] = pInfo->inquiry_data.product_revision_level[3]='\0';

				
				pInfo->Ctrl_Info.Usb_wLength=24;//pInfo->cbw.dCBWDataTransferLength_0+pInfo->cbw.dCBWDataTransferLength_1<<8+pInfo->cbw.dCBWDataTransferLength_2<<16+pInfo->cbw.dCBWDataTransferLength_3<<24;//sizeof(T_USBMS_INQUIRY_DATA);
				pInfo->Ctrl_Info.pData = pInfo->senddata;
				pInfo->Ctrl_Info.Usb_wOffset =0;
				//pInformation->Ctrl_Info.Endpn = ENDP1;
				DataStageIn1();
				break;
			case MODE_SELECT:
				uart_printf("MODE_SELECT call", 0);
				
				break;
			case PREVENT_ALLOW_REMOVAL:  //just return csw,
				uart_printf("PREVENT_ALLOW_REMOVAL call", 0);
				
				break;
			case START_STOP_UNIT:
				uart_printf("START_STOP_UNIT call", 0);
				
				break;
			case READ_CAPACITY:
				//-3 T_USBMS_READ_CAPACITY_DATA
				uart_printf("READ_CAPACITY call", 0);
				pInfo->Ctrl_Info.Usb_wLength=8;//pInfo->cbw.dCBWDataTransferLength_0+pInfo->cbw.dCBWDataTransferLength_1<<8+pInfo->cbw.dCBWDataTransferLength_2<<16+pInfo->cbw.dCBWDataTransferLength_3<<24;//sizeof(T_USBMS_INQUIRY_DATA);
				pInfo->Ctrl_Info.pData = B_Read_Capacity;

⌨️ 快捷键说明

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