|
|
|
@ -190,7 +190,7 @@ int8_t SCSI_ProcessCmd(USBD_HandleTypeDef *pdev,
|
|
|
|
|
*/
|
|
|
|
|
static int8_t SCSI_TestUnitReady(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params)
|
|
|
|
|
{
|
|
|
|
|
USBD_MSC_BOT_HandleTypeDef *hmsc = ((usbd_cdc_msc_hid_state_t*)pdev->pClassData)->msc;
|
|
|
|
|
USBD_MSC_BOT_HandleTypeDef *hmsc = &((usbd_cdc_msc_hid_state_t*)pdev->pClassData)->MSC_BOT_ClassData;
|
|
|
|
|
|
|
|
|
|
/* case 9 : Hi > D0 */
|
|
|
|
|
if (hmsc->cbw.dDataLength != 0)
|
|
|
|
@ -202,7 +202,7 @@ static int8_t SCSI_TestUnitReady(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(((USBD_StorageTypeDef *)pdev->pUserData)->IsReady(lun) !=0 )
|
|
|
|
|
if(hmsc->bdev_ops->IsReady(lun) !=0 )
|
|
|
|
|
{
|
|
|
|
|
SCSI_SenseCode(pdev,
|
|
|
|
|
lun,
|
|
|
|
@ -227,7 +227,7 @@ static int8_t SCSI_Inquiry(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *par
|
|
|
|
|
{
|
|
|
|
|
uint8_t* pPage;
|
|
|
|
|
uint16_t len;
|
|
|
|
|
USBD_MSC_BOT_HandleTypeDef *hmsc = ((usbd_cdc_msc_hid_state_t*)pdev->pClassData)->msc;
|
|
|
|
|
USBD_MSC_BOT_HandleTypeDef *hmsc = &((usbd_cdc_msc_hid_state_t*)pdev->pClassData)->MSC_BOT_ClassData;
|
|
|
|
|
|
|
|
|
|
if (params[1] & 0x01)/*Evpd is set*/
|
|
|
|
|
{
|
|
|
|
@ -237,7 +237,7 @@ static int8_t SCSI_Inquiry(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *par
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
pPage = (uint8_t *)&((USBD_StorageTypeDef *)pdev->pUserData)->pInquiry[lun * STANDARD_INQUIRY_DATA_LEN];
|
|
|
|
|
pPage = (uint8_t *)&hmsc->bdev_ops->pInquiry[lun * STANDARD_INQUIRY_DATA_LEN];
|
|
|
|
|
len = pPage[4] + 5;
|
|
|
|
|
|
|
|
|
|
if (params[4] <= len)
|
|
|
|
@ -264,9 +264,9 @@ static int8_t SCSI_Inquiry(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *par
|
|
|
|
|
*/
|
|
|
|
|
static int8_t SCSI_ReadCapacity10(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params)
|
|
|
|
|
{
|
|
|
|
|
USBD_MSC_BOT_HandleTypeDef *hmsc = ((usbd_cdc_msc_hid_state_t*)pdev->pClassData)->msc;
|
|
|
|
|
USBD_MSC_BOT_HandleTypeDef *hmsc = &((usbd_cdc_msc_hid_state_t*)pdev->pClassData)->MSC_BOT_ClassData;
|
|
|
|
|
|
|
|
|
|
if(((USBD_StorageTypeDef *)pdev->pUserData)->GetCapacity(lun, &hmsc->scsi_blk_nbr, &hmsc->scsi_blk_size) != 0)
|
|
|
|
|
if(hmsc->bdev_ops->GetCapacity(lun, &hmsc->scsi_blk_nbr, &hmsc->scsi_blk_size) != 0)
|
|
|
|
|
{
|
|
|
|
|
SCSI_SenseCode(pdev,
|
|
|
|
|
lun,
|
|
|
|
@ -300,7 +300,7 @@ static int8_t SCSI_ReadCapacity10(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_
|
|
|
|
|
*/
|
|
|
|
|
static int8_t SCSI_ReadFormatCapacity(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params)
|
|
|
|
|
{
|
|
|
|
|
USBD_MSC_BOT_HandleTypeDef *hmsc = ((usbd_cdc_msc_hid_state_t*)pdev->pClassData)->msc;
|
|
|
|
|
USBD_MSC_BOT_HandleTypeDef *hmsc = &((usbd_cdc_msc_hid_state_t*)pdev->pClassData)->MSC_BOT_ClassData;
|
|
|
|
|
|
|
|
|
|
uint16_t blk_size;
|
|
|
|
|
uint32_t blk_nbr;
|
|
|
|
@ -311,7 +311,7 @@ static int8_t SCSI_ReadFormatCapacity(USBD_HandleTypeDef *pdev, uint8_t lun, ui
|
|
|
|
|
hmsc->bot_data[i] = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(((USBD_StorageTypeDef *)pdev->pUserData)->GetCapacity(lun, &blk_nbr, &blk_size) != 0)
|
|
|
|
|
if(hmsc->bdev_ops->GetCapacity(lun, &blk_nbr, &blk_size) != 0)
|
|
|
|
|
{
|
|
|
|
|
SCSI_SenseCode(pdev,
|
|
|
|
|
lun,
|
|
|
|
@ -345,7 +345,7 @@ static int8_t SCSI_ReadFormatCapacity(USBD_HandleTypeDef *pdev, uint8_t lun, ui
|
|
|
|
|
*/
|
|
|
|
|
static int8_t SCSI_ModeSense6 (USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params)
|
|
|
|
|
{
|
|
|
|
|
USBD_MSC_BOT_HandleTypeDef *hmsc = ((usbd_cdc_msc_hid_state_t*)pdev->pClassData)->msc;
|
|
|
|
|
USBD_MSC_BOT_HandleTypeDef *hmsc = &((usbd_cdc_msc_hid_state_t*)pdev->pClassData)->MSC_BOT_ClassData;
|
|
|
|
|
uint16_t len = 8 ;
|
|
|
|
|
hmsc->bot_data_length = len;
|
|
|
|
|
|
|
|
|
@ -367,7 +367,7 @@ static int8_t SCSI_ModeSense6 (USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *
|
|
|
|
|
static int8_t SCSI_ModeSense10 (USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params)
|
|
|
|
|
{
|
|
|
|
|
uint16_t len = 8;
|
|
|
|
|
USBD_MSC_BOT_HandleTypeDef *hmsc = ((usbd_cdc_msc_hid_state_t*)pdev->pClassData)->msc;
|
|
|
|
|
USBD_MSC_BOT_HandleTypeDef *hmsc = &((usbd_cdc_msc_hid_state_t*)pdev->pClassData)->MSC_BOT_ClassData;
|
|
|
|
|
|
|
|
|
|
hmsc->bot_data_length = len;
|
|
|
|
|
|
|
|
|
@ -381,7 +381,7 @@ static int8_t SCSI_ModeSense10 (USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t
|
|
|
|
|
|
|
|
|
|
static int8_t SCSI_SynchronizeCache(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params) {
|
|
|
|
|
// nothing to synchronize, so just return "success"
|
|
|
|
|
USBD_MSC_BOT_HandleTypeDef *hmsc = ((usbd_cdc_msc_hid_state_t*)pdev->pClassData)->msc;
|
|
|
|
|
USBD_MSC_BOT_HandleTypeDef *hmsc = &((usbd_cdc_msc_hid_state_t*)pdev->pClassData)->MSC_BOT_ClassData;
|
|
|
|
|
hmsc->bot_data_length = 0;
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
@ -397,7 +397,7 @@ static int8_t SCSI_SynchronizeCache(USBD_HandleTypeDef *pdev, uint8_t lun, uint
|
|
|
|
|
static int8_t SCSI_RequestSense (USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params)
|
|
|
|
|
{
|
|
|
|
|
uint8_t i;
|
|
|
|
|
USBD_MSC_BOT_HandleTypeDef *hmsc = ((usbd_cdc_msc_hid_state_t*)pdev->pClassData)->msc;
|
|
|
|
|
USBD_MSC_BOT_HandleTypeDef *hmsc = &((usbd_cdc_msc_hid_state_t*)pdev->pClassData)->MSC_BOT_ClassData;
|
|
|
|
|
|
|
|
|
|
for(i=0 ; i < REQUEST_SENSE_DATA_LEN ; i++)
|
|
|
|
|
{
|
|
|
|
@ -439,7 +439,7 @@ static int8_t SCSI_RequestSense (USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t
|
|
|
|
|
*/
|
|
|
|
|
void SCSI_SenseCode(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t sKey, uint8_t ASC)
|
|
|
|
|
{
|
|
|
|
|
USBD_MSC_BOT_HandleTypeDef *hmsc = ((usbd_cdc_msc_hid_state_t*)pdev->pClassData)->msc;
|
|
|
|
|
USBD_MSC_BOT_HandleTypeDef *hmsc = &((usbd_cdc_msc_hid_state_t*)pdev->pClassData)->MSC_BOT_ClassData;
|
|
|
|
|
|
|
|
|
|
hmsc->scsi_sense[hmsc->scsi_sense_tail].Skey = sKey;
|
|
|
|
|
hmsc->scsi_sense[hmsc->scsi_sense_tail].w.ASC = ASC << 8;
|
|
|
|
@ -458,14 +458,14 @@ void SCSI_SenseCode(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t sKey, uint8_
|
|
|
|
|
*/
|
|
|
|
|
static int8_t SCSI_StartStopUnit(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params)
|
|
|
|
|
{
|
|
|
|
|
USBD_MSC_BOT_HandleTypeDef *hmsc = ((usbd_cdc_msc_hid_state_t*)pdev->pClassData)->msc;
|
|
|
|
|
USBD_MSC_BOT_HandleTypeDef *hmsc = &((usbd_cdc_msc_hid_state_t*)pdev->pClassData)->MSC_BOT_ClassData;
|
|
|
|
|
hmsc->bot_data_length = 0;
|
|
|
|
|
|
|
|
|
|
// On Mac OS X, when the device is ejected a SCSI_START_STOP_UNIT command is sent.
|
|
|
|
|
// Bit 0 of params[4] is the START bit.
|
|
|
|
|
// If we get a stop, we must really stop the device so that the Mac does not
|
|
|
|
|
// automatically remount it.
|
|
|
|
|
((USBD_StorageTypeDef *)pdev->pUserData)->StartStopUnit(lun, params[4] & 1);
|
|
|
|
|
hmsc->bdev_ops->StartStopUnit(lun, params[4] & 1);
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
@ -479,9 +479,9 @@ static int8_t SCSI_StartStopUnit(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t
|
|
|
|
|
*/
|
|
|
|
|
static int8_t SCSI_AllowMediumRemoval(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params)
|
|
|
|
|
{
|
|
|
|
|
USBD_MSC_BOT_HandleTypeDef *hmsc = ((usbd_cdc_msc_hid_state_t*)pdev->pClassData)->msc;
|
|
|
|
|
USBD_MSC_BOT_HandleTypeDef *hmsc = &((usbd_cdc_msc_hid_state_t*)pdev->pClassData)->MSC_BOT_ClassData;
|
|
|
|
|
hmsc->bot_data_length = 0;
|
|
|
|
|
((USBD_StorageTypeDef *)pdev->pUserData)->PreventAllowMediumRemoval(lun, params[0]);
|
|
|
|
|
hmsc->bdev_ops->PreventAllowMediumRemoval(lun, params[0]);
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -494,7 +494,7 @@ static int8_t SCSI_AllowMediumRemoval(USBD_HandleTypeDef *pdev, uint8_t lun, ui
|
|
|
|
|
*/
|
|
|
|
|
static int8_t SCSI_Read10(USBD_HandleTypeDef *pdev, uint8_t lun , uint8_t *params)
|
|
|
|
|
{
|
|
|
|
|
USBD_MSC_BOT_HandleTypeDef *hmsc = ((usbd_cdc_msc_hid_state_t*)pdev->pClassData)->msc;
|
|
|
|
|
USBD_MSC_BOT_HandleTypeDef *hmsc = &((usbd_cdc_msc_hid_state_t*)pdev->pClassData)->MSC_BOT_ClassData;
|
|
|
|
|
|
|
|
|
|
if(hmsc->bot_state == USBD_BOT_IDLE) /* Idle */
|
|
|
|
|
{
|
|
|
|
@ -510,7 +510,7 @@ static int8_t SCSI_Read10(USBD_HandleTypeDef *pdev, uint8_t lun , uint8_t *para
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(((USBD_StorageTypeDef *)pdev->pUserData)->IsReady(lun) !=0 )
|
|
|
|
|
if(hmsc->bdev_ops->IsReady(lun) !=0 )
|
|
|
|
|
{
|
|
|
|
|
SCSI_SenseCode(pdev,
|
|
|
|
|
lun,
|
|
|
|
@ -562,7 +562,7 @@ static int8_t SCSI_Read10(USBD_HandleTypeDef *pdev, uint8_t lun , uint8_t *para
|
|
|
|
|
|
|
|
|
|
static int8_t SCSI_Write10 (USBD_HandleTypeDef *pdev, uint8_t lun , uint8_t *params)
|
|
|
|
|
{
|
|
|
|
|
USBD_MSC_BOT_HandleTypeDef *hmsc = ((usbd_cdc_msc_hid_state_t*)pdev->pClassData)->msc;
|
|
|
|
|
USBD_MSC_BOT_HandleTypeDef *hmsc = &((usbd_cdc_msc_hid_state_t*)pdev->pClassData)->MSC_BOT_ClassData;
|
|
|
|
|
|
|
|
|
|
if (hmsc->bot_state == USBD_BOT_IDLE) /* Idle */
|
|
|
|
|
{
|
|
|
|
@ -579,7 +579,7 @@ static int8_t SCSI_Write10 (USBD_HandleTypeDef *pdev, uint8_t lun , uint8_t *pa
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Check whether Media is ready */
|
|
|
|
|
if(((USBD_StorageTypeDef *)pdev->pUserData)->IsReady(lun) !=0 )
|
|
|
|
|
if(hmsc->bdev_ops->IsReady(lun) !=0 )
|
|
|
|
|
{
|
|
|
|
|
SCSI_SenseCode(pdev,
|
|
|
|
|
lun,
|
|
|
|
@ -589,7 +589,7 @@ static int8_t SCSI_Write10 (USBD_HandleTypeDef *pdev, uint8_t lun , uint8_t *pa
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Check If media is write-protected */
|
|
|
|
|
if(((USBD_StorageTypeDef *)pdev->pUserData)->IsWriteProtected(lun) !=0 )
|
|
|
|
|
if(hmsc->bdev_ops->IsWriteProtected(lun) !=0 )
|
|
|
|
|
{
|
|
|
|
|
SCSI_SenseCode(pdev,
|
|
|
|
|
lun,
|
|
|
|
@ -652,7 +652,7 @@ static int8_t SCSI_Write10 (USBD_HandleTypeDef *pdev, uint8_t lun , uint8_t *pa
|
|
|
|
|
|
|
|
|
|
static int8_t SCSI_Verify10(USBD_HandleTypeDef *pdev, uint8_t lun , uint8_t *params)
|
|
|
|
|
{
|
|
|
|
|
USBD_MSC_BOT_HandleTypeDef *hmsc = ((usbd_cdc_msc_hid_state_t*)pdev->pClassData)->msc;
|
|
|
|
|
USBD_MSC_BOT_HandleTypeDef *hmsc = &((usbd_cdc_msc_hid_state_t*)pdev->pClassData)->MSC_BOT_ClassData;
|
|
|
|
|
|
|
|
|
|
if ((params[1]& 0x02) == 0x02)
|
|
|
|
|
{
|
|
|
|
@ -687,7 +687,7 @@ static int8_t SCSI_Verify10(USBD_HandleTypeDef *pdev, uint8_t lun , uint8_t *pa
|
|
|
|
|
*/
|
|
|
|
|
static int8_t SCSI_CheckAddressRange (USBD_HandleTypeDef *pdev, uint8_t lun , uint32_t blk_offset , uint16_t blk_nbr)
|
|
|
|
|
{
|
|
|
|
|
USBD_MSC_BOT_HandleTypeDef *hmsc = ((usbd_cdc_msc_hid_state_t*)pdev->pClassData)->msc;
|
|
|
|
|
USBD_MSC_BOT_HandleTypeDef *hmsc = &((usbd_cdc_msc_hid_state_t*)pdev->pClassData)->MSC_BOT_ClassData;
|
|
|
|
|
|
|
|
|
|
if ((blk_offset + blk_nbr) > hmsc->scsi_blk_nbr )
|
|
|
|
|
{
|
|
|
|
@ -708,12 +708,12 @@ static int8_t SCSI_CheckAddressRange (USBD_HandleTypeDef *pdev, uint8_t lun , u
|
|
|
|
|
*/
|
|
|
|
|
static int8_t SCSI_ProcessRead (USBD_HandleTypeDef *pdev, uint8_t lun)
|
|
|
|
|
{
|
|
|
|
|
USBD_MSC_BOT_HandleTypeDef *hmsc = ((usbd_cdc_msc_hid_state_t*)pdev->pClassData)->msc;
|
|
|
|
|
USBD_MSC_BOT_HandleTypeDef *hmsc = &((usbd_cdc_msc_hid_state_t*)pdev->pClassData)->MSC_BOT_ClassData;
|
|
|
|
|
uint32_t len;
|
|
|
|
|
|
|
|
|
|
len = MIN(hmsc->scsi_blk_len , MSC_MEDIA_PACKET);
|
|
|
|
|
|
|
|
|
|
if( ((USBD_StorageTypeDef *)pdev->pUserData)->Read(lun ,
|
|
|
|
|
if( hmsc->bdev_ops->Read(lun ,
|
|
|
|
|
hmsc->bot_data,
|
|
|
|
|
hmsc->scsi_blk_addr_in_blks,
|
|
|
|
|
len / hmsc->scsi_blk_size) < 0)
|
|
|
|
@ -756,11 +756,11 @@ static int8_t SCSI_ProcessRead (USBD_HandleTypeDef *pdev, uint8_t lun)
|
|
|
|
|
static int8_t SCSI_ProcessWrite (USBD_HandleTypeDef *pdev, uint8_t lun)
|
|
|
|
|
{
|
|
|
|
|
uint32_t len;
|
|
|
|
|
USBD_MSC_BOT_HandleTypeDef *hmsc = ((usbd_cdc_msc_hid_state_t*)pdev->pClassData)->msc;
|
|
|
|
|
USBD_MSC_BOT_HandleTypeDef *hmsc = &((usbd_cdc_msc_hid_state_t*)pdev->pClassData)->MSC_BOT_ClassData;
|
|
|
|
|
|
|
|
|
|
len = MIN(hmsc->scsi_blk_len , MSC_MEDIA_PACKET);
|
|
|
|
|
|
|
|
|
|
if(((USBD_StorageTypeDef *)pdev->pUserData)->Write(lun ,
|
|
|
|
|
if(hmsc->bdev_ops->Write(lun ,
|
|
|
|
|
hmsc->bot_data,
|
|
|
|
|
hmsc->scsi_blk_addr_in_blks,
|
|
|
|
|
len / hmsc->scsi_blk_size) < 0)
|
|
|
|
|