|
|
@@ -507,11 +507,9 @@ static int8_t SCSI_Read10(USBD_HandleTypeDef *pdev, uint8_t lun , uint8_t *para
|
|
|
}
|
|
|
|
|
|
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)
|
|
|
+ if (hmsc->cbw.dDataLength != (hmsc->scsi_blk_len * hmsc->scsi_blk_size))
|
|
|
{
|
|
|
SCSI_SenseCode(pdev,
|
|
|
hmsc->cbw.bLUN,
|
|
|
@@ -535,12 +533,12 @@ 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_CompositeClassData *classData = (USBD_CompositeClassData*) pdev->pClassData;
|
|
|
- USBD_MSC_BOT_HandleTypeDef *hmsc = &(classData->msc);
|
|
|
+ USBD_CompositeClassData *classData = (USBD_CompositeClassData*) pdev->pClassData;
|
|
|
+ USBD_MSC_BOT_HandleTypeDef *hmsc = &(classData->msc);
|
|
|
+ uint32_t len;
|
|
|
|
|
|
if (hmsc->bot_state == USBD_BOT_IDLE) /* Idle */
|
|
|
{
|
|
|
-
|
|
|
/* case 8 : Hi <> Do */
|
|
|
|
|
|
if ((hmsc->cbw.bmFlags & 0x80) == 0x80)
|
|
|
@@ -588,12 +586,11 @@ static int8_t SCSI_Write10 (USBD_HandleTypeDef *pdev, uint8_t lun , uint8_t *pa
|
|
|
{
|
|
|
return -1; /* error */
|
|
|
}
|
|
|
-
|
|
|
- hmsc->scsi_blk_addr *= hmsc->scsi_blk_size;
|
|
|
- hmsc->scsi_blk_len *= hmsc->scsi_blk_size;
|
|
|
+
|
|
|
+ len = hmsc->scsi_blk_len * hmsc->scsi_blk_size;
|
|
|
|
|
|
/* cases 3,11,13 : Hn,Ho <> D0 */
|
|
|
- if (hmsc->cbw.dDataLength != hmsc->scsi_blk_len)
|
|
|
+ if (hmsc->cbw.dDataLength != len)
|
|
|
{
|
|
|
SCSI_SenseCode(pdev,
|
|
|
hmsc->cbw.bLUN,
|
|
|
@@ -601,13 +598,15 @@ static int8_t SCSI_Write10 (USBD_HandleTypeDef *pdev, uint8_t lun , uint8_t *pa
|
|
|
INVALID_CDB);
|
|
|
return -1;
|
|
|
}
|
|
|
+
|
|
|
+ len = MIN(len, S2S_MSC_MEDIA_PACKET);
|
|
|
|
|
|
/* Prepare EP to receive first data packet */
|
|
|
hmsc->bot_state = USBD_BOT_DATA_OUT;
|
|
|
USBD_LL_PrepareReceive (pdev,
|
|
|
MSC_EPOUT_ADDR,
|
|
|
hmsc->bot_data,
|
|
|
- MIN (hmsc->scsi_blk_len, S2S_MSC_MEDIA_PACKET));
|
|
|
+ len);
|
|
|
}
|
|
|
else /* Write Process ongoing */
|
|
|
{
|
|
|
@@ -698,16 +697,19 @@ static int8_t SCSI_CheckAddressRange (USBD_HandleTypeDef *pdev, uint8_t lun , u
|
|
|
*/
|
|
|
static int8_t SCSI_ProcessRead (USBD_HandleTypeDef *pdev, uint8_t lun)
|
|
|
{
|
|
|
- USBD_CompositeClassData *classData = (USBD_CompositeClassData*) pdev->pClassData;
|
|
|
- USBD_MSC_BOT_HandleTypeDef *hmsc = &(classData->msc);
|
|
|
+ USBD_CompositeClassData *classData = (USBD_CompositeClassData*) pdev->pClassData;
|
|
|
+ USBD_MSC_BOT_HandleTypeDef *hmsc = &(classData->msc);
|
|
|
|
|
|
- uint32_t len;
|
|
|
-
|
|
|
- len = MIN(hmsc->scsi_blk_len , S2S_MSC_MEDIA_PACKET);
|
|
|
-
|
|
|
+ uint32_t len = hmsc->scsi_blk_len * hmsc->scsi_blk_size;
|
|
|
+
|
|
|
+ len = MIN(len, S2S_MSC_MEDIA_PACKET);
|
|
|
+
|
|
|
+ // TODO there is a dcache issue here.
|
|
|
+ // work out how, and when, to flush cashes between sdio dma and usb dma
|
|
|
+ memset (hmsc->bot_data, 0xAA, len);
|
|
|
if( ((USBD_StorageTypeDef *)pdev->pUserData)->Read(lun ,
|
|
|
hmsc->bot_data,
|
|
|
- hmsc->scsi_blk_addr / hmsc->scsi_blk_size,
|
|
|
+ hmsc->scsi_blk_addr,
|
|
|
len / hmsc->scsi_blk_size) < 0)
|
|
|
{
|
|
|
|
|
|
@@ -724,9 +726,8 @@ static int8_t SCSI_ProcessRead (USBD_HandleTypeDef *pdev, uint8_t lun)
|
|
|
hmsc->bot_data,
|
|
|
len);
|
|
|
|
|
|
-
|
|
|
- hmsc->scsi_blk_addr += len;
|
|
|
- hmsc->scsi_blk_len -= len;
|
|
|
+ hmsc->scsi_blk_addr += (len / hmsc->scsi_blk_size);
|
|
|
+ hmsc->scsi_blk_len -= (len / hmsc->scsi_blk_size);
|
|
|
|
|
|
/* case 6 : Hi = Di */
|
|
|
hmsc->csw.dDataResidue -= len;
|
|
|
@@ -747,15 +748,16 @@ 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_CompositeClassData *classData = (USBD_CompositeClassData*) pdev->pClassData;
|
|
|
- USBD_MSC_BOT_HandleTypeDef *hmsc = &(classData->msc);
|
|
|
+ USBD_CompositeClassData *classData = (USBD_CompositeClassData*) pdev->pClassData;
|
|
|
+ USBD_MSC_BOT_HandleTypeDef *hmsc = &(classData->msc);
|
|
|
|
|
|
- len = MIN(hmsc->scsi_blk_len , S2S_MSC_MEDIA_PACKET);
|
|
|
+ uint32_t len = hmsc->scsi_blk_len * hmsc->scsi_blk_size;
|
|
|
+
|
|
|
+ len = MIN(len, S2S_MSC_MEDIA_PACKET);
|
|
|
|
|
|
if(((USBD_StorageTypeDef *)pdev->pUserData)->Write(lun ,
|
|
|
hmsc->bot_data,
|
|
|
- hmsc->scsi_blk_addr / hmsc->scsi_blk_size,
|
|
|
+ hmsc->scsi_blk_addr,
|
|
|
len / hmsc->scsi_blk_size) < 0)
|
|
|
{
|
|
|
SCSI_SenseCode(pdev,
|
|
|
@@ -766,8 +768,8 @@ static int8_t SCSI_ProcessWrite (USBD_HandleTypeDef *pdev, uint8_t lun)
|
|
|
}
|
|
|
|
|
|
|
|
|
- hmsc->scsi_blk_addr += len;
|
|
|
- hmsc->scsi_blk_len -= len;
|
|
|
+ hmsc->scsi_blk_addr += (len / hmsc->scsi_blk_size);
|
|
|
+ hmsc->scsi_blk_len -= (len / hmsc->scsi_blk_size);
|
|
|
|
|
|
/* case 12 : Ho = Do */
|
|
|
hmsc->csw.dDataResidue -= len;
|
|
|
@@ -778,11 +780,9 @@ static int8_t SCSI_ProcessWrite (USBD_HandleTypeDef *pdev, uint8_t lun)
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
+ len = MIN((hmsc->scsi_blk_len * hmsc->scsi_blk_size), S2S_MSC_MEDIA_PACKET);
|
|
|
/* Prepare EP to Receive next packet */
|
|
|
- USBD_LL_PrepareReceive (pdev,
|
|
|
- MSC_EPOUT_ADDR,
|
|
|
- hmsc->bot_data,
|
|
|
- MIN (hmsc->scsi_blk_len, S2S_MSC_MEDIA_PACKET));
|
|
|
+ USBD_LL_PrepareReceive (pdev, MSC_EPOUT_ADDR, hmsc->bot_data, len);
|
|
|
}
|
|
|
|
|
|
return 0;
|