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

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

?? usbd_udphs.c

?? AT91SAM9263的USB Device端口驅動
?? C
?? 第 1 頁 / 共 5 頁
字號:
        pTransfer = &(pEndpoint->transfer);

        // Reset endpoint transfer descriptor
        pTransfer->pData = 0;
        pTransfer->transferred = -1;
        pTransfer->buffered = -1;
        pTransfer->remaining = -1;
        pTransfer->fCallback = 0;
        pTransfer->pArgument = 0;

        // Reset endpoint state
        pEndpoint->bank = 0;
        pEndpoint->state = UDP_ENDPOINT_DISABLED;
    }
}


//------------------------------------------------------------------------------
// Disable all endpoints (except control endpoint 0), aborting current transfers
// if necessary.
//------------------------------------------------------------------------------
static void UDPHS_DisableEndpoints( void )
{
    unsigned char bEndpoint;

    // Disable each endpoint, terminating any pending transfer
    // Control endpoint 0 is not disabled
    for( bEndpoint = 1; bEndpoint < BOARD_USB_NUMENDPOINTS; bEndpoint++ ) {

        UDPHS_EndOfTransfer( bEndpoint, USBD_STATUS_ABORTED );
        endpoints[bEndpoint].state = UDP_ENDPOINT_DISABLED;
    }
}

//------------------------------------------------------------------------------
//  Function: UDP_IsTransferFinished
//      Checks if an ongoing transfer on an endpoint has been completed.
//  Parameters:
//      bEndpoint - Endpoint number.
//  Returns:
//      1 if the current transfer on the given endpoint is complete; otherwise
//      0
//------------------------------------------------------------------------------
static unsigned char UDPHS_IsTransferFinished( unsigned char bEndpoint )
{
    Endpoint *pEndpoint = &(endpoints[bEndpoint]);
    Transfer *pTransfer = &(pEndpoint->transfer);

    // Check if it is a Control endpoint
    //  -> Control endpoint must always finish their transfer with a zero-length
    //     packet
    if( AT91C_UDPHS_EPT_TYPE_CTL_EPT == 
        (AT91C_UDPHS_EPT_TYPE&(AT91C_BASE_UDPHS->UDPHS_EPT[bEndpoint].UDPHS_EPTCFG)) ) {

        return (pTransfer->buffered < pEndpoint->size);
    }
    // Other endpoints only need to transfer all the data
    else {

        return( (pTransfer->buffered <= pEndpoint->size) && (pTransfer->remaining == 0) );
    }
}

//------------------------------------------------------------------------------
// Endpoint interrupt handler.
//         Handle IN/OUT transfers, received SETUP packets and STALLing
// bEndpoint Index of endpoint
//------------------------------------------------------------------------------
static void UDPHS_EndpointHandler( unsigned char bEndpoint )
{
    Endpoint *pEndpoint = &(endpoints[bEndpoint]);
    Transfer *pTransfer = &(pEndpoint->transfer);
    unsigned int   status = AT91C_BASE_UDPHS->UDPHS_EPT[bEndpoint].UDPHS_EPTSTA;
    unsigned short wPacketSize;
    USBGenericRequest request;

    trace_LOG(trace_DEBUG, "E%d ", bEndpoint);

    // Handle interrupts
    // IN packet sent
    if( (AT91C_UDPHS_TX_PK_RDY == (AT91C_BASE_UDPHS->UDPHS_EPT[bEndpoint].UDPHS_EPTCTL & AT91C_UDPHS_TX_PK_RDY))
     && (0 == (status & AT91C_UDPHS_TX_PK_RDY )) ) {

        trace_LOG(trace_DEBUG, "Wr ");

        // Check that endpoint was in Sending state
        if( pEndpoint->state == UDP_ENDPOINT_SENDING ) {

            // End of transfer ?
            if( UDPHS_IsTransferFinished(bEndpoint) ) {

                trace_LOG(trace_DEBUG, "%d ", pTransfer->transferred);

                pTransfer->transferred += pTransfer->buffered;
                pTransfer->buffered = 0;

                // Disable interrupt if this is not a control endpoint
                if( AT91C_UDPHS_EPT_TYPE_CTL_EPT != (AT91C_UDPHS_EPT_TYPE&(AT91C_BASE_UDPHS->UDPHS_EPT[bEndpoint].UDPHS_EPTCFG)) ) {

#ifndef DMA
                    AT91C_BASE_UDPHS->UDPHS_IEN &= ~(1<<SHIFT_INTERUPT<<bEndpoint);
#else
                    AT91C_BASE_UDPHS->UDPHS_IEN &= ~(1<<SHIFT_DMA<<bEndpoint);
#endif
                }
                AT91C_BASE_UDPHS->UDPHS_EPT[bEndpoint].UDPHS_EPTCTLDIS = AT91C_UDPHS_TX_PK_RDY;

                UDPHS_EndOfTransfer(bEndpoint, USBD_STATUS_SUCCESS);
            }
            else {

                // Transfer remaining data
                trace_LOG(trace_DEBUG, "%d ", pEndpoint->size);
                pTransfer->transferred += pEndpoint->size;
                pTransfer->buffered -= pEndpoint->size;

                // Send next packet
                UDPHS_WritePayload(bEndpoint);
                AT91C_BASE_UDPHS->UDPHS_EPT[bEndpoint].UDPHS_EPTSETSTA = AT91C_UDPHS_TX_PK_RDY;
            }
        }
        else {

            trace_LOG(trace_FATAL, "Error Wr");
        }
    }

    // OUT packet received
    if( AT91C_UDPHS_RX_BK_RDY == (status & AT91C_UDPHS_RX_BK_RDY) ) {

        trace_LOG(trace_DEBUG, "Rd ");

        // Check that the endpoint is in Receiving state
        if (pEndpoint->state != UDP_ENDPOINT_RECEIVING) {

            // Endpoint is NOT in Read state
            if( (0 == (AT91C_BASE_UDPHS->UDPHS_EPT[bEndpoint].UDPHS_EPTCFG & AT91C_UDPHS_EPT_TYPE))
             && (0 == (status & AT91C_UDPHS_BYTE_COUNT)) ) {

                // Control endpoint, 0 bytes received
                // Acknowledge the data and finish the current transfer
                trace_LOG(trace_DEBUG, "Ack ");
                UDPHS_ClearRxFlag(bEndpoint);

                UDPHS_EndOfTransfer(bEndpoint, USBD_STATUS_SUCCESS);
            }
            // Check if the data has been STALLed
            else if( AT91C_UDPHS_FRCESTALL == (status & AT91C_UDPHS_FRCESTALL)) {

                // Discard STALLed data
                trace_LOG(trace_DEBUG, "Discard ");
                UDPHS_ClearRxFlag(bEndpoint);
            }
            // NAK the data
            else {

                trace_LOG(trace_DEBUG, "Nak ");
#ifndef DMA
                AT91C_BASE_UDPHS->UDPHS_IEN &= ~(1<<SHIFT_INTERUPT<<bEndpoint);
#else
                AT91C_BASE_UDPHS->UDPHS_IEN &= ~(1<<SHIFT_DMA<<bEndpoint);
#endif
            }
        }
        else {

            // Endpoint is in Read state
            // Retrieve data and store it into the current transfer buffer
            wPacketSize = (unsigned short)((status & AT91C_UDPHS_BYTE_COUNT)>>20);

            trace_LOG(trace_DEBUG, "%d ", wPacketSize);
            UDPHS_ReadPayload(bEndpoint, wPacketSize);
            UDPHS_ClearRxFlag(bEndpoint);

            // Check if the transfer is finished
            if ((pTransfer->remaining == 0) || (wPacketSize < pEndpoint->size)) {

                AT91C_BASE_UDPHS->UDPHS_EPT[bEndpoint].UDPHS_EPTCTLDIS = AT91C_UDPHS_RX_BK_RDY;

                // Disable interrupt if this is not a control endpoint
                if( AT91C_UDPHS_EPT_TYPE_CTL_EPT != (AT91C_UDPHS_EPT_TYPE & (AT91C_BASE_UDPHS->UDPHS_EPT[bEndpoint].UDPHS_EPTCFG)) ) {

#ifndef DMA
                    AT91C_BASE_UDPHS->UDPHS_IEN &= ~(1<<SHIFT_INTERUPT<<bEndpoint);
#else
                    AT91C_BASE_UDPHS->UDPHS_IEN &= ~(1<<SHIFT_DMA<<bEndpoint);
#endif
                }
                UDPHS_EndOfTransfer(bEndpoint, USBD_STATUS_SUCCESS);
            }
        }
    }

    // STALL sent
    if( AT91C_UDPHS_STALL_SNT == (status & AT91C_UDPHS_STALL_SNT) ) {

        trace_LOG(trace_WARNING, "Sta 0x%X [%d] ", status, bEndpoint);

        // Acknowledge the stall flag
        AT91C_BASE_UDPHS->UDPHS_EPT[bEndpoint].UDPHS_EPTCLRSTA = AT91C_UDPHS_STALL_SNT;

        // If the endpoint is not halted, clear the STALL condition
        if (pEndpoint->state != UDP_ENDPOINT_HALTED) {

            trace_LOG(trace_WARNING, "_ " );
            AT91C_BASE_UDPHS->UDPHS_EPT[bEndpoint].UDPHS_EPTCLRSTA = AT91C_UDPHS_FRCESTALL;
        }
    }

    // SETUP packet received
    if( AT91C_UDPHS_RX_SETUP == (status & AT91C_UDPHS_RX_SETUP) )  {

        trace_LOG(trace_DEBUG, "Stp ");

        // If a transfer was pending, complete it
        // Handles the case where during the status phase of a control write
        // transfer, the host receives the device ZLP and ack it, but the ack
        // is not received by the device
        if ((pEndpoint->state == UDP_ENDPOINT_RECEIVING)
            || (pEndpoint->state == UDP_ENDPOINT_SENDING)) {

            UDPHS_EndOfTransfer(bEndpoint, USBD_STATUS_SUCCESS);
        }
        // Copy the setup packet
        UDPHS_ReadRequest(&request);

        // Acknowledge setup packet
        AT91C_BASE_UDPHS->UDPHS_EPT[bEndpoint].UDPHS_EPTCLRSTA = AT91C_UDPHS_RX_SETUP;

        // Forward the request to the upper layer
        USBDCallbacks_RequestReceived(&request);
    }

}

//------------------------------------------------------------------------------
//      Interrupt service routine
//------------------------------------------------------------------------------
#ifdef DMA
//----------------------------------------------------------------------------
// \fn    UDPHS_DmaHandler
// \brief This function (ISR) handles dma interrupts
//----------------------------------------------------------------------------
static void UDPHS_DmaHandler( unsigned char bEndpoint )
{
    Endpoint     *pEndpoint = &(endpoints[bEndpoint]);
    Transfer     *pTransfer = &(pEndpoint->transfer);
    unsigned int  status;
    unsigned char result = USBD_STATUS_SUCCESS;

    status = AT91C_BASE_UDPHS->UDPHS_DMA[bEndpoint].UDPHS_DMASTATUS;
    trace_LOG(trace_DEBUG, "Dma Ept%d ", bEndpoint);

    // Disable DMA interrupt to avoid receiving 2 interrupts (B_EN and TR_EN)
    AT91C_BASE_UDPHS->UDPHS_DMA[bEndpoint].UDPHS_DMACONTROL &=
        ~(AT91C_UDPHS_END_TR_EN | AT91C_UDPHS_END_B_EN);

    AT91C_BASE_UDPHS->UDPHS_IEN &= ~(1 << SHIFT_DMA << bEndpoint);

    if( AT91C_UDPHS_END_BF_ST == (status & AT91C_UDPHS_END_BF_ST) ) {

        trace_LOG(trace_DEBUG, "EndBuffer ");

        // BUFF_COUNT holds the number of untransmitted bytes.
        // BUFF_COUNT is equal to zero in case of good transfer
        pTransfer->transferred = pTransfer->buffered
                                 - ((status & AT91C_UDPHS_BUFF_COUNT) >> 16);
        pTransfer->buffered = ((status & AT91C_UDPHS_BUFF_COUNT) >> 16);

        pTransfer->remaining -= pTransfer->transferred;

        trace_LOG(trace_DEBUG, "\n\rR:%d ", pTransfer->remaining );
        trace_LOG(trace_DEBUG, "B:%d ", pTransfer->buffered );
        trace_LOG(trace_DEBUG, "T:%d ", pTransfer->transferred );

        if( (pTransfer->remaining + pTransfer->buffered) > 0 ) {

            // Prepare an other transfer
            if( pTransfer->remaining > DMA_MAX_FIFO_SIZE ) {

                pTransfer->buffered = DMA_MAX_FIFO_SIZE;    
            }
            else {
                pTransfer->buffered = pTransfer->remaining;
            }

            AT91C_BASE_UDPHS->UDPHS_DMA[bEndpoint].UDPHS_DMAADDRESS = 
                    (unsigned int)((pTransfer->pData)+(pTransfer->buffered));

            // Clear unwanted interrupts
            AT91C_BASE_UDPHS->UDPHS_DMA[bEndpoint].UDPHS_DMASTATUS;

            // Enable DMA endpoint interrupt
            AT91C_BASE_UDPHS->UDPHS_IEN |= (1 << SHIFT_DMA << bEndpoint);
            // DMA config for receive the good size of buffer, or an error buffer

            AT91C_BASE_UDPHS->UDPHS_DMA[bEndpoint].UDPHS_DMACONTROL = 0; // raz
            AT91C_BASE_UDPHS->UDPHS_DMA[bEndpoint].UDPHS_DMACONTROL =
                                     ( ((pTransfer->buffered << 16) & AT91C_UDPHS_BUFF_COUNT)
                                       | AT91C_UDPHS_END_TR_EN
                                       | AT91C_UDPHS_END_TR_IT
                                       | AT91C_UDPHS_END_B_EN
                                       | AT91C_UDPHS_END_BUFFIT
                                       | AT91C_UDPHS_CHANN_ENB );
        }
    }
    else if( AT91C_UDPHS_END_TR_ST == (status & AT91C_UDPHS_END_TR_ST) ) {

        trace_LOG(trace_DEBUG, "EndTransf ");

        pTransfer->transferred = pTransfer->buffered
                                 - ((status & AT91C_UDPHS_BUFF_COUNT) >> 16);
        pTransfer->remaining = 0;
        trace_LOG(trace_DEBUG, "\n\rR:%d ", pTransfer->remaining );
        trace_LOG(trace_DEBUG, "B:%d ", pTransfer->buffered );
        trace_LOG(trace_DEBUG, "T:%d ", pTransfer->transferred );
    }
    else {

        trace_LOG(trace_ERROR, "UDPHS_DmaHandler: Error (0x%08X)\n\r", status);
        result = USBD_STATUS_ABORTED;
    }

    // Invoke callback
    if( pTransfer->remaining == 0 ) {

        trace_LOG(trace_DEBUG, "EOT ");
        UDPHS_EndOfTransfer(bEndpoint, result);
    }
}
#endif


//------------------------------------------------------------------------------
//      Exported functions
//------------------------------------------------------------------------------

//------------------------------------------------------------------------------
// UDP interrupt handler
//         Manages device resume, suspend, end of bus reset. Forwards endpoint
//         interrupts to the appropriate handler.

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国内成人自拍视频| 国产iv一区二区三区| 日韩专区在线视频| 国产黑丝在线一区二区三区| 国产乱色国产精品免费视频| 欧美日韩一区二区三区高清 | 亚洲精品成人少妇| 韩国视频一区二区| 色综合激情五月| 欧美嫩在线观看| 伊人开心综合网| 久久精品国产色蜜蜜麻豆| 色综合中文字幕国产 | 国产一区二区精品久久91| 色婷婷亚洲精品| 26uuu另类欧美亚洲曰本| 亚洲欧美在线观看| 成人午夜电影网站| 9191成人精品久久| 久久综合久久鬼色中文字| 亚洲人成人一区二区在线观看 | 7777精品伊人久久久大香线蕉经典版下载 | 欧美电影一区二区三区| 精品剧情v国产在线观看在线| 亚洲欧美偷拍三级| 国产.欧美.日韩| 久久女同精品一区二区| 婷婷开心激情综合| 色综合一个色综合| 亚洲精品成人a在线观看| 国产精品综合久久| ww亚洲ww在线观看国产| 免费一区二区视频| 6080日韩午夜伦伦午夜伦| 午夜不卡av免费| 91视频.com| 亚洲男帅同性gay1069| 成人免费看片app下载| 精品国产一二三| 国内偷窥港台综合视频在线播放| 欧美精品乱码久久久久久按摩| 一区二区三区高清在线| 91丝袜高跟美女视频| 国产欧美一区二区精品性| 成人性生交大片免费| 久久网这里都是精品| 天堂久久久久va久久久久| 91麻豆精品91久久久久同性| 亚洲一级二级在线| 日韩一区二区三区av| 天天免费综合色| 欧美三级日韩在线| 久久99久久99小草精品免视看| 欧美一级片免费看| 国产又黄又大久久| 国产欧美一区二区精品性| 国产suv一区二区三区88区| 成人免费在线播放视频| 91论坛在线播放| 亚洲欧美日韩人成在线播放| 97se亚洲国产综合自在线| 一区二区三区免费观看| 欧洲亚洲国产日韩| 天堂久久一区二区三区| 久久亚洲精品小早川怜子| 国产一区二区三区在线观看免费| 久久综合av免费| 日本韩国欧美国产| 天堂蜜桃一区二区三区| 日本一区二区视频在线| 色综合色综合色综合| 天天影视色香欲综合网老头| 欧美国产精品专区| 色94色欧美sute亚洲线路二| 麻豆91在线观看| 国产精品白丝在线| 欧美精品日韩精品| 国产一区三区三区| 国产欧美精品一区二区色综合 | 精品久久一区二区| 国产精品一区二区久激情瑜伽| 一区二区成人在线视频 | 精品午夜久久福利影院| 中日韩av电影| 日韩欧美成人一区二区| 99在线热播精品免费| 国产一区在线精品| 亚洲国产cao| 亚洲精品在线免费观看视频| 欧美三区在线观看| 国产高清视频一区| 日韩—二三区免费观看av| 国产精品嫩草久久久久| 91麻豆精品国产无毒不卡在线观看| 成人av网站在线观看| 日韩av不卡一区二区| 玉足女爽爽91| 国产欧美日韩精品a在线观看| 欧美在线观看禁18| 欧美亚一区二区| 国产一区在线精品| 美女性感视频久久| 亚洲综合色自拍一区| 精品久久人人做人人爽| 日韩视频123| 欧美系列在线观看| 在线视频一区二区三区| 狠狠色伊人亚洲综合成人| 亚洲成年人影院| 自拍偷拍亚洲欧美日韩| 国产无遮挡一区二区三区毛片日本| 欧美日韩亚洲不卡| 成人av网站大全| 国产乱人伦偷精品视频不卡| 亚洲综合激情网| 国产精品久久久久永久免费观看 | 日本欧美一区二区在线观看| 亚洲成人黄色小说| 亚洲视频免费在线观看| 中文字幕综合网| 亚洲欧洲在线观看av| 国产欧美va欧美不卡在线| 日本一区免费视频| 国产亚洲成av人在线观看导航| 久久男人中文字幕资源站| 精品国产污污免费网站入口| 欧美日韩一区成人| 91久久精品一区二区三| 97精品超碰一区二区三区| 成人h动漫精品| 成人一区二区三区视频在线观看| 成人ar影院免费观看视频| 国产激情91久久精品导航| 国产一区二区三区四区五区美女 | 亚洲国产精品成人综合| 国产欧美日韩三级| 欧美国产精品劲爆| 亚洲在线视频一区| 亚洲国产欧美日韩另类综合 | 一区二区三区精品在线观看| 综合欧美亚洲日本| 亚洲美女视频在线| 男女激情视频一区| 久久精品国产亚洲一区二区三区| 国产精品 欧美精品| 国产99一区视频免费| 色综合久久中文综合久久97| 在线观看视频欧美| 欧美日韩国产片| 久久精品视频在线免费观看| 欧美国产97人人爽人人喊| 亚洲午夜在线观看视频在线| 日韩精品三区四区| 蜜臀av性久久久久蜜臀aⅴ| 国产成人综合网| 一本久久a久久精品亚洲 | 成人美女视频在线观看| 成人一区二区三区在线观看| 在线免费精品视频| 欧美精三区欧美精三区| 欧美α欧美αv大片| 国产精品成人在线观看| 亚洲国产成人91porn| 爽爽淫人综合网网站| 国产精品一区二区男女羞羞无遮挡| 成人18视频日本| 日韩欧美国产高清| 国产精品二区一区二区aⅴ污介绍| 天天综合网天天综合色| 国产一区二区剧情av在线| 欧美日韩国产综合草草| 国产日韩精品一区二区三区| 国产人妖乱国产精品人妖| 免费成人在线播放| 99re热视频这里只精品| 久久精品视频在线看| 亚洲大片免费看| 97精品电影院| 亚洲精品一区二区三区在线观看| 亚洲成人免费在线观看| 国产高清精品网站| 久久久久久一二三区| 亚洲午夜一二三区视频| 91视频免费观看| 久久久久久久久久久久久女国产乱 | 性做久久久久久| 色综合久久综合网| 国产欧美精品一区二区三区四区| 青青草原综合久久大伊人精品| 菠萝蜜视频在线观看一区| 2020国产精品| 六月丁香综合在线视频| 99久久久精品| 中文字幕av一区二区三区高 | 亚洲电影中文字幕在线观看| 国产98色在线|日韩| 久久综合久色欧美综合狠狠| 日本91福利区| 日韩免费视频一区| 热久久免费视频|