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

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

?? usbtransfer.c

?? smartARM2400 USB OTG例程
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*****************************Copyright(c)****************************************************************
**                    Guangzhou ZHIYUAN electronics Co.,LTD.
**                                     
**                           http://www.embedtools.com
**
**------File Info-----------------------------------------------------------------------------------------
** File Name:            USBTransfer.c
** Latest modified Date: 2007-11-14        
** Latest Version:       V1.0    
** Description:          USB主機軟件包的傳輸函數
**                       
**--------------------------------------------------------------------------------------------------------
** Created By:           吳隆穗   Longsui Wu   
** Created date:         2007-11-14    
** Version:              V1.0    
** Descriptions:         初始版本
**
**--------------------------------------------------------------------------------------------------------
** Modified by:          
** Modified date:        
** Version:              
** Description:          
**
**--------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Description:
**
*********************************************************************************************************/
#include "USBHostConfig.h"

USB_INT8U __usbCtrlTranPhase_Setup (PUSB_DEV_REQ pusbDevReq);
USB_INT8U __usbCtrlTranPhase_In (USB_INT16U usLength, USB_INT8U *pucBuf);
USB_INT8U __usbCtrlTranPhase_Out (void);

#ifdef __cplusplus
extern "C" {
#endif

/*********************************************************************************************************
** Function name:       usbStandardReqTransfer
** Descriptions:        發送標準請求, 并取得返回值
** input parameters:    pusbDevReq  標準請求
** output parameters:   pucBuf      設備返回的數據
**                      puiSts      狀態,如錯誤號等
** Returned value:      錯誤碼
*********************************************************************************************************/
USB_INT8U usbStandardReqTransfer (PUSB_DEV_REQ pusbDevReq, USB_INT8U *pucBuf)
{
    USB_INT8U ucErr, ucRet;

    if (GusbHostFlags.ucAttached == 0) {                                /*  設備未插入                  */
        return USB_ERR_DEVICE_NOT_ATTACHED;
    }
    
    OS_ENTER_CRITICAL();
    if (GusbHostFlags.bExitStdOperaReq) {                               /*  應用程序要求退出操作        */
        OS_EXIT_CRITICAL();
        return USB_ERR_EXIT_REQ;
    }
    __GusbHostEvtCnt.ucStdTranCnt++;                                    /*  控制傳輸計數器自加1			*/
    OS_EXIT_CRITICAL();
    
    OSSemPend(__GevtUsbCtrlSem, 0, &ucErr);
    
    do {                                                                /*  避免 goto 而使用 do...while */
        
        /*
         *  第一步: SETUP 階段
         */
        ucRet = __usbCtrlTranPhase_Setup(pusbDevReq);
        if (ucRet != USB_ERR_SUCESS) {
            break;
        }
        
        /*
         *  第二步: IN 階段
         */
        ucRet = __usbCtrlTranPhase_In (pusbDevReq->wLength, pucBuf);
        if (ucRet != USB_ERR_SUCESS) {
            break;
        }

        /*
         *  第三步: OUT 階段, 只有 IN 階段有數據傳輸時才需要此 OUT 階段
         */
        if (pusbDevReq->wLength) {
            __usbCtrlTranPhase_Out();
        }
    } while (0);    
    
    OSSemPost(__GevtUsbCtrlSem);

    OS_ENTER_CRITICAL();
    __GusbHostEvtCnt.ucStdTranCnt--;                                    /*  控制傳輸計數器自減1			*/
    OS_EXIT_CRITICAL();
    
    return ucRet;
}

/*********************************************************************************************************
** Function name:       usbDataTransfer
** Descriptions:        發送或接收 Bulk, Intrrupt 傳輸的數據
** input parameters:    pucData       要發送或接收的數據緩沖區
**                      uiLength      要發送或接收數據的長度
**                      uiTranType    傳輸類型: __HC_ED_TYPE_BULK 或 __HC_ED_TYPE_INTR
**                      ucMaxTryCount 當出現錯誤時,最大的重試次數
** Returned value:      錯誤碼
*********************************************************************************************************/
USB_INT8U usbDataTransfer (USB_INT8U *pucData,                          /*  數據緩沖區                  */
                           USB_INT32U uiLength,                         /*  要傳輸的數據長度            */
                           USB_INT8U  ucTranType,                       /*  傳輸類型                    */
                           USB_INT8U  ucMaxTryCount)                    /*  發生錯誤時最大嘗試次數      */
{
    USB_INT8U                     ucErr;
    USB_INT8U                     ucTryCount;
    USB_INT32U                    uiCode;
    
    USB_INT16U                    usMaxLenPerPkt;
    USB_INT16U                    usCurTran;
    USB_INT32U                    uiTotalTran;
    USB_INT32U                    uiBufLen;
    
    USB_INT8U                    *pucBufTmp;
    USB_INT8U                    *pucFristBuf;
    
    __HC_GEN_TD_PARAM             tdParam;
    __PHC_GEN_TRANSFER_DESCRIPTOR ptdAddTd;
    __ED_INFO                     edInfo;
    
    
    if (!usbIsDeviceReady()) {
        return USB_ERR_DEVICE_NOT_READY;
    }
    
    OS_ENTER_CRITICAL();
    if (GusbHostFlags.bExitDataOperaReq) {                              /*  應用程序要求退出操作        */
        OS_EXIT_CRITICAL();
        return USB_ERR_EXIT_REQ;
    }
    
    __GusbHostEvtCnt.ucDataTranCnt++;
    OS_EXIT_CRITICAL();
    
    usbPipeOpen(ucTranType);
    __hcdGetEdInfo(ucTranType, &edInfo);
    usMaxLenPerPkt = edInfo.usMaxPktSize;
    
    OSSemPend(__GevtUsbDataTranSem, 0, &ucErr);
    
    ucTryCount = 0;
    do {
        pucBufTmp = pucData;
        
        /*
         *  設置 TD 的參數
         */
        tdParam.ucBufferRound = 1;
        tdParam.ucDelayIntr   = 0;
        tdParam.ucDataToggle  = 0;
        
        if (ucTranType & 0x80) {
            tdParam.ucDirect_PID = __OHCI_TD_TYPE_IN;
        } else {
            tdParam.ucDirect_PID = __OHCI_TD_TYPE_OUT;
        }
        
        /* 
         *  為傳輸添加傳輸描述符 TD 并啟動傳輸
         *  當數據量比較大時可能會出現TD 不夠,或緩沖區不夠,此時傳輸要分割為多次,
         *  分割點為無法申請到空閑 TD 或申請不到緩沖區時
         */
        uiTotalTran = 0;                                                /*  清零總傳輸量計數器          */
        do{
            uiBufLen = 0;
            do {
                ptdAddTd = __hcdAllocTd(&edInfo);                       /*  申請 TD                     */
                if (ptdAddTd == NULL) {
                    break;
                }

                
                if (uiLength - uiTotalTran <= usMaxLenPerPkt) {
                    usCurTran = (USB_INT16U)(uiLength - uiTotalTran);
                } else {
                    usCurTran = usMaxLenPerPkt;
                }    
         
                tdParam.pucCBP = __usbAllocGenBuffer(usCurTran);    
                if (tdParam.pucCBP == NULL) {                           /*  如果現在無緩沖區可用,則,    */
                                                                        /*  ...跳出本循環               */
                    __hcdFreeTd(&edInfo, ptdAddTd);
                    break;
                }
                if (!(ucTranType & 0x80)) {                             /*  OUT 傳輸                    */
                    usbMemCopy(tdParam.pucCBP, pucBufTmp, usCurTran);
                    pucBufTmp = pucBufTmp + usCurTran;
                } else {                                                /*  IN 傳輸                     */  
                    if (uiBufLen == 0) {
                        pucFristBuf = tdParam.pucCBP;                   /*  保存第一次的緩沖區位置,     */
                    }                                                   /*  ...usbMemCopy時要用         */
                }
                tdParam.usBufLen = usCurTran;
                __hcdAddTd(&tdParam, ptdAddTd, &edInfo);                /*  將申請到的TD加入到ED中      */ 
                uiTotalTran = (USB_INT32U)(uiTotalTran + usCurTran);
                uiBufLen = (USB_INT32U)(uiBufLen + usCurTran);
            } while (uiTotalTran < uiLength);
        
            __usbEdClearSkip(ucTranType);                               /*  清除 sKip 位                */
            __hcStartSchedule(ucTranType);
            
            uiCode = (USB_INT32U)OSMboxPend(__GevtUsbDataTranMbox, USB_TIMEOUT_TICK, &ucErr);
                                                                        /*  等待調度任務處理完畢        */
            if (ucErr != OS_NO_ERR) {                                   /*  等待超時                    */
                uiCode = (USB_INT32U)(USB_ERR_TIMEOUT << 24);           /*  超時錯誤碼                  */
                ucTryCount = (USB_INT8U)(ucMaxTryCount + 1);            /*  使當前重試次數大于最大重試  */
                                                                        /*  次數,使程序退出do while循環 */
                __hcDisEnSchedAndWaitNextFrame(ucTranType);
                __hcdEdLetHeadEquTail(&edInfo);                         /*  強制 使HeadP = TailP        */
                __hcdFreeAllTd(&edInfo);                                /*  釋放所有 TD 資源            */
                __hcEnableSchedule(ucTranType);
                break;
            }
            if (uiCode == __USB_TRANDEAL_OK) {
                if ((ucTranType & 0x80)) {                              /*  IN 傳輸                     */
                    usbMemCopy(pucBufTmp, pucFristBuf, uiBufLen);           /*  將USB RAM里的數據拷貝至     */
                                                                        /*  ...用戶緩沖區               */
                    pucBufTmp = pucBufTmp + uiBufLen;
                }
                __usbFreeGenBuffer(uiBufLen);                           /*  釋放所占USB RAM緩沖區       */
            } else if (__USBLSB(uiCode, 0) == __USB_TRANDEAL_ERR_TRY) { /*  需要重試                    */
                if (__USBLSB(uiCode, 3) == USB_ERR_STALL) {            /*  端點被禁止, 需要解禁        */
                    usbClearFeature_EP(usbGetEp(0, ucTranType));

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日本vs亚洲vs韩国一区三区| 久久久久久久久一| 国产欧美一区二区精品久导航| 亚洲老司机在线| 国产一区在线看| 欧美日韩国产成人在线91| 国产精品萝li| 国产一区二区福利视频| 欧美日本在线播放| 亚洲三级在线免费| 国产福利精品一区二区| 欧美一区欧美二区| 亚洲一区二区三区自拍| eeuss鲁片一区二区三区在线看| 欧美变态口味重另类| 午夜精品久久久久久久99樱桃| 99精品视频一区二区| 久久精品在这里| 精品一区二区三区在线观看| 欧美色图一区二区三区| 亚洲视频在线观看三级| 国产成人精品亚洲日本在线桃色| 欧美一区二区视频在线观看2020 | 欧美三级视频在线观看| 亚洲色图欧洲色图婷婷| 91精品国产综合久久久久久久| 国产精品三级视频| 国产成人在线影院| 欧美精品一区二区精品网| 日本欧美久久久久免费播放网| 一本色道久久加勒比精品 | 日韩一区二区精品| 亚洲成年人影院| 欧美自拍偷拍一区| 亚洲精品一二三区| 91免费国产在线观看| 一区二区中文视频| av成人老司机| 亚洲日本在线看| 99re8在线精品视频免费播放| 中文字幕巨乱亚洲| 成a人片亚洲日本久久| 国产精品色噜噜| av在线播放不卡| 中文字幕一区二区不卡| 91在线视频免费观看| 亚洲色图清纯唯美| 色婷婷综合久久久久中文| 亚洲免费av在线| 日本道免费精品一区二区三区| 艳妇臀荡乳欲伦亚洲一区| 欧美日韩一区二区三区四区| 日韩精品乱码免费| 日韩一区二区免费视频| 久久国产精品免费| 久久久777精品电影网影网 | 亚洲成av人片一区二区| 在线不卡的av| 激情文学综合丁香| 久久精品一区二区三区不卡牛牛| 成人h版在线观看| 最近中文字幕一区二区三区| 色爱区综合激月婷婷| 五月激情综合色| 日韩欧美123| 国产成人av福利| 亚洲人成精品久久久久久| 日本高清不卡aⅴ免费网站| 午夜精品久久久久久久久久久 | 欧美tickling挠脚心丨vk| 国产精品一区在线观看乱码| 国产精品国产三级国产aⅴ入口 | 免费美女久久99| 国产亚洲精品免费| 99久久精品国产观看| 亚洲国产日产av| 欧美一级片免费看| 国产成人激情av| 亚洲精品中文字幕在线观看| 欧美一区二区大片| 成人精品视频.| 一区二区三区中文字幕| 91精品国产91久久综合桃花| 夫妻av一区二区| 亚洲综合另类小说| 精品1区2区在线观看| 一本色道亚洲精品aⅴ| 日韩中文字幕亚洲一区二区va在线| 2017欧美狠狠色| 色综合久久中文综合久久97| 美女性感视频久久| 国产精品久线在线观看| 欧美精品久久久久久久久老牛影院 | 日韩欧美一二区| 成人av在线电影| 日韩av中文在线观看| 国产精品五月天| 在线播放91灌醉迷j高跟美女| 国产成人午夜99999| 亚洲成人激情综合网| 欧美高清在线视频| 91麻豆精品国产91久久久久久久久| 丁香一区二区三区| 日韩在线a电影| 自拍偷自拍亚洲精品播放| 日韩三级视频在线看| 色美美综合视频| 国产精品白丝jk白祙喷水网站| 香蕉影视欧美成人| 国产精品久久久久久久久图文区| 日韩一区二区中文字幕| 一本一本久久a久久精品综合麻豆 一本一道波多野结衣一区二区 | 欧美吻胸吃奶大尺度电影| 国产精品18久久久久久久久| 日韩精品一二三四| 亚洲色图清纯唯美| 国产欧美一区二区三区网站| 8v天堂国产在线一区二区| 99久久er热在这里只有精品15| 久久国产精品72免费观看| 亚洲成人动漫在线免费观看| 中文字幕日韩一区| 久久久久久久久99精品| 91麻豆精品国产91久久久久久| 91一区二区在线观看| 国产精品一区免费在线观看| 天堂久久久久va久久久久| 亚洲日本在线看| 国产精品情趣视频| 久久午夜国产精品| 日韩丝袜美女视频| 欧美丝袜丝交足nylons图片| 色综合一个色综合亚洲| 国产成人精品综合在线观看| 久久国产免费看| 日韩成人精品在线| 亚洲福利国产精品| 亚洲欧美日韩综合aⅴ视频| 久久精品一区二区三区四区| 日韩一区二区三区电影在线观看| 91黄色免费网站| 一本久久精品一区二区 | 日本美女视频一区二区| 一区二区三区四区国产精品| 中文字幕中文字幕一区二区| 欧美经典一区二区| 久久久综合视频| 久久综合成人精品亚洲另类欧美| 日韩美女天天操| 日韩天堂在线观看| 日韩免费观看高清完整版在线观看| 欧美一级视频精品观看| 日韩美女主播在线视频一区二区三区| 欧美男同性恋视频网站| 欧美丝袜第三区| 欧美嫩在线观看| 欧美一区二区在线视频| 91精品国产综合久久精品app| 欧美四级电影在线观看| 欧美色欧美亚洲另类二区| 欧美日韩国产首页在线观看| 欧美日韩国产成人在线91| 欧美妇女性影城| 日韩一区二区三| 日韩女优毛片在线| 国产亚洲一区二区三区| 国产欧美精品在线观看| 国产精品免费免费| 亚洲天堂中文字幕| 亚洲国产欧美在线| 五月婷婷激情综合| 美女被吸乳得到大胸91| 国产精品自拍三区| 99热这里都是精品| 欧洲生活片亚洲生活在线观看| 欧美日韩国产小视频| 日韩欧美国产麻豆| 久久综合九色欧美综合狠狠| 久久久蜜桃精品| 国产精品久久毛片av大全日韩| 最新成人av在线| 午夜视频在线观看一区二区| 免费成人在线视频观看| 国产精品一线二线三线精华| av福利精品导航| 欧美日韩视频在线第一区| 欧美一卡2卡3卡4卡| 国产日韩亚洲欧美综合| 亚洲特级片在线| 婷婷激情综合网| 国产真实精品久久二三区| bt欧美亚洲午夜电影天堂| 欧美色成人综合| 精品国产乱码久久久久久图片 | 3d动漫精品啪啪1区2区免费| 久久在线观看免费| 亚洲丝袜精品丝袜在线| 日本美女一区二区三区视频| 国产乱理伦片在线观看夜一区 | 国模冰冰炮一区二区|