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

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

?? sbcmethods.c

?? IAR5.2下 AT91SAM9260 ARM 對 MCP2515 控制源化碼
?? C
?? 第 1 頁 / 共 3 頁
字號:
    // Initialize command state if needed
    if (commandState->state == 0) {

        commandState->state = SBC_STATE_WRITE;
    }

    // Check current command state
    switch (commandState->state) {
    //-------------------
    case SBC_STATE_WRITE:
    //-------------------
        // Start transfer
        status = USBD_Write(MSDDriverDescriptors_BULKIN,
                            (void *) &modeParameterHeader6,
                            commandState->length,
                            (TransferCallback) MSDDriver_Callback,
                            (void *) transfer);

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

            trace_LOG(trace_WARNING, "W: SPC_ModeSense6: Cannot start data transfer\n\r");
            result = MSDDriver_STATUS_ERROR;
        }
        else {

            // Proceed to next state
            commandState->state = SBC_STATE_WAIT_WRITE;
        }
        break;

    //------------------------
    case SBC_STATE_WAIT_WRITE:
    //------------------------
        trace_LOG(trace_INFO, "Wait ");

        // Check semaphore value
        if (transfer->semaphore > 0) {

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

            if (transfer->status != USBD_STATUS_SUCCESS) {

                trace_LOG(trace_WARNING, "W: SPC_ModeSense6: Data transfer failed\n\r");
                result = MSDDriver_STATUS_ERROR;
            }
            else {

                result = MSDDriver_STATUS_SUCCESS;
            }

            // Update length field
            commandState->length -= transfer->transferred;

        }
        break;
    }

    return result;
}

//------------------------------------------------------------------------------
//! \brief  Performs a TEST UNIT READY COMMAND command.
//! \param  lun          Pointer to the LUN affected by the command
//! \return Operation result code (SUCCESS, ERROR, INCOMPLETE or PARAMETER)
//! \see    MSDLun
//------------------------------------------------------------------------------
static unsigned char SBC_TestUnitReady(MSDLun *lun)
{
    unsigned char result = MSDDriver_STATUS_ERROR;

    // Check current media state
    switch(lun->media->state) {
    //-------------------
    case MED_STATE_READY:
    //-------------------
        // Nothing to do
        trace_LOG(trace_INFO, "Rdy ");
        result = MSDDriver_STATUS_SUCCESS;
        break;

    //------------------
    case MED_STATE_BUSY:
    //------------------
        trace_LOG(trace_INFO, "Bsy ");
        SBC_UpdateSenseData(&(lun->requestSenseData),
                            SBC_SENSE_KEY_NOT_READY,
                            0,
                            0);
        break;

    //------
    default:
    //------
        trace_LOG(trace_INFO, "? ");
        SBC_UpdateSenseData(&(lun->requestSenseData),
                            SBC_SENSE_KEY_NOT_READY,
                            SBC_ASC_MEDIUM_NOT_PRESENT,
                            0);
        break;
    }

    return result;
}

//------------------------------------------------------------------------------
//      Exported functions
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//! \brief  Updates the sense data of a LUN with the given key and codes
//! \param  requestSenseData             Pointer to the sense data to update
//! \param  senseKey                     Sense key
//! \param  additionalSenseCode          Additional sense code
//! \param  additionalSenseCodeQualifier Additional sense code qualifier
//------------------------------------------------------------------------------
void SBC_UpdateSenseData(SBCRequestSenseData *requestSenseData,
                         unsigned char senseKey,
                         unsigned char additionalSenseCode,
                         unsigned char additionalSenseCodeQualifier)
{
    requestSenseData->bSenseKey = senseKey;
    requestSenseData->bAdditionalSenseCode = additionalSenseCode;
    requestSenseData->bAdditionalSenseCodeQualifier
        = additionalSenseCodeQualifier;
}

//------------------------------------------------------------------------------
//! \brief  Return information about the transfer length and direction expected
//!         by the device for a particular command.
//! \param  command Pointer to a buffer holding the command to evaluate
//! \param  length  Expected length of the data transfer
//! \param  type    Expected direction of data transfer
//! \param  lun     Pointer to the LUN affected by the command
//------------------------------------------------------------------------------
unsigned char SBC_GetCommandInformation(void          *command,
                               unsigned int  *length,
                               unsigned char *type,
                               MSDLun         *lun)
{
    SBCCommand *sbcCommand = (SBCCommand *) command;
    unsigned char          isCommandSupported = 1;

    // Identify command
    switch (sbcCommand->bOperationCode) {
    //---------------
    case SBC_INQUIRY:
    //---------------
        (*type) = MSDDriver_DEVICE_TO_HOST;

        // Allocation length is stored in big-endian format
        (*length) = WORDB(sbcCommand->inquiry.pAllocationLength);
        break;

    //--------------------
    case SBC_MODE_SENSE_6:
    //--------------------
        (*type) = MSDDriver_DEVICE_TO_HOST;
        if (sbcCommand->modeSense6.bAllocationLength >
            sizeof(SBCModeParameterHeader6)) {

            *length = sizeof(SBCModeParameterHeader6);
        }
        else {

            *length = sbcCommand->modeSense6.bAllocationLength;
        }

        // Only "return all pages" command is supported
        if (sbcCommand->modeSense6.bPageCode != SBC_PAGE_RETURN_ALL) {

            // Unsupported page
            trace_LOG(trace_WARNING, "W: SBC_GetCommandInformation: Page code not supported (0x%02X)\n\r",
                          sbcCommand->modeSense6.bPageCode);
            isCommandSupported = 0;
            (*length) = 0;
        }
        break;

    //------------------------------------
    case SBC_PREVENT_ALLOW_MEDIUM_REMOVAL:
    //------------------------------------
        (*type) = MSDDriver_NO_TRANSFER;
        break;

    //---------------------
    case SBC_REQUEST_SENSE:
    //---------------------
        (*type) = MSDDriver_DEVICE_TO_HOST;
        (*length) = sbcCommand->requestSense.bAllocationLength;
        break;

    //-----------------------
    case SBC_TEST_UNIT_READY:
    //-----------------------
        (*type) = MSDDriver_NO_TRANSFER;
        break;

    //---------------------
    case SBC_READ_CAPACITY_10:
    //---------------------
        (*type) = MSDDriver_DEVICE_TO_HOST;
        (*length) = sizeof(SBCReadCapacity10Data);
        break;

    //---------------
    case SBC_READ_10:
    //---------------
        (*type) = MSDDriver_DEVICE_TO_HOST;
        (*length) = WORDB(sbcCommand->read10.pTransferLength)
                     * lun->blockSize;
        break;

    //----------------
    case SBC_WRITE_10:
    //----------------
        (*type) = MSDDriver_HOST_TO_DEVICE;
        (*length) = WORDB(sbcCommand->write10.pTransferLength)
                     * lun->blockSize;
        break;

    //-----------------
    case SBC_VERIFY_10:
    //-----------------
        (*type) = MSDDriver_NO_TRANSFER;
        break;

    //------
    default:
    //------
        isCommandSupported = 0;
    }

    // If length is 0, no transfer is expected
    if ((*length) == 0) {

        (*type) = MSDDriver_NO_TRANSFER;
    }

    return isCommandSupported;
}

//------------------------------------------------------------------------------
//! \brief  Processes a SBC command by dispatching it to a subfunction.
//! \param  pUsb          Pointer to a S_usb instance
//! \param  lun          Pointer to the affected LUN
//! \param  commandState Pointer to the current command state
//! \return Operation result code
//------------------------------------------------------------------------------
unsigned char SBC_ProcessCommand(MSDLun               *lun,
                                 MSDCommandState *commandState)
{
    unsigned char result = MSDDriver_STATUS_INCOMPLETE;
    SBCCommand *command = (SBCCommand *) commandState->cbw.pCommand;

    // Identify command
    switch (command->bOperationCode) {
    //---------------
    case SBC_READ_10:
    //---------------
        trace_LOG(trace_INFO, "Read(10) ");

        // Perform the Read10 command
        result = SBC_Read10(lun, commandState);
        break;

    //----------------
    case SBC_WRITE_10:
    //----------------
        trace_LOG(trace_INFO, "Write(10) ");

        // Perform the Write10 command
        result = SBC_Write10(lun, commandState);
        break;

    //---------------------
    case SBC_READ_CAPACITY_10:
    //---------------------
        trace_LOG(trace_INFO, "RdCapacity(10) ");

        // Perform the ReadCapacity command
        result = SBC_ReadCapacity10(lun, commandState);
        break;

    //---------------------
    case SBC_VERIFY_10:
    //---------------------
        trace_LOG(trace_INFO, "Verify(10) ");

        // Flush media
        MED_Flush(lun->media);
        result = MSDDriver_STATUS_SUCCESS;
        break;

    //---------------
    case SBC_INQUIRY:
    //---------------
        trace_LOG(trace_INFO, "Inquiry ");

        // Process Inquiry command
        result = SBC_Inquiry(lun, commandState);
        break;

    //--------------------
    case SBC_MODE_SENSE_6:
    //--------------------
        trace_LOG(trace_INFO, "ModeSense(6) ");

        // Process ModeSense6 command
        result = SBC_ModeSense6(commandState);
        break;

    //-----------------------
    case SBC_TEST_UNIT_READY:
    //-----------------------
        trace_LOG(trace_INFO, "TstUnitRdy ");

        // Process TestUnitReady command
        //MED_Flush(lun->media);
        result = SBC_TestUnitReady(lun);
        break;

    //---------------------
    case SBC_REQUEST_SENSE:
    //---------------------
        trace_LOG(trace_INFO, "ReqSense ");

        // Perform the RequestSense command
        result = SBC_RequestSense(lun, commandState);
        break;

    //------------------------------------
    case SBC_PREVENT_ALLOW_MEDIUM_REMOVAL:
    //------------------------------------
        trace_LOG(trace_INFO, "PrevAllowRem ");

        // Nothing to do
        result = MSDDriver_STATUS_SUCCESS;
        break;

    //------
    default:
    //------
        result = MSDDriver_STATUS_PARAMETER;
    }

    return result;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品毛片a∨一区二区三区| 亚洲午夜激情网页| 一本一本大道香蕉久在线精品| 一区二区三区不卡在线观看 | av在线不卡网| 日韩主播视频在线| 亚洲人成人一区二区在线观看| 日韩午夜av一区| 一本色道**综合亚洲精品蜜桃冫| 精一区二区三区| 天天综合网天天综合色| 亚洲网友自拍偷拍| 欧美精彩视频一区二区三区| 91精品国产高清一区二区三区 | 色播五月激情综合网| 国产综合色视频| 日本伊人精品一区二区三区观看方式| 国产精品久久久久久户外露出 | 国产精品久久久久国产精品日日| 日韩一区二区三区免费观看| 欧美日韩三级视频| 日本精品视频一区二区| 不卡一区中文字幕| 国产成人综合自拍| 日韩av高清在线观看| 亚洲午夜精品在线| 亚洲精品日日夜夜| 《视频一区视频二区| 国产清纯白嫩初高生在线观看91 | 欧美高清www午色夜在线视频| 91丨国产丨九色丨pron| 成人午夜免费av| 国产一区二区三区免费在线观看| 日韩黄色片在线观看| 亚洲福利视频三区| 亚洲一区二区欧美| 午夜成人在线视频| 日韩黄色在线观看| 日韩精品亚洲专区| 奇米一区二区三区| 久久99国产精品免费| 久久精品国产在热久久| 91丨porny丨国产| 中文字幕日韩精品一区| 国产偷v国产偷v亚洲高清| 欧美大尺度电影在线| 日韩三级在线免费观看| 日韩免费高清视频| 精品国产乱码久久久久久浪潮| 精品久久久久久久久久久久包黑料 | 91久久精品一区二区三| 色婷婷av一区| 欧美日韩中文字幕精品| 欧美日本视频在线| 欧美一区二区三区不卡| 久久久亚洲高清| 国产女主播视频一区二区| 国产精品国产三级国产a| 亚洲女子a中天字幕| 亚洲123区在线观看| 麻豆久久久久久久| 国产成人精品免费网站| 91色乱码一区二区三区| 欧美色图免费看| 欧美mv日韩mv国产网站| 国产片一区二区| 一区二区三区在线视频观看| 午夜私人影院久久久久| 久久国产免费看| 成人黄页在线观看| 欧美亚洲尤物久久| 日韩精品中文字幕一区二区三区 | 久久久五月婷婷| 1024国产精品| 免费观看在线综合| 成人性生交大片免费看视频在线| 91丝袜国产在线播放| 日韩精品资源二区在线| 最新中文字幕一区二区三区| 视频一区中文字幕| 国产成人精品免费视频网站| 91麻豆精品秘密| 日韩一区二区精品| 一区二区中文字幕在线| 日本美女一区二区| 91日韩在线专区| 日韩女优av电影| 国产精品久久久久天堂| 日日欢夜夜爽一区| 99麻豆久久久国产精品免费 | 91污在线观看| 26uuu精品一区二区三区四区在线| 亚洲蜜臀av乱码久久精品蜜桃| 麻豆91小视频| 欧美午夜精品电影| 国产日韩欧美制服另类| 欧美伊人久久大香线蕉综合69| 欧美一区日韩一区| 亚洲色图制服诱惑| 精品无码三级在线观看视频| 欧美体内she精视频| 国产肉丝袜一区二区| 午夜激情久久久| 91丝袜国产在线播放| 国产片一区二区三区| 麻豆精品在线播放| 欧美日韩视频专区在线播放| 中文字幕制服丝袜一区二区三区| 免费成人在线观看视频| 91电影在线观看| 国产精品久久久久久久裸模| 国产综合成人久久大片91| 欧美精品成人一区二区三区四区| 亚洲欧美乱综合| 成人av综合在线| 国产视频一区二区在线| 久久国产日韩欧美精品| 91精品国产美女浴室洗澡无遮挡| 一区二区三区在线观看欧美| 波多野结衣中文字幕一区二区三区| 日韩欧美国产午夜精品| 三级欧美在线一区| 51精品国自产在线| 午夜国产精品影院在线观看| 亚洲欧洲精品一区二区三区 | 久久久不卡网国产精品一区| 日韩国产一二三区| 欧美色图天堂网| 亚洲一区免费在线观看| 欧美亚洲精品一区| 一区二区成人在线| 在线观看亚洲精品视频| 亚洲综合色成人| 在线观看一区不卡| 亚洲影视在线播放| 91小视频在线免费看| 精品国产成人在线影院| 偷拍一区二区三区| 日韩一区二区电影| 奇米色一区二区三区四区| 日韩免费高清电影| 九九九精品视频| 日韩欧美成人午夜| 国产一区二区电影| 精品国产sm最大网站免费看| 国产精品一区二区黑丝| 亚洲精品在线一区二区| 久久精品国产精品亚洲精品| 久久综合999| 国产成人午夜视频| 亚洲欧美另类久久久精品2019| 激情综合亚洲精品| 久久久另类综合| 91啪九色porn原创视频在线观看| 亚洲在线成人精品| 国产一区二区不卡| 精品久久久久久久久久久久包黑料| 国产自产视频一区二区三区| 久久无码av三级| 成人黄色综合网站| 亚洲欧美日韩中文字幕一区二区三区| 91福利在线导航| 亚洲第一福利视频在线| 欧美精品在线一区二区三区| 美女一区二区三区| 久久亚洲一区二区三区明星换脸| 国产激情91久久精品导航| 欧美国产综合色视频| 色综合视频一区二区三区高清| 亚洲日本在线视频观看| 欧美午夜一区二区三区免费大片| 亚洲国产成人va在线观看天堂| 欧美电视剧在线观看完整版| 韩国三级中文字幕hd久久精品| 精品久久久久一区| www.色综合.com| 日韩精品国产精品| 国产视频在线观看一区二区三区| 99久久婷婷国产综合精品| 综合久久国产九一剧情麻豆| 欧美精品视频www在线观看| 玖玖九九国产精品| 国产精品福利电影一区二区三区四区 | 在线观看视频91| 日本不卡免费在线视频| www国产精品av| 日本久久一区二区| 久久av中文字幕片| 亚洲图片激情小说| 欧美在线啊v一区| 国产一区二区三区免费看 | 国产精品一区二区免费不卡| 专区另类欧美日韩| 在线不卡免费欧美| 成人毛片老司机大片| 亚洲国产成人tv| 日本一区二区三区在线不卡| 欧美日韩激情在线| 国产成人午夜片在线观看高清观看| 亚洲一二三区在线观看|