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

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

?? usbdrv.c

?? USB programmer For AVR
?? C
字號:
/* Name: usbdrv.c * Project: AVR USB driver * Author: Christian Starkjohann * Creation Date: 2004-12-29 * Tabsize: 4 * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH * License: Proprietary, free under certain conditions. See Documentation. * This Revision: $Id: usbdrv.c 53 2005-04-12 17:11:29Z cs $ */#include <avr/io.h>#include <avr/pgmspace.h>#include "usbdrv.h"#include "oddebug.h"/*General Description:This module implements the C-part of the USB driver. See usbdrv.h for adocumentation of the entire driver.*//* ------------------------------------------------------------------------- *//* raw USB registers / interface to assembler code: *//* usbRxBuf MUST be in 1 byte addressable range (because usbInputBuf is only 1 byte) */static char	usbRxBuf[2][USB_BUFSIZE];/* raw RX buffer: PID, 8 bytes data, 2 bytes CRC */uchar		usbDeviceId;		/* assigned during enumeration, defaults to 0 */uchar		usbInputBuf;		/* ptr to raw buffer used for receiving */uchar		usbAppBuf;			/* ptr to raw buffer passed to app for processing */volatile char usbRxLen;			/* = 0; number of bytes in usbAppBuf; 0 means free */uchar		usbCurrentTok;		/* last token received */uchar		usbRxToken;			/* token for data we received */uchar		usbMsgLen = 0xff;	/* remaining number of bytes, no msg to send if -1 (see usbMsgPtr) */volatile char usbTxLen = -1;	/* number of bytes to transmit with next IN token */uchar		usbTxBuf[USB_BUFSIZE];/* data to transmit with next IN, free if usbTxLen == -1 */#if USB_CFG_HAVE_INTRIN_ENDPOINT/* uchar		usbRxEndp;		endpoint which was addressed (1 bit in MSB) [not impl] */volatile char usbTxLen1 = -1;	/* TX count for endpoint 1 */uchar		usbTxBuf1[USB_BUFSIZE];/* TX data for endpoint 1 */#endifuchar		usbAckBuf[1] = {USBPID_ACK};	/* transmit buffer for ack tokens */uchar		usbNakBuf[1] = {USBPID_NAK};	/* transmit buffer for nak tokens *//* USB status registers / not shared with asm code */uchar			*usbMsgPtr;		/* data to transmit next -- ROM or RAM address */static uchar	usbMsgFlags;	/* flag values see below */static uchar	usbNewDeviceId;	/* = 0; device ID which should be set after status phase */static uchar	usbIsReset;		/* = 0; USB bus is in reset phase */#define	USB_FLG_TX_PACKET		(1<<0)/* Leave free 6 bits after TX_PACKET. This way we can increment usbMsgFlags to toggle TX_PACKET */#define	USB_FLG_MSGPTR_IS_ROM	(1<<6)#define	USB_FLG_USE_DEFAULT_RW	(1<<7)/*optimizing hints:- do not post/pre inc/dec integer values in operations- assign value of PRG_RDB() to register variables and don't use side effects in arg- use narrow scope for variables which should be in X/Y/Z register- assign char sized expressions to variables to force 8 bit arithmetics*//* ------------------------------------------------------------------------- */static char	usbDescrDevice[] PROGMEM = {	/* USB device descriptor */	18,			/* sizeof(usbDescrDevice): length of descriptor in bytes */	1,			/* descriptor type */	0x01, 0x01,	/* USB version supported */	USB_CFG_DEVICE_CLASS,	USB_CFG_DEVICE_SUBCLASS,	0,			/* protocol */	8,			/* max packet size */	USB_CFG_VENDOR_ID,	/* 2 bytes */	USB_CFG_DEVICE_ID,	/* 2 bytes */	USB_CFG_DEVICE_VERSION,	/* 2 bytes */#if USB_CFG_VENDOR_NAME_LEN	1,			/* manufacturer string index */#else	0,			/* manufacturer string index */#endif#if USB_CFG_DEVICE_NAME_LEN	2,			/* product string index */#else	0,			/* product string index */#endif	0,			/* serial number string index */	1,			/* number of configurations */};static char	usbDescrConfig[] PROGMEM = {	/* USB configuration descriptor */	9,			/* sizeof(usbDescrConfig): length of descriptor in bytes */	2,			/* descriptor type */	(18 + 7 * USB_CFG_HAVE_INTRIN_ENDPOINT), 0,	/* total length of data returned (including inlined descriptors) */	1,			/* number of interfaces in this configuration */	1,			/* index of this configuration */	0,			/* configuration name string index */#if USB_CFG_IS_SELF_POWERED	USBATTR_SELFPOWER,	/* attributes */#else	USBATTR_BUSPOWER,	/* attributes */#endif	USB_CFG_MAX_BUS_POWER/2,			/* max USB current in 2mA units *//* interface descriptor follows inline: */	9,			/* sizeof(usbDescrInterface): length of descriptor in bytes */	4,			/* descriptor type */	0,			/* index of this interface */	0,			/* alternate setting for this interface */	USB_CFG_HAVE_INTRIN_ENDPOINT,	/* endpoints excl 0: number of endpoint descriptors to follow */	USB_CFG_INTERFACE_CLASS,	USB_CFG_INTERFACE_SUBCLASS,	USB_CFG_INTERFACE_PROTOCOL,	0,			/* string index for interface */#if USB_CFG_HAVE_INTRIN_ENDPOINT	/* endpoint descriptor for endpoint 1 */	7,			/* sizeof(usbDescrEndpoint) */	5,			/* descriptor type = endpoint */	0x81,		/* IN endpoint number 1 */	0x03,		/* attrib: Interrupt endpoint */	8, 0,		/* maximum packet size */	USB_CFG_INTR_POLL_INTERVAL,	/* in ms */#endif};static char	usbDescrString0[] PROGMEM = {	/* language descriptor */	4,			/* sizeof(usbDescrString0): length of descriptor in bytes */	3,			/* descriptor type */	0x09, 0x04,	/* language index (0x0409 = US-English) */};#if USB_CFG_VENDOR_NAME_LENstatic int	usbDescrString1[] PROGMEM = {	(2 * USB_CFG_VENDOR_NAME_LEN + 2) | (3<<8),	/* length of descriptor in bytes | descriptor type */	USB_CFG_VENDOR_NAME};#endif#if USB_CFG_DEVICE_NAME_LENstatic int	usbDescrString2[] PROGMEM = {	(2 * USB_CFG_DEVICE_NAME_LEN + 2) | (3<<8),	/* length of descriptor in bytes | descriptor type */	USB_CFG_DEVICE_NAME};#endif/* We don't use prog_int or prog_int16_t for compatibility with various libc * versions. Here's an other compatibility hack: */#ifndef PRG_RDB#define	PRG_RDB(addr)	pgm_read_byte(addr)#endiftypedef union{	unsigned	word;	uchar		*ptr;	uchar		bytes[2];}converter_t;/* We use this union to do type conversions. This is better optimized than * type casts in gcc 3.4.3 and much better than using bit shifts to build * ints from chars. Byte ordering is not a problem on an 8 bit platform. *//* ------------------------------------------------------------------------- */#if USB_CFG_HAVE_INTRIN_ENDPOINTstatic uchar	usbTxPacketCnt1;void	usbSetInterrupt(uchar *data, uchar len){uchar		*p, i;converter_t	crc;	if(len > 7)		len = 7;	i = USBPID_DATA1;	if(usbTxPacketCnt1 & 1)		i = USBPID_DATA0;	if(usbTxLen1 < 0){		/* packet buffer was empty */		usbTxPacketCnt1++;	}else{		usbTxLen1 = -1;		/* avoid sending incomplete interrupt data */	}	p = usbTxBuf1;	*p++ = i;	for(i=len;i--;)		*p++ = *data++;	crc.word = usbCrc16(&usbTxBuf1[1], len);	usbTxBuf1[len + 1] = crc.bytes[0];	usbTxBuf1[len + 2] = crc.bytes[1];	usbTxLen1 = len + 4;	/* len must be given including sync byte */}#endifstatic void	usbWrite(uchar *data, uchar len){#if USB_CFG_IMPLEMENT_FN_WRITE	if(!(usbMsgFlags & USB_FLG_USE_DEFAULT_RW)){		if(usbFunctionWrite(data, len) == 0xff){	/* an error occurred */			/* usbMsgLen = 0xff; cancel potentially pending ACK [has been done by ASM module when OUT token arrived] */			usbTxBuf[0] = USBPID_STALL;			usbTxLen = 2;		/* length including sync byte */			return;		}	}#endif	usbMsgLen = 0;		/* send zero-sized block as ACK */	usbMsgFlags = 0;	/* start with a DATA1 package */}static uchar	usbRead(uchar *data, uchar len){#if USB_CFG_IMPLEMENT_FN_READ	if(usbMsgFlags & USB_FLG_USE_DEFAULT_RW){#endif		uchar i = len, *r = usbMsgPtr;		if(usbMsgFlags & USB_FLG_MSGPTR_IS_ROM){	/* ROM data */			while(i--){				char c = PRG_RDB(r);	/* assign to char size variable to enforce byte ops */				*data++ = c;				r++;			}		}else{					/* RAM data */			while(i--)				*data++ = *r++;		}		usbMsgPtr = r;		return len;#if USB_CFG_IMPLEMENT_FN_READ	}else{		if(len != 0)	/* don't bother app with 0 sized reads */			return usbFunctionRead(data, len);		return 0;	}#endif}/* Don't make this function static to avoid inlining. * The entire function would become too large and exceed the range of * relative jumps. */void	usbProcessRx(uchar *data, uchar len){/* We use if() cascades because the compare is done byte-wise while switch() * is int-based. The if() cascades are therefore more efficient. */	DBG2(0x10 + (usbRxToken == (uchar)USBPID_SETUP), data, len);	if(usbRxToken == (uchar)USBPID_SETUP){		uchar replyLen = 0, flags = USB_FLG_USE_DEFAULT_RW;		if(len == 8){	/* Setup size must be always 8 bytes. Ignore otherwise. */			uchar type = data[0] & (3 << 5);			if(type == USBRQ_TYPE_STANDARD << 5){				uchar *replyData = usbTxBuf + 9; /* there is 3 bytes free space at the end of the buffer */				replyData[0] = 0;				if(data[1] == 0){/* GET_STATUS */#if USB_CFG_IS_SELF_POWERED					uchar recipient = data[0] & 0x1f;	/* assign arith ops to variables to enforce byte size */					if(recipient == USBRQ_RCPT_DEVICE)						replyData[0] =  USB_CFG_IS_SELF_POWERED;#endif					replyData[1] = 0;					replyLen = 2;				}else if(data[1] == 5){		/* SET_ADDRESS */					usbNewDeviceId = data[2];				}else if(data[1] == 6){		/* GET_DESCRIPTOR */					flags = USB_FLG_MSGPTR_IS_ROM | USB_FLG_USE_DEFAULT_RW;					if(data[3] == 1){		/* descriptor type requested */						replyLen = sizeof(usbDescrDevice);						replyData = (uchar *)usbDescrDevice;					}else if(data[3] == 2){						replyLen = sizeof(usbDescrConfig);						replyData = (uchar *)usbDescrConfig;					}else if(data[3] == 3){	/* string descriptor */						if(data[2] == 0){	/* descriptor index */							replyLen = sizeof(usbDescrString0);							replyData = (uchar *)usbDescrString0;#if USB_CFG_VENDOR_NAME_LEN						}else if(data[2] == 1){							replyLen = sizeof(usbDescrString1);							replyData = (uchar *)usbDescrString1;#endif#if USB_CFG_DEVICE_NAME_LEN						}else if(data[2] == 2){							replyLen = sizeof(usbDescrString2);							replyData = (uchar *)usbDescrString2;#endif						}					}				}else if(data[1] == 8){		/* GET_CONFIGURATION */					replyLen = 1;					replyData[0] = 1;	/* config is always 1, no setConfig required */				}else if(data[1] == 10){	/* GET_INTERFACE */					replyLen = 1;#if USB_CFG_HAVE_INTRIN_ENDPOINT				}else if(data[1] == 11){	/* SET_INTERFACE */					usbTxPacketCnt1 = 0;	/* reset data toggling for interrupt socket */#endif				}else{					/* the following requests can be ignored, send default reply */					/* 1: CLEAR_FEATURE, 3: SET_FEATURE, 7: SET_DESCRIPTOR */					/* 9: SET_CONFIGURATION, 11: SET_INTERFACE, 12: SYNCH_FRAME */				}				usbMsgPtr = replyData;				if(!data[7] && replyLen > data[6])	/* max length is in data[7]:data[6] */					replyLen = data[6];			}else{	/* not a standard request -- must be vendor or class request */#if USB_CFG_IMPLEMENT_FN_READ || USB_CFG_IMPLEMENT_FN_WRITE				uchar	len;				replyLen = data[6];	/* if this is an OUT operation, the next token will reset usbMsgLen */				if((len = usbFunctionSetup(data)) != 0xff){					replyLen = len;				}else{					flags = 0;	/* we have no valid msg, use read/write functions */				}#else				replyLen = usbFunctionSetup(data);#endif			}		}		usbMsgLen = replyLen;		usbMsgFlags = flags;	}else{	/* out request */		usbWrite(data, len);	}}/* ------------------------------------------------------------------------- */static void	usbBuildTxBlock(void){uchar		wantLen, len, txLen, x;converter_t	crc;	x = USBPID_DATA1;	if(usbMsgFlags & USB_FLG_TX_PACKET)		x = USBPID_DATA0;	usbMsgFlags++;	usbTxBuf[0] = x;	wantLen = usbMsgLen;	if(wantLen > 8)		wantLen = 8;	usbMsgLen -= wantLen;	len = usbRead(usbTxBuf + 1, wantLen);	if(len <= 8){	/* valid data packet */		crc.word = usbCrc16(&usbTxBuf[1], len);		usbTxBuf[len + 1] = crc.bytes[0];		usbTxBuf[len + 2] = crc.bytes[1];		txLen = len + 4;	/* length including sync byte */		if(len < 8)		/* a partial package identifies end of message */			usbMsgLen = 0xff;	}else{		usbTxBuf[0] = USBPID_STALL;		txLen = 2;	/* length including sync byte */		usbMsgLen = 0xff;	}	usbTxLen = txLen;	DBG2(0x20, usbTxBuf, txLen-1);}static inline uchar	isNotSE0(void){uchar	rval;/* We want to do *     return (USBIN & USBMASK); * here, but the compiler does int-expansion acrobatics. * We can avoid this by assigning to a char-sized variable. */	rval = USBIN & USBMASK;	return rval;}/* ------------------------------------------------------------------------- */void	usbPoll(void){uchar	len;	if((len = usbRxLen) > 0){/* We could check CRC16 here -- but ACK has already been sent anyway. If you * need data integrity checks with this driver, check the CRC in your app * code and report errors back to the host. Since the ACK was already sent, * retries must be handled on application level. * unsigned crc = usbCrc16((uchar *)(unsigned)(usbAppBuf + 1), usbRxLen - 3); */		len -= 3;	/* remove PID and CRC */		if(len < 128){			usbProcessRx((uchar *)(unsigned)(usbAppBuf + 1), len);		}		usbRxLen = 0;	/* mark rx buffer as available */	}	if(usbTxLen < 0){	/* TX system is idle */		if(usbMsgLen != 0xff){			usbBuildTxBlock();		}else if(usbNewDeviceId){			usbDeviceId = usbNewDeviceId;			DBG1(1, &usbNewDeviceId, 1);			usbNewDeviceId = 0;		}	}	if(isNotSE0()){	/* SE0 state */		usbIsReset = 0;	}else{		/* check whether SE0 lasts for more than 2.5us (3.75 bit times) */		if(!usbIsReset){			uchar i;			for(i=100;i;i--){				if(isNotSE0())					goto notUsbReset;			}			usbIsReset = 1;			usbDeviceId = 0;			usbNewDeviceId = 0;			DBG1(0xff, 0, 0);notUsbReset:;		}	}}/* ------------------------------------------------------------------------- */void	usbInit(void){	usbInputBuf = (uchar)usbRxBuf[0];	usbAppBuf = (uchar)usbRxBuf[1];#if USB_INTR_CFG_SET != 0	USB_INTR_CFG |= USB_INTR_CFG_SET;#endif#if USB_INTR_CFG_CLR != 0	USB_INTR_CFG &= ~(USB_INTR_CFG_CLR);#endif	USB_INTR_ENABLE |= (1 << USB_INTR_ENABLE_BIT);}/* ------------------------------------------------------------------------- */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产一区二区在线看| 国产三级精品三级| 色婷婷亚洲精品| 成人国产精品免费观看| 成人午夜伦理影院| 成人免费视频网站在线观看| 懂色av一区二区在线播放| 色综合天天天天做夜夜夜夜做| 成人av网站在线观看| 国产一区二区美女诱惑| 国内不卡的二区三区中文字幕 | 日韩精品一区在线观看| 91精品国产一区二区人妖| 911精品产国品一二三产区| 91精品国产麻豆国产自产在线| 欧美午夜宅男影院| 91精品国产综合久久婷婷香蕉| 日韩一区二区在线观看视频播放| 精品精品国产高清a毛片牛牛 | 国产精品99久久久久久久vr| 国产精品一级在线| 成人av免费网站| 日本久久一区二区| 亚洲成a人v欧美综合天堂下载| 欧美在线免费视屏| 欧美美女黄视频| 在线观看91精品国产麻豆| 欧美精品一区二| 亚洲欧洲av一区二区三区久久| 亚洲一区二区美女| 久久er99精品| 91小视频在线免费看| 日韩一区二区在线观看视频| 久久久久久久久久看片| 亚洲一区二区三区在线播放| 奇米影视在线99精品| va亚洲va日韩不卡在线观看| 91精品国产综合久久小美女 | 国产一区二区三区在线观看免费| av亚洲精华国产精华精| 777a∨成人精品桃花网| 国产精品久久一级| 精品日韩在线一区| 欧美日韩美少妇| 精品国产免费视频| 一区二区三区精密机械公司| 免费看精品久久片| 色综合久久久网| 精品国产电影一区二区| 亚洲综合一二三区| 国产a久久麻豆| 91麻豆精品国产91久久久久久| 国产区在线观看成人精品| 天使萌一区二区三区免费观看| 国产aⅴ精品一区二区三区色成熟| 欧美日韩精品专区| 亚洲你懂的在线视频| 精品中文字幕一区二区| 色综合久久久久综合体| 国产精品免费人成网站| 久久99国产精品久久99果冻传媒| 欧洲亚洲国产日韩| 亚洲欧美日韩电影| 丁香婷婷综合五月| 久久久久久久久久久99999| 日本在线观看不卡视频| 欧美日韩在线三区| 亚洲最大成人网4388xx| 91美女在线视频| 久久综合狠狠综合久久综合88| 婷婷夜色潮精品综合在线| 99国产精品国产精品久久| 中文在线资源观看网站视频免费不卡| 日本欧美一区二区三区乱码| 欧美高清精品3d| 亚洲国产精品一区二区久久恐怖片| 成人综合激情网| 精品国产成人系列| 国产成人免费av在线| 久久久三级国产网站| 国产98色在线|日韩| 91麻豆精品国产自产在线 | 欧美精品一区二区三区高清aⅴ| 午夜欧美一区二区三区在线播放| 欧美视频自拍偷拍| 五月婷婷欧美视频| 日韩精品一区二区三区四区视频| 蜜臀av性久久久久蜜臀aⅴ| 欧美v亚洲v综合ⅴ国产v| 久久超级碰视频| 国产日韩在线不卡| 色悠悠久久综合| 亚洲成精国产精品女| 91精品国产综合久久久久久久| 日本sm残虐另类| 久久久精品黄色| 成人国产在线观看| 亚洲影院理伦片| 欧美一区二区三区视频在线观看| 经典三级视频一区| 中文在线资源观看网站视频免费不卡| 91在线视频播放地址| 亚洲一区在线观看免费| 91精品国产综合久久久久久| 国精产品一区一区三区mba桃花| 欧美国产激情一区二区三区蜜月| 99在线热播精品免费| 日产精品久久久久久久性色| 久久久久久97三级| 在线观看国产日韩| 日本伊人色综合网| 国产精品美女久久久久久久久| 91麻豆精东视频| 精品无人区卡一卡二卡三乱码免费卡| 国产欧美综合色| 在线精品视频免费观看| 韩国精品久久久| 亚洲宅男天堂在线观看无病毒 | 狠狠色伊人亚洲综合成人| 中文字幕欧美激情| 日韩欧美国产综合| 成年人国产精品| 亚洲.国产.中文慕字在线| 国产欧美日韩中文久久| 欧美四级电影网| 粉嫩aⅴ一区二区三区四区| 五月综合激情网| 综合久久久久久久| 久久免费电影网| 欧美一区二区三区视频免费| 色综合久久天天综合网| 粉嫩高潮美女一区二区三区 | 日韩视频在线你懂得| 色8久久精品久久久久久蜜| 国精品**一区二区三区在线蜜桃| 午夜精品视频一区| 亚洲老妇xxxxxx| 欧美国产日韩a欧美在线观看| 欧美大度的电影原声| 欧美精品v日韩精品v韩国精品v| 99热这里都是精品| 懂色av中文一区二区三区| 麻豆久久久久久| 日韩福利视频网| 亚洲成人在线免费| 一区二区三区毛片| 中文字幕一区av| 亚洲人成亚洲人成在线观看图片| 精品黑人一区二区三区久久| 91精品啪在线观看国产60岁| 欧美在线免费播放| 欧洲一区在线电影| 欧美三级日本三级少妇99| 91麻豆文化传媒在线观看| 成人丝袜18视频在线观看| 国产盗摄视频一区二区三区| 国产美女久久久久| 国产在线视视频有精品| 国产乱人伦偷精品视频不卡 | 亚洲欧美日本韩国| 亚洲免费看黄网站| 亚洲综合视频在线观看| 亚洲午夜在线观看视频在线| 视频一区中文字幕国产| 日韩黄色一级片| 狠狠v欧美v日韩v亚洲ⅴ| 国产在线看一区| 国产ts人妖一区二区| 91丨九色丨国产丨porny| 91免费看视频| 欧美丰满少妇xxxxx高潮对白| 欧美裸体一区二区三区| 欧美精品一区二区三区一线天视频| 日韩三级免费观看| 亚洲国产精华液网站w| 亚洲色图另类专区| 婷婷久久综合九色国产成人| 日av在线不卡| 国产精品影视在线观看| 成人av网站大全| 欧美色图天堂网| 欧美精品一区二区久久久| 亚洲国产精品精华液2区45| 亚洲一区免费视频| 视频一区中文字幕| 成人免费黄色在线| 色偷偷久久一区二区三区| 欧美美女黄视频| 国产欧美视频一区二区三区| 亚洲精品国产视频| 婷婷开心激情综合| 国产一区二区三区在线观看免费视频 | 欧美mv和日韩mv的网站| 国产精品白丝在线| 男女男精品视频网| 成人av电影在线| 欧美乱妇20p| 国产丝袜欧美中文另类| 香蕉av福利精品导航| 国产成人亚洲综合a∨婷婷|