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

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

?? usbdrv.c

?? AVR s AVR-CDC
?? C
?? 第 1 頁 / 共 2 頁
字號:
#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. * 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. */#if DEBUG_LEVEL > 1    DBG2(0x10 + ((usbRxToken >> 6) & 3), data, len);#else    DBG1(0x10 + ((usbRxToken >> 6) & 3), data, 2);#endif#if USB_CFG_IMPLEMENT_FN_WRITEOUT    if(usbRxToken & 0x80){        usbFunctionWriteOut(data, len);        return;    }    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){                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(usbHalted1 && recipient == USBRQ_RCPT_ENDPOINT && rq->wIndex.bytes[0] == 0x81)   /* request status for endpoint 1 */                        replyData[0] = 1;#endif                    replyData[1] = 0;                    replyLen = 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] == 1){   /* descriptor type requested */                        replyLen = sizeof(usbDescrDevice);                        replyData = (uchar *)usbDescrDevice;                    }else if(rq->wValue.bytes[1] == 2){                        replyLen = USB_CFG_EXTERNAL_CONFIG_DESCRIPTOR_LENGH;                        replyData = (uchar *)usbDescrConfig;                    }else if(rq->wValue.bytes[1] == 3){ /* string descriptor */                        if(rq->wValue.bytes[0] == 0){   /* descriptor index */                            replyLen = sizeof(usbDescrString0);                            replyData = (uchar *)usbDescrString0;#if USB_CFG_VENDOR_NAME_LEN                        }else if(rq->wValue.bytes[0] == 1){                            replyLen = sizeof(usbDescrString1);                            replyData = (uchar *)usbDescrString1;#endif#if USB_CFG_DEVICE_NAME_LEN                        }else if(rq->wValue.bytes[0] == 2){                            replyLen = sizeof(usbDescrString2);                            replyData = (uchar *)usbDescrString2;#endif#if USB_CFG_SERIAL_NUMBER_LENGTH                        }else if(rq->wValue.bytes[0] == 3){                            replyLen = 2 * USB_CFG_SERIAL_NUMBER_LENGTH + 2;                            replyData = (uchar *)usbCfgSerialNumberStringDescriptor;#endif                        }                    }#if USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH                    else if(rq->wValue.bytes[1] == USBDESCR_HID){           /* 0x21 */                        replyLen = 9;                        replyData = (uchar *)usbDescrConfig + 18;                    }else if(rq->wValue.bytes[1] == USBDESCR_HID_REPORT){   /* 0x22 */                        replyLen = USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH;                        replyData = (uchar *)usbHidReportDescriptor;                    }#endif                }else if(rq->bRequest == USBRQ_GET_CONFIGURATION){  /* 8 */                    replyLen = 1;                    replyData = &usbConfiguration;  /* send current configuration value */                }else if(rq->bRequest == USBRQ_SET_CONFIGURATION){  /* 9 */                    usbConfiguration = rq->wValue.bytes[0];#if USB_CFG_IMPLEMENT_HALT                    usbHalted1 = 0;#endif                }else if(rq->bRequest == USBRQ_GET_INTERFACE){      /* 10 */                    replyLen = 1;#if USB_CFG_HAVE_INTRIN_ENDPOINT#if USB_CFG_IMPLEMENT_HALT                }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 */                        usbHalted1 = rq->bRequest - 1;                        if(usbHalted1){                            usbTxBuf1[0] = USBPID_STALL;                            usbTxLen1 = 2;      /* length including sync byte */                        }                        usbTxPacketCnt1 = 0;    /* reset data toggling for interrupt endpoint */                    }#endif                }else if(rq->bRequest == USBRQ_SET_INTERFACE){      /* 11 */                    usbTxPacketCnt1 = 0;        /* reset data toggling for interrupt endpoint */#if USB_CFG_IMPLEMENT_HALT                    usbHalted1 = 0;#endif#endif                }else{                    /* the following requests can be ignored, send default reply */                    /* 1: CLEAR_FEATURE, 3: SET_FEATURE, 7: SET_DESCRIPTOR */                    /* 12: SYNCH_FRAME */                }                usbMsgPtr = replyData;                if(!rq->wLength.bytes[1] && replyLen > rq->wLength.bytes[0])  /* max length is in */                    replyLen = rq->wLength.bytes[0];            }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 = 0;  /* we have no valid msg, use user supplied read/write functions */                }#endif            }        }        /* 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 ACK [has been done by ASM module when OUT token arrived] */                usbTxBuf[0] = USBPID_STALL;                usbTxLen = 2;       /* length including sync byte */            }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 */        }#else        replyLen = 0;      /* send zero-sized block as ACK */#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{        token = USBPID_STALL;        txLen = 2;          /* length including sync byte */        usbMsgLen = 0xff;    }    usbTxBuf[0] = token;    usbTxLen = txLen;#if DEBUG_LEVEL > 1    DBG2(0x20, usbTxBuf, txLen-1);#else    DBG1(0x20, usbTxBuf + 1, 2);#endif}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 < 0)    /* 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            usbHalted1 = 0;#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);}/* ------------------------------------------------------------------------- */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91蜜桃免费观看视频| 久久国产精品区| 91色综合久久久久婷婷| 中文字幕日韩一区| 91农村精品一区二区在线| 亚洲一区影音先锋| 在线电影院国产精品| 久久国产人妖系列| 久久久精品国产免大香伊| 不卡视频在线看| 一区二区欧美精品| 欧美精品在线观看一区二区| 精品无人区卡一卡二卡三乱码免费卡 | 国产成人免费视频一区| 中文字幕巨乱亚洲| 欧美日韩在线精品一区二区三区激情| 午夜精品久久久久久久99水蜜桃| 日韩视频国产视频| 国产91精品入口| 亚洲成人777| 久久婷婷一区二区三区| 91一区二区在线| 美国精品在线观看| 亚洲色图在线看| 日韩久久精品一区| 91网页版在线| 美美哒免费高清在线观看视频一区二区| 久久亚洲一级片| 91黄色免费版| 国产美女在线观看一区| 中日韩av电影| 91精品国产综合久久久久久久久久| 国模套图日韩精品一区二区| 一区二区三区在线看| 精品国产乱码久久久久久夜甘婷婷| 北条麻妃一区二区三区| 日本怡春院一区二区| 中文字幕日韩一区二区| 欧美高清激情brazzers| 91一区二区三区在线观看| 老司机免费视频一区二区三区| 亚洲精品亚洲人成人网在线播放| 精品国产乱码久久久久久浪潮| 在线这里只有精品| 成人精品免费视频| 国内精品第一页| 天天综合网天天综合色| 亚洲国产成人在线| 日韩欧美自拍偷拍| 精品视频在线免费| 成人av小说网| 国产一区二区在线影院| 日韩av在线发布| 一区二区三国产精华液| 中文字幕在线观看一区| 国产欧美日韩在线观看| 精品国产伦一区二区三区观看体验| 欧美日韩中文国产| 色8久久精品久久久久久蜜| 99久久婷婷国产综合精品电影| 国模一区二区三区白浆| 久久黄色级2电影| 奇米色777欧美一区二区| 亚洲综合免费观看高清完整版| 亚洲天堂av老司机| 中文字幕一区二区三区av| 中文字幕乱码一区二区免费| 国产亚洲欧美激情| 精品成人在线观看| 久久先锋资源网| 国产亚洲污的网站| 久久综合999| 国产欧美中文在线| 国产精品免费人成网站| 国产精品天天摸av网| 中文字幕+乱码+中文字幕一区| 国产精品美女久久久久高潮| 国产欧美综合在线| 一区在线观看免费| 亚洲免费观看视频| 亚洲福利视频三区| 日本不卡一二三| 激情欧美一区二区| 国产成都精品91一区二区三| k8久久久一区二区三区| 99久久99精品久久久久久| 色婷婷综合久色| 777午夜精品免费视频| 日韩一区二区三免费高清| 精品国产一二三区| 国产精品视频yy9299一区| 中文字幕一区二区三区在线观看 | 黄色成人免费在线| 成人久久久精品乱码一区二区三区| 岛国精品在线播放| 色婷婷一区二区三区四区| 欧美亚洲一区三区| 精品国产乱码91久久久久久网站| 久久先锋影音av| 国产精品久久久久久妇女6080| 亚洲精品水蜜桃| 麻豆精品蜜桃视频网站| 成人午夜视频网站| 精品视频1区2区3区| 日韩欧美电影一二三| 国产精品视频观看| 亚洲不卡av一区二区三区| 久久99久久久久| 成人av在线网| 欧美一区二区啪啪| 国产精品网站一区| 天天操天天综合网| 国产69精品久久99不卡| 91国偷自产一区二区三区成为亚洲经典 | 国产欧美精品一区| 亚洲一区二区在线视频| 精品在线视频一区| 色综合天天综合| 日韩欧美精品在线| 一区二区三区中文字幕精品精品| 日本在线不卡视频| 99国产精品国产精品毛片| 欧美日韩国产三级| 国产午夜精品久久久久久免费视 | 国产激情一区二区三区| 欧美午夜影院一区| 中文字幕免费不卡| 青青国产91久久久久久| 91在线porny国产在线看| 日韩午夜精品电影| 亚洲香肠在线观看| 成人avav在线| 国产三级精品视频| 亚洲第一搞黄网站| 99免费精品视频| www精品美女久久久tv| 午夜久久电影网| 色天使久久综合网天天| 亚洲国产电影在线观看| 久88久久88久久久| 欧美精品在欧美一区二区少妇| 一色桃子久久精品亚洲| 国产福利一区在线| 精品少妇一区二区| 日日夜夜精品视频免费| 在线一区二区观看| 最新不卡av在线| 国产a视频精品免费观看| 欧美精品一区视频| 日韩精品电影在线观看| 欧洲激情一区二区| 亚洲人成网站影音先锋播放| 成人毛片视频在线观看| 久久精品人人做人人综合| 久久精品噜噜噜成人av农村| 欧美日韩精品免费观看视频| 亚洲视频在线一区二区| 从欧美一区二区三区| 国产亚洲成av人在线观看导航| 久久99久国产精品黄毛片色诱| 欧美精品18+| 亚洲成人综合在线| 欧美色图在线观看| 亚洲成人自拍网| 欧美日韩综合色| 日韩中文字幕不卡| 欧美一区二区在线免费观看| 午夜不卡av在线| 欧美精品在线视频| 奇米色777欧美一区二区| 91精品国产手机| 日本欧洲一区二区| 欧美成人vr18sexvr| 国产伦理精品不卡| 中文字幕乱码一区二区免费| 成人丝袜18视频在线观看| 国产精品蜜臀av| 91成人在线观看喷潮| 亚洲成人激情社区| 日韩片之四级片| 国产高清在线观看免费不卡| 国产精品美女久久久久aⅴ| 91在线视频播放地址| 亚洲最大的成人av| 69精品人人人人| 国产精品一品二品| 亚洲欧美日韩在线| 欧美另类高清zo欧美| 久久电影网电视剧免费观看| 久久―日本道色综合久久| 99久久精品免费看| 亚洲国产欧美一区二区三区丁香婷| 69久久夜色精品国产69蝌蚪网| 九九精品一区二区| 国产精品成人午夜| 欧美日韩国产一区二区三区地区| 麻豆成人91精品二区三区| 国产精品免费免费| 777奇米成人网| 高清不卡一区二区在线|