/** * @brief SCSI_Read10 * Process Read10 command * @param lun: Logical unit number * @param params: Command parameters * @retval status */ static int8_t SCSI_Read10(USBD_HandleTypeDef *pdev, uint8_t lun , uint8_t *params) { USBD_MSC_BOT_HandleTypeDef *hmsc = pdev->pClassData; if(hmsc->bot_state == USBD_BOT_IDLE) /* Idle */ { /* case 10 : Ho <> Di */ if ((hmsc->cbw.bmFlags & 0x80) != 0x80) { SCSI_SenseCode(pdev, hmsc->cbw.bLUN, ILLEGAL_REQUEST, INVALID_CDB); return -1; } if(((USBD_StorageTypeDef *)pdev->pUserData)->IsReady(lun) !=0 ) { SCSI_SenseCode(pdev, lun, NOT_READY, MEDIUM_NOT_PRESENT); return -1; } hmsc->scsi_blk_addr = (params[2] << 24) | \ (params[3] << 16) | \ (params[4] << 8) | \ params[5]; hmsc->scsi_blk_len = (params[7] << 8) | \ params[8]; if( SCSI_CheckAddressRange(pdev, lun, hmsc->scsi_blk_addr, hmsc->scsi_blk_len) < 0) { return -1; /* error */ } hmsc->bot_state = USBD_BOT_DATA_IN; hmsc->scsi_blk_addr *= hmsc->scsi_blk_size; hmsc->scsi_blk_len *= hmsc->scsi_blk_size; /* cases 4,5 : Hi <> Dn */ if (hmsc->cbw.dDataLength != hmsc->scsi_blk_len) { SCSI_SenseCode(pdev, hmsc->cbw.bLUN, ILLEGAL_REQUEST, INVALID_CDB); return -1; } } hmsc->bot_data_length = MSC_MEDIA_PACKET; return SCSI_ProcessRead(pdev, lun); }
/** * @brief SCSI_Read10 * Process Read10 command * @param lun: Logical unit number * @param params: Command parameters * @retval status */ static int8_t SCSI_Read10(uint8_t lun , uint8_t *params) { if(MSC_BOT_State == BOT_IDLE) /* Idle */ { /* case 10 : Ho <> Di */ if ((MSC_BOT_cbw.bmFlags & 0x80) != 0x80) { SCSI_SenseCode(MSC_BOT_cbw.bLUN, ILLEGAL_REQUEST, INVALID_CDB); return -1; } if(USBD_STORAGE_fops->IsReady(lun) !=0 ) { SCSI_SenseCode(lun, NOT_READY, MEDIUM_NOT_PRESENT); return -1; } SCSI_blk_addr = (params[2] << 24) | \ (params[3] << 16) | \ (params[4] << 8) | \ params[5]; SCSI_blk_len = (params[7] << 8) | \ params[8]; if( SCSI_CheckAddressRange(lun, SCSI_blk_addr, SCSI_blk_len) < 0) { return -1; /* error */ } MSC_BOT_State = BOT_DATA_IN; SCSI_blk_addr *= SCSI_blk_size; SCSI_blk_len *= SCSI_blk_size; /* cases 4,5 : Hi <> Dn */ if (MSC_BOT_cbw.dDataLength != SCSI_blk_len) { SCSI_SenseCode(MSC_BOT_cbw.bLUN, ILLEGAL_REQUEST, INVALID_CDB); return -1; } } MSC_BOT_DataLen = MSC_MEDIA_PACKET; return SCSI_ProcessRead(lun); }