|
@@ -7,9 +7,10 @@
|
|
|
#include "usbd_core.h"
|
|
#include "usbd_core.h"
|
|
|
#include "usbd_msc.h"
|
|
#include "usbd_msc.h"
|
|
|
#include "usb_scsi.h"
|
|
#include "usb_scsi.h"
|
|
|
-#if defined(CONFIG_USBDEV_MSC_THREAD)
|
|
|
|
|
-#include "usb_osal.h"
|
|
|
|
|
-#endif
|
|
|
|
|
|
|
+
|
|
|
|
|
+#undef USB_DBG_TAG
|
|
|
|
|
+#define USB_DBG_TAG "usbd_msc"
|
|
|
|
|
+#include "usb_log.h"
|
|
|
|
|
|
|
|
#define MSD_OUT_EP_IDX 0
|
|
#define MSD_OUT_EP_IDX 0
|
|
|
#define MSD_IN_EP_IDX 1
|
|
#define MSD_IN_EP_IDX 1
|
|
@@ -516,19 +517,14 @@ static bool SCSI_read10(uint8_t busid, uint8_t **data, uint32_t *len)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
g_usbd_msc[busid].start_sector = GET_BE32(&g_usbd_msc[busid].cbw.CB[2]); /* Logical Block Address of First Block */
|
|
g_usbd_msc[busid].start_sector = GET_BE32(&g_usbd_msc[busid].cbw.CB[2]); /* Logical Block Address of First Block */
|
|
|
- USB_LOG_DBG("lba: 0x%04x\r\n", g_usbd_msc[busid].start_sector);
|
|
|
|
|
-
|
|
|
|
|
g_usbd_msc[busid].nsectors = GET_BE16(&g_usbd_msc[busid].cbw.CB[7]); /* Number of Blocks to transfer */
|
|
g_usbd_msc[busid].nsectors = GET_BE16(&g_usbd_msc[busid].cbw.CB[7]); /* Number of Blocks to transfer */
|
|
|
- USB_LOG_DBG("nsectors: 0x%02x\r\n", g_usbd_msc[busid].nsectors);
|
|
|
|
|
|
|
|
|
|
if ((g_usbd_msc[busid].start_sector + g_usbd_msc[busid].nsectors) > g_usbd_msc[busid].scsi_blk_nbr[g_usbd_msc[busid].cbw.bLUN]) {
|
|
if ((g_usbd_msc[busid].start_sector + g_usbd_msc[busid].nsectors) > g_usbd_msc[busid].scsi_blk_nbr[g_usbd_msc[busid].cbw.bLUN]) {
|
|
|
SCSI_SetSenseData(busid, SCSI_KCQIR_LBAOUTOFRANGE);
|
|
SCSI_SetSenseData(busid, SCSI_KCQIR_LBAOUTOFRANGE);
|
|
|
- USB_LOG_ERR("LBA out of range\r\n");
|
|
|
|
|
return false;
|
|
return false;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if (g_usbd_msc[busid].cbw.dDataLength != (g_usbd_msc[busid].nsectors * g_usbd_msc[busid].scsi_blk_size[g_usbd_msc[busid].cbw.bLUN])) {
|
|
if (g_usbd_msc[busid].cbw.dDataLength != (g_usbd_msc[busid].nsectors * g_usbd_msc[busid].scsi_blk_size[g_usbd_msc[busid].cbw.bLUN])) {
|
|
|
- USB_LOG_ERR("scsi_blk_len does not match with dDataLength\r\n");
|
|
|
|
|
return false;
|
|
return false;
|
|
|
}
|
|
}
|
|
|
g_usbd_msc[busid].stage = MSC_DATA_IN;
|
|
g_usbd_msc[busid].stage = MSC_DATA_IN;
|
|
@@ -554,19 +550,14 @@ static bool SCSI_read12(uint8_t busid, uint8_t **data, uint32_t *len)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
g_usbd_msc[busid].start_sector = GET_BE32(&g_usbd_msc[busid].cbw.CB[2]); /* Logical Block Address of First Block */
|
|
g_usbd_msc[busid].start_sector = GET_BE32(&g_usbd_msc[busid].cbw.CB[2]); /* Logical Block Address of First Block */
|
|
|
- USB_LOG_DBG("lba: 0x%04x\r\n", g_usbd_msc[busid].start_sector);
|
|
|
|
|
-
|
|
|
|
|
g_usbd_msc[busid].nsectors = GET_BE32(&g_usbd_msc[busid].cbw.CB[6]); /* Number of Blocks to transfer */
|
|
g_usbd_msc[busid].nsectors = GET_BE32(&g_usbd_msc[busid].cbw.CB[6]); /* Number of Blocks to transfer */
|
|
|
- USB_LOG_DBG("nsectors: 0x%02x\r\n", g_usbd_msc[busid].nsectors);
|
|
|
|
|
|
|
|
|
|
if ((g_usbd_msc[busid].start_sector + g_usbd_msc[busid].nsectors) > g_usbd_msc[busid].scsi_blk_nbr[g_usbd_msc[busid].cbw.bLUN]) {
|
|
if ((g_usbd_msc[busid].start_sector + g_usbd_msc[busid].nsectors) > g_usbd_msc[busid].scsi_blk_nbr[g_usbd_msc[busid].cbw.bLUN]) {
|
|
|
SCSI_SetSenseData(busid, SCSI_KCQIR_LBAOUTOFRANGE);
|
|
SCSI_SetSenseData(busid, SCSI_KCQIR_LBAOUTOFRANGE);
|
|
|
- USB_LOG_ERR("LBA out of range\r\n");
|
|
|
|
|
return false;
|
|
return false;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if (g_usbd_msc[busid].cbw.dDataLength != (g_usbd_msc[busid].nsectors * g_usbd_msc[busid].scsi_blk_size[g_usbd_msc[busid].cbw.bLUN])) {
|
|
if (g_usbd_msc[busid].cbw.dDataLength != (g_usbd_msc[busid].nsectors * g_usbd_msc[busid].scsi_blk_size[g_usbd_msc[busid].cbw.bLUN])) {
|
|
|
- USB_LOG_ERR("scsi_blk_len does not match with dDataLength\r\n");
|
|
|
|
|
return false;
|
|
return false;
|
|
|
}
|
|
}
|
|
|
g_usbd_msc[busid].stage = MSC_DATA_IN;
|
|
g_usbd_msc[busid].stage = MSC_DATA_IN;
|
|
@@ -594,14 +585,10 @@ static bool SCSI_write10(uint8_t busid, uint8_t **data, uint32_t *len)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
g_usbd_msc[busid].start_sector = GET_BE32(&g_usbd_msc[busid].cbw.CB[2]); /* Logical Block Address of First Block */
|
|
g_usbd_msc[busid].start_sector = GET_BE32(&g_usbd_msc[busid].cbw.CB[2]); /* Logical Block Address of First Block */
|
|
|
- USB_LOG_DBG("lba: 0x%04x\r\n", g_usbd_msc[busid].start_sector);
|
|
|
|
|
-
|
|
|
|
|
g_usbd_msc[busid].nsectors = GET_BE16(&g_usbd_msc[busid].cbw.CB[7]); /* Number of Blocks to transfer */
|
|
g_usbd_msc[busid].nsectors = GET_BE16(&g_usbd_msc[busid].cbw.CB[7]); /* Number of Blocks to transfer */
|
|
|
- USB_LOG_DBG("nsectors: 0x%02x\r\n", g_usbd_msc[busid].nsectors);
|
|
|
|
|
|
|
|
|
|
data_len = g_usbd_msc[busid].nsectors * g_usbd_msc[busid].scsi_blk_size[g_usbd_msc[busid].cbw.bLUN];
|
|
data_len = g_usbd_msc[busid].nsectors * g_usbd_msc[busid].scsi_blk_size[g_usbd_msc[busid].cbw.bLUN];
|
|
|
if ((g_usbd_msc[busid].start_sector + g_usbd_msc[busid].nsectors) > g_usbd_msc[busid].scsi_blk_nbr[g_usbd_msc[busid].cbw.bLUN]) {
|
|
if ((g_usbd_msc[busid].start_sector + g_usbd_msc[busid].nsectors) > g_usbd_msc[busid].scsi_blk_nbr[g_usbd_msc[busid].cbw.bLUN]) {
|
|
|
- USB_LOG_ERR("LBA out of range\r\n");
|
|
|
|
|
return false;
|
|
return false;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -627,14 +614,10 @@ static bool SCSI_write12(uint8_t busid, uint8_t **data, uint32_t *len)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
g_usbd_msc[busid].start_sector = GET_BE32(&g_usbd_msc[busid].cbw.CB[2]); /* Logical Block Address of First Block */
|
|
g_usbd_msc[busid].start_sector = GET_BE32(&g_usbd_msc[busid].cbw.CB[2]); /* Logical Block Address of First Block */
|
|
|
- USB_LOG_DBG("lba: 0x%04x\r\n", g_usbd_msc[busid].start_sector);
|
|
|
|
|
-
|
|
|
|
|
g_usbd_msc[busid].nsectors = GET_BE32(&g_usbd_msc[busid].cbw.CB[6]); /* Number of Blocks to transfer */
|
|
g_usbd_msc[busid].nsectors = GET_BE32(&g_usbd_msc[busid].cbw.CB[6]); /* Number of Blocks to transfer */
|
|
|
- USB_LOG_DBG("nsectors: 0x%02x\r\n", g_usbd_msc[busid].nsectors);
|
|
|
|
|
|
|
|
|
|
data_len = g_usbd_msc[busid].nsectors * g_usbd_msc[busid].scsi_blk_size[g_usbd_msc[busid].cbw.bLUN];
|
|
data_len = g_usbd_msc[busid].nsectors * g_usbd_msc[busid].scsi_blk_size[g_usbd_msc[busid].cbw.bLUN];
|
|
|
if ((g_usbd_msc[busid].start_sector + g_usbd_msc[busid].nsectors) > g_usbd_msc[busid].scsi_blk_nbr[g_usbd_msc[busid].cbw.bLUN]) {
|
|
if ((g_usbd_msc[busid].start_sector + g_usbd_msc[busid].nsectors) > g_usbd_msc[busid].scsi_blk_nbr[g_usbd_msc[busid].cbw.bLUN]) {
|
|
|
- USB_LOG_ERR("LBA out of range\r\n");
|
|
|
|
|
return false;
|
|
return false;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -646,52 +629,6 @@ static bool SCSI_write12(uint8_t busid, uint8_t **data, uint32_t *len)
|
|
|
usbd_ep_start_read(busid, mass_ep_data[busid][MSD_OUT_EP_IDX].ep_addr, g_usbd_msc[busid].block_buffer, data_len);
|
|
usbd_ep_start_read(busid, mass_ep_data[busid][MSD_OUT_EP_IDX].ep_addr, g_usbd_msc[busid].block_buffer, data_len);
|
|
|
return true;
|
|
return true;
|
|
|
}
|
|
}
|
|
|
-/* do not use verify to reduce code size */
|
|
|
|
|
-#if 0
|
|
|
|
|
-static bool SCSI_verify10(uint8_t busid, uint8_t **data, uint32_t *len)
|
|
|
|
|
-{
|
|
|
|
|
- /* Logical Block Address of First Block */
|
|
|
|
|
- uint32_t lba = 0;
|
|
|
|
|
- uint32_t blk_num = 0;
|
|
|
|
|
-
|
|
|
|
|
- if ((g_usbd_msc[busid].cbw.CB[1] & 0x02U) == 0x00U) {
|
|
|
|
|
- return true;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- if (((g_usbd_msc[busid].cbw.bmFlags & 0x80U) != 0x00U) || (g_usbd_msc[busid].cbw.dDataLength == 0U)) {
|
|
|
|
|
- SCSI_SetSenseData(busid, SCSI_KCQIR_INVALIDCOMMAND);
|
|
|
|
|
- return false;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- if ((g_usbd_msc[busid].cbw.CB[1] & 0x02U) == 0x02U) {
|
|
|
|
|
- SCSI_SetSenseData(busid, SCSI_KCQIR_INVALIDFIELDINCBA);
|
|
|
|
|
- return false; /* Error, Verify Mode Not supported*/
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- lba = GET_BE32(&g_usbd_msc[busid].cbw.CB[2]);
|
|
|
|
|
- USB_LOG_DBG("lba: 0x%x\r\n", lba);
|
|
|
|
|
-
|
|
|
|
|
- g_usbd_msc[busid].scsi_blk_addr = lba * g_usbd_msc[busid].scsi_blk_size[g_usbd_msc[busid].cbw.bLUN];
|
|
|
|
|
-
|
|
|
|
|
- /* Number of Blocks to transfer */
|
|
|
|
|
- blk_num = GET_BE16(&g_usbd_msc[busid].cbw.CB[7]);
|
|
|
|
|
-
|
|
|
|
|
- USB_LOG_DBG("num (block) : 0x%x\r\n", blk_num);
|
|
|
|
|
- g_usbd_msc[busid].scsi_blk_len = blk_num * g_usbd_msc[busid].scsi_blk_size[g_usbd_msc[busid].cbw.bLUN];
|
|
|
|
|
-
|
|
|
|
|
- if ((lba + blk_num) > g_usbd_msc[busid].scsi_blk_nbr[g_usbd_msc[busid].cbw.bLUN]) {
|
|
|
|
|
- USB_LOG_ERR("LBA out of range\r\n");
|
|
|
|
|
- return false;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- if (g_usbd_msc[busid].cbw.dDataLength != g_usbd_msc[busid].scsi_blk_len) {
|
|
|
|
|
- return false;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- g_usbd_msc[busid].stage = MSC_DATA_OUT;
|
|
|
|
|
- return true;
|
|
|
|
|
-}
|
|
|
|
|
-#endif
|
|
|
|
|
|
|
|
|
|
static bool SCSI_processRead(uint8_t busid)
|
|
static bool SCSI_processRead(uint8_t busid)
|
|
|
{
|
|
{
|
|
@@ -722,6 +659,7 @@ static bool SCSI_processRead(uint8_t busid)
|
|
|
static bool SCSI_processWrite(uint8_t busid, uint32_t nbytes)
|
|
static bool SCSI_processWrite(uint8_t busid, uint32_t nbytes)
|
|
|
{
|
|
{
|
|
|
uint32_t data_len = 0;
|
|
uint32_t data_len = 0;
|
|
|
|
|
+
|
|
|
USB_LOG_DBG("write lba:%d\r\n", g_usbd_msc[busid].start_sector);
|
|
USB_LOG_DBG("write lba:%d\r\n", g_usbd_msc[busid].start_sector);
|
|
|
|
|
|
|
|
if (usbd_msc_sector_write(busid, g_usbd_msc[busid].cbw.bLUN, g_usbd_msc[busid].start_sector, g_usbd_msc[busid].block_buffer, nbytes) != 0) {
|
|
if (usbd_msc_sector_write(busid, g_usbd_msc[busid].cbw.bLUN, g_usbd_msc[busid].start_sector, g_usbd_msc[busid].block_buffer, nbytes) != 0) {
|
|
@@ -804,7 +742,6 @@ static bool SCSI_CBWDecode(uint8_t busid, uint32_t nbytes)
|
|
|
ret = SCSI_write12(busid, NULL, 0);
|
|
ret = SCSI_write12(busid, NULL, 0);
|
|
|
break;
|
|
break;
|
|
|
case SCSI_CMD_VERIFY10:
|
|
case SCSI_CMD_VERIFY10:
|
|
|
- //ret = SCSI_verify10(NULL, 0);
|
|
|
|
|
ret = false;
|
|
ret = false;
|
|
|
break;
|
|
break;
|
|
|
case SCSI_CMD_SYNCHCACHE10:
|
|
case SCSI_CMD_SYNCHCACHE10:
|
|
@@ -812,7 +749,6 @@ static bool SCSI_CBWDecode(uint8_t busid, uint32_t nbytes)
|
|
|
break;
|
|
break;
|
|
|
default:
|
|
default:
|
|
|
SCSI_SetSenseData(busid, SCSI_KCQIR_INVALIDCOMMAND);
|
|
SCSI_SetSenseData(busid, SCSI_KCQIR_INVALIDCOMMAND);
|
|
|
- USB_LOG_WRN("unsupported cmd:0x%02x\r\n", g_usbd_msc[busid].cbw.CB[0]);
|
|
|
|
|
ret = false;
|
|
ret = false;
|
|
|
break;
|
|
break;
|
|
|
}
|
|
}
|
|
@@ -820,7 +756,7 @@ static bool SCSI_CBWDecode(uint8_t busid, uint32_t nbytes)
|
|
|
if (ret) {
|
|
if (ret) {
|
|
|
if (g_usbd_msc[busid].stage == MSC_READ_CBW) {
|
|
if (g_usbd_msc[busid].stage == MSC_READ_CBW) {
|
|
|
if (len2send) {
|
|
if (len2send) {
|
|
|
- USB_LOG_DBG("Send info len:%d\r\n", len2send);
|
|
|
|
|
|
|
+ USB_LOG_DBG("Send info len: %d\r\n", len2send);
|
|
|
usbd_msc_send_info(busid, buf2send, len2send);
|
|
usbd_msc_send_info(busid, buf2send, len2send);
|
|
|
} else {
|
|
} else {
|
|
|
usbd_msc_send_csw(busid, CSW_STATUS_CMD_PASSED);
|
|
usbd_msc_send_csw(busid, CSW_STATUS_CMD_PASSED);
|
|
@@ -837,7 +773,7 @@ void mass_storage_bulk_out(uint8_t busid, uint8_t ep, uint32_t nbytes)
|
|
|
switch (g_usbd_msc[busid].stage) {
|
|
switch (g_usbd_msc[busid].stage) {
|
|
|
case MSC_READ_CBW:
|
|
case MSC_READ_CBW:
|
|
|
if (SCSI_CBWDecode(busid, nbytes) == false) {
|
|
if (SCSI_CBWDecode(busid, nbytes) == false) {
|
|
|
- USB_LOG_ERR("Command:0x%02x decode err\r\n", g_usbd_msc[busid].cbw.CB[0]);
|
|
|
|
|
|
|
+ USB_LOG_ERR("Command: 0x%02x decode err\r\n", g_usbd_msc[busid].cbw.CB[0]);
|
|
|
usbd_msc_bot_abort(busid);
|
|
usbd_msc_bot_abort(busid);
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
@@ -921,7 +857,6 @@ static void usbdev_msc_thread(CONFIG_USB_OSAL_THREAD_SET_ARGV)
|
|
|
if (ret < 0) {
|
|
if (ret < 0) {
|
|
|
continue;
|
|
continue;
|
|
|
}
|
|
}
|
|
|
- USB_LOG_DBG("event:%d\r\n", event);
|
|
|
|
|
if (event == MSC_DATA_OUT) {
|
|
if (event == MSC_DATA_OUT) {
|
|
|
if (SCSI_processWrite(busid, g_usbd_msc[busid].nbytes) == false) {
|
|
if (SCSI_processWrite(busid, g_usbd_msc[busid].nbytes) == false) {
|
|
|
usbd_msc_send_csw(busid, CSW_STATUS_CMD_FAILED); /* send fail status to host,and the host will retry*/
|
|
usbd_msc_send_csw(busid, CSW_STATUS_CMD_FAILED); /* send fail status to host,and the host will retry*/
|
|
@@ -943,7 +878,6 @@ void usbd_msc_polling(uint8_t busid)
|
|
|
|
|
|
|
|
if (event != 0) {
|
|
if (event != 0) {
|
|
|
g_usbd_msc[busid].event = 0;
|
|
g_usbd_msc[busid].event = 0;
|
|
|
- USB_LOG_DBG("event:%d\r\n", event);
|
|
|
|
|
if (event == MSC_DATA_OUT) {
|
|
if (event == MSC_DATA_OUT) {
|
|
|
if (SCSI_processWrite(busid, g_usbd_msc[busid].nbytes) == false) {
|
|
if (SCSI_processWrite(busid, g_usbd_msc[busid].nbytes) == false) {
|
|
|
usbd_msc_send_csw(busid, CSW_STATUS_CMD_FAILED); /* send fail status to host,and the host will retry*/
|
|
usbd_msc_send_csw(busid, CSW_STATUS_CMD_FAILED); /* send fail status to host,and the host will retry*/
|