diff --git a/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Inc/usbd_msc.h b/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Inc/usbd_msc.h index a0bbab906..22521397e 100644 --- a/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Inc/usbd_msc.h +++ b/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Inc/usbd_msc.h @@ -55,6 +55,7 @@ extern "C" { #define BOT_RESET 0xFF #define USB_MSC_CONFIG_DESC_SIZ 32 +#define MSC_BOT_MAX_LUN 0x10 #define MSC_EPIN_ADDR 0x81U #define MSC_EPOUT_ADDR 0x01U @@ -82,25 +83,31 @@ typedef struct _USBD_STORAGE typedef struct { - uint32_t max_lun; - uint32_t interface; - uint8_t bot_state; - uint8_t bot_status; - uint32_t bot_data_length; - uint8_t bot_data[MSC_MEDIA_PACKET]; - USBD_MSC_BOT_CBWTypeDef cbw; - USBD_MSC_BOT_CSWTypeDef csw; - - USBD_SCSI_SenseTypeDef scsi_sense [SENSE_LIST_DEEPTH]; - uint8_t scsi_sense_head; - uint8_t scsi_sense_tail; - uint8_t scsi_medium_state; - - uint16_t scsi_blk_size; - uint32_t scsi_blk_nbr; - - uint32_t scsi_blk_addr; - uint32_t scsi_blk_len; + uint16_t size; + uint32_t nbr; + uint32_t addr; + uint32_t len; +} +USBD_LUN_BLK_HandleTypeDef; + +typedef struct +{ + uint32_t max_lun; + uint32_t interface; + uint8_t bot_state; + uint8_t bot_status; + uint32_t bot_data_length; + uint8_t bot_data[MSC_MEDIA_PACKET]; + USBD_MSC_BOT_CBWTypeDef cbw; + USBD_MSC_BOT_CSWTypeDef csw; + + USBD_SCSI_SenseTypeDef scsi_sense [SENSE_LIST_DEEPTH]; + uint8_t scsi_sense_head; + uint8_t scsi_sense_tail; + uint8_t scsi_medium_state; + + USBD_LUN_BLK_HandleTypeDef scsi_blk[MSC_BOT_MAX_LUN]; + } USBD_MSC_BOT_HandleTypeDef; diff --git a/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Inc/usbd_msc_scsi.h b/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Inc/usbd_msc_scsi.h index 9bf10a9e6..e93bc393c 100644 --- a/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Inc/usbd_msc_scsi.h +++ b/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Inc/usbd_msc_scsi.h @@ -74,6 +74,11 @@ extern "C" { #define SCSI_SEND_DIAGNOSTIC 0x1DU #define SCSI_READ_FORMAT_CAPACITIES 0x23U +#define SCSI_REPORT_LUNS12 0xA0U +#define SCSI_LOG_SENSE10 0x4DU +#define SCSI_RECEIVE_DIAGNOSTIC8 0x1CU +#define SCSI_ATA_PASSTHROUGH12 0xA1U + #define NO_SENSE 0U #define RECOVERED_ERROR 1U #define NOT_READY 2U diff --git a/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc.c b/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc.c index 4b96dbdd5..d2ac551cb 100644 --- a/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc.c +++ b/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc.c @@ -390,6 +390,7 @@ uint8_t USBD_MSC_Setup(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) ((req->bmRequest & 0x80U) == 0x80U)) { hmsc->max_lun = (uint32_t)((USBD_StorageTypeDef *)pdev->pUserData)->GetMaxLun(); + hmsc->max_lun = (hmsc->max_lun > MSC_BOT_MAX_LUN) ? MSC_BOT_MAX_LUN : hmsc->max_lun; (void)USBD_CtlSendData(pdev, (uint8_t *)&hmsc->max_lun, 1U); } else diff --git a/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc_bot.c b/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc_bot.c index bbe94303e..421fe0705 100644 --- a/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc_bot.c +++ b/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc_bot.c @@ -255,7 +255,7 @@ static void MSC_BOT_CBW_Decode(USBD_HandleTypeDef *pdev) if ((USBD_LL_GetRxDataSize(pdev, MSC_EPOUT_ADDR) != USBD_BOT_CBW_LENGTH) || (hmsc->cbw.dSignature != USBD_BOT_CBW_SIGNATURE) || - (hmsc->cbw.bLUN > 1U) || (hmsc->cbw.bCBLength < 1U) || + (hmsc->cbw.bLUN > hmsc->max_lun) || (hmsc->cbw.bCBLength < 1U) || (hmsc->cbw.bCBLength > 16U)) { SCSI_SenseCode(pdev, hmsc->cbw.bLUN, ILLEGAL_REQUEST, INVALID_CDB); diff --git a/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc_scsi.c b/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc_scsi.c index 02fdc833a..c51d1bae3 100644 --- a/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc_scsi.c +++ b/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc_scsi.c @@ -100,6 +100,16 @@ static int8_t SCSI_ProcessWrite(USBD_HandleTypeDef *pdev, uint8_t lun); static int8_t SCSI_UpdateBotData(USBD_MSC_BOT_HandleTypeDef *hmsc, uint8_t *pBuff, uint16_t length); + +static int8_t SCSI_ReportLuns12(USBD_HandleTypeDef *pdev, uint8_t lun, + uint8_t *params); +static int8_t SCSI_Log_Sense10(USBD_HandleTypeDef *pdev, uint8_t lun, + uint8_t *params); +static int8_t SCSI_Recive_Diagnostic8(USBD_HandleTypeDef *pdev, uint8_t lun, + uint8_t *params); +static int8_t SCSI_Ata_PassThrough12(USBD_HandleTypeDef *pdev, uint8_t lun, + uint8_t *params); + /** * @} */ @@ -190,6 +200,22 @@ int8_t SCSI_ProcessCmd(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *cmd) ret = SCSI_Verify10(pdev, lun, cmd); break; + case SCSI_REPORT_LUNS12: + ret = SCSI_ReportLuns12(pdev, lun, cmd); + break; + + case SCSI_LOG_SENSE10: + ret = SCSI_Log_Sense10(pdev, lun, cmd); + break; + + case SCSI_RECEIVE_DIAGNOSTIC8: + ret = SCSI_Recive_Diagnostic8(pdev, lun, cmd); + break; + + case SCSI_ATA_PASSTHROUGH12: + ret = SCSI_Ata_PassThrough12(pdev, lun, cmd); + break; + default: SCSI_SenseCode(pdev, lun, ILLEGAL_REQUEST, INVALID_CDB); hmsc->bot_status = USBD_BOT_STATUS_ERROR; @@ -317,13 +343,14 @@ static int8_t SCSI_ReadCapacity10(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t UNUSED(params); int8_t ret; USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassData; + USBD_LUN_BLK_HandleTypeDef *hlun = &hmsc->scsi_blk[lun]; if (hmsc == NULL) { return -1; } - ret = ((USBD_StorageTypeDef *)pdev->pUserData)->GetCapacity(lun, &hmsc->scsi_blk_nbr, &hmsc->scsi_blk_size); + ret = ((USBD_StorageTypeDef *)pdev->pUserData)->GetCapacity(lun, &hlun->nbr, &hlun->size); if ((ret != 0) || (hmsc->scsi_medium_state == SCSI_MEDIUM_EJECTED)) { @@ -331,15 +358,15 @@ static int8_t SCSI_ReadCapacity10(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t return -1; } - hmsc->bot_data[0] = (uint8_t)((hmsc->scsi_blk_nbr - 1U) >> 24); - hmsc->bot_data[1] = (uint8_t)((hmsc->scsi_blk_nbr - 1U) >> 16); - hmsc->bot_data[2] = (uint8_t)((hmsc->scsi_blk_nbr - 1U) >> 8); - hmsc->bot_data[3] = (uint8_t)(hmsc->scsi_blk_nbr - 1U); + hmsc->bot_data[0] = (uint8_t)((hlun->nbr - 1U) >> 24); + hmsc->bot_data[1] = (uint8_t)((hlun->nbr - 1U) >> 16); + hmsc->bot_data[2] = (uint8_t)((hlun->nbr - 1U) >> 8); + hmsc->bot_data[3] = (uint8_t)(hlun->nbr - 1U); - hmsc->bot_data[4] = (uint8_t)(hmsc->scsi_blk_size >> 24); - hmsc->bot_data[5] = (uint8_t)(hmsc->scsi_blk_size >> 16); - hmsc->bot_data[6] = (uint8_t)(hmsc->scsi_blk_size >> 8); - hmsc->bot_data[7] = (uint8_t)(hmsc->scsi_blk_size); + hmsc->bot_data[4] = (uint8_t)(hlun->size >> 24); + hmsc->bot_data[5] = (uint8_t)(hlun->size >> 16); + hmsc->bot_data[6] = (uint8_t)(hlun->size >> 8); + hmsc->bot_data[7] = (uint8_t)(hlun->size); hmsc->bot_data_length = 8U; @@ -361,13 +388,14 @@ static int8_t SCSI_ReadCapacity16(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t uint8_t idx; int8_t ret; USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassData; + USBD_LUN_BLK_HandleTypeDef *hlun = &hmsc->scsi_blk[lun]; if (hmsc == NULL) { return -1; } - ret = ((USBD_StorageTypeDef *)pdev->pUserData)->GetCapacity(lun, &hmsc->scsi_blk_nbr, &hmsc->scsi_blk_size); + ret = ((USBD_StorageTypeDef *)pdev->pUserData)->GetCapacity(lun, &hlun->nbr, &hlun->size); if ((ret != 0) || (hmsc->scsi_medium_state == SCSI_MEDIUM_EJECTED)) { @@ -385,15 +413,15 @@ static int8_t SCSI_ReadCapacity16(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t hmsc->bot_data[idx] = 0U; } - hmsc->bot_data[4] = (uint8_t)((hmsc->scsi_blk_nbr - 1U) >> 24); - hmsc->bot_data[5] = (uint8_t)((hmsc->scsi_blk_nbr - 1U) >> 16); - hmsc->bot_data[6] = (uint8_t)((hmsc->scsi_blk_nbr - 1U) >> 8); - hmsc->bot_data[7] = (uint8_t)(hmsc->scsi_blk_nbr - 1U); + hmsc->bot_data[4] = (uint8_t)((hlun->nbr - 1U) >> 24); + hmsc->bot_data[5] = (uint8_t)((hlun->nbr - 1U) >> 16); + hmsc->bot_data[6] = (uint8_t)((hlun->nbr - 1U) >> 8); + hmsc->bot_data[7] = (uint8_t)(hlun->nbr - 1U); - hmsc->bot_data[8] = (uint8_t)(hmsc->scsi_blk_size >> 24); - hmsc->bot_data[9] = (uint8_t)(hmsc->scsi_blk_size >> 16); - hmsc->bot_data[10] = (uint8_t)(hmsc->scsi_blk_size >> 8); - hmsc->bot_data[11] = (uint8_t)(hmsc->scsi_blk_size); + hmsc->bot_data[8] = (uint8_t)(hlun->size >> 24); + hmsc->bot_data[9] = (uint8_t)(hlun->size >> 16); + hmsc->bot_data[10] = (uint8_t)(hlun->size >> 8); + hmsc->bot_data[11] = (uint8_t)(hlun->size); hmsc->bot_data_length = ((uint32_t)params[10] << 24) | ((uint32_t)params[11] << 16) | @@ -472,6 +500,12 @@ static int8_t SCSI_ModeSense6(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *pa { return -1; } + + /* Check If media is write-protected */ + if (((USBD_StorageTypeDef *)pdev->pUserData)->IsWriteProtected(lun) == 1) + { + MSC_Mode_Sense6_data[2] |= 0x80; + } if (params[4] <= len) { @@ -502,6 +536,12 @@ static int8_t SCSI_ModeSense10(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *p return -1; } + /* Check If media is write-protected */ + if (((USBD_StorageTypeDef *)pdev->pUserData)->IsWriteProtected(lun) == 1) + { + MSC_Mode_Sense6_data[2] |= 0x80; + } + if (params[8] <= len) { len = params[8]; @@ -688,6 +728,7 @@ static int8_t SCSI_AllowPreventRemovable(USBD_HandleTypeDef *pdev, uint8_t lun, static int8_t SCSI_Read10(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params) { USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassData; + USBD_LUN_BLK_HandleTypeDef *hlun = &hmsc->scsi_blk[lun]; if (hmsc == NULL) { @@ -716,21 +757,20 @@ static int8_t SCSI_Read10(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params return -1; } - hmsc->scsi_blk_addr = ((uint32_t)params[2] << 24) | - ((uint32_t)params[3] << 16) | - ((uint32_t)params[4] << 8) | - (uint32_t)params[5]; + hlun->addr = ((uint32_t)params[2] << 24) | + ((uint32_t)params[3] << 16) | + ((uint32_t)params[4] << 8) | + (uint32_t)params[5]; - hmsc->scsi_blk_len = ((uint32_t)params[7] << 8) | (uint32_t)params[8]; + hlun->len = ((uint32_t)params[7] << 8) | (uint32_t)params[8]; - if (SCSI_CheckAddressRange(pdev, lun, hmsc->scsi_blk_addr, - hmsc->scsi_blk_len) < 0) + if (SCSI_CheckAddressRange(pdev, lun, hlun->addr, hlun->len) < 0) { return -1; /* error */ } /* cases 4,5 : Hi <> Dn */ - if (hmsc->cbw.dDataLength != (hmsc->scsi_blk_len * hmsc->scsi_blk_size)) + if (hmsc->cbw.dDataLength != (hlun->len * hlun->size)) { SCSI_SenseCode(pdev, hmsc->cbw.bLUN, ILLEGAL_REQUEST, INVALID_CDB); return -1; @@ -754,6 +794,7 @@ static int8_t SCSI_Read10(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params static int8_t SCSI_Read12(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params) { USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassData; + USBD_LUN_BLK_HandleTypeDef *hlun = &hmsc->scsi_blk[lun]; if (hmsc == NULL) { @@ -781,24 +822,23 @@ static int8_t SCSI_Read12(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params return -1; } - hmsc->scsi_blk_addr = ((uint32_t)params[2] << 24) | - ((uint32_t)params[3] << 16) | - ((uint32_t)params[4] << 8) | - (uint32_t)params[5]; + hlun->addr = ((uint32_t)params[2] << 24) | + ((uint32_t)params[3] << 16) | + ((uint32_t)params[4] << 8) | + (uint32_t)params[5]; - hmsc->scsi_blk_len = ((uint32_t)params[6] << 24) | - ((uint32_t)params[7] << 16) | - ((uint32_t)params[8] << 8) | - (uint32_t)params[9]; + hlun->len = ((uint32_t)params[6] << 24) | + ((uint32_t)params[7] << 16) | + ((uint32_t)params[8] << 8) | + (uint32_t)params[9]; - if (SCSI_CheckAddressRange(pdev, lun, hmsc->scsi_blk_addr, - hmsc->scsi_blk_len) < 0) + if (SCSI_CheckAddressRange(pdev, lun, hlun->addr, hlun->len) < 0) { return -1; /* error */ } /* cases 4,5 : Hi <> Dn */ - if (hmsc->cbw.dDataLength != (hmsc->scsi_blk_len * hmsc->scsi_blk_size)) + if (hmsc->cbw.dDataLength != (hlun->len * hlun->size)) { SCSI_SenseCode(pdev, hmsc->cbw.bLUN, ILLEGAL_REQUEST, INVALID_CDB); return -1; @@ -822,6 +862,7 @@ static int8_t SCSI_Read12(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params static int8_t SCSI_Write10(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params) { USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassData; + USBD_LUN_BLK_HandleTypeDef *hlun = &hmsc->scsi_blk[lun]; uint32_t len; if (hmsc == NULL) @@ -858,22 +899,21 @@ static int8_t SCSI_Write10(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *param return -1; } - hmsc->scsi_blk_addr = ((uint32_t)params[2] << 24) | - ((uint32_t)params[3] << 16) | - ((uint32_t)params[4] << 8) | - (uint32_t)params[5]; + hlun->addr = ((uint32_t)params[2] << 24) | + ((uint32_t)params[3] << 16) | + ((uint32_t)params[4] << 8) | + (uint32_t)params[5]; - hmsc->scsi_blk_len = ((uint32_t)params[7] << 8) | - (uint32_t)params[8]; + hlun->len = ((uint32_t)params[7] << 8) | + (uint32_t)params[8]; /* check if LBA address is in the right range */ - if (SCSI_CheckAddressRange(pdev, lun, hmsc->scsi_blk_addr, - hmsc->scsi_blk_len) < 0) + if (SCSI_CheckAddressRange(pdev, lun, hlun->addr, hlun->len) < 0) { return -1; /* error */ } - len = hmsc->scsi_blk_len * hmsc->scsi_blk_size; + len = hlun->len * hlun->size; /* cases 3,11,13 : Hn,Ho <> D0 */ if (hmsc->cbw.dDataLength != len) @@ -907,6 +947,7 @@ static int8_t SCSI_Write10(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *param static int8_t SCSI_Write12(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params) { USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassData; + USBD_LUN_BLK_HandleTypeDef *hlun = &hmsc->scsi_blk[lun]; uint32_t len; if (hmsc == NULL) @@ -945,24 +986,23 @@ static int8_t SCSI_Write12(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *param return -1; } - hmsc->scsi_blk_addr = ((uint32_t)params[2] << 24) | - ((uint32_t)params[3] << 16) | - ((uint32_t)params[4] << 8) | - (uint32_t)params[5]; + hlun->addr = ((uint32_t)params[2] << 24) | + ((uint32_t)params[3] << 16) | + ((uint32_t)params[4] << 8) | + (uint32_t)params[5]; - hmsc->scsi_blk_len = ((uint32_t)params[6] << 24) | - ((uint32_t)params[7] << 16) | - ((uint32_t)params[8] << 8) | - (uint32_t)params[9]; + hlun->len = ((uint32_t)params[6] << 24) | + ((uint32_t)params[7] << 16) | + ((uint32_t)params[8] << 8) | + (uint32_t)params[9]; /* check if LBA address is in the right range */ - if (SCSI_CheckAddressRange(pdev, lun, hmsc->scsi_blk_addr, - hmsc->scsi_blk_len) < 0) + if (SCSI_CheckAddressRange(pdev, lun, hlun->addr, hlun->len) < 0) { return -1; /* error */ } - len = hmsc->scsi_blk_len * hmsc->scsi_blk_size; + len = hlun->len * hlun->size; /* cases 3,11,13 : Hn,Ho <> D0 */ if (hmsc->cbw.dDataLength != len) @@ -996,6 +1036,7 @@ static int8_t SCSI_Write12(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *param static int8_t SCSI_Verify10(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params) { USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassData; + USBD_LUN_BLK_HandleTypeDef *hlun = &hmsc->scsi_blk[lun]; if (hmsc == NULL) { @@ -1008,7 +1049,7 @@ static int8_t SCSI_Verify10(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *para return -1; /* Error, Verify Mode Not supported*/ } - if (SCSI_CheckAddressRange(pdev, lun, hmsc->scsi_blk_addr, hmsc->scsi_blk_len) < 0) + if (SCSI_CheckAddressRange(pdev, lun, hlun->addr, hlun->len) < 0) { return -1; /* error */ } @@ -1030,13 +1071,14 @@ static int8_t SCSI_CheckAddressRange(USBD_HandleTypeDef *pdev, uint8_t lun, uint32_t blk_offset, uint32_t blk_nbr) { USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassData; + USBD_LUN_BLK_HandleTypeDef *hlun = &hmsc->scsi_blk[lun]; if (hmsc == NULL) { return -1; } - if ((blk_offset + blk_nbr) > hmsc->scsi_blk_nbr) + if ((blk_offset + blk_nbr) > hlun->nbr) { SCSI_SenseCode(pdev, lun, ILLEGAL_REQUEST, ADDRESS_OUT_OF_RANGE); return -1; @@ -1054,7 +1096,8 @@ static int8_t SCSI_CheckAddressRange(USBD_HandleTypeDef *pdev, uint8_t lun, static int8_t SCSI_ProcessRead(USBD_HandleTypeDef *pdev, uint8_t lun) { USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassData; - uint32_t len = hmsc->scsi_blk_len * hmsc->scsi_blk_size; + USBD_LUN_BLK_HandleTypeDef *hlun = &hmsc->scsi_blk[lun]; + uint32_t len = hlun->len * hlun->size; if (hmsc == NULL) { @@ -1064,8 +1107,8 @@ static int8_t SCSI_ProcessRead(USBD_HandleTypeDef *pdev, uint8_t lun) len = MIN(len, MSC_MEDIA_PACKET); if (((USBD_StorageTypeDef *)pdev->pUserData)->Read(lun, hmsc->bot_data, - hmsc->scsi_blk_addr, - (len / hmsc->scsi_blk_size)) < 0) + hlun->addr, + (len / hlun->size)) < 0) { SCSI_SenseCode(pdev, lun, HARDWARE_ERROR, UNRECOVERED_READ_ERROR); return -1; @@ -1073,13 +1116,13 @@ static int8_t SCSI_ProcessRead(USBD_HandleTypeDef *pdev, uint8_t lun) (void)USBD_LL_Transmit(pdev, MSC_EPIN_ADDR, hmsc->bot_data, len); - hmsc->scsi_blk_addr += (len / hmsc->scsi_blk_size); - hmsc->scsi_blk_len -= (len / hmsc->scsi_blk_size); + hlun->addr += (len / hlun->size); + hlun->len -= (len / hlun->size); /* case 6 : Hi = Di */ hmsc->csw.dDataResidue -= len; - if (hmsc->scsi_blk_len == 0U) + if (hlun->len == 0U) { hmsc->bot_state = USBD_BOT_LAST_DATA_IN; } @@ -1096,7 +1139,8 @@ static int8_t SCSI_ProcessRead(USBD_HandleTypeDef *pdev, uint8_t lun) static int8_t SCSI_ProcessWrite(USBD_HandleTypeDef *pdev, uint8_t lun) { USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassData; - uint32_t len = hmsc->scsi_blk_len * hmsc->scsi_blk_size; + USBD_LUN_BLK_HandleTypeDef *hlun = &hmsc->scsi_blk[lun]; + uint32_t len = hlun->len * hlun->size; if (hmsc == NULL) { @@ -1106,26 +1150,26 @@ static int8_t SCSI_ProcessWrite(USBD_HandleTypeDef *pdev, uint8_t lun) len = MIN(len, MSC_MEDIA_PACKET); if (((USBD_StorageTypeDef *)pdev->pUserData)->Write(lun, hmsc->bot_data, - hmsc->scsi_blk_addr, - (len / hmsc->scsi_blk_size)) < 0) + hlun->addr, + (len / hlun->size)) < 0) { SCSI_SenseCode(pdev, lun, HARDWARE_ERROR, WRITE_FAULT); return -1; } - hmsc->scsi_blk_addr += (len / hmsc->scsi_blk_size); - hmsc->scsi_blk_len -= (len / hmsc->scsi_blk_size); + hlun->addr += (len / hlun->size); + hlun->len -= (len / hlun->size); /* case 12 : Ho = Do */ hmsc->csw.dDataResidue -= len; - if (hmsc->scsi_blk_len == 0U) + if (hlun->len == 0U) { MSC_BOT_SendCSW(pdev, USBD_CSW_CMD_PASSED); } else { - len = MIN((hmsc->scsi_blk_len * hmsc->scsi_blk_size), MSC_MEDIA_PACKET); + len = MIN((hlun->len * hlun->size), MSC_MEDIA_PACKET); /* Prepare EP to Receive next packet */ (void)USBD_LL_PrepareReceive(pdev, MSC_EPOUT_ADDR, hmsc->bot_data, len); @@ -1163,6 +1207,97 @@ static int8_t SCSI_UpdateBotData(USBD_MSC_BOT_HandleTypeDef *hmsc, return 0; } + + +/** + * @brief SCSI_Write12 + * Process Write12 command + * @param lun: Logical unit number + * @param params: Command parameters + * @retval status + */ +static int8_t SCSI_ReportLuns12(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params) +{ + USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassData; + + uint16_t lun_i; + + static uint64_t report_luns[MSC_BOT_MAX_LUN + 1]; + + if (hmsc == NULL) + { + return -1; + } + + + report_luns[0] = 0; + ((uint8_t *)report_luns)[3] = sizeof(uint64_t)*(hmsc->max_lun + 1); + + for (lun_i = 0; lun_i <= hmsc->max_lun; lun_i++){ + report_luns[lun_i + 1] = lun_i << 8; + } + + (void)SCSI_UpdateBotData(hmsc, (uint8_t *)report_luns, sizeof(uint64_t)*(hmsc->max_lun + 2) ); + + return 0; +} + + + +/** + * @brief SCSI_Write12 + * Process Write12 command + * @param lun: Logical unit number + * @param params: Command parameters + * @retval status + */ +static int8_t SCSI_Log_Sense10(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params) +{ + USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassData; + + static uint8_t log_sense[] = {0x00, 0x00, 0x00, 0x00}; + + if (hmsc == NULL) + { + return -1; + } + + (void)SCSI_UpdateBotData(hmsc, log_sense, sizeof(log_sense) ); + + return 0; +} + + + +/** + * @brief SCSI_Write12 + * Process Write12 command + * @param lun: Logical unit number + * @param params: Command parameters + * @retval status + */ +static int8_t SCSI_Recive_Diagnostic8(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params) +{ + + return SCSI_Log_Sense10(pdev, lun, params); +} + + + +/** + * @brief SCSI_Write12 + * Process Write12 command + * @param lun: Logical unit number + * @param params: Command parameters + * @retval status + */ +static int8_t SCSI_Ata_PassThrough12(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params) +{ + + return SCSI_Log_Sense10(pdev, lun, params); +} + + /** * @} */