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

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

?? main_serial.c

?? Free Usb Stack for NXP LPC2xxx microcontrollers.
?? C
字號:
/*
	LPCUSB, an USB device driver for LPC microcontrollers	
	Copyright (C) 2006 Bertrik Sikken (bertrik@sikken.nl)

	Redistribution and use in source and binary forms, with or without
	modification, are permitted provided that the following conditions are met:

	1. Redistributions of source code must retain the above copyright
	   notice, this list of conditions and the following disclaimer.
	2. Redistributions in binary form must reproduce the above copyright
	   notice, this list of conditions and the following disclaimer in the
	   documentation and/or other materials provided with the distribution.
	3. The name of the author may not be used to endorse or promote products
	   derived from this software without specific prior written permission.

	THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
	IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
	OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
	IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 
	INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
	NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
	DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
	THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
	(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
	THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

/*
	Minimal implementation of a USB serial port, using the CDC class.
	This example application simply echoes everything it receives right back
	to the host.

	Windows:
	Extract the usbser.sys file from .cab file in C:\WINDOWS\Driver Cache\i386
	and store it somewhere (C:\temp is a good place) along with the usbser.inf
	file. Then plug in the LPC214x and direct windows to the usbser driver.
	Windows then creates an extra COMx port that you can open in a terminal
	program, like hyperterminal.

	Linux:
	The device should be recognised automatically by the cdc_acm driver,
	which creates a /dev/ttyACMx device file that acts just like a regular
	serial port.

*/


#include <string.h>			// memcpy

#include "type.h"
#include "usbdebug.h"

#include "armVIC.h"

#include "console.h"
#include "usbapi.h"
#include "startup.h"

#include "serial_fifo.h"


#define BAUD_RATE	115200

#define INT_IN_EP		0x81
#define BULK_OUT_EP		0x05
#define BULK_IN_EP		0x82

#define MAX_PACKET_SIZE	64

#define LE_WORD(x)		((x)&0xFF),((x)>>8)

// CDC definitions
#define CS_INTERFACE			0x24
#define CS_ENDPOINT				0x25

#define	SET_LINE_CODING			0x20
#define	GET_LINE_CODING			0x21
#define	SET_CONTROL_LINE_STATE	0x22

// interrupts
#define VICIntSelect   *((volatile unsigned int *) 0xFFFFF00C)
#define VICIntEnable   *((volatile unsigned int *) 0xFFFFF010)
#define VICVectAddr    *((volatile unsigned int *) 0xFFFFF030)
#define VICVectAddr0   *((volatile unsigned int *) 0xFFFFF100)
#define VICVectCntl0   *((volatile unsigned int *) 0xFFFFF200)

#define	INT_VECT_NUM	0

#define IRQ_MASK 0x00000080

// data structure for GET_LINE_CODING / SET_LINE_CODING class requests
typedef struct {
	U32		dwDTERate;
	U8		bCharFormat;
	U8		bParityType;
	U8		bDataBits;
} TLineCoding;

static TLineCoding LineCoding = {115200, 0, 0, 8};
static U8 abBulkBuf[64];
static U8 abClassReqData[8];

static U8 txdata[VCOM_FIFO_SIZE];
static U8 rxdata[VCOM_FIFO_SIZE];

static fifo_t txfifo;
static fifo_t rxfifo;

// forward declaration of interrupt handler
static void USBIntHandler(void) __attribute__ ((interrupt("IRQ")));


static const U8 abDescriptors[] = {

// device descriptor
	0x12,
	DESC_DEVICE,
	LE_WORD(0x0101),			// bcdUSB
	0x02,						// bDeviceClass
	0x00,						// bDeviceSubClass
	0x00,						// bDeviceProtocol
	MAX_PACKET_SIZE0,			// bMaxPacketSize
	LE_WORD(0xFFFF),			// idVendor
	LE_WORD(0x0005),			// idProduct
	LE_WORD(0x0100),			// bcdDevice
	0x01,						// iManufacturer
	0x02,						// iProduct
	0x03,						// iSerialNumber
	0x01,						// bNumConfigurations

// configuration descriptor
	0x09,
	DESC_CONFIGURATION,
	LE_WORD(67),				// wTotalLength
	0x02,						// bNumInterfaces
	0x01,						// bConfigurationValue
	0x00,						// iConfiguration
	0xC0,						// bmAttributes
	0x32,						// bMaxPower
// control class interface
	0x09,
	DESC_INTERFACE,
	0x00,						// bInterfaceNumber
	0x00,						// bAlternateSetting
	0x01,						// bNumEndPoints
	0x02,						// bInterfaceClass
	0x02,						// bInterfaceSubClass
	0x01,						// bInterfaceProtocol, linux requires value of 1 for the cdc_acm module
	0x00,						// iInterface
// header functional descriptor
	0x05,
	CS_INTERFACE,
	0x00,
	LE_WORD(0x0110),
// call management functional descriptor
	0x05,
	CS_INTERFACE,
	0x01,
	0x01,						// bmCapabilities = device handles call management
	0x01,						// bDataInterface
// ACM functional descriptor
	0x04,
	CS_INTERFACE,
	0x02,
	0x02,						// bmCapabilities
// union functional descriptor
	0x05,
	CS_INTERFACE,
	0x06,
	0x00,						// bMasterInterface
	0x01,						// bSlaveInterface0
// notification EP
	0x07,
	DESC_ENDPOINT,
	INT_IN_EP,					// bEndpointAddress
	0x03,						// bmAttributes = intr
	LE_WORD(8),					// wMaxPacketSize
	0x0A,						// bInterval
// data class interface descriptor
	0x09,
	DESC_INTERFACE,
	0x01,						// bInterfaceNumber
	0x00,						// bAlternateSetting
	0x02,						// bNumEndPoints
	0x0A,						// bInterfaceClass = data
	0x00,						// bInterfaceSubClass
	0x00,						// bInterfaceProtocol
	0x00,						// iInterface
// data EP OUT
	0x07,
	DESC_ENDPOINT,
	BULK_OUT_EP,				// bEndpointAddress
	0x02,						// bmAttributes = bulk
	LE_WORD(MAX_PACKET_SIZE),	// wMaxPacketSize
	0x00,						// bInterval
// data EP in
	0x07,
	DESC_ENDPOINT,
	BULK_IN_EP,					// bEndpointAddress
	0x02,						// bmAttributes = bulk
	LE_WORD(MAX_PACKET_SIZE),	// wMaxPacketSize
	0x00,						// bInterval
	
	// string descriptors
	0x04,
	DESC_STRING,
	LE_WORD(0x0409),

	0x0E,
	DESC_STRING,
	'L', 0, 'P', 0, 'C', 0, 'U', 0, 'S', 0, 'B', 0,

	0x14,
	DESC_STRING,
	'U', 0, 'S', 0, 'B', 0, 'S', 0, 'e', 0, 'r', 0, 'i', 0, 'a', 0, 'l', 0,

	0x12,
	DESC_STRING,
	'D', 0, 'E', 0, 'A', 0, 'D', 0, 'C', 0, '0', 0, 'D', 0, 'E', 0,

// terminating zero
	0
};


/**
	Local function to handle incoming bulk data
		
	@param [in] bEP
	@param [in] bEPStatus
 */
static void BulkOut(U8 bEP, U8 bEPStatus)
{
	int i, iLen;

	if (fifo_free(&rxfifo) < MAX_PACKET_SIZE) {
		// may not fit into fifo
		return;
	}

	// get data from USB into intermediate buffer
	iLen = USBHwEPRead(bEP, abBulkBuf, sizeof(abBulkBuf));
	for (i = 0; i < iLen; i++) {
		// put into FIFO
		if (!fifo_put(&rxfifo, abBulkBuf[i])) {
			// overflow... :(
			ASSERT(FALSE);
			break;
		}
	}
}


/**
	Local function to handle outgoing bulk data
		
	@param [in] bEP
	@param [in] bEPStatus
 */
static void BulkIn(U8 bEP, U8 bEPStatus)
{
	int i, iLen;

	if (fifo_avail(&txfifo) == 0) {
		// no more data, disable further NAK interrupts until next USB frame
		USBHwNakIntEnable(0);
		return;
	}

	// get bytes from transmit FIFO into intermediate buffer
	for (i = 0; i < MAX_PACKET_SIZE; i++) {
		if (!fifo_get(&txfifo, &abBulkBuf[i])) {
			break;
		}
	}
	iLen = i;
	
	// send over USB
	if (iLen > 0) {
		USBHwEPWrite(bEP, abBulkBuf, iLen);
	}
}


/**
	Local function to handle the USB-CDC class requests
		
	@param [in] pSetup
	@param [out] piLen
	@param [out] ppbData
 */
static BOOL HandleClassRequest(TSetupPacket *pSetup, int *piLen, U8 **ppbData)
{
	switch (pSetup->bRequest) {

	// set line coding
	case SET_LINE_CODING:
DBG("SET_LINE_CODING\n");
		memcpy((U8 *)&LineCoding, *ppbData, 7);
		*piLen = 7;
DBG("dwDTERate=%u, bCharFormat=%u, bParityType=%u, bDataBits=%u\n",
	LineCoding.dwDTERate,
	LineCoding.bCharFormat,
	LineCoding.bParityType,
	LineCoding.bDataBits);
		break;

	// get line coding
	case GET_LINE_CODING:
DBG("GET_LINE_CODING\n");
		*ppbData = (U8 *)&LineCoding;
		*piLen = 7;
		break;

	// set control line state
	case SET_CONTROL_LINE_STATE:
		// bit0 = DTR, bit = RTS
DBG("SET_CONTROL_LINE_STATE %X\n", pSetup->wValue);
		break;

	default:
		return FALSE;
	}
	return TRUE;
}


/**
	Initialises the VCOM port.
	Call this function before using VCOM_putchar or VCOM_getchar
 */
void VCOM_init(void)
{
	fifo_init(&txfifo, txdata);
	fifo_init(&rxfifo, rxdata);
}


/**
	Writes one character to VCOM port
	
	@param [in] c character to write
	@returns character written, or EOF if character could not be written
 */
int VCOM_putchar(int c)
{
	return fifo_put(&txfifo, c) ? c : EOF;
}


/**
	Reads one character from VCOM port
	
	@returns character read, or EOF if character could not be read
 */
int VCOM_getchar(void)
{
	U8 c;
	
	return fifo_get(&rxfifo, &c) ? c : EOF;
}


/**
	Interrupt handler
	
	Simply calls the USB ISR, then signals end of interrupt to VIC
 */
static void USBIntHandler(void)
{
	USBHwISR();
	VICVectAddr = 0x00;    // dummy write to VIC to signal end of ISR 	
}


static void USBFrameHandler(U16 wFrame)
{
	if (fifo_avail(&txfifo) > 0) {
		// data available, enable NAK interrupt on bulk in
		USBHwNakIntEnable(INACK_BI);
	}
}

/*************************************************************************
	main
	====
**************************************************************************/
int main(void)
{
	int c;
	
	// PLL and MAM
	Initialize();

	// init DBG
	ConsoleInit(60000000 / (16 * BAUD_RATE));

	DBG("Initialising USB stack\n");

	// initialise stack
	USBInit();

	// register descriptors
	USBRegisterDescriptors(abDescriptors);

	// register class request handler
	USBRegisterRequestHandler(REQTYPE_TYPE_CLASS, HandleClassRequest, abClassReqData);

	// register endpoint handlers
	USBHwRegisterEPIntHandler(INT_IN_EP, NULL);
	USBHwRegisterEPIntHandler(BULK_IN_EP, BulkIn);
	USBHwRegisterEPIntHandler(BULK_OUT_EP, BulkOut);
	
	// register frame handler
	USBHwRegisterFrameHandler(USBFrameHandler);

	// enable bulk-in interrupts on NAKs
	USBHwNakIntEnable(INACK_BI);

	// initialise VCOM
	VCOM_init();

	DBG("Starting USB communication\n");

	// set up USB interrupt
	VICIntSelect &= ~(1<<22);               // select IRQ for USB
	VICIntEnable |= (1<<22);

	(*(&VICVectCntl0+INT_VECT_NUM)) = 0x20 | 22; // choose highest priority ISR slot 	
	(*(&VICVectAddr0+INT_VECT_NUM)) = (int)USBIntHandler;
	
	enableIRQ();

	// connect to bus
	USBHwConnect(TRUE);

	// echo any character received (do USB stuff in interrupt)
	while (1) {
		c = VCOM_getchar();
		if (c != EOF) {
			// show on console
			if ((c == 9) || (c == 10) || (c == 13) || ((c >= 32) && (c <= 126))) {
				DBG("%c", c);
			}
			else {
				DBG(".");
			}
			VCOM_putchar(c);
		}
	}

	return 0;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一本久久综合亚洲鲁鲁五月天 | 一区2区3区在线看| 麻豆精品新av中文字幕| 欧美一个色资源| 久99久精品视频免费观看| 欧美一区二区在线观看| 精品一区二区三区久久久| 久久久99精品免费观看| 成人黄色777网| 一区二区三区四区在线免费观看| 欧洲精品中文字幕| 视频一区视频二区在线观看| 日韩免费观看高清完整版在线观看| 激情图片小说一区| 国产精品免费久久久久| 色婷婷av一区二区三区大白胸| 亚洲成人av中文| 久久综合久久综合久久综合| 成人av在线网站| 亚洲国产精品视频| 精品三级在线看| 99精品视频免费在线观看| 亚洲国产日日夜夜| 2020国产成人综合网| 91婷婷韩国欧美一区二区| 婷婷夜色潮精品综合在线| 26uuu色噜噜精品一区| 91麻豆自制传媒国产之光| 日本亚洲欧美天堂免费| 亚洲国产精品二十页| 欧美剧在线免费观看网站| 国产精品一区二区久久不卡 | 亚洲二区在线观看| 亚洲精品一区二区三区福利| 91黄色免费网站| 久久电影网站中文字幕| 综合激情成人伊人| 精品日韩欧美一区二区| 91在线国产福利| 国内精品久久久久影院一蜜桃| 亚洲欧美另类在线| 精品福利视频一区二区三区| 一本久久综合亚洲鲁鲁五月天 | 91麻豆精东视频| 欧美aaaaaa午夜精品| 亚洲天堂免费看| 久久久精品免费免费| 777奇米四色成人影色区| 成人av在线一区二区| 国内精品伊人久久久久影院对白| 一区二区三区美女视频| 亚洲国产成人在线| 日韩精品自拍偷拍| 日本电影欧美片| 成人妖精视频yjsp地址| 美女mm1313爽爽久久久蜜臀| 亚洲v精品v日韩v欧美v专区| 亚洲视频 欧洲视频| 欧美激情艳妇裸体舞| 精品国产亚洲在线| 91精品国产综合久久小美女| 91麻豆成人久久精品二区三区| 国产精品资源网站| 久久国内精品视频| 日本欧美在线看| 性做久久久久久| 亚洲第一狼人社区| 亚洲一二三四久久| 亚洲免费观看视频| 亚洲精品国产一区二区三区四区在线| 国产清纯白嫩初高生在线观看91| 精品国产乱码久久久久久图片 | 这里只有精品免费| 欧美日韩免费观看一区三区| 色综合中文综合网| 波多野结衣一区二区三区| 国内精品伊人久久久久av一坑| 免费国产亚洲视频| 麻豆精品视频在线| 精品一区二区免费在线观看| 老司机一区二区| 国产一区二区看久久| 国产乱码精品一区二区三区忘忧草| 精品一区二区免费| 福利91精品一区二区三区| 岛国精品一区二区| 成人av电影免费在线播放| 91亚洲永久精品| 欧美在线看片a免费观看| 欧美日韩在线一区二区| 欧美精品亚洲一区二区在线播放| 欧美久久久久久久久| 欧美大片在线观看一区| 久久蜜桃av一区精品变态类天堂| 久久这里只有精品视频网| 日本一区二区三级电影在线观看 | 欧美激情一区不卡| 亚洲欧美日韩国产一区二区三区| 亚洲男帅同性gay1069| 亚洲图片欧美色图| 久久国内精品自在自线400部| 国产精品一级在线| 97久久超碰国产精品电影| 欧美亚洲动漫制服丝袜| 日韩欧美一级片| 国产精品丝袜91| 亚洲国产日日夜夜| 激情另类小说区图片区视频区| 国产激情一区二区三区四区| 91在线看国产| 91精品综合久久久久久| 国产亚洲精品bt天堂精选| 亚洲人精品午夜| 日本视频中文字幕一区二区三区| 国产宾馆实践打屁股91| 色婷婷综合视频在线观看| 日韩欧美aaaaaa| 中文字幕一区二区三区视频 | 中文字幕日韩av资源站| 天堂va蜜桃一区二区三区漫画版| 狠狠色狠狠色综合日日91app| 91香蕉视频mp4| 日韩三级电影网址| 综合精品久久久| 久久97超碰国产精品超碰| 色婷婷精品大在线视频| 精品国产伦一区二区三区免费| 亚洲精品免费在线| 久久国产三级精品| 色偷偷久久一区二区三区| 精品久久久久久久人人人人传媒| 一区二区三区在线视频观看| 国产综合色产在线精品| 欧美性大战久久久久久久| 中文字幕+乱码+中文字幕一区| 日韩高清欧美激情| 99国产欧美另类久久久精品| 精品国内片67194| 亚洲电影激情视频网站| 99视频在线观看一区三区| 26uuu久久综合| 午夜电影网亚洲视频| 成人免费看视频| 精品久久国产老人久久综合| 性做久久久久久免费观看欧美| 91尤物视频在线观看| 欧美激情一区不卡| 国产一区视频导航| 日韩色视频在线观看| 亚洲成人激情综合网| 91啪九色porn原创视频在线观看| 久久久99精品免费观看| 久久精品国产77777蜜臀| 欧美一区二区三区白人| 亚洲国产欧美在线| 色天天综合色天天久久| 国产精品久久久久久久久果冻传媒| 精品系列免费在线观看| 欧美一级理论性理论a| 亚洲成a人在线观看| 在线一区二区三区四区| 亚洲精品国产一区二区精华液 | 成人午夜av电影| 久久综合网色—综合色88| 男男视频亚洲欧美| 91精品国产免费久久综合| 爽好多水快深点欧美视频| 精品一区二区日韩| 久久久久久久电影| 国产精品一二三在| 国产欧美精品一区aⅴ影院| 精品一二三四区| 久久久久久久综合狠狠综合| 久久国产三级精品| 久久嫩草精品久久久久| 国产一区二区三区在线观看免费| 久久一区二区视频| 高清不卡一二三区| 成人欧美一区二区三区白人| 91视频在线观看免费| 亚洲男人的天堂av| 欧美性猛交xxxx乱大交退制版| 亚洲成人在线免费| 日韩一区二区在线观看视频播放| 日本sm残虐另类| 国产欧美一区二区三区网站| 成人福利视频在线| 亚洲成a天堂v人片| 2024国产精品| 91视频在线观看| 青草国产精品久久久久久| 亚洲精品在线免费观看视频| 丁香五精品蜜臀久久久久99网站| 中文字幕一区三区| 欧美精品乱码久久久久久按摩 | 首页欧美精品中文字幕| 欧美精品一区二区三区高清aⅴ | 蜜臀精品久久久久久蜜臀| 国产性做久久久久久| 91免费视频大全|