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

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

?? usbdrv.h

?? AVR Devolpment Board
?? H
?? 第 1 頁 / 共 2 頁
字號:
/* Name: usbdrv.h * 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.h 209 2006-06-26 09:44:15Z cs $ */#ifndef __usbdrv_h_included__#define __usbdrv_h_included__#include "usbconfig.h"#include "iarcompat.h"/*Hardware Prerequisites:=======================USB lines D+ and D- MUST be wired to the same I/O port. D+ must (also) beconnected to INT0. D- requires a pullup of 1.5k to +3.5V (and the devicemust be powered at 3.5V) to identify as low-speed USB device. A pullup of1M SHOULD be connected from D+ to +3.5V to prevent interference when no USBmaster is connected. We use D+ as interrupt source and not D- because itdoes not trigger on keep-alive and RESET states.As a compile time option, the 1.5k pullup resistor on D- can be madeswitchable to allow the device to disconnect at will. See the definition ofusbDeviceConnect() and usbDeviceDisconnect() further down in this file.Please adapt the values in usbconfig.h according to your hardware!The device MUST be clocked at 12 MHz. This is more than the 10 MHz allowed byan AT90S2313 powered at 4.5V. However, if the supply voltage to maximum clockrelation is interpolated linearly, an ATtiny2313 meets the requirement byspecification. In practice, the AT90S2313 can be overclocked and works well.Limitations:============Compiling:You should link the usbdrv.o module first because it has special alignmentrequirements for the receive buffer (the buffer must not cross a 256 bytepage boundary, it must not even touch it at the end). If you can't link itfirst, you must use other measures to ensure alignment.Note: gcc does not always assign variable addresses in the order as the modulesare linked or the variables are declared. You can choose a memory section forthe receive buffer with the configuration option "USB_BUFFER_SECTION". Thisoption defaults to ".bss". If you use your own section, you can place it atan arbitrary location with a linker option similar to"-Wl,--section-start=.mybuffer=0x800060". Use "avr-nm -ng" on the binary andsearch for "usbRxBuf" to find tbe base address of the 22 bytes rx buffer.Robustness with respect to communication errors:The driver assumes error-free communication. It DOES check for errors inthe PID, but does NOT check bit stuffing errors, SE0 in middle of a byte,token CRC (5 bit) and data CRC (16 bit). CRC checks can not be performed dueto timing constraints: We must start sending a reply within 7 bit times.Bit stuffing and misplaced SE0 would have to be checked in real-time, but CPUperformance does not permit that. The driver does not check Data0/Data1toggling, but application software can implement the check.Sampling jitter:The driver guarantees a sampling window of 1/2 bit. The USB spec requiresthat the receiver has at most 1/4 bit sampling window. The 1/2 bit windowshould still work reliably enough because we work at low speed. If you wantto meet the spec, define the macro "USB_CFG_SAMPLE_EXACT" to 1 in usbconfig.h.This will unroll a loop which results in bigger code size.Input characteristics:Since no differential receiver circuit is used, electrical interferencerobustness may suffer. The driver samples only one of the data lines withan ordinary I/O pin's input characteristics. However, since this is only alow speed USB implementation and the specification allows for 8 times thebit rate over the same hardware, we should be on the safe side. Even the specrequires detection of asymmetric states at high bit rate for SE0 detection.Number of endpoints:The driver supports up to two endpoints: One control endpoint (endpoint 0) andone interrupt-in endpoint (endpoint 1) where the device can send interruptdata to the host. Endpoint 1 is only compiled in ifUSB_CFG_HAVE_INTRIN_ENDPOINT is defined to 1 in usbconfig.h.Maximum data payload:Data payload of control in and out transfers may be up to 254 bytes. In orderto accept payload data of out transfers, you need to implement'usbFunctionWrite()'.USB Suspend Mode supply current:The USB standard limits power consumption to 500uA when the bus is in suspendmode. This is not a problem for self-powered devices since they don't needbus power anyway. Bus-powered devices can achieve this only by putting theCPU in sleep mode. The driver does not implement suspend handling by itself.However, the application may implement activity monitoring and wakeup fromsleep. The host sends regular SE0 states on the bus to keep it active. TheseSE0 states can be detected by wiring the INT1 pin to D-. It is not necessaryto enable the interrupt, checking the interrupt pending flag should suffice.Before entering sleep mode, the application should enable INT1 for a wakeupon the next bus activity.Operation without an USB master:The driver behaves neutral without connection to an USB master if D- readsas 1. To avoid spurious interrupts, we recommend a high impedance (e.g. 1M)pullup resistor on D+. If D- becomes statically 0, the driver may block inthe interrupt routine.Interrupt latency:The application must ensure that the USB interrupt is not disabled for morethan 20 cycles. This implies that all interrupt routines must either bedeclared as "INTERRUPT" instead of "SIGNAL" (see "avr/signal.h") or that theyare written in assembler with "sei" as the first instruction.Maximum interrupt duration / CPU cycle consumption:The driver handles all USB communication during the interrupt serviceroutine. The routine will not return before an entire USB message is receivedand the reply is sent. This may be up to ca. 1200 cycles = 100us if the hostconforms to the standard. The driver will consume CPU cycles for all USBmessages, even if they address another (low-speed) device on the same bus.*//* ------------------------------------------------------------------------- *//* --------------------------- Module Interface ---------------------------- *//* ------------------------------------------------------------------------- */#define USBDRV_VERSION  20060626/* This define uniquely identifies a driver version. It is a decimal number * constructed from the driver's release date in the form YYYYMMDD. If the * driver's behavior or interface changes, you can use this constant to * distinguish versions. If it is not defined, the driver's release date is * older than 2006-01-25. */#ifndef __ASSEMBLER__#ifndef uchar#define uchar   unsigned char#endif#ifndef schar#define schar   signed char#endif/* shortcuts for well defined 8 bit integer types */extern void     usbInit(void);/* This function must be called before interrupts are enabled and the main * loop is entered. */extern void     usbPoll(void);/* This function must be called at regular intervals from the main loop. * Maximum delay between calls is somewhat less than 50ms (USB timeout for * accepting a Setup message). Otherwise the device will not be recognized. * Please note that debug outputs through the UART take ~ 0.5ms per byte * at 19200 bps. */extern uchar    *usbMsgPtr;/* This variable may be used to pass transmit data to the driver from the * implementation of usbFunctionWrite(). It is also used internally by the * driver for standard control requests. */extern uchar    usbFunctionSetup(uchar data[8]);/* This function is called when the driver receives a SETUP transaction from * the host which is not answered by the driver itself (in practice: class and * vendor requests). All control transfers start with a SETUP transaction where * the host communicates the parameters of the following (optional) data * transfer. The SETUP data is available in the 'data' parameter which can * (and should) be casted to 'usbRequest_t *' for a more user-friendly access * to parameters. * * If the SETUP indicates a control-in transfer, you should provide the * requested data to the driver. There are two ways to transfer this data: * (1) Set the global pointer 'usbMsgPtr' to the base of the static RAM data * block and return the length of the data in 'usbFunctionSetup()'. The driver * will handle the rest. Or (2) return 0xff in 'usbFunctionSetup()'. The driver * will then call 'usbFunctionRead()' when data is needed. See the * documentation for usbFunctionRead() for details. * * If the SETUP indicates a control-out transfer, the only way to receive the * data from the host is through the 'usbFunctionWrite()' call. If you * implement this function, you must return 0xff in 'usbFunctionSetup()' to * indicate that 'usbFunctionWrite()' should be used. See the documentation of * this function for more information. If you just want to ignore the data sent * by the host, return 0 in 'usbFunctionSetup()'. * * Note that calls to the functions usbFunctionRead() and usbFunctionWrite() * are only done if enabled by the configuration in usbconfig.h. */#if USB_CFG_HAVE_INTRIN_ENDPOINTvoid    usbSetInterrupt(uchar *data, uchar len);/* This function sets the message which will be sent during the next interrupt * IN transfer. The message is copied to an internal buffer and must not exceed * a length of 8 bytes. The message may be 0 bytes long just to indicate the * interrupt status to the host. * If you need to transfer more bytes, use a control read after the interrupt. */extern volatile schar usbTxLen1;#define usbInterruptIsReady()   (usbTxLen1 == -1)/* This macro indicates whether the last interrupt message has already been * sent. If you set a new interrupt message before the old was sent, the * message already buffered will be lost. */#if USB_CFG_HAVE_INTRIN_ENDPOINT3void    usbSetInterrupt3(uchar *data, uchar len);extern volatile schar usbTxLen3;#define usbInterruptIsReady3()   (usbTxLen3 == -1)/* Same as above for endpoint 3 */#endif#endif /* USB_CFG_HAVE_INTRIN_ENDPOINT */#if USB_CFG_HID_REPORT_DESCRIPTOR_LENGTHextern PROGMEM const char usbHidReportDescriptor[];/* If you implement an HID device, you need to provide a report descriptor. * The HID report descriptor syntax is a bit complex. If you understand how * report descriptors are constructed, we recommend that you use the HID * Descriptor Tool from usb.org, see http://www.usb.org/developers/hidpage/. * Otherwise you should probably start with a working example. */#endif  /* USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH */#if USB_CFG_IMPLEMENT_FN_WRITEextern uchar    usbFunctionWrite(uchar *data, uchar len);/* This function is called by the driver to provide a control transfer's * payload data (control-out). It is called in chunks of up to 8 bytes. The * total count provided in the current control transfer can be obtained from * the 'length' property in the setup data. If an error occurred during * processing, return 0xff (== -1). The driver will answer the entire transfer * with a STALL token in this case. If you have received the entire payload * successfully, return 1. If you expect more data, return 0. If you don't * know whether the host will send more data (you should know, the total is * provided in the usbFunctionSetup() call!), return 1. * NOTE: If you return 0xff for STALL, 'usbFunctionWrite()' may still be called * for the remaining data. You must continue to return 0xff for STALL in these * calls. * In order to get usbFunctionWrite() called, define USB_CFG_IMPLEMENT_FN_WRITE * to 1 in usbconfig.h and return 0xff in usbFunctionSetup().. */#endif /* USB_CFG_IMPLEMENT_FN_WRITE */#if USB_CFG_IMPLEMENT_FN_READextern uchar usbFunctionRead(uchar *data, uchar len);/* This function is called by the driver to ask the application for a control * transfer's payload data (control-in). It is called in chunks of up to 8 * bytes each. You should copy the data to the location given by 'data' and * return the actual number of bytes copied. If you return less than requested, * the control-in transfer is terminated. If you return 0xff, the driver aborts * the transfer with a STALL token. * In order to get usbFunctionRead() called, define USB_CFG_IMPLEMENT_FN_READ * to 1 in usbconfig.h and return 0xff in usbFunctionSetup().. */#endif /* USB_CFG_IMPLEMENT_FN_READ */#if USB_CFG_IMPLEMENT_FN_WRITEOUTextern void usbFunctionWriteOut(uchar *data, uchar len);/* This function is called by the driver when data on interrupt-out or bulk- * out endpoint 1 is received. You must define USB_CFG_IMPLEMENT_FN_WRITEOUT * to 1 in usbconfig.h to get this function called. */#endif /* USB_CFG_IMPLEMENT_FN_WRITEOUT */#ifdef USB_CFG_PULLUP_IOPORTNAME#define usbDeviceConnect()      ((USB_PULLUP_DDR |= (1<<USB_CFG_PULLUP_BIT)), \                                  (USB_PULLUP_OUT |= (1<<USB_CFG_PULLUP_BIT)))/* This macro (intended to look like a function) connects the device to the * USB bus. It is only available if you have defined the constants * USB_CFG_PULLUP_IOPORT and USB_CFG_PULLUP_BIT in usbconfig.h. */#define usbDeviceDisconnect()   (USB_PULLUP_OUT &= ~(1<<USB_CFG_PULLUP_BIT))/* This macro (intended to look like a function) disconnects the device from * the USB bus. It is only available if you have defined the constants * USB_CFG_PULLUP_IOPORT and USB_CFG_PULLUP_BIT in usbconfig.h. */#endif /* USB_CFG_PULLUP_IOPORT */extern unsigned usbCrc16(unsigned data, uchar len);#define usbCrc16(data, len) usbCrc16((unsigned)(data), len)
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲国产精品久久久男人的天堂| 亚洲日本成人在线观看| 欧美videos大乳护士334| 午夜视黄欧洲亚洲| 欧美片在线播放| 人妖欧美一区二区| 久久综合九色欧美综合狠狠 | 国产一区二区在线电影| 国产日韩视频一区二区三区| 国产福利一区二区| 亚洲欧洲制服丝袜| 欧美久久久久免费| 国产在线精品一区二区夜色 | 亚洲人成在线播放网站岛国| 91黄色免费观看| 日韩国产一区二| 久久久久88色偷偷免费| 色综合咪咪久久| 青娱乐精品视频| 国产精品资源在线看| 欧美午夜一区二区三区| 亚洲三级在线看| 这里只有精品免费| 成人免费看视频| 天天综合天天综合色| 国产网红主播福利一区二区| 欧美亚洲国产一区二区三区 | 久久久久国产免费免费| 一本久道久久综合中文字幕 | 在线播放日韩导航| 成人一级片在线观看| 亚洲国产成人va在线观看天堂| 欧美成人精品1314www| 99re亚洲国产精品| 久久精品久久精品| 一个色综合av| 久久久亚洲欧洲日产国码αv| 一本久久a久久精品亚洲| 久久国产欧美日韩精品| 日韩美女精品在线| 欧美成人国产一区二区| 欧美在线观看视频一区二区三区| 黄色成人免费在线| 亚洲电影欧美电影有声小说| 国产精品天干天干在观线| 欧美日韩中文字幕一区| 不卡的看片网站| 狠狠色综合色综合网络| 午夜激情一区二区三区| 亚洲同性gay激情无套| 久久久久国产一区二区三区四区| 在线播放91灌醉迷j高跟美女 | 99久久精品国产毛片| 奇米一区二区三区| 一区二区三区在线观看国产| 久久久久久久久伊人| 日韩免费视频线观看| 欧美色窝79yyyycom| 99免费精品在线| 成人av在线电影| 国产suv精品一区二区三区| 久久国产精品99精品国产| 日本中文在线一区| 亚洲成a人片在线观看中文| 一区二区三区在线视频播放| 自拍av一区二区三区| 一区免费观看视频| 日本一区二区三区高清不卡| 久久久精品国产免大香伊| 久久综合99re88久久爱| 日韩精品一区二区三区在线播放| 6080国产精品一区二区| 欧美日韩免费电影| 欧美军同video69gay| 欧美日韩国产综合视频在线观看| 精品婷婷伊人一区三区三| 欧美性大战久久| 欧美日韩国产123区| 欧美人与z0zoxxxx视频| 这里只有精品视频在线观看| 91精品国产综合久久精品麻豆 | 91亚洲精品久久久蜜桃| 成人的网站免费观看| 99精品久久只有精品| 一本色道久久综合亚洲aⅴ蜜桃| 91亚洲精品乱码久久久久久蜜桃| 91免费版在线| 欧美午夜免费电影| 欧美精品一二三| 欧美不卡在线视频| 久久久精品影视| 亚洲素人一区二区| 一区二区三区国产精华| 日韩电影免费在线看| 国产综合一区二区| 成人一区二区三区在线观看| 97精品国产露脸对白| 欧美日韩一区成人| 日韩欧美在线1卡| 中文字幕精品一区二区精品绿巨人| 国产精品美女久久久久久2018| 一区二区三区在线高清| 日韩成人免费在线| 国产成人av影院| 91国产丝袜在线播放| 日韩欧美你懂的| 亚洲欧洲韩国日本视频| 亚洲大片精品永久免费| 狠狠色综合日日| 91毛片在线观看| 日韩精品中午字幕| 国产精品免费网站在线观看| 亚洲一卡二卡三卡四卡 | 午夜视频在线观看一区二区| 久久精品99久久久| 91在线精品一区二区三区| 欧美日韩国产综合一区二区| 久久久精品国产免费观看同学| 玉足女爽爽91| 精品一区二区三区免费观看| 一本大道久久精品懂色aⅴ| 日韩精品一区二区三区中文精品| 日韩一区在线免费观看| 色噜噜久久综合| 欧美成人a视频| 亚洲综合成人在线| 国产精品18久久久久久久久| 精品污污网站免费看| 国产精品免费免费| 免费观看在线综合色| 日本久久精品电影| 亚洲精品一区二区三区精华液| 亚洲精品国产精品乱码不99 | 亚洲va韩国va欧美va| 国产91高潮流白浆在线麻豆| 91麻豆精品国产自产在线| 亚洲精品视频一区二区| 久久99精品国产麻豆不卡| 国产精品久久久久aaaa樱花 | 在线精品视频免费播放| 欧美tk丨vk视频| 亚洲国产aⅴ成人精品无吗| 成人国产精品免费观看| 精品成人私密视频| 三级成人在线视频| 在线中文字幕不卡| 国产精品国产三级国产aⅴ无密码| 激情文学综合网| 日韩三级在线免费观看| 一个色综合av| 色婷婷久久99综合精品jk白丝| 中文字幕巨乱亚洲| 狠狠色丁香婷婷综合| 日韩欧美一二三四区| 午夜欧美电影在线观看| 日本道免费精品一区二区三区| 国产精品久久久久久福利一牛影视 | 视频一区视频二区中文| 2020国产精品自拍| 在线亚洲一区观看| 97aⅴ精品视频一二三区| 亚洲第一福利视频在线| 1024精品合集| 国产精品女同一区二区三区| 久久久久国产精品厨房| 337p粉嫩大胆噜噜噜噜噜91av| 欧美精品久久久久久久久老牛影院| 99re这里只有精品视频首页| 国产盗摄视频一区二区三区| 国产精品中文有码| 免费欧美高清视频| 亚洲男人天堂av网| 天堂在线亚洲视频| 884aa四虎影成人精品一区| 午夜av一区二区| 日韩一区二区在线看| 精品一区精品二区高清| 久久精品人人做人人爽人人| 国产精品白丝jk白祙喷水网站| 国产欧美精品一区二区三区四区| 成人综合婷婷国产精品久久| 99久久99久久精品免费观看| 日韩欧美另类在线| 天天色综合成人网| 欧美成人官网二区| 91精品久久久久久久91蜜桃| 日本午夜精品一区二区三区电影| 欧美一区二区在线视频| 激情深爱一区二区| 国产精品久久国产精麻豆99网站| 色菇凉天天综合网| 日韩av一区二区在线影视| 精品乱人伦小说| 99热精品一区二区| 午夜精品久久久久久久99樱桃| 精品国产一区二区国模嫣然| 99精品视频中文字幕| 午夜日韩在线电影| 久久精品亚洲精品国产欧美| 91免费视频大全|