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

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

?? msddriver.c

?? IAR5.2下 AT91SAM9260 ARM 對 MCP2515 控制源化碼
?? C
?? 第 1 頁 / 共 2 頁
字號:

            // STALL the endpoint waiting for data
            if ((cbw->bmCBWFlags & MSD_CBW_DEVICE_TO_HOST) == 0) {

                // Stall the OUT endpoint : host to device
                USBD_Halt(MSDDriverDescriptors_BULKOUT);
                trace_LOG(trace_INFO, "StaOUT ");
            }
            else {

                // Stall the IN endpoint : device to host
                USBD_Halt(MSDDriverDescriptors_BULKIN);
                trace_LOG(trace_INFO, "StaIN ");
            }
        }

        // Reset command state
        commandState->state = 0;
    }

    return isCommandComplete;
}

//------------------------------------------------------------------------------
//! \brief  Resets the state of the BOT driver
//! \param  pBot Pointer to a S_bot instance
//! \see    S_bot
//------------------------------------------------------------------------------
void MSDDriver_Reset()
{
    trace_LOG(trace_INFO, "MSDReset ");

    msdDriver.state = MSDDriver_STATE_READ_CBW;
    msdDriver.waitResetRecovery = 0;
    msdDriver.commandState.state = 0;
}

//------------------------------------------------------------------------------
//         Callback re-implementation
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
/// Invoked when a new SETUP request is received from the host. Forwards the
/// request to the Mass Storage device driver handler function.
/// \param request  Pointer to a USBGenericRequest instance.
//------------------------------------------------------------------------------
void USBDCallbacks_RequestReceived(const USBGenericRequest *request)
{
    MSDDriver_RequestHandler(request);
}

//------------------------------------------------------------------------------
/// Invoked when the configuration of the device changes. Resets the mass
/// storage driver.
//------------------------------------------------------------------------------
void USBDDriverCallbacks_ConfigurationChanged(unsigned char cfgnum)
{
    if (cfgnum > 0) {

        MSDDriver_Reset();
    }
}

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

//------------------------------------------------------------------------------
//! \brief  Initializes a BOT driver and the associated USB driver.
//! \param  pBot    Pointer to a S_bot instance
//! \param  pUsb    USB driver to use
//! \param  lun    Pointer to a list of LUNs
//! \param  numLuns Number of LUN in list
//! \see    S_bot
//! \see    S_usb
//------------------------------------------------------------------------------
void MSDDriver_Initialize(MSDLun *luns, unsigned char numLuns)
{
    trace_LOG(trace_INFO, "I: MSD init\n\r");

    // Command state initialization
    msdDriver.commandState.state = 0;
    msdDriver.commandState.postprocess = 0;
    msdDriver.commandState.length = 0;
    msdDriver.commandState.transfer.semaphore = 0;

    // LUNs
    msdDriver.luns = luns;
    msdDriver.maxLun = (unsigned char) (numLuns - 1);

    // Reset BOT driver
    MSDDriver_Reset();

    // Init the USB driver
    USBDDriver_Initialize(&usbdDriver, &msdDriverDescriptors, 0);
    USBD_Init();
}

//------------------------------------------------------------------------------
//! \brief  Handler for incoming SETUP requests on default Control endpoint 0.
//!
//!         Standard requests are forwarded to the STD_RequestHandler method.
//! \param  pBot Pointer to a S_bot instance
//------------------------------------------------------------------------------
void MSDDriver_RequestHandler(const USBGenericRequest *request)
{
    trace_LOG(trace_INFO, "NewReq ");

    // Handle requests
    switch (USBGenericRequest_GetRequest(request)) {
    //---------------------
    case USBGenericRequest_CLEARFEATURE:
    //---------------------
        trace_LOG(trace_INFO, "ClrFeat ");

        switch (USBFeatureRequest_GetFeatureSelector(request)) {

        //---------------------
        case USBFeatureRequest_ENDPOINTHALT:
        //---------------------
            trace_LOG(trace_INFO, "Hlt ");

            // Do not clear the endpoint halt status if the device is waiting
            // for a reset recovery sequence
            if (!msdDriver.waitResetRecovery) {

                // Forward the request to the standard handler
                USBDDriver_RequestHandler(&usbdDriver, request);
            }
            else {

                trace_LOG(trace_INFO, "No ");
            }

            USBD_Write(0, 0, 0, 0, 0);
            break;

        //------
        default:
        //------
            // Forward the request to the standard handler
            USBDDriver_RequestHandler(&usbdDriver, request);
        }
        break;

    //-------------------
    case MSD_GET_MAX_LUN:
    //-------------------
        trace_LOG(trace_INFO, "gMaxLun ");

        // Check request parameters
        if ((request->wValue == 0)
            && (request->wIndex == 0)
            && (request->wLength == 1)) {

            USBD_Write(0, &(msdDriver.maxLun), 1, 0, 0);

        }
        else {

            trace_LOG(trace_WARNING, "W: MSDDriver_RequestHandler: GetMaxLUN(%d,%d,%d)\n\r",
                          request->wValue, request->wIndex, request->wLength);
            USBD_Stall(0);
        }
        break;

    //-----------------------
    case MSD_BULK_ONLY_RESET:
    //-----------------------
        trace_LOG(trace_INFO, "Rst ");

        // Check parameters
        if ((request->wValue == 0)
            && (request->wIndex == 0)
            && (request->wLength == 0)) {

            // Reset the MSD driver
            MSDDriver_Reset();
            USBD_Write(0, 0, 0, 0, 0);
        }
        else {

            trace_LOG(trace_WARNING, "W: MSDDriver_RequestHandler: Reset(%d,%d,%d)\n\r",
                          request->wValue, request->wIndex, request->wLength);
            USBD_Stall(0);
        }
        break;

    //------
    default:
    //------
        // Forward request to standard handler
        USBDDriver_RequestHandler(&usbdDriver, request);

        break;
    }
}

//------------------------------------------------------------------------------
//! \brief  State machine for the BOT driver
//! \param  pBot Pointer to a S_bot instance
//------------------------------------------------------------------------------
void MSDDriver_StateMachine(void)
{
    MSDCommandState *commandState = &(msdDriver.commandState);
    MSCbw           *cbw = &(commandState->cbw);
    MSCsw           *csw = &(commandState->csw);
    MSDTransfer      *transfer = &(commandState->transfer);
    unsigned char       status;

    // Identify current driver state
    switch (msdDriver.state) {
    //----------------------
    case MSDDriver_STATE_READ_CBW:
    //----------------------
        // Start the CBW read operation
        transfer->semaphore = 0;
        status = USBD_Read(MSDDriverDescriptors_BULKOUT,
                           cbw,
                           MSD_CBW_SIZE,
                           (TransferCallback) MSDDriver_Callback,
                           (void *) transfer);

        // Check operation result code
        if (status == USBD_STATUS_SUCCESS) {

            // If the command was successful, wait for transfer
            msdDriver.state = MSDDriver_STATE_WAIT_CBW;
        }
        break;

    //----------------------
    case MSDDriver_STATE_WAIT_CBW:
    //----------------------
        // Check transfer semaphore
        if (transfer->semaphore > 0) {

            // Take semaphore and terminate transfer
            transfer->semaphore--;

            // Check if transfer was successful
            if (transfer->status == USBD_STATUS_SUCCESS) {

                trace_LOG(trace_INFO, "------------------------------\n\r");

                // Process received command
                msdDriver.state = MSDDriver_STATE_PROCESS_CBW;
            }
            else if (transfer->status == USBD_STATUS_RESET) {

                trace_LOG(trace_INFO, "I: MSDDriver_StateMachine: Endpoint resetted\n\r");
                msdDriver.state = MSDDriver_STATE_READ_CBW;
            }
            else {

                trace_LOG(trace_WARNING, "W: MSDDriver_StateMachine: Failed to read CBW\n\r");
                msdDriver.state = MSDDriver_STATE_READ_CBW;
            }
        }
        break;

    //-------------------------
    case MSDDriver_STATE_PROCESS_CBW:
    //-------------------------
        // Check if this is a new command
        if (commandState->state == 0) {

            // Copy the CBW tag
            csw->dCSWTag = cbw->dCBWTag;

            // Check that the CBW is 31 bytes long
            if ((transfer->transferred != MSD_CBW_SIZE) ||
                (transfer->remaining != 0)) {

                trace_LOG(trace_WARNING, "W: MSDDriver_StateMachine: Invalid CBW (too short or too long)\n\r");

                // Wait for a reset recovery
                msdDriver.waitResetRecovery = 1;

                // Halt the Bulk-IN and Bulk-OUT pipes
                USBD_Halt(MSDDriverDescriptors_BULKOUT);
                USBD_Halt(MSDDriverDescriptors_BULKIN);

                csw->bCSWStatus = MSD_CSW_COMMAND_FAILED;
                msdDriver.state = MSDDriver_STATE_READ_CBW;

            }
            // Check the CBW Signature
            else if (cbw->dCBWSignature != MSD_CBW_SIGNATURE) {

                trace_LOG(trace_WARNING, "W: MSD_BOTStateMachine: Invalid CBW (Bad signature)\n\r");

                // Wait for a reset recovery
                msdDriver.waitResetRecovery = 1;

                // Halt the Bulk-IN and Bulk-OUT pipes
                USBD_Halt(MSDDriverDescriptors_BULKOUT);
                USBD_Halt(MSDDriverDescriptors_BULKIN);

                csw->bCSWStatus = MSD_CSW_COMMAND_FAILED;
                msdDriver.state = MSDDriver_STATE_READ_CBW;
            }
            else {

                // Pre-process command
                MSDDriver_PreProcessCommand();
            }
        }

        // Process command
        if (csw->bCSWStatus == MSDDriver_STATUS_SUCCESS) {

            if (MSDDriver_ProcessCommand()) {

                // Post-process command if it is finished
                MSDDriver_PostProcessCommand();
                msdDriver.state = MSDDriver_STATE_SEND_CSW;
            }
            trace_LOG(trace_INFO, "\n\r");
        }

        break;

    //----------------------
    case MSDDriver_STATE_SEND_CSW:
    //----------------------
        // Set signature
        csw->dCSWSignature = MSD_CSW_SIGNATURE;

        // Start the CSW write operation
        status = USBD_Write(MSDDriverDescriptors_BULKIN,
                            csw,
                            MSD_CSW_SIZE,
                            (TransferCallback) MSDDriver_Callback,
                            (void *) transfer);

        // Check operation result code
        if (status == USBD_STATUS_SUCCESS) {

            trace_LOG(trace_INFO, "SendCSW ");

            // Wait for end of transfer
            msdDriver.state = MSDDriver_STATE_WAIT_CSW;
        }
        break;

    //----------------------
    case MSDDriver_STATE_WAIT_CSW:
    //----------------------
        // Check transfer semaphore
        if (transfer->semaphore > 0) {

            // Take semaphore and terminate transfer
            transfer->semaphore--;

            // Check if transfer was successful
            if (transfer->status == USBD_STATUS_RESET) {

                trace_LOG(trace_INFO, "MSDDriver_StateMachine: Endpoint resetted\n\r");
            }
            else if (transfer->status == USBD_STATUS_ABORTED) {

                trace_LOG(trace_WARNING, "W: MSDDriver_StateMachine: Failed to send CSW\n\r");
            }
            else {

                trace_LOG(trace_INFO, "ok");
            }

            // Read new CBW
            msdDriver.state = MSDDriver_STATE_READ_CBW;
        }
        break;
    }
}

//------------------------------------------------------------------------------
/// Starts a remote wake-up sequence if the host has explicitely enabled it
/// by sending the appropriate SET_FEATURE request.
//------------------------------------------------------------------------------
void MSDDriver_RemoteWakeUp(void)
{
    // Remote wake-up has been enabled
    if (USBDDriver_IsRemoteWakeUpEnabled(&usbdDriver)) {

        USBD_RemoteWakeUp();
    }
    // Remote wake-up NOT enabled
    else {

        trace_LOG(trace_WARNING, "-W- MSDDriver_RemoteWakeUp: Host has not enabled remote wake-up\n\r");
    }
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色美美综合视频| 日韩av在线播放中文字幕| 国产九色sp调教91| 久久久久久日产精品| 国产99精品在线观看| 中文字幕一区二区不卡| 成人h动漫精品一区二区| 一区在线观看视频| 色悠久久久久综合欧美99| 亚洲六月丁香色婷婷综合久久| 色猫猫国产区一区二在线视频| 亚洲图片欧美视频| 91精品国产麻豆国产自产在线| 蜜臀av在线播放一区二区三区| 精品国精品自拍自在线| 国产v综合v亚洲欧| 亚洲免费色视频| 欧美三级在线播放| 毛片一区二区三区| 欧美国产国产综合| 欧美午夜不卡在线观看免费| 男女性色大片免费观看一区二区| 久久久久久久av麻豆果冻| 99re热这里只有精品视频| 婷婷夜色潮精品综合在线| 久久久综合激的五月天| 欧洲精品一区二区三区在线观看| 久久精品国产99国产| 亚洲欧洲韩国日本视频| 欧美精品aⅴ在线视频| 国产精品自拍在线| 洋洋av久久久久久久一区| 日韩三级伦理片妻子的秘密按摩| 国产91在线观看| 一区二区成人在线视频| 2020国产精品自拍| 欧美视频第二页| 成人免费电影视频| 日本成人中文字幕| 亚洲天堂2016| 精品国产一区二区在线观看| 日本视频一区二区三区| 成人v精品蜜桃久久一区| 日韩一区二区三区电影| 成人激情小说网站| 奇米影视一区二区三区| 国产精品夫妻自拍| 欧美va日韩va| 欧美无砖砖区免费| www.激情成人| 国产综合色视频| 日韩精品一级中文字幕精品视频免费观看| 国产欧美视频一区二区| 91精品国产综合久久小美女| 色呦呦网站一区| 成人综合婷婷国产精品久久蜜臀 | 亚洲最色的网站| 国产精品五月天| 337p日本欧洲亚洲大胆精品| 欧美日精品一区视频| aaa欧美日韩| 国产精品原创巨作av| 天堂av在线一区| 亚洲国产你懂的| 亚洲蜜桃精久久久久久久| 中文字幕日韩一区二区| 久久综合成人精品亚洲另类欧美| 欧美高清视频一二三区| 欧美精品日韩一区| 欧美日韩小视频| 欧美性受极品xxxx喷水| 色狠狠综合天天综合综合| 99久久久国产精品| www.日本不卡| 成人av手机在线观看| 国产成人亚洲综合a∨猫咪| 国产九色sp调教91| 国产乱人伦偷精品视频免下载| 久久国产精品99精品国产| 蜜臀精品久久久久久蜜臀| 麻豆一区二区在线| 久久精品免费观看| 国精产品一区一区三区mba视频| 六月丁香婷婷久久| 久久成人免费电影| 激情伊人五月天久久综合| 久久99精品久久久久久动态图| 精品一区二区三区香蕉蜜桃| 青青草视频一区| 久久电影网站中文字幕| 国产又黄又大久久| 国产乱子伦一区二区三区国色天香| 国产在线不卡视频| 成人免费视频app| 色94色欧美sute亚洲线路一久| 色噜噜久久综合| 欧美人牲a欧美精品| 欧美一级视频精品观看| 久久综合国产精品| 综合电影一区二区三区| 亚洲国产cao| 天堂一区二区在线免费观看| 国产一级精品在线| youjizz国产精品| 欧美性感一类影片在线播放| 91麻豆精品国产综合久久久久久 | 亚洲一区二区三区视频在线| 日日噜噜夜夜狠狠视频欧美人| 麻豆91在线观看| 福利一区二区在线| 91黄视频在线| 精品三级av在线| 日韩美女视频一区二区| 午夜成人在线视频| 国产风韵犹存在线视精品| 欧洲国产伦久久久久久久| 日韩免费视频线观看| 18欧美亚洲精品| 麻豆精品国产91久久久久久| 成人性生交大片免费看在线播放| 在线精品视频免费观看| 久久人人超碰精品| 一区二区三区四区中文字幕| 精品一区二区在线视频| 色综合天天综合狠狠| 精品处破学生在线二十三| 亚洲综合色丁香婷婷六月图片| 精品一区二区三区视频在线观看| 91福利精品视频| 国产喷白浆一区二区三区| 亚洲高清免费观看| 不卡的av网站| 久久色视频免费观看| 亚洲成人你懂的| thepron国产精品| 亚洲精品在线观看网站| 亚洲国产欧美一区二区三区丁香婷| 国产精品1区二区.| 欧美丰满嫩嫩电影| 亚洲精品久久久蜜桃| 粉嫩久久99精品久久久久久夜| 制服丝袜亚洲色图| 亚洲精品成人精品456| 国产精品中文字幕欧美| 欧美一级片免费看| 亚洲一区免费视频| 99久久精品费精品国产一区二区| 久久久精品人体av艺术| 青椒成人免费视频| 欧美色视频一区| 亚洲人成影院在线观看| 不卡一区二区三区四区| 久久久青草青青国产亚洲免观| 久久国产乱子精品免费女| 欧美一区二区视频在线观看2020 | 一区二区三区日韩精品视频| eeuss鲁片一区二区三区在线看| 久久亚洲影视婷婷| 蜜桃av一区二区三区电影| 欧美一二三区在线| 青青青伊人色综合久久| 日韩一区二区三区视频| 欧美aaaaaa午夜精品| 日韩欧美一区二区不卡| 美女视频免费一区| 亚洲精品一区二区三区香蕉| 久久国产精品区| 精品88久久久久88久久久| 久久99精品久久只有精品| 欧美福利视频导航| 一区二区三区四区激情 | 国产激情视频一区二区在线观看 | 91精品蜜臀在线一区尤物| 亚洲成人免费视频| 欧美亚日韩国产aⅴ精品中极品| 国产精品视频麻豆| 肉肉av福利一精品导航| 日韩午夜中文字幕| 婷婷成人综合网| 欧美精品丝袜久久久中文字幕| 亚洲第一会所有码转帖| 欧美综合亚洲图片综合区| 日韩美女久久久| 9l国产精品久久久久麻豆| 亚洲免费av网站| 色婷婷av久久久久久久| 一区二区三区在线观看国产| 国产精品国产三级国产aⅴ无密码| 欧美色图在线观看| 7878成人国产在线观看| 精品欧美乱码久久久久久| 欧美日韩国产天堂| 欧美巨大另类极品videosbest | 中文字幕永久在线不卡| 国产裸体歌舞团一区二区| 久久久久99精品一区| 国产精品77777| 亚洲伊人色欲综合网| 欧美性猛交xxxxxx富婆| 亚洲福利视频三区|