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

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

?? usbdrv.c

?? AVR單片機模擬USB實現CDC類串行口
?? C
?? 第 1 頁 / 共 2 頁
字號:
        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. *//* 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 */#ifdef USB_RX_USER_HOOK    USB_RX_USER_HOOK(data, len)#endif#if USB_CFG_IMPLEMENT_FN_WRITEOUT    if(usbRxToken < 0x10){  /* endpoint number in usbRxToken */        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_PRODUCT, 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 */#if USB_CFG_DESCR_PROPS_HID_REPORT  /* only support HID descriptors if enabled */                    }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)#endif  /* USB_CFG_DESCR_PROPS_HID_REPORT */                    }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(USB_INITIAL_DATATOKEN);  /* reset data toggling for interrupt endpoint */#   if USB_CFG_HAVE_INTRIN_ENDPOINT3                    USB_SET_DATATOKEN3(USB_INITIAL_DATATOKEN);  /* 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(USB_INITIAL_DATATOKEN);  /* reset data toggling for interrupt endpoint */#       if USB_CFG_HAVE_INTRIN_ENDPOINT3                        USB_SET_DATATOKEN3(USB_INITIAL_DATATOKEN);  /* 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;}/* ------------------------------------------------------------------------- */USB_PUBLIC 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);    }}/* ------------------------------------------------------------------------- */USB_PUBLIC 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(USB_INITIAL_DATATOKEN);  /* reset data toggling for interrupt endpoint */#   if USB_CFG_HAVE_INTRIN_ENDPOINT3    USB_SET_DATATOKEN3(USB_INITIAL_DATATOKEN);  /* reset data toggling for interrupt endpoint */#   endif#endif}/* ------------------------------------------------------------------------- */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一区二区欧美在线观看| 国产v综合v亚洲欧| 亚洲精品五月天| 亚洲欧美偷拍三级| 国产精品私人自拍| 国产网站一区二区三区| 久久综合色天天久久综合图片| 日韩视频一区二区在线观看| 欧美疯狂做受xxxx富婆| 欧美日韩国产综合一区二区三区| 色狠狠综合天天综合综合| 色偷偷成人一区二区三区91| 99热精品国产| 欧美又粗又大又爽| 91精品福利在线| 欧美丝袜丝交足nylons| 7777女厕盗摄久久久| 91福利精品第一导航| 91蜜桃婷婷狠狠久久综合9色| 91免费精品国自产拍在线不卡 | 99久久精品国产导航| 成人爱爱电影网址| 成人国产精品免费观看| 91福利在线看| 欧美精三区欧美精三区| 日韩精品最新网址| 国产午夜亚洲精品不卡| 欧美国产丝袜视频| 综合久久给合久久狠狠狠97色| 中文字幕精品一区二区精品绿巨人| 国产精品成人免费| 亚洲一区二区三区爽爽爽爽爽| 日韩成人免费在线| 国产在线精品一区二区不卡了| 成人av资源在线| 在线影视一区二区三区| 日韩一区二区三区高清免费看看| 久久久美女艺术照精彩视频福利播放| 国产精品乱码妇女bbbb| 亚洲一区视频在线| 国产成人免费视频网站| 欧美日韩国产a| 亚洲国产精品成人综合色在线婷婷 | 色噜噜狠狠成人中文综合| 欧美日韩激情一区二区| 国产精品久久毛片a| 美女脱光内衣内裤视频久久影院| 99视频在线精品| 亚洲欧洲综合另类| 老司机午夜精品| 在线看国产一区二区| 国产精品久久久久影视| 精品一区二区免费| 51久久夜色精品国产麻豆| 一区二区三区在线免费视频| 成人激情动漫在线观看| 精品美女一区二区| 裸体在线国模精品偷拍| 欧美日本一区二区三区| 一区二区三区自拍| 97精品超碰一区二区三区| 国产欧美日韩精品一区| 国模无码大尺度一区二区三区| 欧美伦理影视网| 视频一区中文字幕国产| 欧美日韩视频在线一区二区| 亚洲综合色婷婷| 欧美主播一区二区三区| 亚洲综合精品久久| 欧美影院午夜播放| 亚洲中国最大av网站| 欧美丝袜自拍制服另类| 午夜激情一区二区三区| 日韩一区二区精品在线观看| 欧美三级日韩三级| 欧美日韩国产小视频在线观看| 亚洲素人一区二区| 国产成人精品网址| 欧美性高清videossexo| 一区二区三区欧美激情| 色天使久久综合网天天| 亚洲精品你懂的| 欧美亚一区二区| 偷窥少妇高潮呻吟av久久免费| 欧美日韩成人在线一区| 美女脱光内衣内裤视频久久网站| 日韩欧美综合在线| 国产伦精品一区二区三区在线观看| 精品国内二区三区| www.亚洲人| 亚洲电影视频在线| 欧美一级欧美一级在线播放| 狠狠色狠狠色综合日日91app| 国产校园另类小说区| aaa欧美日韩| 婷婷一区二区三区| 国产亚洲精久久久久久| 色哟哟一区二区| 裸体健美xxxx欧美裸体表演| 久久久久久久综合日本| 欧洲日韩一区二区三区| 乱一区二区av| 亚洲激情图片qvod| 久久综合色8888| 欧美专区日韩专区| 国产精品亚洲第一区在线暖暖韩国 | 99国产欧美久久久精品| 一区二区三区免费| 国产精品一区不卡| 久久精品人人做人人综合 | 精品盗摄一区二区三区| 国产精品伊人色| 亚洲国产美女搞黄色| 欧美mv和日韩mv的网站| eeuss国产一区二区三区| 午夜电影久久久| 日本一区二区三区在线观看| 欧美视频在线观看一区| 国产一区高清在线| 亚洲成a人v欧美综合天堂下载| 久久久噜噜噜久久中文字幕色伊伊| 国产精品白丝jk黑袜喷水| 亚洲精品成人天堂一二三| 久久综合久久鬼色中文字| 99久久综合国产精品| 国产一区二区在线视频| 肉色丝袜一区二区| 一区二区三区四区av| 欧美久久一二三四区| 精品一区二区三区在线观看| 亚洲女子a中天字幕| 国产日韩欧美在线一区| 6080午夜不卡| 欧美日韩三级在线| 在线免费观看日本欧美| 粗大黑人巨茎大战欧美成人| 久久精品国产免费| 美女一区二区视频| 日韩av在线免费观看不卡| 亚洲精品视频自拍| 亚洲色图视频网| 亚洲欧洲精品一区二区精品久久久| 精品黑人一区二区三区久久| 欧美一区二区三区色| 欧美一区二区精品| 欧美一区二区三区在| 欧美在线看片a免费观看| 国产在线国偷精品免费看| 亚洲韩国一区二区三区| 久久精品一区二区三区不卡| 日韩一级片网站| 欧美精品粉嫩高潮一区二区| 在线观看一区不卡| 一本久道久久综合中文字幕| 97精品久久久午夜一区二区三区| 高清shemale亚洲人妖| 国产成人av电影在线播放| 国产福利一区二区| 99在线热播精品免费| 一本久道中文字幕精品亚洲嫩| 一本色道**综合亚洲精品蜜桃冫| 色综合一区二区| 欧美性色黄大片| 日韩天堂在线观看| 久久久影视传媒| 国产精品久久久久一区二区三区| 中文字幕在线观看不卡视频| 亚洲综合色成人| 日本不卡的三区四区五区| 黑人巨大精品欧美一区| 菠萝蜜视频在线观看一区| 久久er精品视频| 福利一区二区在线| 色一情一乱一乱一91av| 欧美高清一级片在线| 精品国产免费一区二区三区四区| 国产亚洲综合av| 亚洲一区免费视频| 精品在线观看免费| 99视频超级精品| 欧美一区二区三区在线视频| 欧美激情综合网| 日韩精品视频网站| 国产黑丝在线一区二区三区| 在线观看欧美黄色| 久久久久久久久一| 一区二区三区免费看视频| 国内外成人在线| 色婷婷久久久久swag精品| 日韩精品一区二区三区视频播放 | 欧美蜜桃一区二区三区| 久久亚洲二区三区| 亚洲自拍都市欧美小说| 国产一区二区视频在线播放| 在线日韩一区二区| 久久青草国产手机看片福利盒子| 亚洲综合图片区| www.66久久| 久久精品一区八戒影视| 首页亚洲欧美制服丝腿|