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

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

?? usbshed.c

?? smartARM2400 USB OTG例程
?? C
字號:
/*****************************Copyright(c)****************************************************************
**                    Guangzhou ZHIYUAN electronics Co.,LTD.
**                                     
**                           http://www.embedtools.com
**
**------File Info-----------------------------------------------------------------------------------------
** File Name:            usbShed.c
** Latest modified Date: 2007-11-24        
** Latest Version:       V1.0    
** Description:          調度任務的實現
**                       
**--------------------------------------------------------------------------------------------------------
** Created By:           吳隆穗   Longsui Wu   
** Created date:         2007-11-06    
** Version:              V1.0    
** Descriptions:         初始版本
**
**--------------------------------------------------------------------------------------------------------
** Modified by:          
** Modified date:        
** Version:              
** Description:          
**
**--------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Description:
**
*********************************************************************************************************/
#include "USBHostConfig.h"
#include "stdlib.h"

OS_EVENT *__GevtUsbMsgQeue;                                             /*  調度消息隊列                */
void     *__GevtUsbMsgQeueTbl[__USB_MSGQEUE_LENGTH];                    /*  消息隊列緩沖區              */

OS_EVENT *__GevtUsbCtrlMbox;                                            /*  控制傳輸郵箱                */
OS_EVENT *__GevtUsbDataTranMbox;                                        /*  批量,中斷傳輸郵箱           */

OS_EVENT *__GevtUsbCtrlSem;                                             /*  控制傳輸信號量,用于實現互斥 */
OS_EVENT *__GevtUsbDataTranSem;                                         /*  批量,中斷傳輸信號量         */

#define __TASK_USB_SCHED_STK_LEN    512                                 /*  調度任務堆棧長度            */
#define __TASK_USB_ENUM_STK_LEN     512                                 /*  枚舉任務堆棧長度            */

void __taskUsbSheduler (void *pdata);
void __taskUsbEnum (void *pdata);
void __usbEnumDeal (USB_INT8U ucCode);
void __usbDoneHeadDeal (USB_INT32U uiTdHeadDoneList);
void __usbConectChange (USB_INT32U uiCode, USB_INT32U uiEnumPrio);

OS_STK	__taskUsbShedulerStk [__TASK_USB_SCHED_STK_LEN];                /*  調度任務堆棧                */
OS_STK	__taskUsbEnumStk [__TASK_USB_ENUM_STK_LEN];                     /*  枚舉任務堆棧                */


/*********************************************************************************************************
** Function name:       __usbShedInit
** Descriptions:        USB調度的環境初始化化,主要是初始化消息隊列,消息郵箱等
** input parameters:    None
** output parameters:   None
** Returned value:      TRUE : 成功    FALSE : 失敗
*********************************************************************************************************/
USB_BOOL __usbShedInit (void)
{
    __GevtUsbMsgQeue = OSQCreate(&__GevtUsbMsgQeueTbl[0], __USB_MSGQEUE_LENGTH);
    if (__GevtUsbMsgQeue == NULL) {
        return FALSE;
    }
 
    __GevtUsbCtrlMbox = OSMboxCreate((void *)0);
    if (__GevtUsbCtrlMbox == NULL) {
        return FALSE;
    }
    
    __GevtUsbDataTranMbox = OSMboxCreate((void *)0);
    if (__GevtUsbDataTranMbox == NULL) {
        return FALSE;
    }
       
    __GevtUsbCtrlSem = OSSemCreate(1);
    if (__GevtUsbCtrlSem == NULL) {
        return FALSE;
    }
    
    __GevtUsbDataTranSem = OSSemCreate(1);
    if (__GevtUsbDataTranSem == NULL) {
        return FALSE;
    }
    
    return TRUE;

}

/*********************************************************************************************************
** Function name:       __usbCreateShedTask
** Descriptions:        創建調度任務
** input parameters:    None
** output parameters:   None
** Returned value:      TRUE : 創建成功    FALSE : 創建失敗
*********************************************************************************************************/
USB_BOOL __usbCreateShedTask (USB_INT8U ucShedPrio, USB_INT8U ucEnumPrio)
{
    if (OSTaskCreate(__taskUsbSheduler, (void *)(USB_INT32U)ucEnumPrio, \
        &__taskUsbShedulerStk[__TASK_USB_SCHED_STK_LEN - 1], ucShedPrio) == OS_NO_ERR) {
        return TRUE;
    } else {
        USBDEBUG_SENDSTR("\r\n!!Create scheduler task failed!\r\n ");
        return FALSE;
    }
}  
    
/*********************************************************************************************************
** Function name:       __taskUsbSheduler
** Descriptions:        uC/OS-II任務,用于對USB的各個事件進行調度
** input parameters:    pdata: uC/OS-II要求的參數
** output parameters:   None
** Returned value:      None
*********************************************************************************************************/
void __taskUsbSheduler (void *pdata)
{
    INT8U  ucErr;
    INT32U uiMsgCode;
    
    while (1) {
        uiMsgCode = (INT32U)OSQPend(__GevtUsbMsgQeue, 0, &ucErr);
        if (ucErr == OS_NO_ERR) {
            switch ((__USBLSB(uiMsgCode, 3)) & 0xF0U) {                 /*  BIT31~24為事件類型          */
            
            case __USB_SHED_CONCHANGE:                                  /*  連接改變                    */
                __usbConectChange(uiMsgCode, (USB_INT32U)pdata);
                break;
                
            case __USB_SHED_DONEHEAD:                                   /*  Write back done處理         */
                __usbDoneHeadDeal((uiMsgCode << 4) & 0xFFFFFFF0);
                break;
            
            case __USB_SHED_SHEDOVERRUN:                                /*  SchedulingOverrun 處理      */
                USBDEBUG_SENDSTR("\r\nSchedulingOverrun\r\n");   
                break;
            
            case __USB_SHED_UNRECERROR:                                 /*  Unrecoverable Error         */
                USBDEBUG_SENDSTR("\r\nUnrecoverable Error\r\n");   
                break;
                
            case __USB_SHED_DELSELF:                                    /*  刪除自身任務                */
                OSTaskDel(OS_PRIO_SELF);
                break;
                
            default:
                USBDEBUG_SENDSTR("\r\n!!Unknow MsgCode!\r\n\r\n");
                break;
            }
        }
    }
}

/*********************************************************************************************************
** Function name:       __usbDoneHeadDeal
** Descriptions:        對write back done進行處理
** input parameters:    uiTdHeadDoneList 傳輸完成鏈表表頭指針
** output parameters:   None
** Returned value:      None
*********************************************************************************************************/
void __usbDoneHeadDeal (USB_INT32U uiTdHeadDoneList)
{
    USB_INT8U                     ucErrorCode;
    USB_INT8U                     ucType;
    
    __PHC_GEN_TRANSFER_DESCRIPTOR pTdHeadDoneList;
    __ED_INFO                     edInfo;
    
    
    pTdHeadDoneList = (__PHC_GEN_TRANSFER_DESCRIPTOR)uiTdHeadDoneList;
    ucType = __hcdGetTdType(pTdHeadDoneList);                           /*  獲取傳輸類型                */
    ucErrorCode = (USB_INT8U)((pTdHeadDoneList->uiControl >> 28) & 0x0F);
                                                                        /*  獲取錯誤碼,詳見OHCI規范4.3.3*/
    __hcdGetEdInfo(ucType, &edInfo);
    if (ucErrorCode != USB_ERR_NOERR) {                                /*  非正常結束                  */

        USBDEBUG_SENDSTR("\r\n!!Erroe code: ");
        USBDEBUG_SENDCHAR((USB_INT8U)(ucErrorCode + 0x30));
        USBDEBUG_SENDSTR("!!!\r\n\r\n");
        
        __hcdEdLetHeadEquTail(&edInfo);                                 /*  強制 HeadP = TailP          */
        __hcdFreeAllTd(&edInfo);                                        /*  釋放所有 TD 資源            */
        if (ucType == USB_TRAN_TYPE_CONTROL) {                          /*  發送重試信息給傳輸函數      */
            OSMboxPost(__GevtUsbCtrlMbox, (void *)((ucErrorCode << 24) | __USB_TRANDEAL_ERR_TRY));
        } else {
            OSMboxPost(__GevtUsbDataTranMbox, (void *)((ucErrorCode << 24) | __USB_TRANDEAL_ERR_TRY));
        }
    } else {                                                            /*  傳輸正常                    */
        if (ucType == USB_TRAN_TYPE_CONTROL) {                          /*  控制傳輸                    */
            if ((USB_INT32U)pTdHeadDoneList == (USB_INT32U)__GsTranEndTd.pCtrlEndTd) {
                                                                        /*  判斷傳輸是否完畢            */
                __GsTranEndTd.pCtrlEndTd = NULL;
                __hcdFreeAllTd(&edInfo);
                OSMboxPost(__GevtUsbCtrlMbox, (void *)__USB_TRANDEAL_OK);
            }
        } else {                                                        /*  數據傳輸(BULK或INTR傳輸)    */
            if ((USB_INT32U)pTdHeadDoneList == (USB_INT32U)__GsTranEndTd.pDataEndTd) {
                __GsTranEndTd.pDataEndTd = NULL;
                __hcdFreeAllTd(&edInfo);
                OSMboxPost(__GevtUsbDataTranMbox, (void *)__USB_TRANDEAL_OK);
            }
        }
    }
}

/*********************************************************************************************************
** Function name:       __usbConectChange
** Descriptions:        連接改變處理
** input parameters:    uiCode      包括設備是插入還是撥出的信息代碼
**                      uiEnumPrio  枚舉任務的優先級
** output parameters:   None
** Returned value:      None
*********************************************************************************************************/
void __usbConectChange (USB_INT32U uiCode, USB_INT32U uiEnumPrio)
{
    USB_INT8U ucErr, bRet;
    
    if (__USBLSB(uiCode, 0) == 0x00) {
        if (GusbHostFlags.ucAttached == 0) {
            __ohciInit();
            return;
        }
        
        OS_ENTER_CRITICAL();
        GusbHostFlags.ucEnumed = 0;                                                     
        GusbHostFlags.ucConfiged = 0;                                                   
        GusbHostFlags.ucAttached = 0;
    
        GusbHostFlags.ucCtrlPipe = 0;
        GusbHostFlags.ucBulkOutPipe = 0;
        GusbHostFlags.ucBulkInPipe = 0;
        GusbHostFlags.ucIntrOutPipe = 0;
        GusbHostFlags.ucIntrInPipe = 0;
        OS_EXIT_CRITICAL();
        
        usbPipeClose(USB_TRAN_TYPE_CONTROL);
        usbPipeClose(USB_TRAN_TYPE_INTR_OUT);
        usbPipeClose(USB_TRAN_TYPE_INTR_IN);
        usbPipeClose(USB_TRAN_TYPE_BULK_OUT);
        usbPipeClose(USB_TRAN_TYPE_BULK_IN);
        
        __ohciInit();
        
        USBDEBUG_SENDSTR("Device remove! Close Pipe!\r\n");
        
        if (!OSTCBPrioTbl[(INT8U)uiEnumPrio]) {                         /*  設備撥出后,如果枚舉任務還在,    */
            OSTaskDelReq((INT8U)uiEnumPrio);                            /*  ...則申請刪除                   */
        }
        if (__GpDevDisconCallBack) {
            (*__GpDevDisconCallBack)();                                 /*  執行設備撥出回調函數            */
        }

    } else {

        OSTimeDly(20);
        
        bRet = __ohciAffirmAttach(__USBLSB(uiCode, 1));                 /*  確認設備是否仍處插入狀態(未撥出)*/
        if (bRet == FALSE) {
            __ohciInit();
            return;
        }
       
        GusbHostFlags.ucAttached = 1;
        
        USBDEBUG_SENDSTR("\r\n\r\nDevice attach!\r\n");
        
        __hcdInit();
        __ohciInit2(__USBLSB(uiCode, 1));
        
        uiEnumPrio = uiEnumPrio & 0xFF;
        if (GusbHostFlags.ucCtrlPipe == 1) {
            return;
        }
        usbPipeOpen(USB_TRAN_TYPE_CONTROL);
        
        USBDEBUG_SENDSTR("Open Pipe!\r\n");

        ucErr = OSTaskCreate(__taskUsbEnum, (void *)0, &__taskUsbEnumStk[__TASK_USB_ENUM_STK_LEN - 1], \
                             (USB_INT8U)uiEnumPrio);
        if (ucErr == OS_NO_ERR) {
            USBDEBUG_SENDSTR("\r\n Create Enumerate task sucess! Start enumerate...\r\n");
        } else {
            USBDEBUG_SENDSTR("\r\n\r\n Create Enumerate task failed!\r\n");
        }
    }
} 

/*********************************************************************************************************
** Function name:       __usbEnumDeal
** Descriptions:        枚舉后的處理
** input parameters:    ucCode 枚舉是否成功標志
** output parameters:   None
** Returned value:      None
*********************************************************************************************************/
void __usbEnumDeal (USB_INT8U ucCode)
{
    if (ucCode == 0x01) {
        usbPipeOpen(USB_TRAN_TYPE_INTR_OUT);
        usbPipeOpen(USB_TRAN_TYPE_INTR_IN);
        usbPipeOpen(USB_TRAN_TYPE_BULK_OUT);
        usbPipeOpen(USB_TRAN_TYPE_BULK_IN);
    }
}

/*********************************************************************************************************
  END FILE
*********************************************************************************************************/    

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
免费日本视频一区| 成人午夜私人影院| 成人免费一区二区三区视频| 欧美日韩一区二区三区在线看| 久久国产麻豆精品| 亚洲午夜在线视频| 中文字幕亚洲在| 久久午夜免费电影| 51精品国自产在线| 欧美影院一区二区| 99re这里都是精品| 成人午夜又粗又硬又大| 精品亚洲免费视频| 午夜精彩视频在线观看不卡| 国产精品高潮呻吟| 久久精品视频免费观看| 欧美一区二区三区在线观看视频| 在线观看日韩高清av| 白白色亚洲国产精品| 国产麻豆精品95视频| 麻豆中文一区二区| 日韩精品欧美精品| 亚洲小说欧美激情另类| 亚洲伦理在线精品| 亚洲视频香蕉人妖| 亚洲欧美日韩精品久久久久| 日本一二三四高清不卡| 久久色.com| 精品国产a毛片| 欧美电影精品一区二区| 欧美一区二区女人| 欧美一区二区在线看| 91 com成人网| 欧美一级二级三级蜜桃| 日韩一级黄色大片| 日韩一级黄色大片| 精品日韩一区二区三区| 精品国产人成亚洲区| 欧美成人欧美edvon| 久久亚洲一区二区三区明星换脸| 久久综合九色综合97_久久久| 精品久久久三级丝袜| 26uuu国产在线精品一区二区| 日韩午夜在线播放| 精品国产免费久久| 国产片一区二区三区| 国产欧美1区2区3区| 中文字幕在线一区二区三区| 国产精品久久久久久久久免费相片 | 日韩精品成人一区二区三区| 亚洲成人精品在线观看| 丝袜脚交一区二区| 亚洲午夜久久久久久久久久久| 亚洲欧洲无码一区二区三区| 一区二区三区电影在线播| 午夜电影网亚洲视频| 美腿丝袜在线亚洲一区| 国产精品中文欧美| av激情成人网| 欧美三级在线播放| 精品国产一区二区精华| 国产精品麻豆欧美日韩ww| 亚洲精品菠萝久久久久久久| 午夜精品久久久久久不卡8050| 精品一区二区免费在线观看| 国产乱人伦偷精品视频不卡| 99精品视频免费在线观看| 欧美综合一区二区| 日韩三级在线观看| 日本一区二区三区电影| 一区二区免费在线播放| 蜜臀精品久久久久久蜜臀| 粉嫩av一区二区三区在线播放| 91国产免费观看| 精品日韩在线一区| 亚洲天天做日日做天天谢日日欢| 亚洲一区二区不卡免费| 韩国三级在线一区| 一本一本久久a久久精品综合麻豆 一本一道波多野结衣一区二区 | 日韩电影免费在线| 国产91精品在线观看| 色综合久久66| 久久综合999| 一区二区三区美女视频| 美腿丝袜在线亚洲一区| 91在线视频观看| 精品少妇一区二区三区| 亚洲精品国久久99热| 紧缚捆绑精品一区二区| 日本道精品一区二区三区| 久久嫩草精品久久久久| 亚洲成人黄色影院| 成人av网址在线观看| 日韩午夜小视频| 一区二区三区四区精品在线视频 | 性做久久久久久免费观看 | 国产精品1区二区.| 欧美日韩国产123区| 国产精品三级av| 麻豆成人免费电影| 欧美午夜视频网站| 亚洲欧洲国产日本综合| 国产综合色产在线精品| 91精品一区二区三区久久久久久 | 天天影视网天天综合色在线播放| 成人国产精品免费观看动漫| 日韩免费观看高清完整版在线观看| 亚洲男人天堂av| 成人午夜精品在线| 久久蜜桃香蕉精品一区二区三区| 日韩高清欧美激情| 欧美三级一区二区| 亚洲色欲色欲www在线观看| 国产成人福利片| 精品国产123| 蜜臀精品久久久久久蜜臀| 欧美日韩美少妇| 亚洲一区视频在线观看视频| 91色.com| 亚洲日本成人在线观看| 成人免费观看视频| 国产人成一区二区三区影院| 黄页网站大全一区二区| 欧美一级爆毛片| 日本vs亚洲vs韩国一区三区 | 精品写真视频在线观看| 欧美理论片在线| 亚洲不卡在线观看| 91精品办公室少妇高潮对白| 亚洲色大成网站www久久九九| 不卡av在线免费观看| 国产蜜臀97一区二区三区| 国产乱码一区二区三区| 久久色.com| 国产传媒久久文化传媒| 国产亚洲综合av| 国产精品原创巨作av| 久久久久青草大香线综合精品| 久久精品国产99国产| 日韩视频免费观看高清在线视频| 天天色图综合网| 欧美一区二区精美| 美女mm1313爽爽久久久蜜臀| 91精品国产欧美一区二区| 日本午夜一区二区| 欧美大白屁股肥臀xxxxxx| 久久精品国产亚洲a| 2020国产精品久久精品美国| 国产精品影视在线观看| 中文字幕一区二区三区在线播放 | 91精品国产综合久久精品| 热久久久久久久| 精品999在线播放| 丁香啪啪综合成人亚洲小说 | 欧美日韩日本视频| 爽爽淫人综合网网站| 日韩欧美精品在线视频| 国产aⅴ综合色| 亚洲自拍偷拍欧美| 欧美一区二区三区色| 国产麻豆91精品| 国产精品成人免费在线| 欧美综合一区二区| 极品瑜伽女神91| 亚洲欧美激情小说另类| 欧美疯狂性受xxxxx喷水图片| 国产精品影视网| 亚洲免费大片在线观看| 制服丝袜日韩国产| 国产高清无密码一区二区三区| 亚洲精品视频一区| 日韩精品一区二区三区在线| 成人激情午夜影院| 午夜精品久久久久久| 亚洲国产精品高清| 欧美日韩亚洲综合在线 欧美亚洲特黄一级| 日本中文在线一区| 亚洲国产精品99久久久久久久久| 欧美日韩国产一二三| 国产成人免费9x9x人网站视频| 一区二区三区日韩欧美| 久久亚洲综合色一区二区三区| 在线免费视频一区二区| 国产精品自拍在线| 五月开心婷婷久久| 国产精品久久久久永久免费观看| 欧美日韩夫妻久久| 国产98色在线|日韩| 日本成人在线网站| 亚洲另类一区二区| 国产日韩欧美精品在线| 69堂精品视频| 99vv1com这只有精品| 激情亚洲综合在线| 视频一区国产视频| 亚洲免费视频成人| 国产精品网站在线播放| 日韩欧美在线观看一区二区三区| 94-欧美-setu| 懂色av一区二区三区免费观看 |