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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? usbdrv.c

?? 可用來自做的AVR-USB-ISP的源碼,內(nèi)符電路圖,用AVR M8來模擬USB接口
?? C
?? 第 1 頁(yè) / 共 2 頁(yè)
字號(hào):
    }#endif}#define GET_DESCRIPTOR(cfgProp, staticName)         \    if(cfgProp){                                    \        if((cfgProp) & USB_PROP_IS_RAM)             \            flags &= ~USB_FLG_MSGPTR_IS_ROM;        \        if((cfgProp) & USB_PROP_IS_DYNAMIC){        \            replyLen = usbFunctionDescriptor(rq);   \        }else{                                      \            replyData = (uchar *)(staticName);      \            SET_REPLY_LEN((cfgProp) & 0xff);        \        }                                           \    }/* We use if() instead of #if in the macro above because #if can't be used * in macros and the compiler optimizes constant conditions anyway. *//* Don't make this function static to avoid inlining. * The entire function would become too large and exceed the range of * relative jumps. * 2006-02-25: Either gcc 3.4.3 is better than the gcc used when the comment * above was written, or other parts of the code have changed. We now get * better results with an inlined function. Test condition: PowerSwitch code. */static void usbProcessRx(uchar *data, uchar len){usbRequest_t    *rq = (void *)data;uchar           replyLen = 0, flags = USB_FLG_USE_DEFAULT_RW;/* We use if() cascades because the compare is done byte-wise while switch() * is int-based. The if() cascades are therefore more efficient. *//* usbRxToken can be: * 0x2d 00101101 (USBPID_SETUP for endpoint 0) * 0xe1 11100001 (USBPID_OUT for endpoint 0) * 0xff 11111111 (USBPID_OUT for endpoint 1) */    DBG2(0x10 + ((usbRxToken >> 1) & 3), data, len);    /* SETUP0=12; OUT0=10; OUT1=13 */#if USB_CFG_IMPLEMENT_FN_WRITEOUT    if(usbRxToken == 0xff){        usbFunctionWriteOut(data, len);        return; /* no reply expected, hence no usbMsgPtr, usbMsgFlags, usbMsgLen set */    }#endif    if(usbRxToken == (uchar)USBPID_SETUP){        usbTxLen = USBPID_NAK;  /* abort pending transmit */        if(len == 8){   /* Setup size must be always 8 bytes. Ignore otherwise. */            uchar type = rq->bmRequestType & USBRQ_TYPE_MASK;            if(type == USBRQ_TYPE_STANDARD){                #define SET_REPLY_LEN(len)  replyLen = (len); usbMsgPtr = replyData                /* This macro ensures that replyLen and usbMsgPtr are always set in the same way.                 * That allows optimization of common code in if() branches */                uchar *replyData = usbTxBuf + 9; /* there is 3 bytes free space at the end of the buffer */                replyData[0] = 0;   /* common to USBRQ_GET_STATUS and USBRQ_GET_INTERFACE */                if(rq->bRequest == USBRQ_GET_STATUS){           /* 0 */                    uchar __attribute__((__unused__)) recipient = rq->bmRequestType & USBRQ_RCPT_MASK;  /* assign arith ops to variables to enforce byte size */#if USB_CFG_IS_SELF_POWERED                    if(recipient == USBRQ_RCPT_DEVICE)                        replyData[0] =  USB_CFG_IS_SELF_POWERED;#endif#if USB_CFG_HAVE_INTRIN_ENDPOINT && USB_CFG_IMPLEMENT_HALT                    if(recipient == USBRQ_RCPT_ENDPOINT && rq->wIndex.bytes[0] == 0x81)   /* request status for endpoint 1 */                        replyData[0] = usbTxLen1 == USBPID_STALL;#endif                    replyData[1] = 0;                    SET_REPLY_LEN(2);                }else if(rq->bRequest == USBRQ_SET_ADDRESS){    /* 5 */                    usbNewDeviceAddr = rq->wValue.bytes[0];                }else if(rq->bRequest == USBRQ_GET_DESCRIPTOR){ /* 6 */                    flags = USB_FLG_MSGPTR_IS_ROM | USB_FLG_USE_DEFAULT_RW;                    if(rq->wValue.bytes[1] == USBDESCR_DEVICE){ /* 1 */                        GET_DESCRIPTOR(USB_CFG_DESCR_PROPS_DEVICE, usbDescriptorDevice)                    }else if(rq->wValue.bytes[1] == USBDESCR_CONFIG){   /* 2 */                        GET_DESCRIPTOR(USB_CFG_DESCR_PROPS_CONFIGURATION, usbDescriptorConfiguration)                    }else if(rq->wValue.bytes[1] == USBDESCR_STRING){   /* 3 */#if USB_CFG_DESCR_PROPS_STRINGS & USB_PROP_IS_DYNAMIC                        if(USB_CFG_DESCR_PROPS_STRINGS & USB_PROP_IS_RAM)                            flags &= ~USB_FLG_MSGPTR_IS_ROM;                        replyLen = usbFunctionDescriptor(rq);#else   /* USB_CFG_DESCR_PROPS_STRINGS & USB_PROP_IS_DYNAMIC */                        if(rq->wValue.bytes[0] == 0){   /* descriptor index */                            GET_DESCRIPTOR(USB_CFG_DESCR_PROPS_STRING_0, usbDescriptorString0)                        }else if(rq->wValue.bytes[0] == 1){                            GET_DESCRIPTOR(USB_CFG_DESCR_PROPS_STRING_VENDOR, usbDescriptorStringVendor)                        }else if(rq->wValue.bytes[0] == 2){                            GET_DESCRIPTOR(USB_CFG_DESCR_PROPS_STRING_DEVICE, usbDescriptorStringDevice)                        }else if(rq->wValue.bytes[0] == 3){                            GET_DESCRIPTOR(USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER, usbDescriptorStringSerialNumber)                        }else if(USB_CFG_DESCR_PROPS_UNKNOWN & USB_PROP_IS_DYNAMIC){                            replyLen = usbFunctionDescriptor(rq);                        }#endif  /* USB_CFG_DESCR_PROPS_STRINGS & USB_PROP_IS_DYNAMIC */                    }else if(rq->wValue.bytes[1] == USBDESCR_HID){          /* 0x21 */                        GET_DESCRIPTOR(USB_CFG_DESCR_PROPS_HID, usbDescriptorConfiguration + 18)                    }else if(rq->wValue.bytes[1] == USBDESCR_HID_REPORT){   /* 0x22 */                        GET_DESCRIPTOR(USB_CFG_DESCR_PROPS_HID_REPORT, usbDescriptorHidReport)                    }else if(USB_CFG_DESCR_PROPS_UNKNOWN & USB_PROP_IS_DYNAMIC){                        replyLen = usbFunctionDescriptor(rq);                    }                }else if(rq->bRequest == USBRQ_GET_CONFIGURATION){  /* 8 */                    replyData = &usbConfiguration;  /* send current configuration value */                    SET_REPLY_LEN(1);                }else if(rq->bRequest == USBRQ_SET_CONFIGURATION){  /* 9 */                    usbConfiguration = rq->wValue.bytes[0];#if USB_CFG_IMPLEMENT_HALT                    usbTxLen1 = USBPID_NAK;#endif                }else if(rq->bRequest == USBRQ_GET_INTERFACE){      /* 10 */                    SET_REPLY_LEN(1);#if USB_CFG_HAVE_INTRIN_ENDPOINT                }else if(rq->bRequest == USBRQ_SET_INTERFACE){      /* 11 */                    USB_SET_DATATOKEN1(USBPID_DATA0);   /* reset data toggling for interrupt endpoint */#   if USB_CFG_HAVE_INTRIN_ENDPOINT3                    USB_SET_DATATOKEN3(USBPID_DATA0);   /* reset data toggling for interrupt endpoint */#   endif#   if USB_CFG_IMPLEMENT_HALT                    usbTxLen1 = USBPID_NAK;                }else if(rq->bRequest == USBRQ_CLEAR_FEATURE || rq->bRequest == USBRQ_SET_FEATURE){   /* 1|3 */                    if(rq->wValue.bytes[0] == 0 && rq->wIndex.bytes[0] == 0x81){   /* feature 0 == HALT for endpoint == 1 */                        usbTxLen1 = rq->bRequest == USBRQ_CLEAR_FEATURE ? USBPID_NAK : USBPID_STALL;                        USB_SET_DATATOKEN1(USBPID_DATA0);   /* reset data toggling for interrupt endpoint */#       if USB_CFG_HAVE_INTRIN_ENDPOINT3                        USB_SET_DATATOKEN3(USBPID_DATA0);   /* reset data toggling for interrupt endpoint */#       endif                    }#   endif#endif                }else{                    /* the following requests can be ignored, send default reply */                    /* 1: CLEAR_FEATURE, 3: SET_FEATURE, 7: SET_DESCRIPTOR */                    /* 12: SYNCH_FRAME */                }                #undef SET_REPLY_LEN            }else{  /* not a standard request -- must be vendor or class request */                replyLen = usbFunctionSetup(data);            }#if USB_CFG_IMPLEMENT_FN_READ || USB_CFG_IMPLEMENT_FN_WRITE            if(replyLen == 0xff){   /* use user-supplied read/write function */                if((rq->bmRequestType & USBRQ_DIR_MASK) == USBRQ_DIR_DEVICE_TO_HOST){                    replyLen = rq->wLength.bytes[0];    /* IN transfers only */                }                flags &= ~USB_FLG_USE_DEFAULT_RW;  /* we have no valid msg, use user supplied read/write functions */            }else   /* The 'else' prevents that we limit a replyLen of 0xff to the maximum transfer len. */#endif            if(!rq->wLength.bytes[1] && replyLen > rq->wLength.bytes[0])  /* limit length to max */                replyLen = rq->wLength.bytes[0];        }        /* make sure that data packets which are sent as ACK to an OUT transfer are always zero sized */    }else{  /* DATA packet from out request */#if USB_CFG_IMPLEMENT_FN_WRITE        if(!(usbMsgFlags & USB_FLG_USE_DEFAULT_RW)){            uchar rval = usbFunctionWrite(data, len);            replyLen = 0xff;            if(rval == 0xff){       /* an error occurred */                usbMsgLen = 0xff;   /* cancel potentially pending data packet for ACK */                usbTxLen = USBPID_STALL;            }else if(rval != 0){    /* This was the final package */                replyLen = 0;       /* answer with a zero-sized data packet */            }            flags = 0;    /* start with a DATA1 package, stay with user supplied write() function */        }#endif    }    usbMsgFlags = flags;    usbMsgLen = replyLen;}/* ------------------------------------------------------------------------- */static void usbBuildTxBlock(void){uchar       wantLen, len, txLen, token;    wantLen = usbMsgLen;    if(wantLen > 8)        wantLen = 8;    usbMsgLen -= wantLen;    token = USBPID_DATA1;    if(usbMsgFlags & USB_FLG_TX_PACKET)        token = USBPID_DATA0;    usbMsgFlags++;    len = usbRead(usbTxBuf + 1, wantLen);    if(len <= 8){           /* valid data packet */        usbCrc16Append(&usbTxBuf[1], len);        txLen = len + 4;    /* length including sync byte */        if(len < 8)         /* a partial package identifies end of message */            usbMsgLen = 0xff;    }else{        txLen = USBPID_STALL;   /* stall the endpoint */        usbMsgLen = 0xff;    }    usbTxBuf[0] = token;    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){schar   len;uchar   i;    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(buffer + 1, usbRxLen - 3); */        usbProcessRx(usbRxBuf + USB_BUFSIZE + 1 - usbInputBufOffset, len - 3);#if USB_CFG_HAVE_FLOWCONTROL        if(usbRxLen > 0)    /* only mark as available if not inactivated */            usbRxLen = 0;#else        usbRxLen = 0;       /* mark rx buffer as available */#endif    }    if(usbTxLen & 0x10){ /* transmit system idle */        if(usbMsgLen != 0xff){  /* transmit data pending? */            usbBuildTxBlock();        }    }    for(i = 10; i > 0; i--){        if(isNotSE0())            break;    }    if(i == 0){ /* RESET condition, called multiple times during reset */        usbNewDeviceAddr = 0;        usbDeviceAddr = 0;#if USB_CFG_IMPLEMENT_HALT        usbTxLen1 = USBPID_NAK;#if USB_CFG_HAVE_INTRIN_ENDPOINT3        usbTxLen3 = USBPID_NAK;#endif#endif        DBG1(0xff, 0, 0);    }}/* ------------------------------------------------------------------------- */void    usbInit(void){#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);#if USB_CFG_HAVE_INTRIN_ENDPOINT    USB_SET_DATATOKEN1(USBPID_DATA0);   /* reset data toggling for interrupt endpoint */#   if USB_CFG_HAVE_INTRIN_ENDPOINT3    USB_SET_DATATOKEN3(USBPID_DATA0);   /* reset data toggling for interrupt endpoint */#   endif#endif}/* ------------------------------------------------------------------------- */

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲成人www| 亚洲另类中文字| 91丨porny丨最新| 美女网站在线免费欧美精品| 国产精品―色哟哟| 欧美高清性hdvideosex| 成人av在线资源网| 精品一区二区在线观看| 亚洲尤物视频在线| 中文在线一区二区| 精品国产凹凸成av人导航| 91激情在线视频| 成人黄色国产精品网站大全在线免费观看| 亚洲午夜激情网站| 亚洲欧美在线视频| 久久久九九九九| 日韩精品专区在线| 欧美三级一区二区| eeuss鲁片一区二区三区| 老司机午夜精品| 亚洲一区二区欧美| 亚洲视频综合在线| 国产欧美日韩麻豆91| 日韩一卡二卡三卡国产欧美| 色综合久久天天综合网| 风间由美性色一区二区三区| 久久99这里只有精品| 婷婷综合五月天| 亚洲一区二区精品3399| 亚洲日本成人在线观看| 国产精品视频你懂的| 久久无码av三级| 日韩免费性生活视频播放| 56国语精品自产拍在线观看| 欧美亚洲日本一区| 色天天综合久久久久综合片| 成人福利视频在线| 成人精品鲁一区一区二区| 国产成人自拍网| 国产一区视频网站| 国产在线看一区| 国产一区二区三区久久久| 老司机一区二区| 韩国理伦片一区二区三区在线播放| 三级精品在线观看| 喷白浆一区二区| 久久草av在线| 国产电影精品久久禁18| 国产99精品在线观看| 成人自拍视频在线观看| 成人黄色大片在线观看| 91视频在线观看| 色欧美乱欧美15图片| 欧美亚洲图片小说| 91精品国产日韩91久久久久久| 欧美欧美欧美欧美| 欧美一区日韩一区| 亚洲精品一线二线三线| 亚洲国产精品成人久久综合一区| 国产精品欧美一区喷水| 亚洲精品欧美综合四区| 成人免费视频国产在线观看| 99re视频精品| 欧美中文字幕亚洲一区二区va在线| 欧美图区在线视频| 欧美一区二区三区在线| 精品国产伦理网| 国产精品女同互慰在线看| 亚洲精品v日韩精品| 午夜视频一区在线观看| 开心九九激情九九欧美日韩精美视频电影 | 2024国产精品视频| 亚洲国产精品传媒在线观看| 亚洲欧美视频在线观看视频| 亚洲愉拍自拍另类高清精品| 美女www一区二区| 成人伦理片在线| 欧美日产国产精品| 国产视频亚洲色图| 亚洲摸摸操操av| 日韩二区三区四区| 国产大陆亚洲精品国产| 色屁屁一区二区| 精品久久国产97色综合| 亚洲欧美日韩国产另类专区| 日韩国产欧美在线视频| 国产 日韩 欧美大片| 欧美日韩精品系列| 久久久亚洲国产美女国产盗摄| 亚洲免费成人av| 国产一区二区主播在线| 色综合久久88色综合天天 | 亚洲精品一区二区三区99| 日韩一区中文字幕| 免费欧美在线视频| 99久久精品久久久久久清纯| 日韩欧美一级在线播放| 亚洲欧美乱综合| 九九久久精品视频| 欧美日韩精品一区二区三区| 中文欧美字幕免费| 久久99精品一区二区三区三区| 色综合久久久久综合体桃花网| 精品不卡在线视频| 亚洲va韩国va欧美va精品| 懂色av一区二区三区免费看| 欧美剧在线免费观看网站| 自拍偷拍亚洲综合| 国产精品白丝jk白祙喷水网站| 欧美日韩一区国产| 亚洲男人的天堂av| 成人理论电影网| 精品国产乱码91久久久久久网站| 亚洲综合色噜噜狠狠| 粉嫩aⅴ一区二区三区四区| 欧美成人精品高清在线播放| 亚洲电影一级黄| 色妞www精品视频| 欧美国产97人人爽人人喊| 蜜臀a∨国产成人精品| 欧美精品第一页| 亚洲一区日韩精品中文字幕| 成人午夜精品在线| 国产无人区一区二区三区| 久久99热狠狠色一区二区| 亚洲国产精品久久久久秋霞影院 | 自拍偷拍亚洲激情| 成人精品gif动图一区| 久久久久久99久久久精品网站| 美腿丝袜亚洲一区| 欧美一区二区精美| 五月天欧美精品| 欧美日韩日本视频| 亚洲永久精品大片| 欧美在线影院一区二区| 亚洲美女在线一区| 91成人在线免费观看| 亚洲欧美一区二区三区久本道91 | 日韩一区二区免费电影| 天堂午夜影视日韩欧美一区二区| 在线观看日韩电影| 亚洲第一成年网| 欧美久久高跟鞋激| 日韩国产欧美三级| 日韩欧美亚洲一区二区| 久久99国产精品久久99 | 亚洲综合激情网| 欧美三区在线观看| 人禽交欧美网站| 精品理论电影在线观看 | 亚洲人妖av一区二区| 色综合久久久久网| 一区二区成人在线观看| 欧美人与z0zoxxxx视频| 蜜臀av一区二区三区| 国产日韩欧美在线一区| 成人av电影观看| 一区二区不卡在线播放 | 亚洲同性gay激情无套| 色又黄又爽网站www久久| 亚洲主播在线观看| 日韩欧美激情在线| 国产激情视频一区二区在线观看 | caoporm超碰国产精品| 亚洲自拍偷拍九九九| 在线综合视频播放| 国产精品一区免费在线观看| 国产精品网站在线播放| 色婷婷综合在线| 免费日本视频一区| 国产精品美女久久久久久2018| 99久久精品免费精品国产| 性感美女极品91精品| 日韩欧美视频在线| 不卡欧美aaaaa| 午夜精品福利一区二区三区av | 日韩一区二区在线免费观看| 国产成人午夜精品5599| 一区二区三区国产| 2024国产精品| 91黄色激情网站| 麻豆精品一区二区| 亚洲视频免费观看| 日韩精品一区二区三区视频播放 | 国产福利视频一区二区三区| 色呦呦日韩精品| 久久国产夜色精品鲁鲁99| 最新国产成人在线观看| 欧美一级夜夜爽| 色婷婷综合激情| 国产在线国偷精品产拍免费yy | 国产一区不卡在线| 午夜av区久久| 中文字幕av一区二区三区免费看| 精品视频全国免费看| 国产精品123| 亚洲午夜免费电影| 国产精品久久久久9999吃药| 精品视频一区二区不卡| 国产麻豆视频精品|