亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? usb_core.c

?? STR71X源代碼包括例程與各功能的源代碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
					*/
				LAST_OUT_DATA;
	}
} /* DataStageOut */

/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
	NAME:	DataStageIn
	INPUT:	none
	OUTPUT:
	DESCRIPTION:
		Data stage of a Control Read Transfer
 *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
void DataStageIn(void)
{
	ENDPOINT_INFO	*pEPinfo = &pInformation->Ctrl_Info;
	WORD	save_wLength = pEPinfo->Usb_wLength;
	BYTE	ControlState;

	BYTE	*DataBuffer;
	WORD	Length;
	int i;
    DWORD *pTxBuff;
    WORD wTra;
 	union {
		BYTE *bTra;
    	WORD *wTra;
	}pBuf;

	if (save_wLength == 0) {
		/* if the number of byte to be sent is				*/
		/* multiple of MaxPacketSize: send a 0 length data packet	*/
		ControlState = WAIT_IN_ZERO;
		Send0LengthData();
		goto Expect_Status_Out;
	}

	Length = pEPinfo->PacketSize;
	ControlState = (save_wLength < Length) ? LAST_IN_DATA : IN_DATA;

	/* Same as UsbWrite */
	if (Length > save_wLength)
		Length = save_wLength;

	DataBuffer = (*pEPinfo->CopyData)(Length);
    /* transfer data from buffer to PMA */
    pTxBuff = (DWORD *)(PMAAddr + (BYTE *)(_GetEPTxAddr(ENDP0)*2));
    pBuf.wTra = &wTra;
    for(i=0;i < Length;)
    {
    	*(pBuf.bTra  ) = *DataBuffer++;
    	i++;
    	*(pBuf.bTra+1) = *DataBuffer++;
    	i++;
    	*pTxBuff = wTra;
    	pTxBuff++;
    }

	_SetEPTxCount(ENDP0, Length);

	pEPinfo->Usb_wLength -= Length;
	pEPinfo->Usb_wOffset += Length;
	vSetEPTxStatus(EP_TX_VALID);

Expect_Status_Out:
	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;

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

/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
	NAME:	In0_Process
	INPUT:
	OUTPUT:	none
	DESCRIPTION:
		Process the IN token on all default endpoint
 *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
BYTE In0_Process()
{
	DEVICE_INFO	*pInfo = pInformation;
	BYTE	ControlState = pInfo->ControlState;

	if (ControlState == IN_DATA)
	{
		DataStageIn();
/* sb questo e' un baco della libreria st9	*/
		ControlState = pInfo->ControlState; /* may be changed outside the function */
/* sb */
	}
	else if (ControlState == LAST_IN_DATA || ControlState == WAIT_IN_ZERO) {
		ControlState = WAIT_STATUS_OUT;
		USB_StatusOut();
	}
	else if (ControlState == WAIT_OUT_ZERO || ControlState == WAIT_STATUS_IN) {
		if (pInfo->USBbRequest == SET_ADDRESS &&
				Type_Recipient == (STANDARD_REQUEST | DEVICE_RECIPIENT) ) {

			/* Device address must be written */
			/* after completion of Status Stage (ACK from Host) */
			SetDeviceAddress(pInfo->USBwValue0);

		}

		(*pProperty->Process_Status_IN)();

		ControlState = WAIT_SETUP;
	}
	else
		ControlState = STALLED;

	pInfo->ControlState = ControlState;

	return Post0_Process();
} /* In0_Process */

/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
	NAME:	Out0_Process
	INPUT:
	OUTPUT:	none
	DESCRIPTION:
		Process the OUT token on all default endpoint
 *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
BYTE Out0_Process()
{
	DEVICE_INFO	*pInfo = pInformation;
	BYTE	ControlState = pInfo->ControlState;

	if (ControlState == OUT_DATA) {
		DataStageOut();

		if (pInfo->ControlState == LAST_OUT_DATA) {
			ControlState = WAIT_STATUS_IN;
			USB_StatusIn();
		}
		else {
			/* Expecting another OUT token with 0 length data */
			SetEPRxCount(ENDP0, 0);
			vSetEPRxStatus(EP_RX_VALID);

			/* Also expecting an IN token to finish the transaction */
			USB_StatusIn();
		}
	}
	else if (ControlState == WAIT_STATUS_OUT || ControlState == IN_DATA) {
		/* host aborts the xfer before finish */
		/* Clear_Status_Out(EPindex);*/		/* Clear ST_OUT bit of this EP */

		vSetEPTxStatus(EP_TX_NAK);
				/* This is to ensure that when the xfer is aborted,
					close down the transmitter, in case the next IN
					token comes in before I config the transmitter */

		(*pProperty->Process_Status_OUT)();
		ControlState = WAIT_SETUP;
	}
	else if (ControlState == WAIT_OUT_ZERO) {
		ControlState = WAIT_STATUS_IN;
		USB_StatusIn();

	}
	else {
		/* Unexpect state, STALL the endpoint */
		ControlState = STALLED;
	}

	pInfo->ControlState = ControlState;

	return Post0_Process();
} /* Out0_Process */

/*============================================================================*/
/*============================================================================*/
BYTE Post0_Process()
{
	SetEPRxCount(ENDP0, STD_MAXPACKETSIZE);

	if (pInformation->ControlState == STALLED) {
		vSetEPRxStatus(EP_RX_STALL);
		vSetEPTxStatus(EP_TX_STALL);
	}
/*
 * Since the SIE will receive SETUP even in NAK state
 * There is no need to enable the receiver again
*/

	return (pInformation->ControlState == PAUSE);
} /* Post0_Process */

/***************************************************************************
BYTE DescriptorBuffer[128];
BYTE *SetDeviceDescriptor(WORD Length)
{
	if (Length == 0)
		return (BYTE*)sizeof(DescriptorBuffer);

	return DescriptorBuffer + pInfomation->Ctrl_Info.Usb_rOffset;
}
***************************************************************************/
/*-----------------------------------------------------------------*/
/*-----------------------------------------------------------------*/
void SetDeviceAddress(BYTE Val)
{
  int i;
  DEVICE *pDevice = &Device_Table;
/*  BYTE	EP0 = pDevice->EP0;	*/
  int	nEP = pDevice->Total_Endpoint;

	/* set address in every used endpoint */
	for(i=0;i<nEP;i++)
	{
		_SetEPAddress((BYTE)i, (BYTE)i);
	} /* for */
	_SetDADDR(Val|DADDR_EF); /* set device address and enable function */
} /* SetDeviceAddress */

/*-----------------------------------------------------------------*/
/*-----------------------------------------------------------------*/
void NOP_Process(void)
{
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美精品一区二区三| 久久精品国产精品亚洲综合| 亚洲欧洲国产专区| 久久精品一二三| 欧美成人一区二区三区在线观看| 欧美一区二区视频在线观看2022| 精品视频999| 91精品国产综合久久香蕉麻豆 | 欧美日韩欧美一区二区| 在线观看日韩一区| 欧美电影在线免费观看| 欧美浪妇xxxx高跟鞋交| 国产一区二区久久| av资源网一区| 亚洲成人精品一区二区| 亚洲啪啪综合av一区二区三区| 国产精品第五页| 自拍av一区二区三区| 亚洲久本草在线中文字幕| 亚洲伊人色欲综合网| 午夜av一区二区| 欧美a级理论片| 国产一区二区成人久久免费影院| 国产一区二区三区免费看| 成人午夜av电影| 色欧美乱欧美15图片| 欧美日韩一区三区四区| 日韩一区二区三区电影在线观看| 久久影视一区二区| 国产精品婷婷午夜在线观看| 亚洲女同女同女同女同女同69| 亚洲一区影音先锋| 久久精品国产精品亚洲精品| 成人一道本在线| 欧美三级电影在线看| 日韩精品在线一区二区| 国产日本亚洲高清| 亚洲一区在线视频观看| 韩国v欧美v日本v亚洲v| www.日韩大片| 欧美一级在线视频| 中文字幕不卡的av| 性欧美疯狂xxxxbbbb| 国产精品亚洲成人| 欧美日韩中文字幕一区二区| 欧美精品一区二区三区在线| 国产精品成人午夜| 性做久久久久久| 成人听书哪个软件好| 欧美日韩国产小视频| 国产亚洲1区2区3区| 亚洲国产精品一区二区www | 精品一区二区在线视频| 国产成人亚洲精品青草天美| 欧美综合色免费| 久久久精品综合| 亚洲成av人片| 成人激情文学综合网| 678五月天丁香亚洲综合网| 中文字幕一区二区三区四区| 免费在线观看一区| 91在线国产观看| 精品不卡在线视频| 亚洲高清免费观看高清完整版在线观看| 国产原创一区二区三区| 欧美日韩免费观看一区三区| 亚洲国产成人午夜在线一区| 日韩av一二三| 在线观看不卡一区| 亚洲国产成人一区二区三区| 日韩av在线发布| 色激情天天射综合网| 国产欧美一区二区在线| 男女男精品网站| 欧美日韩免费在线视频| 国产精品欧美一级免费| 国产麻豆视频一区二区| 制服丝袜在线91| 亚洲综合精品自拍| 91老司机福利 在线| 久久精品日韩一区二区三区| 蜜桃久久av一区| 欧美人牲a欧美精品| 亚洲日本护士毛茸茸| 成人h动漫精品一区二| 久久综合一区二区| 久久成人免费网| 欧美一区在线视频| 亚洲成a人片在线观看中文| 91极品视觉盛宴| 一区二区三区日韩精品视频| 不卡大黄网站免费看| 国产精品美女久久久久久久网站| 国产一区二区三区在线看麻豆| 日韩一区二区三区在线视频| 日韩综合小视频| 欧美精品第1页| 石原莉奈一区二区三区在线观看| 日本道在线观看一区二区| 18成人在线观看| 99国产精品久久久久| 国产精品久久午夜夜伦鲁鲁| jizz一区二区| 自拍偷拍亚洲激情| 一本一本久久a久久精品综合麻豆| 国产精品视频免费看| 97久久精品人人澡人人爽| 中文字幕制服丝袜一区二区三区| 国产成人久久精品77777最新版本| 国产亚洲欧美日韩在线一区| 国产盗摄一区二区三区| 中文字幕免费在线观看视频一区| 成人午夜视频在线观看| 日韩美女精品在线| 欧美影院精品一区| 午夜欧美视频在线观看| 日韩欧美中文字幕一区| 国产一区二区主播在线| 国产视频一区二区三区在线观看| 成人一二三区视频| 亚洲激情图片小说视频| 欧美日韩在线播放三区| 日本女优在线视频一区二区| 久久综合久久综合久久综合| 波多野结衣亚洲一区| 亚洲图片欧美一区| 日韩一区二区三区在线观看| 国产精一品亚洲二区在线视频| 国产午夜亚洲精品羞羞网站| 99国产精品久久久久久久久久久| 亚洲一区二区三区视频在线播放| 欧美人牲a欧美精品| 国产一区二区三区久久久| 国产精品三级av| 欧美美女喷水视频| 国产成人免费av在线| 一区二区三区国产豹纹内裤在线| 欧美视频精品在线观看| 精油按摩中文字幕久久| 1000精品久久久久久久久| 欧美日韩精品一二三区| 国产精品123区| 一区二区免费视频| 精品久久久久香蕉网| 99久久99久久综合| 青青草国产成人av片免费| 精品国产凹凸成av人导航| 色综合咪咪久久| 久久99久久精品| 一区二区三区欧美亚洲| ww亚洲ww在线观看国产| 91久久精品一区二区三| 精品在线观看视频| 最近日韩中文字幕| 精品奇米国产一区二区三区| 色婷婷久久久久swag精品| 韩国成人在线视频| 亚洲福利视频导航| 中文字幕av资源一区| 日韩欧美国产系列| 一本久久a久久免费精品不卡| 久久99精品视频| 亚洲午夜免费电影| 国产免费久久精品| 欧美一区二区三区喷汁尤物| 91丨porny丨首页| 国产精品一区二区久久不卡| 亚洲国产乱码最新视频 | 国产精品成人免费在线| 日韩精品一区二区三区视频播放| 91天堂素人约啪| 国产成人在线网站| 蜜桃91丨九色丨蝌蚪91桃色| 亚洲永久精品国产| 1000精品久久久久久久久| 久久亚洲捆绑美女| 777欧美精品| 在线一区二区观看| 成人免费看黄yyy456| 韩国理伦片一区二区三区在线播放| 亚洲一区在线观看网站| 亚洲丝袜美腿综合| 中文字幕av一区二区三区免费看| 精品卡一卡二卡三卡四在线| 欧美日韩亚洲国产综合| 色综合天天做天天爱| 成人高清视频免费观看| 国产高清一区日本| 玖玖九九国产精品| 日韩一区精品视频| 亚洲自拍偷拍综合| 亚洲欧美日韩在线| 亚洲人精品午夜| 国产精品欧美极品| 久久久高清一区二区三区| 久久这里都是精品| 欧美va亚洲va国产综合| 欧美电影精品一区二区| 欧美一区中文字幕| 日韩亚洲欧美中文三级|