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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? at91_svc_usbctl.c

?? hyesco usb devce driver
?? C
字號:
//*----------------------------------------------------------------------------
//*      ATMEL Microcontroller Software Support  -  ROUSSET  -
//*----------------------------------------------------------------------------
//* The software is delivered "AS IS" without warranty or condition of any
//* kind, either express, implied or statutory. This includes without
//* limitation any warranty or condition with respect to merchantability or
//* fitness for any particular purpose, or against the infringements of
//* intellectual property rights of others.
//*----------------------------------------------------------------------------
//* File Name           : AT91_SVC_USBCTL.c
//* Object              : DMA service USB device control enpoint
//*
//* 1.0 Jul 30 2002 	: ODi Creation
//*----------------------------------------------------------------------------
#include "AT91_SVC_USBCTL.h"
#include "lib_AT91RM9200.h"

//*----------------------------------------------------------------------------
//* \fn    AT91F_SVC_USBCTL_Open
//* \brief Open USBCTL service.
//*----------------------------------------------------------------------------
AT91PS_SVC_USBCTL AT91F_SVC_USBCTL_Open(
	AT91PS_SVC_USBCTL pSvcUdp,  // \arg Pointer to an USBCTL service previously allocated
	AT91PS_UDP pUdp)            // \arg Pointer to UDP registers
{
	pSvcUdp->Handler = AT91F_SVC_USBCTL_Handler;
	pSvcUdp->Read    = AT91F_SVC_USBCTL_Read;
	pSvcUdp->Write   = AT91F_SVC_USBCTL_Write;

	pSvcUdp->DisptachSetup = (AT91PF_SVC_USBCTL_DispatchSetup) 0;
	pSvcUdp->RWComplete    = (AT91PF_SVC_USBCTL_RWComplete) 0;

	pSvcUdp->pBuffer = (char *) 0;
	pSvcUdp->bufferSize = 0;
	pSvcUdp->eot = 0;

	pSvcUdp->pUdp = pUdp;


	return pSvcUdp;
}

//*----------------------------------------------------------------------------
//* \fn    AT91F_SVC_USBCTL_DataIn
//* \brief
//*----------------------------------------------------------------------------
static void AT91F_SVC_USBCTL_DataIn(
	AT91PS_SVC_USBCTL pSvcUdp,     // \arg Pointer to an USBCTL service
	AT91PS_UDP pUdp)               // \arg Pointer to UDP registers
{
	char *pBuffer;

	// If bufferSize == 0 Send a Zero length packet
	if (pSvcUdp->bufferSize == 0)
		AT91F_UDP_EpEndOfWr(pUdp, 0);

	// else initialize DPR
	else {
		pBuffer = pSvcUdp->pBuffer;
		if (pSvcUdp->bufferSize >= 8) {
			AT91F_UDP_EpWrite(pUdp, 0, *pBuffer++);
			AT91F_UDP_EpWrite(pUdp, 0, *pBuffer++);
			AT91F_UDP_EpWrite(pUdp, 0, *pBuffer++);
			AT91F_UDP_EpWrite(pUdp, 0, *pBuffer++);
			AT91F_UDP_EpWrite(pUdp, 0, *pBuffer++);
			AT91F_UDP_EpWrite(pUdp, 0, *pBuffer++);
			AT91F_UDP_EpWrite(pUdp, 0, *pBuffer++);
			AT91F_UDP_EpWrite(pUdp, 0, *pBuffer++);
			pSvcUdp->bufferSize -= 8;
		}
		else while (pSvcUdp->bufferSize--)
			AT91F_UDP_EpWrite(pUdp, 0, *pBuffer++);
		pSvcUdp->pBuffer = pBuffer;
		AT91F_UDP_EpEndOfWr(pUdp, 0);
	}
	pSvcUdp->eot = !(pSvcUdp->bufferSize);
}

//*----------------------------------------------------------------------------
//* \fn    AT91F_SVC_USBCTL_DataOut
//* \brief
//*----------------------------------------------------------------------------
__inline char AT91F_SVC_USBCTL_DataOut(
	AT91PS_SVC_USBCTL pSvcUdp,     // \arg Pointer to an USBCTL service
	AT91PS_UDP pUdp,               // \arg Pointer to UDP registers
	unsigned int epCsr)            // \arg Value of the UDP_CSR[0] register
{
	unsigned int bytesReceived;
	char eor; // Detect end of Receive

	// Copy bytes received to the client buffer
	bytesReceived = (epCsr & AT91C_UDP_RXBYTECNT) >> 16;
	if (bytesReceived > pSvcUdp->bufferSize)
		bytesReceived = pSvcUdp->bufferSize;
	pSvcUdp->bufferSize -= bytesReceived;
	// Check the end of a Control OUT sequence: An incomplete packet stops the Data OUT sequence
	eor = (bytesReceived < 8);

	while (bytesReceived--)
		*(pSvcUdp->pBuffer)++ = AT91F_UDP_EpRead(pUdp, 0);
	AT91F_UDP_EpClear(pUdp, 0, (AT91C_UDP_RX_DATA_BK0));

	return eor;
}

//*----------------------------------------------------------------------------
//* \fn    AT91F_SVC_USBCTL_Handler
//* \brief
//*----------------------------------------------------------------------------
void AT91F_SVC_USBCTL_Handler(
	AT91PS_SVC_USBCTL pSvcUdp)     // \arg Pointer to an USBCTL service
{
	AT91PS_UDP   pUdp = pSvcUdp->pUdp; // Pointer to UDP registers
	unsigned int epCsr =  AT91F_UDP_EpStatus(pUdp, 0);

	// Test if a SETUP packet has been received
	if (epCsr & AT91C_UDP_RXSETUP) {
		// Copy the setup packet
		pSvcUdp->pSetup[0] = AT91F_UDP_EpRead(pUdp, 0);
		pSvcUdp->pSetup[1] = AT91F_UDP_EpRead(pUdp, 0);
		pSvcUdp->pSetup[2] = AT91F_UDP_EpRead(pUdp, 0);
		pSvcUdp->pSetup[3] = AT91F_UDP_EpRead(pUdp, 0);
		pSvcUdp->pSetup[4] = AT91F_UDP_EpRead(pUdp, 0);
		pSvcUdp->pSetup[5] = AT91F_UDP_EpRead(pUdp, 0);
		pSvcUdp->pSetup[6] = AT91F_UDP_EpRead(pUdp, 0);
		pSvcUdp->pSetup[7] = AT91F_UDP_EpRead(pUdp, 0);
		// Set the DIR bit before clearing RXSETUP in Control IN sequence
		if (pSvcUdp->pSetup[0] & 0x80)
			AT91F_UDP_EpSet(pUdp, 0, AT91C_UDP_DIR);
		// Clear RXSETUP
		AT91F_UDP_EpClear(pUdp, 0, AT91C_UDP_RXSETUP);
		// Notify the dispatcher
		if (pSvcUdp->DisptachSetup)
			pSvcUdp->DisptachSetup(pSvcUdp);
	}

	// Test if the previous DATA IN packet is achieved
	else if (epCsr & AT91C_UDP_TXCOMP) {
		AT91F_UDP_EpClear(pUdp, 0, AT91C_UDP_TXCOMP);
		// test end of transmission
		if (pSvcUdp->eot && pSvcUdp->RWComplete)
			pSvcUdp->RWComplete(pSvcUdp);
		// else start new packet transfer
		else
			AT91F_SVC_USBCTL_DataIn(pSvcUdp, pUdp);
	}

	// test if any DATA OUT packet occured
	else if (epCsr & AT91C_UDP_RX_DATA_BK0) {
		// Test if this DATA OUT aborts a CONTROL IN sequence
		if (!(pSvcUdp->eot) && pSvcUdp->RWComplete)
			pSvcUdp->RWComplete(pSvcUdp);
		if (AT91F_SVC_USBCTL_DataOut(pSvcUdp, pUdp, epCsr) && pSvcUdp->RWComplete)
			pSvcUdp->RWComplete(pSvcUdp);
	}

	// Test if a STALL has been acknowledged...
	else if (epCsr & AT91C_UDP_ISOERROR) { // !!!!! Should be: AT91C_UDP_STALLSENT) {
		AT91F_UDP_EpClear(pUdp, 0, (AT91C_UDP_ISOERROR | AT91C_UDP_FORCESTALL));
	}

}


//*----------------------------------------------------------------------------
//* \fn    AT91F_SVC_USBCTL_Write
//* \brief
//*----------------------------------------------------------------------------
void AT91F_SVC_USBCTL_Write(
	AT91PS_SVC_USBCTL pSvcUdp,     // \arg Pointer to an USBCTL service
	const char *pBuffer,                 // \arg Pointer to the client buffer to send
	unsigned int bufferSize,       // \arg Client buffer size
	AT91PF_SVC_USBCTL_RWComplete Callback) // \arg Callback to invoke when buffer is Sent
{
	pSvcUdp->bufferSize  = bufferSize;
	pSvcUdp->pBuffer     = (char *)pBuffer;
	pSvcUdp->RWComplete  = Callback;

	AT91F_SVC_USBCTL_DataIn(pSvcUdp, pSvcUdp->pUdp);
}

//*----------------------------------------------------------------------------
//* \fn    AT91F_SVC_USBCTL_Read
//* \brief
//*----------------------------------------------------------------------------
void AT91F_SVC_USBCTL_Read(
	AT91PS_SVC_USBCTL pSvcUdp,     // \arg Pointer to an USBCTL service
	char *pBuffer,                 // \arg Pointer to the client buffer to fill
	unsigned int bufferSize,       // \arg Client buffer size
	AT91PF_SVC_USBCTL_RWComplete Callback) // \arg Callback to invoke when buffer is Full
{
	if ((bufferSize == 0) && (Callback)) {
		Callback(pSvcUdp);
		return;
	}
	pSvcUdp->bufferSize = bufferSize;
	pSvcUdp->pBuffer    = pBuffer;
	pSvcUdp->RWComplete = Callback;
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
中文字幕日本不卡| 久久一留热品黄| 欧美一级夜夜爽| 91精品国产丝袜白色高跟鞋| 日韩精品专区在线影院重磅| 日韩亚洲欧美在线| 日本一区二区三区高清不卡| 国产乱码精品一区二区三| 精东粉嫩av免费一区二区三区| 国产精品18久久久久| 色欧美乱欧美15图片| 日韩午夜激情电影| ...av二区三区久久精品| 婷婷久久综合九色国产成人| 国产成人精品www牛牛影视| 91高清视频在线| 精品国产成人系列| 亚洲国产成人tv| 国产99精品在线观看| 欧美精品1区2区3区| 国产精品毛片高清在线完整版| 天堂成人国产精品一区| av动漫一区二区| 久久精品免费在线观看| 日韩电影免费在线看| 一本一本大道香蕉久在线精品| 久久免费看少妇高潮| 日本aⅴ免费视频一区二区三区| 色综合久久中文字幕综合网| 国产欧美日韩久久| 精品一区二区三区免费| 制服丝袜av成人在线看| 亚洲综合色丁香婷婷六月图片| 不卡视频免费播放| 国产精品午夜在线观看| 国产成人免费xxxxxxxx| 久久色在线观看| 麻豆精品一区二区av白丝在线| 欧美视频一区在线| 亚洲在线视频免费观看| 欧美亚洲高清一区二区三区不卡| 亚洲欧美日韩久久精品| 色综合久久中文字幕综合网| 一区二区国产视频| 欧美久久久久久久久中文字幕| 亚洲一区自拍偷拍| 欧美亚洲图片小说| 久久久无码精品亚洲日韩按摩| 美女网站在线免费欧美精品| 精品国产人成亚洲区| 亚洲色图视频网| 色综合久久久久综合| 午夜精品123| 337p日本欧洲亚洲大胆色噜噜| 国产99精品国产| 一区二区三区四区在线| 在线电影欧美成精品| 国产一区二区三区观看| 欧美激情一区在线观看| 91看片淫黄大片一级在线观看| 亚洲一二三四久久| 麻豆高清免费国产一区| 国产精品一区二区久久精品爱涩 | 欧美日韩在线播放三区四区| 欧美三级日本三级少妇99| 视频一区二区三区入口| 2019国产精品| 在线观看亚洲专区| 国产精选一区二区三区 | 欧美激情艳妇裸体舞| 韩国av一区二区| 一区二区三区四区乱视频| 日韩精品在线网站| 91视视频在线观看入口直接观看www | 国产亚洲欧美日韩在线一区| 色老头久久综合| 国产不卡一区视频| 免费日韩伦理电影| 亚洲一区在线电影| 欧美三级资源在线| 国产成人在线观看| 韩国三级电影一区二区| 亚洲综合色成人| 国产精品护士白丝一区av| 欧美va亚洲va在线观看蝴蝶网| 在线观看一区日韩| 色偷偷88欧美精品久久久| 国产精品18久久久久久久久| 久久这里只有精品首页| 欧美日韩一区高清| 欧美视频第二页| 欧美综合亚洲图片综合区| 91香蕉视频mp4| 99久久精品免费看国产| 成人综合婷婷国产精品久久蜜臀| 久久99久久99小草精品免视看| 日韩精品在线一区| 欧美成人在线直播| 久久综合色婷婷| 久久人人97超碰com| 伊人夜夜躁av伊人久久| 亚洲精品日韩专区silk| 亚洲免费观看高清完整版在线观看熊| 国产精品成人一区二区艾草 | 国产成人免费视| 成人福利电影精品一区二区在线观看| 欧美一区二区在线观看| 久久久久久久久99精品| 中文字幕一区二| 天天av天天翘天天综合网| 美女脱光内衣内裤视频久久影院| 久久99精品视频| 91一区二区在线观看| 欧美精三区欧美精三区| 精品国产免费一区二区三区四区 | 精品一区二区影视| 豆国产96在线|亚洲| 97久久精品人人澡人人爽| 亚洲影院免费观看| 日韩成人伦理电影在线观看| 久久精品99国产国产精| 中文在线一区二区| 亚洲色图欧洲色图婷婷| 狠狠色丁香九九婷婷综合五月| 国产精品一线二线三线精华| 99久久婷婷国产综合精品| 欧美日韩1区2区| 亚洲四区在线观看| 日韩一二在线观看| 亚洲乱码国产乱码精品精的特点| 亚洲高清不卡在线| 狠狠色2019综合网| 这里只有精品免费| 亚洲欧美在线观看| 国产在线看一区| 欧洲一区二区av| 亚洲天堂中文字幕| 97国产一区二区| 久久久三级国产网站| 亚洲国产日产av| 在线观看日产精品| 国产欧美日韩激情| 美女视频黄久久| 在线这里只有精品| 亚洲品质自拍视频网站| 国产精品一二三区在线| 69av一区二区三区| 亚洲精品视频观看| 色综合久久综合网97色综合| 国产日本欧美一区二区| 国产一区在线看| 日韩一级成人av| 五月婷婷激情综合| 欧美男人的天堂一二区| 水蜜桃久久夜色精品一区的特点| 色视频一区二区| 一区二区三区在线观看欧美 | 免费av成人在线| 日韩欧美色电影| 精品亚洲成a人| 久久精品一区二区三区四区| 久久精品国产成人一区二区三区| 69堂亚洲精品首页| 麻豆视频一区二区| 久久精品日产第一区二区三区高清版| 狂野欧美性猛交blacked| 精品剧情在线观看| 日韩制服丝袜av| 久久一留热品黄| 99久久精品免费看| 亚洲国产sm捆绑调教视频 | 成人免费小视频| 欧美日韩色一区| 午夜影视日本亚洲欧洲精品| 日本韩国视频一区二区| 天天影视色香欲综合网老头| 精品久久久久av影院| 国产激情一区二区三区四区| 亚洲欧洲一区二区在线播放| 欧美在线三级电影| 国产老女人精品毛片久久| 亚洲日本在线a| 日韩欧美www| 色综合视频在线观看| 麻豆91在线播放免费| 欧美色图在线观看| 麻豆精品久久久| 国产精品全国免费观看高清| 欧美日韩成人综合天天影院| 国产精品白丝av| 美女在线一区二区| 色av综合在线| 国产精品91xxx| 国产在线视频不卡二| 天堂久久一区二区三区| 亚洲精品高清视频在线观看| 久久精品无码一区二区三区| 欧美日韩综合一区| www.日韩在线| 久久国产福利国产秒拍|