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

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

?? usbdrv.c

?? 利用AVR單片機(jī)實(shí)現(xiàn)的慢速USB設(shè)備協(xié)議
?? C
?? 第 1 頁(yè) / 共 2 頁(yè)
字號(hào):
#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}#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. */    DBG2(0x10 + ((usbRxToken >> 6) & 3), data, len);#if USB_CFG_IMPLEMENT_FN_WRITEOUT    if(usbRxToken & 0x80){        usbFunctionWriteOut(data, len);        return; /* no reply expected, hence no usbMsgPtr, usbMsgFlags, usbMsgLen set */    }    if(usbRxToken == (uchar)(USBPID_SETUP & 0x7f)){ /* MSb contains endpoint (== 0) */#else    if(usbRxToken == (uchar)USBPID_SETUP){#endif        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 */                    usbTxPacketCnt1 = 0;        /* reset data toggling for interrupt endpoint */#   if USB_CFG_HAVE_INTRIN_ENDPOINT3                    usbTxPacketCnt3 = 0;        /* 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;                        usbTxPacketCnt1 = 0;    /* reset data toggling for interrupt endpoint */#       if USB_CFG_HAVE_INTRIN_ENDPOINT3                        usbTxPacketCnt3 = 0;    /* 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){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){  /* no overflow */            converter_t appBuf;            appBuf.ptr = (uchar *)usbRxBuf;            appBuf.bytes[0] = usbAppBuf;            appBuf.bytes[0]++;            usbProcessRx(appBuf.ptr, len);        }#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(usbMsgLen != 0xff){  /* transmit data pending? */        if(usbTxLen & 0x10) /* transmit system idle */            usbBuildTxBlock();    }    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;            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);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);}/* ------------------------------------------------------------------------- */

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲黄色在线视频| 久久久91精品国产一区二区三区| 欧美一级黄色录像| 久久嫩草精品久久久精品一| 国产精品久久久久一区二区三区 | 成人免费观看视频| 在线精品亚洲一区二区不卡| 中文字幕亚洲一区二区av在线| 亚洲视频一区二区免费在线观看| 视频一区二区三区中文字幕| 国产乱码字幕精品高清av| 北条麻妃一区二区三区| 538prom精品视频线放| 久久久久久久久久久电影| 一区二区三区在线不卡| 极品少妇xxxx精品少妇偷拍| 99久久精品一区二区| 欧美一区二区三区在线观看视频 | heyzo一本久久综合| 欧美色图免费看| 国产嫩草影院久久久久| 日韩精品电影在线| 91农村精品一区二区在线| 日韩亚洲欧美成人一区| 最新日韩在线视频| 狠狠v欧美v日韩v亚洲ⅴ| 91在线国内视频| 欧美va亚洲va| 午夜精品久久久久久久99水蜜桃 | 国产精品久久久久9999吃药| 美女尤物国产一区| 成人免费看视频| 欧美不卡123| 一区二区日韩电影| 成人天堂资源www在线| 欧美大片日本大片免费观看| 亚洲一区中文在线| 99久久久免费精品国产一区二区| 精品少妇一区二区三区在线播放| 亚洲午夜在线电影| 国产在线播放一区三区四| 欧美日韩国产区一| 亚洲美女屁股眼交3| 成人精品一区二区三区四区 | 成人高清视频免费观看| 精品久久人人做人人爰| 日本成人在线一区| 在线观看三级视频欧美| 日韩理论电影院| 国产精品乡下勾搭老头1| 欧美v日韩v国产v| 日本aⅴ亚洲精品中文乱码| 色综合天天综合色综合av | 日韩欧美一二三区| 一区二区三区成人在线视频| av不卡免费在线观看| 久久精品欧美一区二区三区麻豆| 美女精品自拍一二三四| 欧美亚男人的天堂| 国产91对白在线观看九色| 精品国产一区二区三区久久影院| 天堂在线亚洲视频| 欧美日本高清视频在线观看| 亚洲欧美国产毛片在线| 波多野结衣的一区二区三区| 国产精品久线观看视频| 成人午夜伦理影院| 国产精品久久久久久亚洲毛片 | 亚洲欧美日韩久久| 91影院在线免费观看| 国产精品网站一区| 成人激情校园春色| 国产精品萝li| 色一情一乱一乱一91av| 一区二区三区色| 欧美无砖砖区免费| 亚州成人在线电影| 亚洲一级在线观看| 91精品91久久久中77777| 亚洲欧美日韩系列| 欧美在线高清视频| 天天操天天综合网| 91精品国产91综合久久蜜臀| 免费国产亚洲视频| 久久新电视剧免费观看| 国产69精品久久99不卡| 亚洲视频免费观看| 欧美日韩在线播放| 五月天久久比比资源色| 欧美一级久久久久久久大片| 精品亚洲porn| 国产精品每日更新| 色狠狠色噜噜噜综合网| 亚洲第一精品在线| 日韩欧美国产一区二区三区 | 国产精品你懂的在线| 91丨porny丨首页| 日韩精品免费专区| 久久久91精品国产一区二区三区| 99精品欧美一区二区三区小说 | 在线成人av影院| 极品少妇xxxx精品少妇偷拍| 国产精品成人免费| 在线观看不卡一区| 精品在线视频一区| 亚洲色图制服诱惑 | 精品一区二区三区不卡| 中文字幕一区三区| 欧美日韩激情一区二区| 精品综合久久久久久8888| 国产精品久久久久久久久晋中| 欧美吻胸吃奶大尺度电影| 天堂成人国产精品一区| 国产日本欧美一区二区| 欧美在线观看一二区| 狠狠色狠狠色综合系列| 中文字幕亚洲一区二区av在线| 51午夜精品国产| 成人avav影音| 日本女优在线视频一区二区| 综合在线观看色| 日韩一区二区三区在线观看| av午夜一区麻豆| 视频一区在线播放| 国产精品网站在线播放| 91精品国产麻豆国产自产在线 | 精品国产一区二区在线观看| 99精品偷自拍| 久久国产精品99久久久久久老狼| 中文字幕在线不卡国产视频| 91精品欧美福利在线观看| 99久久免费精品| 国精产品一区一区三区mba桃花 | 欧美一级免费大片| 国产v日产∨综合v精品视频| 亚洲专区一二三| 中文字幕成人网| 欧美一区二区三区爱爱| 国产精品小仙女| 亚洲国产成人91porn| 国产精品国产馆在线真实露脸| 91精品久久久久久久91蜜桃 | 国产精品福利影院| 日韩欧美www| 在线观看91视频| 成人蜜臀av电影| 国产又黄又大久久| 日本不卡中文字幕| 亚洲成人精品影院| 亚洲人成亚洲人成在线观看图片 | 丰满白嫩尤物一区二区| 日韩和欧美一区二区| 亚洲精品美腿丝袜| 国产精品午夜电影| 久久夜色精品一区| 日韩色在线观看| 欧美日韩大陆一区二区| 日本韩国一区二区三区| 成人免费三级在线| 高清国产一区二区| 国产乱码字幕精品高清av| 久久99精品视频| 久久99精品久久久久久| 日本成人在线一区| 日韩av成人高清| 日韩有码一区二区三区| 亚洲成人动漫av| 亚洲成人免费在线观看| 亚洲一区免费观看| 一区二区理论电影在线观看| 亚洲欧美日韩国产手机在线| 成人欧美一区二区三区白人| 国产精品欧美久久久久无广告| 国产蜜臀av在线一区二区三区| 久久精品夜色噜噜亚洲aⅴ| 久久嫩草精品久久久久| 久久精品人人爽人人爽| 久久精品亚洲精品国产欧美kt∨| 久久蜜臀精品av| 国产日韩欧美不卡在线| 国产精品欧美精品| 1区2区3区国产精品| 亚洲视频资源在线| 亚洲精品日韩一| 亚洲成av人片一区二区三区| 五月天激情综合| 另类小说色综合网站| 久久不见久久见免费视频7| 欧美人与禽zozo性伦| 欧美日韩国产欧美日美国产精品| 一本久道久久综合中文字幕| 91丨porny丨中文| 色婷婷久久久综合中文字幕 | 国产精品久久久久影院亚瑟| 国产精品久久久久一区二区三区| 中文字幕在线观看不卡| 亚洲综合免费观看高清完整版在线 | 久久国产日韩欧美精品| 国产一区亚洲一区| 粉嫩嫩av羞羞动漫久久久|