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

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

?? usbehcdutil.c

?? vxWorks下USB2.0中的EHCI的HCD源碼,極具有參考價值
?? C
?? 第 1 頁 / 共 5 頁
字號:
    	/* Free the siTD data structure */    	memPartFree(ehcdmemPartID, pHeadFreeSITD->pAllocatedMem);        }    /* Update the head and tail pointers to NULL */    pHeadFreeSITD = NULL;    pTailFreeSITD = NULL;    /* Release the event */    OS_RELEASE_EVENT(g_ListAccessEvent);    OS_LOG_MESSAGE_LOW(EHCD,"usbEhcdFreeAllLists - Exit\n",0,0,0,0);    return;    }    /* End of function usbEhcdFreeAllLists() */    /***************************************************************************** usbEhcdFormEmptyQH - forms an empty QH and populates it.** This function is checks if a QH can be retrieved from the free list. If a* QH cannot be retrieved, creates an empty QH. After retrieving a valid QH,* populates the fields of the QH.** RETURNS: Pointer to the USB_EHCD_QH data structure.** ERRNO:*   None.** \NOMANUAL*/pUSB_EHCD_QH usbEhcdFormEmptyQH(VOID)    {    /* To hold the pointer to the Queue Head */    pUSB_EHCD_QH    pQH = NULL;    /* To hold the pointer to the allocated memory */    VOID *       pAllocatedMem = NULL;    OS_LOG_MESSAGE_LOW(EHCD,"usbEhcdFormEmptyQH - Entry\n",0,0,0,0);    /* Get a free QH from the free list */    pQH = usbEhcdGetFreeQH();    /* If the free list is empty, allocate memory and align it */    if (NULL == pQH)        {    	/* Allocate memory considering that the QH is aligned to 32 bytes */        pAllocatedMem = memPartAlignedAlloc (ehcdmemPartID,        				            sizeof(USB_EHCD_QH),                                    USB_EHCD_HC_DATA_STRUCTURE_ALIGNMENT);        /* Check if memory allocation is successful */        if (NULL == pAllocatedMem)            {            OS_LOG_MESSAGE_HIGH(EHCD,"usbEhcdFormEmptyQH - memory not allocated for \                                 QH\n",0,0,0,0);            return NULL;            }        /* Align the memory */        pQH = usbEhcdAlign(pAllocatedMem, USB_EHCD_HC_DATA_STRUCTURE_ALIGNMENT);        /* Initialize all the elements of the Queue Head */        OS_MEMSET(pQH, 0, sizeof(USB_EHCD_QH));         /* Store the allocated memory in aligned QH */        pQH->pAllocatedMem = pAllocatedMem;        }    /* Populate the fields of the QH - Start */    /*     * This field indicates to the hardware that     * the item referenced by the link pointer is a QH     */    USB_EHCD_SET_BITFIELD(QH, pQH->uQueueHeadHorizontalLinkPointer,                             USB_EHCD_TYPE_QH, HORIZONTAL_LINK_POINTER_TYPE);    /*     * Indicate that there are no valid TDs     * in this queue as the QH is newly created     */    USB_EHCD_SET_BITFIELD(QH, pQH->uNextQtdPointer,                             USB_EHCD_INVALID_LINK, NEXTQTD_POINTER_T);    USB_EHCD_SET_BITFIELD(QH, pQH->uAlternateNextQtdPointer,                             USB_EHCD_INVALID_LINK, ALTERNATE_NEXTQTDPOINTER_T);    /* Populate the fields of the QH - End */    OS_LOG_MESSAGE_LOW(EHCD,"usbEhcdFormEmptyQH - Exit\n",0,0,0,0);    return pQH;    }     /* End of function usbEhcdFormEmptyQH() *//***************************************************************************** usbEhcdFormEmptyQTD - forms an empty QTD and populates it.** This function is checks if a QTD can be retrieved from the free list. If a* QTD cannot be retrieved, creates an empty QTD. After retrieving a valid QTD,* populates the fields of the QTD.** RETURNS: Pointer to the USB_EHCD_QTD data structure.** ERRNO:*   None.** \NOMANUAL*/pUSB_EHCD_QTD usbEhcdFormEmptyQTD(VOID)    {    /* To hold the pointer to the QTD */    pUSB_EHCD_QTD    pQTD = NULL;    /* To hold the pointer to the allocated memory */    VOID *       pAllocatedMem = NULL;    /* Get a free QTD from the free list */    pQTD = usbEhcdGetFreeQTD();    /* If the free list is empty, allocate memory and align it */    if (NULL == pQTD)        {    	/* Allocate memory considering that the QH is aligned to 32 bytes */        pAllocatedMem = memPartAlignedAlloc (ehcdmemPartID,        				                     sizeof(USB_EHCD_QTD),                               			     USB_EHCD_HC_DATA_STRUCTURE_ALIGNMENT);        /* Check if memory allocation is successful */        if (NULL == pAllocatedMem)            {            OS_LOG_MESSAGE_HIGH(EHCD,"usbEhcdFormEmptyQTD - memory not allocated for \                                 QTD\n",0,0,0,0);            return NULL;            }        /* Align the memory */        pQTD = usbEhcdAlign(pAllocatedMem, USB_EHCD_HC_DATA_STRUCTURE_ALIGNMENT);        /* Initialize all the elements of the Queue Head */        OS_MEMSET(pQTD, 0, sizeof(USB_EHCD_QTD));        /* Store the allocated memory in aligned QTD */        pQTD->pAllocatedMem = pAllocatedMem;        }    /* Populate the fields of the QTD - Start */    /* Invalidate Link pointer */    USB_EHCD_SET_BITFIELD(QTD,                          pQTD->uNextQTDPointer,                          USB_EHCD_INVALID_LINK,                          NEXTQTD_POINTER_T );    USB_EHCD_SET_BITFIELD(QTD,                          pQTD->uAlternateNextQTDPointer,                          USB_EHCD_INVALID_LINK,                          ALTERNATE_NEXTQTDPOINTER_T );    /* Indicate that a maximum of 2 errors is acceptable during a transfer */    USB_EHCD_SET_BITFIELD(QTD,                          pQTD->uTransferInfo,                          USB_EHCD_MAX_ERRORS,                          TOKEN_CERR );    /* Enable the HC to start executing the Transaction */    USB_EHCD_SET_BITFIELD(QTD,                          pQTD->uTransferInfo,                          USB_EHCD_QTD_STATUS_ACTIVE,                          TOKEN_STATUS);    /* Populate the fields of the QTD - End */    return pQTD;    }    /* End of usbEhcdFormEmptyQTD() *//***************************************************************************** usbEhcdFillQTDBuffer - populates the buffer pointers of the QTD.** This function is used to populate the buffer pointer fields of the QTD.** <pQTD>   - Pointer to the QTD.* <pBuffer>  - Pointer to the start of the buffer* <uSize> - Size of the data to be filled.* RETURNS: Returns the number of bytes which were filled in qTD.** ERRNO:*   None.** \NOMANUAL*/UINT32 usbEhcdFillQTDBuffer    (    pUSB_EHCD_QTD    pQTD, /* Pointer to the QTD */    VOID *        pBuffer,  /* Pointer to the start of the buffer */    UINT32       uSize,     /* Size of the buffer to be filled */    UINT32          uMaxPacketSize /* Maximum packet size */    )    {    /* To hold the index into the buffer pointers of the qTD */    UINT32 uIndex;    UINT32 actualSize;    /* Check the validity of the parameters */    if(NULL == pQTD ||       NULL == pBuffer ||       0 == uSize)        {        return 0;        }    /* Fill qTD's buffer pointer */    USB_EHCD_SET_BITFIELD(QTD,                          pQTD->uBufferPagePointerList[0],                          (((unsigned)USB_EHCD_CONVERT_TO_PCI(pBuffer)) >> 12),                          BUFFER_POINTER);    /* Fill qTD's current offset into the buffer pointer */    USB_EHCD_SET_BITFIELD(QTD,                          pQTD->uBufferPagePointerList[0],                          ((unsigned)USB_EHCD_CONVERT_TO_PCI(pBuffer) & 0xFFF),                          BUFFERPOINTER_CURRENT_OFFSET);    /* Fill the number of bytes to transfer -     * Totally 5 * 4K bytes can be     * transferred using 1 qTD.     */    actualSize = (uSize <= (USB_EHCD_QTD_MAX_TRANSFER_SIZE -                      USB_EHCD_GET_BITFIELD(QTD,                                            pQTD->uBufferPagePointerList[0],                                            BUFFERPOINTER_CURRENT_OFFSET)))    ? uSize:(USB_EHCD_QTD_MAX_TRANSFER_SIZE -                      USB_EHCD_GET_BITFIELD(QTD,                                            pQTD->uBufferPagePointerList[0],                                            BUFFERPOINTER_CURRENT_OFFSET));    pQTD->uBytesToTransfer = actualSize;    /* If uSize is more than BytesToTransfer for this QTD     * and BytesToTransfer is not multiple of maximum packet      * size supported by endpoint, then for IN transaction     * BytesToTransfer should change to next multiple of     * maximum packet size     */    if ((uSize > pQTD->uBytesToTransfer) &&         (pQTD->uBytesToTransfer % uMaxPacketSize))        {        pQTD->uBytesToTransfer = pQTD->uBytesToTransfer - (pQTD->uBytesToTransfer % uMaxPacketSize);        }    USB_EHCD_SET_BITFIELD(QTD,                          pQTD->uTransferInfo,                          pQTD->uBytesToTransfer,                          TOKEN_TOTAL_BYTES_TO_TRANSFER);    /* Update other buffer pointer fields of the qTD .     * Each buffer pointer will be pointing to a different page     */    for(uIndex = 1; 5 > uIndex; ++uIndex)        {        USB_EHCD_SET_BITFIELD(                        QTD,		 	pQTD->uBufferPagePointerList[uIndex],			(USB_EHCD_GET_BITFIELD(QTD,                        pQTD->uBufferPagePointerList[0],		        BUFFER_POINTER) + uIndex),			BUFFER_POINTER);        }    /* Return the number of bytes being transfered by this qTD */    return (USB_EHCD_GET_BITFIELD(QTD,                                  pQTD->uTransferInfo,                                  TOKEN_TOTAL_BYTES_TO_TRANSFER));    }    /* End of usbEhcdFillQTDBuffer() */    /***************************************************************************** usbEhcdCreateQTDs - creates TDs and populates them.** This function is used to create TDs for a data transfer and to populate the* fields of the TDs.** <ppDataHead> - Pointer holding the pointer to the*               head of the list of QTDS.* <ppDataTail> - Pointer holding the pointer to the*               tail of the list of QTDS.* <pTransferBuffer> - Data buffer* <uTransferLength> - length of the data buffer* <uToggle>  - initial toggle value* <uPID>  - PID value* RETURNS: Returns TRUE if the QTDs are created successfully.*          Returns FALSE if the QTDs are not created successfully.** ERRNO:*   None.** \NOMANUAL*/BOOLEAN usbEhcdCreateQTDs    (    pUSB_EHCD_QTD *ppDataHead,/* Pointer to the head QTD */    pUSB_EHCD_QTD *ppDataTail,/* Pointer to the tail QTD */    UCHAR  *   pTransferBuffer,/* Transfer buffer */    UINT32     uTransferLength,/* Transfer length */    UINT32     uMaximumPacketSize, /* Maximum packet size */    UINT8      uToggle,  /* Initial toggle value */    UINT8      uPID     /* PID value */    )    {    /* Pointer to the current qTD */    pUSB_EHCD_QTD pQTD = NULL;    /* To hold the temporary pointer to the qTD */    pUSB_EHCD_QTD pTempQTD = NULL;    /* To hold the number of bytes transferred */    UINT32 uBytesTransfered = 0;    /* Check the validity of the parameters */    if (NULL == ppDataHead ||        NULL == ppDataTail ||        NULL == pTransferBuffer)        {        OS_LOG_MESSAGE_HIGH(EHCD,"Parameters are not valid\n",0,0,0,0);        return FALSE;        }    /* Create the 1st TD needed for the transfer */    pQTD = *ppDataHead = usbEhcdFormEmptyQTD();    /* If unable to create the TD, return FALSE */    if(NULL == pQTD)        {        return FALSE;        }    /* This loop gets executed till all the TDs are created */    while (uBytesTransfered < uTransferLength)        {        /* Populate the TD's buffer pointers */        uBytesTransfered +=                   usbEhcdFillQTDBuffer(pQTD,                                      pTransferBuffer + uBytesTransfered,                                      uTransferLength - uBytesTransfered,                                      uMaximumPacketSize);        /* Update the data toggle bit */        USB_EHCD_SET_BITFIELD(QTD,                             pQTD->uTransferInfo,                             uToggle,                             TOKEN_DT);        /* Update PID field of the qTD */        USB_EHCD_SET_BITFIELD(QTD,                             pQTD->uTransferInfo,                             uPID,                             TOKEN_PID_CODE);        /* Flush the contents of the cache to the RAM */        CACHE_DMA_FLUSH(pQTD, sizeof(USB_EHCD_QTD));        /* Invalidate the cache */        CACHE_DMA_INVALIDATE(pQTD, sizeof(USB_EHCD_QTD));        /* If the bytes transfered is less than the total transfer size */        if(uBytesTransfered < uTransferLength)            {            /* Create 1 more qTD */            pQTD->pNext = usbEhcdFormEmptyQTD();            /* Check if memory allocation is a failure */            if(NULL == pQTD->pNext)                {                /* Free up all the TDs created */                for(pQTD = *ppDataHead;                    NULL != pQTD;                    pQTD = pQTD->pNext)                    {                    pTempQTD = pQTD->pNext;                    OS_ASSERT(NULL != pQTD->pAllocatedMem);                    OS_FREE(pQTD->pAllocatedMem);                    pQTD = pTempQTD;                    }                /* Return FALSE */                return FALSE;                }/* End of if() */            /* Flush the contents of the cache to the RAM */              CACHE_DMA_FLUSH((char*)pQTD+pUSB_EHCD_QTD_pNext_OFFSET, sizeof(UINT32));            /* Invalidate the cache */              CACHE_DMA_INVALIDATE((char*)pQTD+pUSB_EHCD_QTD_pNext_OFFSET, sizeof(UINT32));                          /* Update the HC's link pointers */            USB_EHCD_SET_BITFIELD(QTD,                                  pQTD->uNextQTDPointer,                                  (((unsigned)USB_EHCD_CONVERT_TO_PCI(pQTD->pNext))                                   >> 5),                                  NEXTQTD_POINTER);            /* Indicate that this is not the last element in the queue */            USB_EHCD_SET_BITFIELD(QTD,                                  pQTD->uNextQTDPointer,                                  0,                                  NEXTQTD_POINTER_T);            /* Flush the contents of the cache to the RAM */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产乱子轮精品视频| 欧美肥妇毛茸茸| 91.com视频| 欧美国产1区2区| 免费观看日韩av| 欧日韩精品视频| 中文欧美字幕免费| 日韩av不卡一区二区| 色噜噜狠狠成人网p站| 国产午夜亚洲精品理论片色戒| 亚洲黄色av一区| 粉嫩aⅴ一区二区三区四区五区| 91麻豆精品久久久久蜜臀| 一区二区三区毛片| 成人免费视频一区| 久久久www免费人成精品| 日本午夜一本久久久综合| 欧美午夜精品理论片a级按摩| 中文幕一区二区三区久久蜜桃| 激情综合网av| 欧美大度的电影原声| 日本视频一区二区| 337p亚洲精品色噜噜狠狠| 亚洲一区二区三区四区不卡| 日本国产一区二区| 亚洲视频在线一区| jvid福利写真一区二区三区| 国产精品午夜在线观看| 成人综合在线观看| 久久久久97国产精华液好用吗| 久久精品av麻豆的观看方式| 欧美一卡二卡在线| 麻豆一区二区三区| 日韩一区二区电影| 精品一区二区日韩| 久久久久久久久99精品| 国产成人av影院| 中文字幕不卡一区| 91香蕉国产在线观看软件| 亚洲日本在线a| 在线精品国精品国产尤物884a | 91久久精品一区二区| 亚洲精品久久嫩草网站秘色| 在线看日韩精品电影| 偷拍日韩校园综合在线| 日韩精品一区二区三区蜜臀| 精品系列免费在线观看| 国产精品素人一区二区| 91免费看`日韩一区二区| 亚洲五码中文字幕| 日韩美女视频一区二区在线观看| 美女爽到高潮91| 国产亚洲精品aa| 91在线免费视频观看| 亚洲第一狼人社区| 精品久久一区二区三区| 丁香激情综合五月| 亚洲一区中文日韩| 日韩欧美美女一区二区三区| 国产成人精品三级麻豆| 亚洲高清中文字幕| 精品99一区二区三区| 粉嫩欧美一区二区三区高清影视| 亚洲综合精品自拍| 精品日韩一区二区三区| 成人精品视频一区二区三区| 亚洲一二三四区| 日韩欧美久久久| 色综合天天在线| 五月天婷婷综合| 国产亚洲精久久久久久| 欧美日韩国产影片| 国产精品自产自拍| 亚洲1区2区3区4区| 中文字幕不卡三区| 91精品国产手机| 99热精品国产| 韩国精品主播一区二区在线观看 | 国产精品99精品久久免费| 亚洲精品欧美二区三区中文字幕| 欧美一卡在线观看| 色老汉av一区二区三区| 国产一区二区三区在线观看精品 | 欧美剧情电影在线观看完整版免费励志电影 | 欧美二区在线观看| 99视频精品在线| 国产精品一线二线三线精华| 五月婷婷激情综合| 亚洲日穴在线视频| 亚洲国产成人在线| 久久亚区不卡日本| 日韩一区二区三免费高清| 欧美亚洲图片小说| 91丨porny丨国产| 国产成人精品在线看| 激情综合网激情| 麻豆精品一区二区| 亚洲成人动漫在线观看| 亚洲女女做受ⅹxx高潮| 国产精品久久久久久久久图文区| 欧美成人一区二区三区在线观看| 91久久线看在观草草青青| 97超碰欧美中文字幕| 成人激情动漫在线观看| 国产一区二区不卡| 久久精品噜噜噜成人av农村| 午夜精品福利在线| 亚洲123区在线观看| 亚洲与欧洲av电影| 亚洲国产乱码最新视频| 亚洲一本大道在线| 亚洲国产日日夜夜| 亚洲一级在线观看| 五月天亚洲婷婷| 麻豆视频一区二区| 久久av老司机精品网站导航| 麻豆一区二区三区| 国产资源在线一区| 国产91精品欧美| 成人精品免费看| 91视频www| 在线观看日韩一区| 欧美日韩一区二区在线视频| 欧美视频一区二区| 日韩欧美一级特黄在线播放| 337p粉嫩大胆噜噜噜噜噜91av| 精品国产欧美一区二区| 国产视频911| **欧美大码日韩| 一片黄亚洲嫩模| 免费在线看成人av| 国产成人在线视频网站| 99久久国产综合色|国产精品| 一本色道亚洲精品aⅴ| 欧美日韩三级在线| 精品免费一区二区三区| 久久久久国色av免费看影院| 自拍偷拍欧美精品| 亚洲成人第一页| 国产精品一区免费在线观看| 91影院在线免费观看| 在线不卡的av| 国产丝袜美腿一区二区三区| 亚洲综合激情小说| 蜜臀精品久久久久久蜜臀| 成人黄色a**站在线观看| 欧美日韩一卡二卡| 日本一区二区三区视频视频| 一区二区三区电影在线播| 久久精品国产77777蜜臀| 99久久99久久综合| 欧美电影免费观看完整版| 亚洲欧美日韩国产中文在线| 日本在线不卡视频| 99在线精品视频| 日韩欧美激情在线| 亚洲黄色性网站| 国产aⅴ综合色| 欧美电影一区二区| 亚洲日本青草视频在线怡红院 | 日韩欧美国产高清| 国产精品成人网| 精品在线观看免费| 欧美性猛片xxxx免费看久爱| 国产欧美在线观看一区| 婷婷成人综合网| 91啪九色porn原创视频在线观看| 日韩三级视频在线看| 亚洲女人的天堂| 成人午夜免费视频| 欧美电视剧在线看免费| 亚瑟在线精品视频| 99精品国产99久久久久久白柏| 欧美大胆一级视频| 亚洲国产一区在线观看| 一本大道久久a久久精二百| 国产亚洲欧美日韩在线一区| 日韩精品五月天| 欧美无砖专区一中文字| 亚洲丝袜自拍清纯另类| 国产成人aaa| 精品日韩欧美在线| 亚欧色一区w666天堂| 色女孩综合影院| 亚洲男人都懂的| 91丨porny丨户外露出| 国产精品久久久久久久岛一牛影视| 久久成人av少妇免费| 欧美肥妇free| 日韩电影免费在线观看网站| 欧美日韩精品一区二区三区蜜桃| 亚洲特黄一级片| 一本大道久久a久久精品综合| 国产精品私房写真福利视频| 大胆亚洲人体视频| 国产欧美精品一区二区三区四区| 国内精品久久久久影院薰衣草| 日韩精品一区二区三区在线观看| 青青青伊人色综合久久| 91精品福利在线一区二区三区|