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

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

?? usb-cdc.c

?? 最新版FreeRTOS, 包擴多種開發平臺的移植
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*
	FreeRTOS.org V4.1.1 - copyright (C) 2003-2006 Richard Barry.

	This file is part of the FreeRTOS.org distribution.

	FreeRTOS.org is free software; you can redistribute it and/or modify
	it under the terms of the GNU General Public License as published by
	the Free Software Foundation; either version 2 of the License, or
	(at your option) any later version.

	FreeRTOS.org is distributed in the hope that it will be useful,
	but WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
	GNU General Public License for more details.

	You should have received a copy of the GNU General Public License
	along with FreeRTOS.org; if not, write to the Free Software
	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

	A special exception to the GPL can be applied should you wish to distribute
	a combined work that includes FreeRTOS.org, without being obliged to provide
	the source code for any proprietary components.  See the licensing section
	of http://www.FreeRTOS.org for full details of how and when the exception
	can be applied.

	***************************************************************************
	See http://www.FreeRTOS.org for documentation, latest information, license
	and contact details.  Please ensure to read the configuration and relevant
	port sections of the online documentation.
	***************************************************************************
*/

/*
	USB Communications Device Class driver.
	Implements task vUSBCDCTask and provides an Abstract Control Model serial 
	interface.  Control is through endpoint 0, device-to-host notification is 
	provided by interrupt-in endpoint 3, and raw data is transferred through 
	bulk endpoints 1 and 2.

	- developed from original FreeRTOS HID example by Scott Miller
	- modified to support 3.2 GCC by najay
*/

/* Standard includes. */
#include <string.h>
#include <stdio.h>

/* Demo board includes. */
#include "Board.h"

/* Scheduler includes. */
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"

/* Demo app includes. */
#include "USB-CDC.h"
#include "descriptors.h"

#define usbNO_BLOCK ( ( portTickType ) 0 )

/* Reset all endpoints */
static void prvResetEndPoints( void );

/* Clear pull up resistor to detach device from host */
static void vDetachUSBInterface( void );

/* Set up interface and initialize variables */
static void vInitUSBInterface( void );

/* Handle control endpoint events. */
static void prvProcessEndPoint0Interrupt( xISRStatus *pxMessage );

/* Handle standard device requests. */
static void prvHandleStandardDeviceRequest( xUSB_REQUEST *pxRequest );

/* Handle standard interface requests. */
static void prvHandleStandardInterfaceRequest( xUSB_REQUEST *pxRequest );

/* Handle endpoint requests. */
static void prvHandleStandardEndPointRequest( xUSB_REQUEST *pxRequest );

/* Handle class interface requests. */
static void prvHandleClassInterfaceRequest( xUSB_REQUEST *pxRequest );

/* Prepare control data transfer.  prvSendNextSegment starts transfer. */
static void prvSendControlData( unsigned portCHAR *pucData, unsigned portSHORT usRequestedLength, unsigned portLONG ulLengthLeftToSend, portLONG lSendingDescriptor );

/* Send next segment of data for the control transfer */
static void prvSendNextSegment( void );

/* Send stall - used to respond to unsupported requests */
static void prvSendStall( void );

/* Send a zero-length (null) packet */
static void prvSendZLP( void );

/* Handle requests for standard interface descriptors */
static void prvGetStandardInterfaceDescriptor( xUSB_REQUEST *pxRequest );

/*------------------------------------------------------------*/

/* File scope static variables */
static unsigned portCHAR ucUSBConfig = ( unsigned portCHAR ) 0;
static unsigned portLONG ulReceivedAddress = ( unsigned portLONG ) 0;
static eDRIVER_STATE eDriverState = eNOTHING;

/* Incoming and outgoing control data structures */
static xCONTROL_MESSAGE pxControlTx;
static xCONTROL_MESSAGE pxControlRx;

/* Queue holding pointers to pending messages */
xQueueHandle xUSBInterruptQueue; 

/* Queues used to hold received characters, and characters waiting to be
transmitted.  Rx queue must be larger than FIFO size. */
static xQueueHandle xRxCDC; 
static xQueueHandle xTxCDC; 

/* Line coding - 115,200 baud, N-8-1 */
static const unsigned portCHAR pxLineCoding[] = { 0x00, 0xC2, 0x01, 0x00, 0x00, 0x00, 0x08 };

/* Status variables. */
static unsigned portCHAR ucControlState;
static unsigned int uiCurrentBank;


/*------------------------------------------------------------*/


void vUSBCDCTask( void *pvParameters )
{
xISRStatus *pxMessage;
unsigned portLONG ulStatus;
unsigned portLONG ulRxBytes;
unsigned portCHAR ucByte;
portBASE_TYPE xByte;

	( void ) pvParameters;

	/* Disconnect USB device from hub.  For debugging - causes host to register reset */
	portENTER_CRITICAL();
		 vDetachUSBInterface();
	portEXIT_CRITICAL();
	
	vTaskDelay( portTICK_RATE_MS * 60 );

	/* Init USB interface */
	portENTER_CRITICAL();
		vInitUSBInterface();
	portEXIT_CRITICAL();
	
	/* Main task loop.  Process incoming endpoint 0 interrupts, handle data transfers. */
	 
	for( ;; )
	{
		/* Look for data coming from the ISR. */
		if( xQueueReceive( xUSBInterruptQueue, &pxMessage, usbSHORTEST_DELAY ) )
		{
			if( pxMessage->ulISR & AT91C_UDP_EPINT0 )
			{
				/* All endpoint 0 interrupts are handled here. */
				prvProcessEndPoint0Interrupt( pxMessage );
			}

			if( pxMessage->ulISR & AT91C_UDP_ENDBUSRES )
			{
				/* End of bus reset - reset the endpoints and de-configure. */
				prvResetEndPoints();		
			}
		}
		
		/* See if we're ready to send and receive data. */
		if( eDriverState == eREADY_TO_SEND && ucControlState ) 
		{
			if( ( !(AT91C_BASE_UDP->UDP_CSR[ usbEND_POINT_2 ] & AT91C_UDP_TXPKTRDY) ) && uxQueueMessagesWaiting( xTxCDC ) )
			{
				for( xByte = 0; xByte < 64; xByte++ )
				{				   
					if( !xQueueReceive( xTxCDC, &ucByte, 0 ) ) 
					{
						/* No data buffered to transmit. */
						break;
					}

					/* Got a byte to transmit. */
					AT91C_BASE_UDP->UDP_FDR[ usbEND_POINT_2 ] = ucByte;
				} 
				AT91C_BASE_UDP->UDP_CSR[ usbEND_POINT_2 ] |= AT91C_UDP_TXPKTRDY;
			}

			/* Check for incoming data (host-to-device) on endpoint 1. */
			while( AT91C_BASE_UDP->UDP_CSR[ usbEND_POINT_1 ] & (AT91C_UDP_RX_DATA_BK0 | AT91C_UDP_RX_DATA_BK1) )
			{
				ulRxBytes = (AT91C_BASE_UDP->UDP_CSR[ usbEND_POINT_1 ] >> 16) & usbRX_COUNT_MASK;

				/* Only process FIFO if there's room to store it in the queue */
				if( ulRxBytes < ( USB_CDC_QUEUE_SIZE - uxQueueMessagesWaiting( xRxCDC ) ) )
				{
					while( ulRxBytes-- )
					{
						ucByte = AT91C_BASE_UDP->UDP_FDR[ usbEND_POINT_1 ];
						xQueueSend( xRxCDC, &ucByte, 0 );
					}

					/* Release the FIFO */
					portENTER_CRITICAL();
					{
						ulStatus = AT91C_BASE_UDP->UDP_CSR[ usbEND_POINT_1 ];
						usbCSR_CLEAR_BIT( &ulStatus, uiCurrentBank );
						AT91C_BASE_UDP->UDP_CSR[ usbEND_POINT_1 ] = ulStatus;
					}
					portEXIT_CRITICAL();

					/* Re-enable endpoint 1's interrupts */
					AT91C_BASE_UDP->UDP_IER = AT91C_UDP_EPINT1;
				
					/* Update the current bank in use */
					if( uiCurrentBank == AT91C_UDP_RX_DATA_BK0 ) 
					{
						uiCurrentBank = AT91C_UDP_RX_DATA_BK1;
					}
					else 
					{
						uiCurrentBank = AT91C_UDP_RX_DATA_BK0;
					}

				}
				else 
				{
					break;
				}
			}
		}
	}
}
/*------------------------------------------------------------*/

void vUSBSendByte( portCHAR cByte )
{
	/* Queue the byte to be sent.  The USB task will send it. */
	xQueueSend( xTxCDC, &cByte, usbNO_BLOCK );
}
/*------------------------------------------------------------*/

static void prvSendZLP( void )
{
unsigned portLONG ulStatus;

	/* Wait until the FIFO is free - even though we are not going to use it.
	THERE IS NO TIMEOUT HERE! */
	while( AT91C_BASE_UDP->UDP_CSR[ usbEND_POINT_0 ] & AT91C_UDP_TXPKTRDY )
	{
		vTaskDelay( usbSHORTEST_DELAY );
	}

	portENTER_CRITICAL();
	{
		/* Cancel any further pending data */
		pxControlTx.ulTotalDataLength = pxControlTx.ulNextCharIndex;

		/* Set the TXPKTRDY bit to cause a transmission with no data. */
		ulStatus = AT91C_BASE_UDP->UDP_CSR[ usbEND_POINT_0 ];
		usbCSR_SET_BIT( &ulStatus, AT91C_UDP_TXPKTRDY );
		AT91C_BASE_UDP->UDP_CSR[ usbEND_POINT_0 ] = ulStatus;
	}
	portEXIT_CRITICAL();
}
/*------------------------------------------------------------*/

static void prvSendStall( void )
{
	unsigned portLONG ulStatus;

	portENTER_CRITICAL();
	{
		/* Force a stall by simply setting the FORCESTALL bit in the CSR. */
		ulStatus = AT91C_BASE_UDP->UDP_CSR[ usbEND_POINT_0 ];
		usbCSR_SET_BIT( &ulStatus, AT91C_UDP_FORCESTALL );
		AT91C_BASE_UDP->UDP_CSR[ usbEND_POINT_0 ] = ulStatus;
	}
	portEXIT_CRITICAL();
}
/*------------------------------------------------------------*/

static void prvResetEndPoints( void )
{
unsigned portLONG ulTemp;

	eDriverState = eJUST_RESET;
	ucControlState = 0;

	/* Reset all the end points. */
	AT91C_BASE_UDP->UDP_RSTEP  = usbEND_POINT_RESET_MASK;
	AT91C_BASE_UDP->UDP_RSTEP  = ( unsigned portLONG ) 0x00;

	/* Enable data to be sent and received. */
	AT91C_BASE_UDP->UDP_FADDR = AT91C_UDP_FEN;

	/* Repair the configuration end point. */
	portENTER_CRITICAL();
	{
		ulTemp = AT91C_BASE_UDP->UDP_CSR[ usbEND_POINT_0 ];
		usbCSR_SET_BIT( &ulTemp, ( ( unsigned portLONG ) ( AT91C_UDP_EPEDS | AT91C_UDP_EPTYPE_CTRL ) ) );
		AT91C_BASE_UDP->UDP_CSR[ usbEND_POINT_0 ] = ulTemp;
		AT91C_BASE_UDP->UDP_IER = AT91C_UDP_EPINT0;
	}
	portEXIT_CRITICAL();
	uiCurrentBank = AT91C_UDP_RX_DATA_BK0;
}
/*------------------------------------------------------------*/

static void prvProcessEndPoint0Interrupt( xISRStatus *pxMessage )
{
static xUSB_REQUEST xRequest;
unsigned portLONG ulRxBytes;

	/* Get number of bytes received, if any */
	ulRxBytes = pxMessage->ulCSR0 >> 16;
	ulRxBytes &= usbRX_COUNT_MASK;

	if( pxMessage->ulCSR0 & AT91C_UDP_TXCOMP )
	{
		/* We received a TX complete interrupt.  What we do depends on
		what we sent to get this interrupt. */

		if( eDriverState == eJUST_GOT_CONFIG )
		{
			/* We sent an acknowledgement of a SET_CONFIG request.  We
			are now at the end of the enumeration.
			
			TODO: Config 0 sets unconfigured state, should enter Address state.
			Request for unsupported config should stall. */
			AT91C_BASE_UDP->UDP_GLBSTATE = AT91C_UDP_CONFG;
			
			/* Set up endpoints */
			portENTER_CRITICAL();
			{
				unsigned portLONG ulTemp;

				/* Set endpoint 1 to bulk-out */
				ulTemp = AT91C_BASE_UDP->UDP_CSR[ usbEND_POINT_1 ];					
				usbCSR_SET_BIT( &ulTemp, AT91C_UDP_EPEDS | AT91C_UDP_EPTYPE_BULK_OUT );
				AT91C_BASE_UDP->UDP_CSR[ usbEND_POINT_1 ] = ulTemp;		
				AT91C_BASE_UDP->UDP_IER = AT91C_UDP_EPINT1;
				/* Set endpoint 2 to bulk-in */
				ulTemp = AT91C_BASE_UDP->UDP_CSR[ usbEND_POINT_2 ];					
				usbCSR_SET_BIT( &ulTemp, AT91C_UDP_EPEDS | AT91C_UDP_EPTYPE_BULK_IN );
				AT91C_BASE_UDP->UDP_CSR[ usbEND_POINT_2 ] = ulTemp;		
				AT91C_BASE_UDP->UDP_IER = AT91C_UDP_EPINT2;
					/* Set endpoint 3 to interrupt-in, enable it, and enable interrupts */
				ulTemp = AT91C_BASE_UDP->UDP_CSR[ usbEND_POINT_3 ];					
				usbCSR_SET_BIT( &ulTemp, AT91C_UDP_EPEDS | AT91C_UDP_EPTYPE_INT_IN );
				AT91C_BASE_UDP->UDP_CSR[ usbEND_POINT_3 ] = ulTemp;		
				/*AT91F_UDP_EnableIt( AT91C_BASE_UDP, AT91C_UDP_EPINT3 );				 */
			}
			portEXIT_CRITICAL();

			eDriverState = eREADY_TO_SEND;
		}		
		else if( eDriverState == eJUST_GOT_ADDRESS )
		{
			/* We sent an acknowledgement of a SET_ADDRESS request.  Move
			to the addressed state. */
			if( ulReceivedAddress != ( unsigned portLONG ) 0 )
			{			
				AT91C_BASE_UDP->UDP_GLBSTATE = AT91C_UDP_FADDEN;
			}
			else
			{
				AT91C_BASE_UDP->UDP_GLBSTATE = 0;
			}			

			AT91C_BASE_UDP->UDP_FADDR = ( AT91C_UDP_FEN | ulReceivedAddress );		
			eDriverState = eNOTHING;
		}
		else
		{		
			/* The TXCOMP was not for any special type of transmission.  See
			if there is any more data to send. */
			prvSendNextSegment();
		}
	}

	if( pxMessage->ulCSR0 & AT91C_UDP_RX_DATA_BK0 )
	{
		/* Received a control data packet.  May be a 0-length ACK or a data stage. */
		unsigned portCHAR ucBytesToGet;
	 
		/* Got data.  Cancel any outgoing data. */
		pxControlTx.ulNextCharIndex = pxControlTx.ulTotalDataLength;
		
		 /* Determine how many bytes we need to receive. */
		ucBytesToGet = pxControlRx.ulTotalDataLength - pxControlRx.ulNextCharIndex;
		if( ucBytesToGet > ulRxBytes ) 
		{	
			ucBytesToGet = ulRxBytes;
		}

		/* If we're not expecting any data, it's an ack - just quit now. */
		if( !ucBytesToGet )
		{
			 return;
		}

		/* Get the required data and update the index. */
		memcpy( pxControlRx.ucBuffer, pxMessage->ucFifoData, ucBytesToGet );
		pxControlRx.ulNextCharIndex += ucBytesToGet;	
	}

	if( pxMessage->ulCSR0 & AT91C_UDP_RXSETUP )
	{
		/* Received a SETUP packet.  May be followed by data packets. */

		if( ulRxBytes >= usbEXPECTED_NUMBER_OF_BYTES )
		{		 		
			/* Create an xUSB_REQUEST variable from the raw bytes array. */

			xRequest.ucReqType = pxMessage->ucFifoData[ usbREQUEST_TYPE_INDEX ];
			xRequest.ucRequest = pxMessage->ucFifoData[ usbREQUEST_INDEX ];

			xRequest.usValue = pxMessage->ucFifoData[ usbVALUE_HIGH_BYTE ];
			xRequest.usValue <<= 8;
			xRequest.usValue |= pxMessage->ucFifoData[ usbVALUE_LOW_BYTE ];
						
			xRequest.usIndex = pxMessage->ucFifoData[ usbINDEX_HIGH_BYTE ];
			xRequest.usIndex <<= 8;
			xRequest.usIndex |= pxMessage->ucFifoData[ usbINDEX_LOW_BYTE ];
			
			xRequest.usLength = pxMessage->ucFifoData[ usbLENGTH_HIGH_BYTE ];
			xRequest.usLength <<= 8;
			xRequest.usLength |= pxMessage->ucFifoData[ usbLENGTH_LOW_BYTE ];

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
蜜桃久久久久久| 久久精品国产免费看久久精品| 欧美欧美欧美欧美| 97国产精品videossex| 国产高清亚洲一区| 国产精品一区在线| 国产精品白丝jk黑袜喷水| 麻豆91在线观看| 麻豆一区二区三区| 久久精品国产在热久久| 精品一区二区三区香蕉蜜桃| 色欧美日韩亚洲| 91免费在线播放| 欧美日韩国产美| 欧美中文字幕不卡| 欧美丝袜自拍制服另类| 激情综合色综合久久综合| 国产剧情一区在线| 欧美一级一区二区| 婷婷久久综合九色国产成人| 成人免费观看男女羞羞视频| 久久嫩草精品久久久久| 日本视频在线一区| 欧美色综合天天久久综合精品| 中文字幕一区二区不卡| 国产精品一区二区三区网站| 精品国产一二三| 精品综合免费视频观看| 欧美一区二区三区喷汁尤物| 亚洲午夜视频在线观看| 日本高清不卡aⅴ免费网站| 中文字幕制服丝袜一区二区三区| 国产麻豆成人传媒免费观看| 欧美大片在线观看| 激情综合网激情| 国产三区在线成人av| 成人黄色片在线观看| 国产亚洲欧洲一区高清在线观看| 国内精品视频666| 久久久久九九视频| 成人性生交大片免费| 欧美激情在线看| 波多野结衣亚洲一区| 亚洲色图欧洲色图婷婷| 97se亚洲国产综合自在线| 亚洲美女屁股眼交| 欧美性videosxxxxx| 蜜臀国产一区二区三区在线播放 | 欧美揉bbbbb揉bbbbb| 亚洲主播在线观看| 欧美日韩免费观看一区三区| 五月天精品一区二区三区| 日韩一区二区三区免费观看| 国产精品综合在线视频| 亚洲色图欧美激情| 欧美日韩国产免费一区二区| 韩国三级中文字幕hd久久精品| 国产亚洲精久久久久久| 色伊人久久综合中文字幕| 午夜久久久影院| 久久亚洲二区三区| 日本丶国产丶欧美色综合| 日韩制服丝袜av| 国产亚洲综合av| 欧洲中文字幕精品| 狠狠色丁香久久婷婷综合_中 | 日韩女优制服丝袜电影| 国产精选一区二区三区| 亚洲自拍都市欧美小说| 久久众筹精品私拍模特| 日本精品裸体写真集在线观看| 蜜桃传媒麻豆第一区在线观看| 国产精品三级av在线播放| 欧美高清你懂得| 99精品视频在线免费观看| 日本在线播放一区二区三区| 国产精品久久久久婷婷| 宅男噜噜噜66一区二区66| 成人国产精品免费观看| 男女男精品视频网| 一区二区三区中文字幕在线观看| 日韩你懂的在线播放| 色婷婷av一区| 春色校园综合激情亚洲| 免费观看30秒视频久久| 亚洲自拍偷拍图区| 国产精品久久影院| 亚洲精品一区在线观看| 欧美三级欧美一级| 色诱亚洲精品久久久久久| 国产精品综合网| 久久成人av少妇免费| 日韩主播视频在线| 亚洲欧美日韩精品久久久久| 国产欧美日韩亚州综合| 日韩精品一区二区三区视频 | 五月综合激情网| 亚洲欧美一区二区三区国产精品| 久久久久久久性| 精品久久久久久久一区二区蜜臀| 欧美日韩国产精品自在自线| 一本大道久久a久久综合婷婷| 成人激情电影免费在线观看| 成人性生交大片免费看中文| 国产在线国偷精品产拍免费yy| 蜜臀av性久久久久av蜜臀妖精| 午夜欧美视频在线观看| 一区二区三区在线播放| 亚洲免费av观看| 一区二区三区高清| 曰韩精品一区二区| 一区二区在线观看免费| 亚洲欧美日韩在线| 亚洲伦理在线免费看| 亚洲男同性视频| 一区二区三区毛片| 亚洲第四色夜色| 婷婷夜色潮精品综合在线| 爽好多水快深点欧美视频| 午夜视频在线观看一区| 日日夜夜免费精品| 麻豆91在线观看| 韩国精品在线观看| 国产成人免费视频精品含羞草妖精| 国产一区二区三区蝌蚪| 高清beeg欧美| 91社区在线播放| 91黄视频在线| 欧美一区二区私人影院日本| 欧美成人在线直播| 国产欧美视频在线观看| 亚洲图片另类小说| 亚洲午夜视频在线| 蜜桃视频在线观看一区二区| 国产精品66部| 91女神在线视频| 欧美日本在线一区| 久久久精品综合| 亚洲人吸女人奶水| 人人精品人人爱| 夫妻av一区二区| 欧美无砖专区一中文字| 日韩欧美一级片| 国产精品免费视频网站| 亚洲va韩国va欧美va| 韩国v欧美v日本v亚洲v| 91在线观看下载| 91精品欧美一区二区三区综合在| 亚洲精品在线网站| 一区二区三区精品| 国产综合色产在线精品| 91麻豆国产精品久久| 91精品综合久久久久久| 国产蜜臀av在线一区二区三区| 亚洲一区二区四区蜜桃| 狠狠色综合色综合网络| 91免费看片在线观看| 欧美α欧美αv大片| 亚洲精品欧美在线| 国产在线播放一区| 欧美日韩国产综合视频在线观看| 久久久不卡影院| 亚洲不卡一区二区三区| 大陆成人av片| 日韩免费视频线观看| 一区二区三区产品免费精品久久75| 国产麻豆视频精品| 5566中文字幕一区二区电影| 亚洲男人的天堂一区二区| 国产一区在线视频| 91精品国产日韩91久久久久久| 综合在线观看色| 国产99久久久国产精品潘金网站| 欧美电影一区二区| 亚洲美腿欧美偷拍| 99久久精品免费看国产| 久久亚洲一级片| 男男gaygay亚洲| 欧美日韩的一区二区| 亚洲欧洲中文日韩久久av乱码| 国产精品123区| 久久综合中文字幕| 日本成人中文字幕在线视频| 欧美性受极品xxxx喷水| 自拍av一区二区三区| 成人丝袜高跟foot| 久久久精品免费免费| 久久99这里只有精品| 欧美精品v国产精品v日韩精品| 亚洲精品免费看| 色婷婷狠狠综合| 亚洲婷婷国产精品电影人久久| 国产精品77777竹菊影视小说| 精品国产精品一区二区夜夜嗨| 日本aⅴ精品一区二区三区| 91精品欧美久久久久久动漫 | 日韩欧美亚洲国产另类 | 777久久久精品| 首页国产欧美日韩丝袜| 欧美精品自拍偷拍|