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

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

?? usbdrv.c

?? USB-ASP下載線的制作完整資料,搞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一区二区三区免费野_久草精品视频
91麻豆精品国产无毒不卡在线观看| 久久久久久久久久久黄色| 欧美日韩亚洲丝袜制服| 久久夜色精品一区| 亚洲丶国产丶欧美一区二区三区| 国模无码大尺度一区二区三区| 色噜噜狠狠成人中文综合| 欧美tk—视频vk| 亚洲mv在线观看| 成人av在线观| 久久久99精品免费观看不卡| 午夜视频久久久久久| 91在线国产福利| 久久婷婷成人综合色| 丝袜美腿亚洲综合| 欧美亚洲另类激情小说| 国产精品乱人伦一区二区| 九九视频精品免费| 欧美日韩国产一区二区三区地区| 中文字幕在线一区免费| 欧美精品精品一区| 国产精品久久久久婷婷二区次| 久久丁香综合五月国产三级网站| 欧美男生操女生| 亚洲另类在线制服丝袜| 99精品视频一区二区三区| 久久综合久久综合亚洲| 麻豆成人91精品二区三区| 欧美日韩五月天| 亚洲一区二区在线免费看| 91视视频在线直接观看在线看网页在线看| 久久伊99综合婷婷久久伊| 久久精品99国产精品| 日韩欧美aaaaaa| 久久精品国产77777蜜臀| 日韩一级视频免费观看在线| 日韩二区三区四区| 日韩午夜激情免费电影| 麻豆国产一区二区| 精品国产91九色蝌蚪| 精品系列免费在线观看| 欧美精品一区在线观看| 国产福利不卡视频| 国产日韩欧美一区二区三区综合| 国产成人小视频| 国产精品美女久久久久aⅴ| 成人免费看黄yyy456| 国产精品久久久久久久久动漫 | 久久女同性恋中文字幕| 国产一区在线精品| 中文字幕免费不卡| 色综合咪咪久久| 五月激情丁香一区二区三区| 欧美一区二区三区在线| 国产乱国产乱300精品| 国产精品色婷婷| 欧美日韩三级视频| 精品在线你懂的| 国产精品美女久久久久久久久 | 国产精品国产三级国产aⅴ入口 | 国产成人精品一区二区三区四区 | 国产iv一区二区三区| 中文字幕av一区 二区| 一本久久a久久免费精品不卡| 亚洲国产精品自拍| 久久人人97超碰com| 色综合久久久久综合| 蜜臀久久久99精品久久久久久| 久久久美女艺术照精彩视频福利播放| 成人毛片老司机大片| 午夜精品久久久久久久蜜桃app| 精品国产免费一区二区三区四区 | 国产精品亲子伦对白| 欧美自拍偷拍一区| 九九国产精品视频| 亚洲日本韩国一区| 久久综合国产精品| 欧美性受极品xxxx喷水| 国产一区二区91| 亚洲va国产天堂va久久en| 久久无码av三级| 欧美日韩国产精品自在自线| 国产激情视频一区二区三区欧美| 亚洲图片欧美色图| 国产精品丝袜一区| 日韩一级高清毛片| 日本高清成人免费播放| 国产传媒一区在线| 五月天欧美精品| 亚洲精品福利视频网站| 欧美国产精品专区| 欧美电影免费观看高清完整版| 色又黄又爽网站www久久| 国产精品一区二区三区99| 亚洲国产精品人人做人人爽| 国产精品久久综合| 26uuu精品一区二区在线观看| 欧美午夜片在线看| 色综合咪咪久久| 成人激情视频网站| 国产精品99久久久久久有的能看| 日本亚洲三级在线| 亚洲地区一二三色| 一区二区三区四区中文字幕| 国产精品免费视频观看| www久久久久| 欧美大白屁股肥臀xxxxxx| 欧美日高清视频| 欧美私人免费视频| 91黄视频在线观看| 日本电影欧美片| 91久久香蕉国产日韩欧美9色| av毛片久久久久**hd| 福利电影一区二区三区| 国模无码大尺度一区二区三区| 免费精品视频最新在线| 日本中文字幕一区| 日本欧洲一区二区| 麻豆精品视频在线观看视频| 日本成人在线一区| 看片网站欧美日韩| 精品一区二区三区不卡| 国模一区二区三区白浆| 国精产品一区一区三区mba视频 | 久久综合色鬼综合色| 久久久久久综合| 中国色在线观看另类| 中文字幕欧美一| 亚洲激情五月婷婷| 图片区日韩欧美亚洲| 久久99精品久久久久婷婷| 韩国av一区二区三区在线观看| 国内精品免费在线观看| 不卡视频在线看| 欧美无乱码久久久免费午夜一区| 欧美日韩国产123区| 精品国产乱码久久久久久免费| 久久日一线二线三线suv| 国产精品女同一区二区三区| 一区二区三区四区在线| 免费欧美在线视频| 成人做爰69片免费看网站| 不卡的电影网站| 欧美优质美女网站| 色噜噜狠狠色综合中国| 欧美日韩一区二区电影| 91麻豆自制传媒国产之光| 欧美一区二区久久久| 欧美mv和日韩mv国产网站| 久久久久久久综合色一本| 精品国产1区二区| 亚洲美腿欧美偷拍| 天天av天天翘天天综合网 | 久久精品亚洲精品国产欧美kt∨| 亚洲国产电影在线观看| 国产精品精品国产色婷婷| 一区二区三区小说| 欧美a一区二区| 色香蕉久久蜜桃| 制服丝袜亚洲网站| 久久精品在线免费观看| 亚洲欧洲国产专区| 久久国产生活片100| av在线不卡电影| 欧美日韩一区在线| 精品福利二区三区| 亚洲精品乱码久久久久久| 日本在线不卡视频一二三区| 国产高清精品网站| 欧美一区二区女人| 亚洲色图色小说| 久久se精品一区二区| www.欧美.com| 国产亚洲一二三区| 亚洲成人av免费| 风间由美一区二区三区在线观看| www.亚洲精品| 国产欧美日韩视频一区二区| 亚洲电影中文字幕在线观看| 国产一区二区主播在线| 91精品福利视频| 国产精品乱码久久久久久| 青青草国产精品亚洲专区无| av电影一区二区| 91精品在线一区二区| 亚洲在线视频一区| 成人精品国产一区二区4080| 欧美精品视频www在线观看| 中文字幕亚洲区| 狠狠色狠狠色综合| 欧美日韩一区二区三区四区| 欧美精彩视频一区二区三区| 美女www一区二区| 精品视频123区在线观看| 国产精品福利av| 国产在线日韩欧美| 久久综合色婷婷| 极品尤物av久久免费看| 欧美日韩性生活| 亚洲成人av在线电影|