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

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

?? cdc_enumerate.c

?? AT91SAM7S-BasicUSB的源代碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
				pData[nbBytesRcv++] = pUdp->UDP_FDR[AT91C_EP_OUT];
			pUdp->UDP_CSR[AT91C_EP_OUT] &= ~(currentReceiveBank);
			if (currentReceiveBank == AT91C_UDP_RX_DATA_BK0)
				currentReceiveBank = AT91C_UDP_RX_DATA_BK1;
			else
				currentReceiveBank = AT91C_UDP_RX_DATA_BK0;

		}
	}
	pCdc->currentRcvBank = currentReceiveBank;
	return nbBytesRcv;

}

//*----------------------------------------------------------------------------
//* \fn    AT91F_CDC_Write
//* \brief Send through endpoint 2
//*----------------------------------------------------------------------------
static uint AT91F_UDP_Write(AT91PS_CDC pCdc, const char *pData, uint length)
{
	AT91PS_UDP pUdp = pCdc->pUdp;
	uint cpt = 0;

	// Send the first packet
	cpt = MIN(length, AT91C_EP_IN_SIZE);
	length -= cpt;
	while (cpt--) pUdp->UDP_FDR[AT91C_EP_IN] = *pData++;
	pUdp->UDP_CSR[AT91C_EP_IN] |= AT91C_UDP_TXPKTRDY;

	while (length) {
		// Fill the second bank
		cpt = MIN(length, AT91C_EP_IN_SIZE);
		length -= cpt;
		while (cpt--) pUdp->UDP_FDR[AT91C_EP_IN] = *pData++;
		// Wait for the the first bank to be sent
		while ( !(pUdp->UDP_CSR[AT91C_EP_IN] & AT91C_UDP_TXCOMP) )
			if ( !AT91F_UDP_IsConfigured(pCdc) ) return length;
		pUdp->UDP_CSR[AT91C_EP_IN] &= ~(AT91C_UDP_TXCOMP);
		while (pUdp->UDP_CSR[AT91C_EP_IN] & AT91C_UDP_TXCOMP);
		pUdp->UDP_CSR[AT91C_EP_IN] |= AT91C_UDP_TXPKTRDY;
	}
	// Wait for the end of transfer
	while ( !(pUdp->UDP_CSR[AT91C_EP_IN] & AT91C_UDP_TXCOMP) )
		if ( !AT91F_UDP_IsConfigured(pCdc) ) return length;
	pUdp->UDP_CSR[AT91C_EP_IN] &= ~(AT91C_UDP_TXCOMP);
	while (pUdp->UDP_CSR[AT91C_EP_IN] & AT91C_UDP_TXCOMP);

	return length;
}

//*----------------------------------------------------------------------------
//* \fn    AT91F_USB_SendData
//* \brief Send Data through the control endpoint
//*----------------------------------------------------------------------------
unsigned int csrTab[100];
unsigned char csrIdx = 0;

static void AT91F_USB_SendData(AT91PS_UDP pUdp, const char *pData, uint length)
{
	uint cpt = 0;
	AT91_REG csr;

	do {
		cpt = MIN(length, 8);
		length -= cpt;

		while (cpt--)
			pUdp->UDP_FDR[0] = *pData++;

		if (pUdp->UDP_CSR[0] & AT91C_UDP_TXCOMP) {
			pUdp->UDP_CSR[0] &= ~(AT91C_UDP_TXCOMP);
			while (pUdp->UDP_CSR[0] & AT91C_UDP_TXCOMP);
		}

		pUdp->UDP_CSR[0] |= AT91C_UDP_TXPKTRDY;
		do {
			csr = pUdp->UDP_CSR[0];

			// Data IN stage has been stopped by a status OUT
			if (csr & AT91C_UDP_RX_DATA_BK0) {
				pUdp->UDP_CSR[0] &= ~(AT91C_UDP_RX_DATA_BK0);
				return;
			}
		} while ( !(csr & AT91C_UDP_TXCOMP) );

	} while (length);

	if (pUdp->UDP_CSR[0] & AT91C_UDP_TXCOMP) {
		pUdp->UDP_CSR[0] &= ~(AT91C_UDP_TXCOMP);
		while (pUdp->UDP_CSR[0] & AT91C_UDP_TXCOMP);
	}
}

//*----------------------------------------------------------------------------
//* \fn    AT91F_USB_SendZlp
//* \brief Send zero length packet through the control endpoint
//*----------------------------------------------------------------------------
void AT91F_USB_SendZlp(AT91PS_UDP pUdp)
{
	pUdp->UDP_CSR[0] |= AT91C_UDP_TXPKTRDY;
	while ( !(pUdp->UDP_CSR[0] & AT91C_UDP_TXCOMP) );
	pUdp->UDP_CSR[0] &= ~(AT91C_UDP_TXCOMP);
	while (pUdp->UDP_CSR[0] & AT91C_UDP_TXCOMP);
}

//*----------------------------------------------------------------------------
//* \fn    AT91F_USB_SendStall
//* \brief Stall the control endpoint
//*----------------------------------------------------------------------------
void AT91F_USB_SendStall(AT91PS_UDP pUdp)
{
	pUdp->UDP_CSR[0] |= AT91C_UDP_FORCESTALL;
	while ( !(pUdp->UDP_CSR[0] & AT91C_UDP_ISOERROR) );
	pUdp->UDP_CSR[0] &= ~(AT91C_UDP_FORCESTALL | AT91C_UDP_ISOERROR);
	while (pUdp->UDP_CSR[0] & (AT91C_UDP_FORCESTALL | AT91C_UDP_ISOERROR));
}

//*----------------------------------------------------------------------------
//* \fn    AT91F_CDC_Enumerate
//* \brief This function is a callback invoked when a SETUP packet is received
//*----------------------------------------------------------------------------
static void AT91F_CDC_Enumerate(AT91PS_CDC pCdc)
{
	AT91PS_UDP pUDP = pCdc->pUdp;
	uchar bmRequestType, bRequest;
	ushort wValue, wIndex, wLength, wStatus;


	if ( !(pUDP->UDP_CSR[0] & AT91C_UDP_RXSETUP) )
		return;

	bmRequestType = pUDP->UDP_FDR[0];
	bRequest      = pUDP->UDP_FDR[0];
	wValue        = (pUDP->UDP_FDR[0] & 0xFF);
	wValue       |= (pUDP->UDP_FDR[0] << 8);
	wIndex        = (pUDP->UDP_FDR[0] & 0xFF);
	wIndex       |= (pUDP->UDP_FDR[0] << 8);
	wLength       = (pUDP->UDP_FDR[0] & 0xFF);
	wLength      |= (pUDP->UDP_FDR[0] << 8);

	if (bmRequestType & 0x80) {
		pUDP->UDP_CSR[0] |= AT91C_UDP_DIR;
		while ( !(pUDP->UDP_CSR[0] & AT91C_UDP_DIR) );
	}
	pUDP->UDP_CSR[0] &= ~AT91C_UDP_RXSETUP;
	while ( (pUDP->UDP_CSR[0]  & AT91C_UDP_RXSETUP)  );

	// Handle supported standard device request Cf Table 9-3 in USB specification Rev 1.1
	switch ((bRequest << 8) | bmRequestType) {
	case STD_GET_DESCRIPTOR:
		if (wValue == 0x100)       // Return Device Descriptor
			AT91F_USB_SendData(pUDP, devDescriptor, MIN(sizeof(devDescriptor), wLength));
		else if (wValue == 0x200)  // Return Configuration Descriptor
			AT91F_USB_SendData(pUDP, cfgDescriptor, MIN(sizeof(cfgDescriptor), wLength));
		else
			AT91F_USB_SendStall(pUDP);
		break;
	case STD_SET_ADDRESS:
		AT91F_USB_SendZlp(pUDP);
		pUDP->UDP_FADDR = (AT91C_UDP_FEN | wValue);
		pUDP->UDP_GLBSTATE  = (wValue) ? AT91C_UDP_FADDEN : 0;
		break;
	case STD_SET_CONFIGURATION:
		pCdc->currentConfiguration = wValue;
		AT91F_USB_SendZlp(pUDP);
		pUDP->UDP_GLBSTATE  = (wValue) ? AT91C_UDP_CONFG : AT91C_UDP_FADDEN;
		pUDP->UDP_CSR[1] = (wValue) ? (AT91C_UDP_EPEDS | AT91C_UDP_EPTYPE_BULK_OUT) : 0;
		pUDP->UDP_CSR[2] = (wValue) ? (AT91C_UDP_EPEDS | AT91C_UDP_EPTYPE_BULK_IN)  : 0;
		pUDP->UDP_CSR[3] = (wValue) ? (AT91C_UDP_EPEDS | AT91C_UDP_EPTYPE_ISO_IN)   : 0;
		break;
	case STD_GET_CONFIGURATION:
		AT91F_USB_SendData(pUDP, (char *) &(pCdc->currentConfiguration), sizeof(pCdc->currentConfiguration));
		break;
	case STD_GET_STATUS_ZERO:
		wStatus = 0;
		AT91F_USB_SendData(pUDP, (char *) &wStatus, sizeof(wStatus));
		break;
	case STD_GET_STATUS_INTERFACE:
		wStatus = 0;
		AT91F_USB_SendData(pUDP, (char *) &wStatus, sizeof(wStatus));
		break;
	case STD_GET_STATUS_ENDPOINT:
		wStatus = 0;
		wIndex &= 0x0F;
		if ((pUDP->UDP_GLBSTATE & AT91C_UDP_CONFG) && (wIndex <= 3)) {
			wStatus = (pUDP->UDP_CSR[wIndex] & AT91C_UDP_EPEDS) ? 0 : 1;
			AT91F_USB_SendData(pUDP, (char *) &wStatus, sizeof(wStatus));
		}
		else if ((pUDP->UDP_GLBSTATE & AT91C_UDP_FADDEN) && (wIndex == 0)) {
			wStatus = (pUDP->UDP_CSR[wIndex] & AT91C_UDP_EPEDS) ? 0 : 1;
			AT91F_USB_SendData(pUDP, (char *) &wStatus, sizeof(wStatus));
		}
		else
			AT91F_USB_SendStall(pUDP);
		break;
	case STD_SET_FEATURE_ZERO:
		AT91F_USB_SendStall(pUDP);
	    break;
	case STD_SET_FEATURE_INTERFACE:
		AT91F_USB_SendZlp(pUDP);
		break;
	case STD_SET_FEATURE_ENDPOINT:
		wIndex &= 0x0F;
		if ((wValue == 0) && wIndex && (wIndex <= 3)) {
			pUDP->UDP_CSR[wIndex] = 0;
			AT91F_USB_SendZlp(pUDP);
		}
		else
			AT91F_USB_SendStall(pUDP);
		break;
	case STD_CLEAR_FEATURE_ZERO:
		AT91F_USB_SendStall(pUDP);
	    break;
	case STD_CLEAR_FEATURE_INTERFACE:
		AT91F_USB_SendZlp(pUDP);
		break;
	case STD_CLEAR_FEATURE_ENDPOINT:
		wIndex &= 0x0F;
		if ((wValue == 0) && wIndex && (wIndex <= 3)) {
			if (wIndex == 1)
				pUDP->UDP_CSR[1] = (AT91C_UDP_EPEDS | AT91C_UDP_EPTYPE_BULK_OUT);
			else if (wIndex == 2)
				pUDP->UDP_CSR[2] = (AT91C_UDP_EPEDS | AT91C_UDP_EPTYPE_BULK_IN);
			else if (wIndex == 3)
				pUDP->UDP_CSR[3] = (AT91C_UDP_EPEDS | AT91C_UDP_EPTYPE_ISO_IN);
			AT91F_USB_SendZlp(pUDP);
		}
		else
			AT91F_USB_SendStall(pUDP);
		break;

	// handle CDC class requests
	case SET_LINE_CODING:
		while ( !(pUDP->UDP_CSR[0] & AT91C_UDP_RX_DATA_BK0) );
		pUDP->UDP_CSR[0] &= ~(AT91C_UDP_RX_DATA_BK0);
		AT91F_USB_SendZlp(pUDP);
		break;
	case GET_LINE_CODING:
		AT91F_USB_SendData(pUDP, (char *) &line, MIN(sizeof(line), wLength));
		break;
	case SET_CONTROL_LINE_STATE:
		pCdc->currentConnection = wValue;
		AT91F_USB_SendZlp(pUDP);
		break;
	default:
		AT91F_USB_SendStall(pUDP);
	    break;
	}
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩av在线发布| 国产91精品欧美| 成人久久视频在线观看| 欧美日韩第一区日日骚| 中文字幕一区二区三区在线播放| 三级亚洲高清视频| 99久久免费视频.com| 久久精品视频在线看| 奇米精品一区二区三区在线观看一| 99视频国产精品| 日本一区二区三级电影在线观看 | 麻豆久久久久久久| 欧美性猛交xxxxxx富婆| 国产精品成人免费在线| 国产美女精品一区二区三区| 7777精品伊人久久久大香线蕉| 亚洲欧美视频在线观看视频| 国产精品2024| 久久蜜臀中文字幕| 国内成人免费视频| 欧美va亚洲va香蕉在线| 乱一区二区av| 日韩美女一区二区三区四区| 日韩电影网1区2区| 这里只有精品免费| 人妖欧美一区二区| 欧美videofree性高清杂交| 美腿丝袜亚洲三区| 欧美一区二区三区四区视频| 午夜激情一区二区三区| 欧美日本乱大交xxxxx| 亚洲aaa精品| 欧美一区二区三区喷汁尤物| 天天影视色香欲综合网老头| 欧美一区二区三区免费大片| 日韩激情在线观看| 日韩美女视频在线| 国内国产精品久久| 国产精品嫩草久久久久| 成人app在线观看| 亚洲精品视频免费看| 欧美色图激情小说| 另类小说一区二区三区| 久久久99久久精品欧美| 波多野结衣中文字幕一区| 最新久久zyz资源站| 欧美自拍偷拍午夜视频| 亚州成人在线电影| 精品国产免费一区二区三区四区 | 日韩你懂的在线观看| 国内精品视频一区二区三区八戒| 久久久久久影视| 99久久精品国产网站| 亚洲第一激情av| 精品久久99ma| 97精品超碰一区二区三区| 亚洲国产综合色| 欧美va日韩va| 色综合久久久网| 麻豆专区一区二区三区四区五区| 国产视频911| 欧美丰满美乳xxx高潮www| 国产成人在线免费| 亚洲免费资源在线播放| 日韩免费看的电影| 91美女精品福利| 麻豆免费精品视频| 亚洲欧美偷拍卡通变态| 精品99999| 欧洲av在线精品| 国产高清久久久| 日韩电影在线免费观看| 中文在线一区二区| 日韩精品一区二区三区在线观看| 色综合天天综合| 国产一区欧美一区| 亚洲高清免费观看 | 欧美电影免费提供在线观看| 亚洲一区二区三区视频在线播放 | 色综合天天视频在线观看| 亚洲自拍偷拍网站| 国产真实乱偷精品视频免| 99久久伊人网影院| 亚洲精品福利视频网站| 色综合天天在线| 亚洲成av人片| 亚洲精品一区二区三区蜜桃下载| 毛片av一区二区| 欧美—级在线免费片| 91亚洲精华国产精华精华液| 亚洲六月丁香色婷婷综合久久 | 久久天天做天天爱综合色| 韩日精品视频一区| 国产精品传媒入口麻豆| 91成人免费在线| 久久精品国产精品亚洲精品| 日本一区二区视频在线| 色综合一区二区| 日韩精品电影在线观看| 国产视频一区在线播放| 91麻豆123| 久久国产精品免费| 国产精品第一页第二页第三页| 欧美在线小视频| 精品一区二区三区欧美| 中文字幕人成不卡一区| 777奇米成人网| 成人av在线观| 日本欧美一区二区三区乱码| 久久丝袜美腿综合| 欧美三级电影一区| 成人一区二区三区视频在线观看 | 日韩电影在线免费观看| 国产亚洲精品福利| 777欧美精品| 91老师片黄在线观看| 久久精品国产网站| 亚洲一区二区av电影| 欧美激情资源网| 欧美不卡一区二区三区四区| 91丨porny丨蝌蚪视频| 激情欧美一区二区| 亚洲成在线观看| 亚洲乱码国产乱码精品精小说| 久久久不卡网国产精品一区| 欧美日韩高清一区二区不卡| 99r国产精品| 国产精品一卡二| 久久国产日韩欧美精品| 丝袜诱惑制服诱惑色一区在线观看 | 91啪亚洲精品| 国产99一区视频免费| 看片的网站亚洲| 亚洲成人tv网| 亚洲一区二区三区四区五区黄| 国产精品高清亚洲| 亚洲国产成人私人影院tom| 精品日本一线二线三线不卡| 69堂成人精品免费视频| 欧美日韩激情一区二区| 在线中文字幕一区二区| 97精品久久久午夜一区二区三区| 福利电影一区二区三区| 激情久久五月天| 国内精品视频一区二区三区八戒| 日韩 欧美一区二区三区| 视频一区欧美日韩| 亚洲超碰97人人做人人爱| 一区二区在线观看不卡| 亚洲欧美自拍偷拍色图| 1区2区3区国产精品| ●精品国产综合乱码久久久久| 综合色中文字幕| 亚洲精品大片www| 亚洲一区免费观看| 天天操天天干天天综合网| 午夜激情久久久| 蜜桃视频免费观看一区| 久久国产精品色婷婷| 国产高清亚洲一区| caoporm超碰国产精品| 97久久精品人人爽人人爽蜜臀 | 日韩欧美亚洲国产另类| 精品久久久网站| 亚洲国产精品黑人久久久| 中文字幕欧美日韩一区| 亚洲激情校园春色| 首页综合国产亚洲丝袜| 九九**精品视频免费播放| 国产99精品在线观看| 色综合天天综合网天天狠天天| 欧美日韩一区二区三区四区| 欧美成人官网二区| 中文字幕在线一区二区三区| 一区二区三区91| 奇米精品一区二区三区在线观看| 国产在线精品免费| 91黄色在线观看| 26uuu另类欧美| 国产精品毛片久久久久久久| 一区二区国产盗摄色噜噜| 美女高潮久久久| 色呦呦国产精品| 精品国产污污免费网站入口 | 成av人片一区二区| 日韩视频在线一区二区| 国产精品久久久久桃色tv| 在线观看视频一区二区欧美日韩| 69精品人人人人| 国产精品不卡一区| 日韩成人免费看| 国产91富婆露脸刺激对白| 欧美日韩亚洲另类| 国产日韩在线不卡| 婷婷久久综合九色国产成人| 床上的激情91.| 91精品国产aⅴ一区二区| 国产精品女主播av| 人人精品人人爱| 欧美制服丝袜第一页|