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

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

?? usbdrv.c

?? AVRusb開發的一個電腦遙控器
?? C
?? 第 1 頁 / 共 2 頁
字號:
        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}#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);}/* ------------------------------------------------------------------------- */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产中文一区二区三区| 99久久精品情趣| 日韩你懂的在线观看| 麻豆免费精品视频| 欧美精品一区二区在线播放 | 一本色道久久综合精品竹菊| 亚洲免费大片在线观看| 欧美在线高清视频| 色先锋久久av资源部| 欧美亚洲高清一区| 亚欧色一区w666天堂| 欧美精三区欧美精三区| 国模大尺度一区二区三区| 国产日韩亚洲欧美综合| 99精品久久免费看蜜臀剧情介绍| 亚洲免费av高清| 欧美二区三区的天堂| 国产精品一二三四| 国产精品久久福利| 7777精品久久久大香线蕉| 国产一区二区三区四区五区入口 | 久久这里只有精品视频网| 成人激情校园春色| 亚洲国产视频在线| 久久久久久久综合狠狠综合| 91一区二区在线观看| 日本亚洲三级在线| 国产精品久久一级| 555www色欧美视频| 丁香天五香天堂综合| 亚洲成人手机在线| 国产欧美日韩精品在线| 欧美老女人在线| 99久久精品国产导航| 奇米888四色在线精品| 国产精品久久久久影院老司| 91精品国产丝袜白色高跟鞋| 五月综合激情日本mⅴ| 尤物在线观看一区| 久久久久综合网| 欧美午夜电影在线播放| 国产一区二区精品在线观看| 天天综合色天天综合色h| 国产黄色精品网站| 精品精品国产高清a毛片牛牛| 中文字幕av在线一区二区三区| 91精品国产综合久久久蜜臀图片| 亚洲精品水蜜桃| 色婷婷亚洲综合| 亚洲欧美一区二区三区极速播放| 一本色道**综合亚洲精品蜜桃冫 | 欧美视频在线不卡| 日本女优在线视频一区二区| 国产精品成人网| 国产色婷婷亚洲99精品小说| 欧美精选在线播放| 色八戒一区二区三区| 成人黄色在线视频| 国产精品影视在线观看| 蜜臀久久99精品久久久久久9| 亚洲激情欧美激情| 亚洲视频1区2区| 国产精品久久久久久久久晋中 | 欧美一区二区三区视频| 99精品一区二区三区| 国产精品资源在线| 韩国女主播一区| 老司机午夜精品| 青草国产精品久久久久久| 亚洲成a人在线观看| 亚洲一区二区三区中文字幕| 亚洲欧美在线视频| 国产精品久久看| 中文字幕一区在线| 亚洲欧美另类小说| 亚洲精品久久7777| 亚洲综合成人在线视频| 亚洲精品第1页| 亚洲综合另类小说| 亚洲嫩草精品久久| 亚洲综合在线观看视频| 亚洲一区在线观看网站| 亚洲成人tv网| 日本成人在线看| 精品在线一区二区| 国产成人亚洲综合色影视| 国产高清久久久| 成人久久视频在线观看| 色婷婷综合久久久中文字幕| 在线中文字幕一区| 欧美蜜桃一区二区三区| 日韩午夜在线观看视频| 日韩视频一区二区三区| 久久蜜桃av一区二区天堂| 国产精品日产欧美久久久久| 最新久久zyz资源站| 亚洲小少妇裸体bbw| 日韩高清在线观看| 蜜桃视频一区二区| 国产一区二区三区免费看 | 日韩国产欧美在线视频| 麻豆成人91精品二区三区| 国产精品亚洲人在线观看| 99久久99久久精品免费观看| 欧美三级日韩三级| 精品国产sm最大网站| 亚洲欧美在线观看| 日日夜夜一区二区| 国产精品 欧美精品| 在线这里只有精品| 欧美精品一区二区三区久久久| 国产精品国产三级国产有无不卡| 一区二区三区欧美在线观看| 蜜臀a∨国产成人精品| 成人高清av在线| 欧美精品第一页| 国产精品久久久久婷婷二区次| 一区二区三区视频在线看| 麻豆国产91在线播放| 99vv1com这只有精品| 欧美一区二区三区思思人| 国产精品视频看| 五月天中文字幕一区二区| 成人免费高清视频在线观看| 91精品久久久久久蜜臀| 国产精品久久久久久久浪潮网站 | 久久青草欧美一区二区三区| 一区二区三区四区激情| 国产在线不卡视频| 精品视频一区 二区 三区| 国产亚洲成年网址在线观看| 婷婷中文字幕综合| av一区二区三区在线| 欧美一级高清片| 亚洲老司机在线| 国产成人午夜片在线观看高清观看| 精品视频免费看| 中文字幕视频一区| 国产精品996| 欧美一区二区三级| 亚洲国产日韩一级| 99久久久免费精品国产一区二区| 精品少妇一区二区三区日产乱码| 亚洲国产成人tv| 色先锋aa成人| 亚洲欧洲在线观看av| 国产精品一二三| 2020日本不卡一区二区视频| 免费观看在线综合| 7777精品伊人久久久大香线蕉的| 一区二区三区精品在线| 99免费精品视频| 日本一二三四高清不卡| 国产一区二区三区综合| 久久综合色8888| 国产在线看一区| 久久久天堂av| 国产精品资源网站| 国产亚洲精品aa| 国产麻豆精品在线观看| 2021中文字幕一区亚洲| 狠狠网亚洲精品| 久久久影视传媒| 国产91精品一区二区麻豆网站| xvideos.蜜桃一区二区| 国产一区二区三区久久悠悠色av| 欧美videos大乳护士334| 免费在线观看成人| 日韩欧美一级在线播放| 六月丁香婷婷久久| 久久蜜桃av一区精品变态类天堂| 激情综合五月天| 国产视频一区在线观看 | 91亚洲精品久久久蜜桃网站 | 久久精品一区蜜桃臀影院| 狠狠色丁香婷婷综合久久片| 久久久久久亚洲综合| 国产69精品久久99不卡| 国产精品久久看| 91极品美女在线| 国产欧美一区二区精品性色| 成人精品高清在线| 亚洲男人的天堂av| 欧美日韩在线三级| 日本不卡视频一二三区| www国产亚洲精品久久麻豆| 国产精品99久久久久久有的能看| 国产欧美一区二区在线| 成人av免费网站| 亚洲成人资源网| 精品国产免费人成在线观看| 国产成人综合精品三级| 亚洲日本中文字幕区| 欧美色综合网站| 激情综合五月婷婷| 国产精品久久久久久久久免费桃花| 在线看国产一区| 日韩二区三区在线观看| 国产亚洲精品久| 欧美日韩亚洲丝袜制服|