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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? usbd_udphs.c

?? AT91SAM9263的USB Device端口驅(qū)動
?? C
?? 第 1 頁 / 共 5 頁
字號:
//         Sets up the transfer descriptor, write one or two data payloads
//         (depending on the number of FIFO banks for the endpoint) and then
//         starts the actual transfer. The operation is complete when all
//         the data has been sent.
//------------------------------------------------------------------------------
char USBD_Write( unsigned char    bEndpoint,
                 const void       *pData,
                 unsigned int     dLength,
                 TransferCallback fCallback,
                 void             *pArgument )
{
    Endpoint *pEndpoint = &(endpoints[bEndpoint]);
    Transfer *pTransfer = &(pEndpoint->transfer);

    // Return if the endpoint is not in IDLE state
    if (pEndpoint->state != UDP_ENDPOINT_IDLE)  {

        return USBD_STATUS_LOCKED;
    }

    trace_LOG(trace_DEBUG, "Write%d(%d) ", bEndpoint, dLength);

    // Setup the transfer descriptor
    pTransfer->pData = (void *) pData;
    pTransfer->remaining = dLength;
    pTransfer->buffered = 0;
    pTransfer->transferred = 0;
    pTransfer->fCallback = fCallback;
    pTransfer->pArgument = pArgument;
    
    // Send one packet
    pEndpoint->state = UDP_ENDPOINT_SENDING;

#ifdef DMA
    // Test if endpoint type control
    if(AT91C_UDPHS_EPT_TYPE_CTL_EPT == (AT91C_UDPHS_EPT_TYPE&(AT91C_BASE_UDPHS->UDPHS_EPT[bEndpoint].UDPHS_EPTCFG)))  {
#endif
        // Send the first packet
        UDPHS_WritePayload(bEndpoint);
        AT91C_BASE_UDPHS->UDPHS_EPT[bEndpoint].UDPHS_EPTSETSTA = AT91C_UDPHS_TX_PK_RDY;

        // If double buffering is enabled and there is data remaining,
        // prepare another packet
        if( (BOARD_USB_ENDPOINTS_BANKS(bEndpoint) > 1) && (pTransfer->remaining > 0) ) {

            UDPHS_WritePayload( bEndpoint );
        }
        // Enable endpoint IT
        AT91C_BASE_UDPHS->UDPHS_IEN |= (1 << SHIFT_INTERUPT << bEndpoint);
        AT91C_BASE_UDPHS->UDPHS_EPT[bEndpoint].UDPHS_EPTCTLENB = AT91C_UDPHS_TX_PK_RDY;

#ifdef DMA
    }
    else {

        // Others endpoints (not control)
        if( pTransfer->remaining > DMA_MAX_FIFO_SIZE ) {

            // Transfer the max
            pTransfer->buffered = DMA_MAX_FIFO_SIZE;    
        }
        else {
            // Transfer the good size
            pTransfer->buffered = pTransfer->remaining;
        }

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

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

        // 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
        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_B_EN
                                            | AT91C_UDPHS_END_BUFFIT
                                            | AT91C_UDPHS_CHANN_ENB );
    }
#endif

    return USBD_STATUS_SUCCESS;
}

//------------------------------------------------------------------------------
// Reads incoming data on an USB endpoint (OUT)
//------------------------------------------------------------------------------
char USBD_Read( unsigned char    bEndpoint,
                void             *pData,
                unsigned int     dLength,
                TransferCallback fCallback,
                void             *pArgument )
{
    Endpoint *pEndpoint = &(endpoints[bEndpoint]);
    Transfer *pTransfer = &(pEndpoint->transfer);
  
    // Return if the endpoint is not in IDLE state
    if (pEndpoint->state != UDP_ENDPOINT_IDLE) {

        return USBD_STATUS_LOCKED;
    }

    trace_LOG(trace_DEBUG, "Read%d(%d) ", bEndpoint, dLength);

    // Endpoint enters Receiving state
    pEndpoint->state = UDP_ENDPOINT_RECEIVING;

    // Set the transfer descriptor
    pTransfer->pData = pData;
    pTransfer->remaining = dLength;
    pTransfer->buffered = 0;
    pTransfer->transferred = 0;
    pTransfer->fCallback = fCallback;
    pTransfer->pArgument = pArgument;

#ifdef DMA
    // Test if endpoint type control
    if(AT91C_UDPHS_EPT_TYPE_CTL_EPT == (AT91C_UDPHS_EPT_TYPE&(AT91C_BASE_UDPHS->UDPHS_EPT[bEndpoint].UDPHS_EPTCFG))) {
#endif
        // Control endpoint
        // Enable endpoint IT
        AT91C_BASE_UDPHS->UDPHS_IEN |= (1 << SHIFT_INTERUPT << bEndpoint);
        AT91C_BASE_UDPHS->UDPHS_EPT[bEndpoint].UDPHS_EPTCTLENB = AT91C_UDPHS_RX_BK_RDY;
#ifdef DMA
    }
    else {

        trace_LOG(trace_DEBUG, "Read%d(%d) ", bEndpoint, dLength);

        // Others endpoints (not control)
        if( pTransfer->remaining > DMA_MAX_FIFO_SIZE ) {

            // Transfer the max
            pTransfer->buffered = DMA_MAX_FIFO_SIZE;    
        }
        else {
            // Transfer the good size
            pTransfer->buffered = pTransfer->remaining;
        }

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

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

        // Enable DMA endpoint interrupt
        AT91C_BASE_UDPHS->UDPHS_IEN |= (1 << SHIFT_DMA << bEndpoint);

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

        // DMA config
        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 );
    }
#endif

    return USBD_STATUS_SUCCESS;
}

//------------------------------------------------------------------------------
// Clears, sets or returns the Halt state on specified endpoint
//
//         When in Halt state, an endpoint acknowledges every received packet
//         with a STALL handshake. This continues until the endpoint is
//         manually put out of the Halt state by calling this function.
// pUsb Pointer to a S_usb instance
// bEndpoint Index of endpoint
// bRequest  Request to perform
//                   -> USB_SET_FEATURE, USB_CLEAR_FEATURE, USB_GET_STATUS
// \return true if the endpoint is currently Halted, false otherwise
// 
//------------------------------------------------------------------------------
void USBD_Halt( unsigned char bEndpoint )
{
    Endpoint *pEndpoint = &(endpoints[bEndpoint]);

    // Check that endpoint is enabled and not already in Halt state
    if( (pEndpoint->state != UDP_ENDPOINT_DISABLED)
     && (pEndpoint->state != UDP_ENDPOINT_HALTED) ) {

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

        // Abort the current transfer if necessary
        UDPHS_EndOfTransfer(bEndpoint, USBD_STATUS_ABORTED);

        // Put endpoint into Halt state
        AT91C_BASE_UDPHS->UDPHS_EPT[bEndpoint].UDPHS_EPTSETSTA = AT91C_UDPHS_FRCESTALL;
        pEndpoint->state = UDP_ENDPOINT_HALTED;

#ifdef DMA
        // Test if endpoint type control
        if(AT91C_UDPHS_EPT_TYPE_CTL_EPT == (AT91C_UDPHS_EPT_TYPE&(AT91C_BASE_UDPHS->UDPHS_EPT[bEndpoint].UDPHS_EPTCFG)))  {
#endif
            // Enable the endpoint interrupt
            AT91C_BASE_UDPHS->UDPHS_IEN |= (1<<SHIFT_INTERUPT<<bEndpoint);
#ifdef DMA
        }
        else {
            // Enable IT DMA
            AT91C_BASE_UDPHS->UDPHS_IEN |= (1<<SHIFT_DMA<<bEndpoint);
        }
#endif
   }
}

//------------------------------------------------------------------------------
//    Function: USBD_Unhalt
//        Clears the Halt feature on the given endpoint.
//------------------------------------------------------------------------------
void USBD_Unhalt( unsigned char bEndpoint )
{
    Endpoint *pEndpoint = &(endpoints[bEndpoint]);

    // Check if the endpoint is enabled
    if (pEndpoint->state != UDP_ENDPOINT_DISABLED) {

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

        // Return endpoint to Idle state
        pEndpoint->state = UDP_ENDPOINT_IDLE;

        // Clear FORCESTALL flag
        AT91C_BASE_UDPHS->UDPHS_EPT[bEndpoint].UDPHS_EPTCLRSTA = AT91C_UDPHS_TOGGLESQ | AT91C_UDPHS_FRCESTALL;

        // Reset Endpoint Fifos
        AT91C_BASE_UDPHS->UDPHS_EPTRST = (1<<bEndpoint);
    }
}

//------------------------------------------------------------------------------
//    Function: USBD_IsHalted
//        Returns the current Halt status of an endpoint.
//
//    Parameters:
//        bEndpoint - Endpoint number.
//
//    Returns:
//        1 if the endpoint is currently halted; otherwise 0.
//------------------------------------------------------------------------------
unsigned char USBD_IsHalted( unsigned char bEndpoint )
{
    Endpoint *pEndpoint = &(endpoints[bEndpoint]);
    unsigned char status = 0;

    if (pEndpoint->state == UDP_ENDPOINT_HALTED) {
        status = 1;
    }
    return( status );
}

//------------------------------------------------------------------------------
// IS High Speed device working in High Speed ?
//------------------------------------------------------------------------------
unsigned char USBD_IsHighSpeed( void )
{
    unsigned char status = 0;

    if( AT91C_UDPHS_SPEED == (AT91C_BASE_UDPHS->UDPHS_INTSTA & AT91C_UDPHS_SPEED) )
    {
        // High Speed
        trace_LOG(trace_DEBUG, "High Speed\n\r");
        status = 1;
    }
    else {
        trace_LOG(trace_DEBUG, "Full Speed\n\r");
    }
    return( status );
}
 

//------------------------------------------------------------------------------
// Causes the endpoint to acknowledge the next received packet with
//         a STALL handshake.
//         Further packets are then handled normally.
// bEndpoint Index of endpoint
// \return Operation result code
//------------------------------------------------------------------------------
unsigned char USBD_Stall( unsigned char bEndpoint )
{
    Endpoint *pEndpoint = &(endpoints[bEndpoint]);

    // Check that endpoint is in Idle state
    if (pEndpoint->state != UDP_ENDPOINT_IDLE) {

        trace_LOG(trace_WARNING, "W: UDP_Stall: Endpoint%d locked\n\r", bEndpoint);
        return USBD_STATUS_LOCKED;
    }

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

    AT91C_BASE_UDPHS->UDPHS_EPT[bEndpoint].UDPHS_EPTSETSTA = AT91C_UDPHS_FRCESTALL;

    return USBD_STATUS_SUCCESS;
}

//------------------------------------------------------------------------------
// Activates a remote wakeup procedure
//------------------------------------------------------------------------------
void USBD_RemoteWakeUp(void)
{
    trace_LOG(trace_DEBUG, "Remote WakeUp\n\r");

    // Device is currently suspended
    if (deviceState == USBD_STATE_SUSPENDED) {

        trace_LOG(trace_DEBUG, "RW\n\r");
        UDPHS_EnableUsbClock();

        // Activates a remote wakeup
        AT91C_BASE_UDPHS->UDPHS_CTRL |= AT91C_UDPHS_REWAKEUP;

        while ((AT91C_BASE_UDPHS->UDPHS_CTRL&AT91C_UDPHS_REWAKEUP) == AT91C_UDPHS_REWAKEUP) {

            trace_LOG(trace_DEBUG, "W");
        }
        UDPHS_EnableBIAS();
    }
    // Device is NOT suspended
    else {

        trace_LOG(trace_WARNING, "-W- USBD_RemoteWakeUp: Device is not suspended\n\r");
    }
}

//------------------------------------------------------------------------------
// Sets or unsets the device address
//         This function directly accesses the S_usb_request instance located
//         in the S_usb structure to extract its new address.

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲国产精品二十页| 2020国产精品久久精品美国| 三级在线观看一区二区| 日韩欧美国产综合| 91女神在线视频| 五月婷婷激情综合网| 欧美国产日韩一二三区| 在线播放91灌醉迷j高跟美女| 韩国精品主播一区二区在线观看 | 成人av在线网站| 日韩av一二三| 国产精品久久久久影院| 99精品视频一区| 国产精品一区二区在线播放 | 一区二区成人在线| 亚洲精品在线免费播放| 91久久精品日日躁夜夜躁欧美| 久久se精品一区二区| 亚洲精品视频免费观看| 亚洲国产精品v| 91精品黄色片免费大全| 欧美亚洲精品一区| 成人一区二区三区视频在线观看| 美女脱光内衣内裤视频久久网站| 综合欧美亚洲日本| 精品国产免费人成在线观看| 欧美电影一区二区| 色呦呦日韩精品| 99国产精品99久久久久久| 久久国产综合精品| 一色桃子久久精品亚洲| 精品国产免费一区二区三区四区| 欧美自拍偷拍一区| 暴力调教一区二区三区| 久久电影网电视剧免费观看| 亚洲最大色网站| 亚洲视频你懂的| 国产欧美日韩视频一区二区| 宅男噜噜噜66一区二区66| 欧美在线看片a免费观看| 91色九色蝌蚪| 波多野洁衣一区| 伦理电影国产精品| 激情五月婷婷综合| 久久成人18免费观看| 久热成人在线视频| 久久精品国产网站| 国产自产视频一区二区三区| 蜜臀久久99精品久久久久久9| 奇米色一区二区| 日韩精品视频网站| 亚洲永久精品国产| 首页欧美精品中文字幕| 午夜不卡在线视频| 日韩精品乱码免费| 日韩精品一二三区| 久久 天天综合| 久久99精品久久久| 国产美女在线观看一区| 韩国视频一区二区| 天堂在线亚洲视频| 蜜桃视频免费观看一区| 免费在线一区观看| 国产成人亚洲综合a∨猫咪| 国产一区二区在线观看免费| 风间由美性色一区二区三区| 国产成人免费9x9x人网站视频| 99热99精品| 在线一区二区观看| 日韩一区二区免费高清| 精品毛片乱码1区2区3区| 精品久久久网站| 中文字幕电影一区| 国产精品第五页| 丝袜美腿亚洲色图| 蜜臀av性久久久久蜜臀aⅴ四虎| 国产福利电影一区二区三区| 成人综合在线观看| 欧美日韩国产另类不卡| 欧美一级夜夜爽| 久久久美女毛片| 中文字幕一区三区| 亚洲一区电影777| 国产中文字幕一区| 99这里只有精品| 日韩视频一区在线观看| 26uuu精品一区二区在线观看| 亚洲欧美中日韩| 亚洲一级在线观看| 国产成人aaa| 欧洲色大大久久| 精品国产91九色蝌蚪| 亚洲欧美日韩精品久久久久| 亚洲免费电影在线| 麻豆极品一区二区三区| 国内精品伊人久久久久av影院| 色综合天天综合网国产成人综合天 | 精品午夜一区二区三区在线观看| 国产揄拍国内精品对白| 欧美日韩一区二区三区四区五区 | 欧美岛国在线观看| 一区二区三区日韩精品视频| 天堂资源在线中文精品| 处破女av一区二区| 在线播放视频一区| 亚洲日韩欧美一区二区在线| 日韩va欧美va亚洲va久久| 日韩国产精品大片| 日本伦理一区二区| 久久综合久久综合久久| 亚洲第一av色| 国产jizzjizz一区二区| 日韩一区二区三区电影在线观看| 国产精品丝袜91| 国产精品中文有码| 欧美人与性动xxxx| 亚洲免费观看在线观看| 国产精品1区2区3区在线观看| 337p亚洲精品色噜噜噜| 亚洲乱码国产乱码精品精98午夜| 夜夜嗨av一区二区三区四季av| 国产一区二区按摩在线观看| 欧美人妖巨大在线| 亚洲一区二区av电影| 成人一区在线观看| 欧美sm极限捆绑bd| 国产91丝袜在线播放0| 国产精品天干天干在线综合| 国产成人av影院| 久久五月婷婷丁香社区| 日韩精品国产精品| 99久久99久久精品免费观看| 亚洲成人免费视频| 老司机免费视频一区二区| 日本韩国精品一区二区在线观看| 日韩三级视频在线观看| 一区二区三区四区高清精品免费观看| 国产黄色91视频| 欧美一卡在线观看| 日韩电影免费在线看| 欧美午夜免费电影| 午夜免费久久看| 91美女视频网站| 精品国产亚洲在线| 久久精品二区亚洲w码| 欧美日韩三级在线| 亚洲综合视频在线| www.av亚洲| 中文字幕日本乱码精品影院| 国产寡妇亲子伦一区二区| 久久在线观看免费| 免费成人深夜小野草| 久久伊人蜜桃av一区二区| 麻豆91在线观看| 久久久噜噜噜久久人人看| 久久99久久精品| 国产视频一区在线观看| 国产一二精品视频| 国产精品久久一级| 成人av手机在线观看| 一区二区三区久久久| 在线精品视频免费观看| 中文字幕一区二区三| 99久久综合精品| 国产精品区一区二区三| 99久久婷婷国产综合精品电影 | 成人免费黄色大片| 中文字幕一区二区不卡| 91蝌蚪porny| 午夜精彩视频在线观看不卡| 欧美一级理论片| 成人动漫av在线| 一区二区三区免费观看| 欧美电视剧在线观看完整版| 精品在线播放午夜| 亚洲乱码国产乱码精品精的特点| 欧亚洲嫩模精品一区三区| 久久精品国产一区二区| 国产日产欧美一区二区三区| 欧美三级视频在线观看| 五月婷婷久久丁香| 国产午夜精品一区二区三区视频 | 综合欧美一区二区三区| 欧美影院一区二区| 国产激情一区二区三区四区 | 欧美电视剧在线看免费| 久久成人免费日本黄色| 国产精品伦一区二区三级视频| av亚洲精华国产精华精| 亚洲成人一区二区| 欧美videossexotv100| 91香蕉视频在线| 肉丝袜脚交视频一区二区| 欧美疯狂做受xxxx富婆| 东方aⅴ免费观看久久av| 一区二区三区日韩精品视频| 日韩精品一区二区在线| 久久精品国产第一区二区三区 | 久久九九99视频| 国产精品一区二区男女羞羞无遮挡|