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

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

?? usbdrv.c

?? 制作AVR下在線
?? 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_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 */   
                    }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;  
}  
  
/* ------------------------------------------------------------------------- */  
  
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(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   
}  
  
/* ------------------------------------------------------------------------- */  

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
免费一级欧美片在线观看| 欧美午夜不卡视频| 欧美一区二区精品| 亚洲成精国产精品女| 一本一道久久a久久精品| 国产精品家庭影院| 国产成人免费视频 | av一本久道久久综合久久鬼色| 精品成人一区二区| 免费欧美在线视频| 94色蜜桃网一区二区三区| 中文字幕在线观看一区| 99久久99久久综合| 亚洲精品视频自拍| 91丨九色丨蝌蚪丨老版| 亚洲视频网在线直播| 99国产精品久| 亚洲妇熟xx妇色黄| 欧美一区二区三区精品| 亚洲成人动漫一区| 欧美体内she精高潮| 午夜精品爽啪视频| 精品国精品自拍自在线| 丁香六月综合激情| 一区二区三区在线免费| 精品国产乱子伦一区| 麻豆精品国产91久久久久久| 久久久综合视频| 97精品国产97久久久久久久久久久久 | 91社区在线播放| 亚洲最大成人网4388xx| 欧美在线观看视频一区二区| 婷婷久久综合九色综合伊人色| 欧美美女视频在线观看| 激情欧美一区二区三区在线观看| 国产精品高潮呻吟久久| 欧美日韩在线三区| 国产一区二区毛片| 一区二区三区在线免费观看| 日韩美一区二区三区| 成人av在线一区二区三区| 亚洲麻豆国产自偷在线| 欧美日韩国产电影| 国产精品原创巨作av| 亚洲国产精品视频| 久久女同精品一区二区| 成人av免费在线播放| 亚洲欧美日韩国产另类专区| 欧美一级生活片| 成人精品免费看| 欧美国产综合一区二区| 一本一本大道香蕉久在线精品| aaa亚洲精品| 蜜臀av在线播放一区二区三区| 日本一区二区三区免费乱视频| 91高清视频免费看| 国产成人精品午夜视频免费| 五月婷婷综合网| 国产精品伦一区二区三级视频| 777午夜精品视频在线播放| 国产99久久久国产精品潘金| 亚洲国产精品久久人人爱蜜臀| 国产精品三级视频| 久久久久久久一区| 欧美一级艳片视频免费观看| 欧美性感一区二区三区| 成人激情文学综合网| 久久国产精品99精品国产| 亚洲成精国产精品女| 综合久久综合久久| 国产精品久久久久影视| 精品sm在线观看| 欧美日韩成人激情| 色综合久久88色综合天天| 成人小视频免费在线观看| 国内偷窥港台综合视频在线播放| 午夜欧美视频在线观看| 综合分类小说区另类春色亚洲小说欧美| 久久久亚洲高清| 久久视频一区二区| 欧美成人猛片aaaaaaa| 91精品欧美久久久久久动漫| 91福利在线导航| 99久久er热在这里只有精品15| 成人性生交大片免费看中文| 日日摸夜夜添夜夜添亚洲女人| 亚洲国产中文字幕| 午夜天堂影视香蕉久久| 一区二区成人在线| 亚洲欧美一区二区三区久本道91| 国产精品麻豆欧美日韩ww| 中文字幕在线播放不卡一区| 国产亚洲精品aa| 精品成a人在线观看| 久久久久久久久久电影| 精品久久99ma| 精品国产露脸精彩对白 | 91成人在线精品| 99re热这里只有精品视频| 蜜臀久久99精品久久久久久9| 亚洲bt欧美bt精品777| 亚洲成av人影院| 五月天久久比比资源色| 视频在线在亚洲| 久久激五月天综合精品| 激情亚洲综合在线| 激情六月婷婷久久| 国产一区激情在线| 不卡一区在线观看| 99久久99久久精品免费观看| 99久久久无码国产精品| 91黄视频在线| 欧美不卡一二三| 欧美国产日韩精品免费观看| 国产精品二三区| 日韩精品免费专区| 国产丶欧美丶日本不卡视频| 国产成人在线免费观看| 99久久久国产精品| 成人久久久精品乱码一区二区三区 | 久久久久久久国产精品影院| 国产亚洲婷婷免费| 中文字幕一区二区三区四区| 亚洲黄色小视频| 一区二区三区毛片| 亚洲码国产岛国毛片在线| 青青草原综合久久大伊人精品优势| 蜜桃视频一区二区三区| 国产成人aaa| 欧美乱熟臀69xxxxxx| 久久美女高清视频| 亚洲综合丝袜美腿| 国产裸体歌舞团一区二区| 91同城在线观看| 日韩三级免费观看| 中文字幕日本乱码精品影院| 亚洲福利电影网| 国产91精品露脸国语对白| 欧美三级电影在线看| 精品成人佐山爱一区二区| 一区二区在线观看免费视频播放 | 亚洲欧美激情在线| 日韩精品1区2区3区| 大尺度一区二区| 亚洲精品一区二区三区精华液| 一区二区在线观看视频| 国产老女人精品毛片久久| 色婷婷久久久久swag精品| 日韩一级片网址| 夜夜嗨av一区二区三区中文字幕| 丁香五精品蜜臀久久久久99网站| 欧美在线视频全部完| 国产精品五月天| 麻豆高清免费国产一区| 日本国产一区二区| 欧美激情中文不卡| 免费在线观看一区| 欧美视频一区二区三区四区 | 欧美日韩国产成人在线免费| 久久久久青草大香线综合精品| 夜夜爽夜夜爽精品视频| 91一区二区三区在线观看| 欧美mv日韩mv| 日韩国产高清在线| 色婷婷综合久久| 中文字幕一区二区不卡| 国产成人超碰人人澡人人澡| 日韩精品一区二区三区视频播放 | 中文字幕精品一区二区精品绿巨人| 亚洲一区中文在线| 丁香一区二区三区| 欧美xxxx老人做受| 久久国内精品自在自线400部| 欧美日韩国产美| 日日骚欧美日韩| 在线成人av影院| 日韩精品高清不卡| 日韩亚洲欧美在线| 日本三级韩国三级欧美三级| 欧美顶级少妇做爰| 日本成人在线视频网站| 日韩一区二区三区高清免费看看| 日韩中文字幕av电影| 欧美巨大另类极品videosbest | 国产一区二区三区在线看麻豆| 91精品国产欧美一区二区18| 亚洲成a人v欧美综合天堂| www.在线成人| 亚洲日本在线a| 欧亚洲嫩模精品一区三区| 久久综合资源网| 国产在线观看一区二区| 国产午夜一区二区三区| 国产一区二区三区久久久| 国产欧美日韩综合精品一区二区| 精品亚洲成av人在线观看| 国产人成一区二区三区影院| 91免费版在线| 偷拍日韩校园综合在线| 日韩一区二区三区高清免费看看|