summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorHa Thach <[email protected]>2021-02-23 11:51:48 +0700
committerGitHub <[email protected]>2021-02-23 11:51:48 +0700
commitcea31c346d2a6f8f33ca1a49e5672a3fb58d72a5 (patch)
tree92c4d0ad181538e6333d70177d9e223634fbe903 /src
parentade4bf74ea7343bcebff4c1b2bbd1ebaac9009c0 (diff)
parentbdee6397ebf87ba83043fec15ca03e3542deb7a3 (diff)
Merge pull request #575 from nwlab/yaa/msc_read
Added MSC read10 and write10 function
Diffstat (limited to 'src')
-rw-r--r--src/class/msc/msc_host.c91
-rw-r--r--src/class/msc/msc_host.h22
2 files changed, 52 insertions, 61 deletions
diff --git a/src/class/msc/msc_host.c b/src/class/msc/msc_host.c
index 9a44d0632..ce3693dcb 100644
--- a/src/class/msc/msc_host.c
+++ b/src/class/msc/msc_host.c
@@ -192,60 +192,59 @@ bool tuh_msc_request_sense(uint8_t dev_addr, uint8_t lun, void *resposne, tuh_ms
return tuh_msc_scsi_command(dev_addr, &cbw, resposne, complete_cb);
}
-#if 0
-
-tusb_error_t tuh_msc_read10(uint8_t dev_addr, uint8_t lun, void * p_buffer, uint32_t lba, uint16_t block_count)
+bool tuh_msc_read10(uint8_t dev_addr, uint8_t lun, void * p_buffer, uint32_t lba, uint16_t block_count, tuh_msc_complete_cb_t complete_cb)
{
- msch_interface_t* p_msch = &msch_data[dev_addr-1];
-
- //------------- Command Block Wrapper -------------//
- msc_cbw_add_signature(&p_msch->cbw, lun);
-
- p_msch->cbw.total_bytes = p_msch->block_size*block_count; // Number of bytes
- p_msch->cbw.dir = TUSB_DIR_IN_MASK;
- p_msch->cbw.cmd_len = sizeof(scsi_read10_t);
+ msch_interface_t* p_msc = get_itf(dev_addr);
+ if ( !p_msc->mounted ){ return false;};
- //------------- SCSI command -------------//
- scsi_read10_t cmd_read10 =msch_sem_hdl
+ msc_cbw_t cbw = { 0 };
+
+ //------------- Command Block Wrapper -------------//
+ msc_cbw_add_signature(&cbw, lun);
+
+ cbw.total_bytes = 512*block_count; // Number of bytes
+ cbw.dir = TUSB_DIR_IN_MASK;
+ cbw.cmd_len = sizeof(scsi_read10_t);
+
+ //------------- SCSI command -------------//
+ scsi_read10_t cmd_read10 =
{
- .cmd_code = SCSI_CMD_READ_10,
- .lba = tu_htonl(lba),
- .block_count = tu_htons(block_count)
+ .cmd_code = SCSI_CMD_READ_10,
+ .lba = tu_htonl(lba),
+ .block_count = tu_htons(block_count)
};
-
- memcpy(p_msch->cbw.command, &cmd_read10, p_msch->cbw.cmd_len);
-
- TU_ASSERT_ERR ( send_cbw(dev_addr, p_msch, p_buffer));
-
- return TUSB_ERROR_NONE;
+
+ memcpy(cbw.command, &cmd_read10, cbw.cmd_len);
+
+ return tuh_msc_scsi_command(dev_addr, &cbw, p_buffer, complete_cb);
}
-
-tusb_error_t tuh_msc_write10(uint8_t dev_addr, uint8_t lun, void const * p_buffer, uint32_t lba, uint16_t block_count)
+
+bool tuh_msc_write10(uint8_t dev_addr, uint8_t lun, void * p_buffer, uint32_t lba, uint16_t block_count, tuh_msc_complete_cb_t complete_cb)
{
- msch_interface_t* p_msch = &msch_data[dev_addr-1];
-
- //------------- Command Block Wrapper -------------//
- msc_cbw_add_signature(&p_msch->cbw, lun);
-
- p_msch->cbw.total_bytes = p_msch->block_size*block_count; // Number of bytes
- p_msch->cbw.dir = TUSB_DIR_OUT;
- p_msch->cbw.cmd_len = sizeof(scsi_write10_t);
-
- //------------- SCSI command -------------//
- scsi_write10_t cmd_write10 =
- {
- .cmd_code = SCSI_CMD_WRITE_10,
- .lba = tu_htonl(lba),
- .block_count = tu_htons(block_count)
- };
-
- memcpy(p_msch->cbw.command, &cmd_write10, p_msch->cbw.cmd_len);
-
- TU_ASSERT_ERR ( send_cbw(dev_addr, p_msch, (void*) p_buffer));
+ msch_interface_t* p_msc = get_itf(dev_addr);
+ if ( !p_msc->mounted ){ return false;};
+
+ msc_cbw_t cbw = { 0 };
+
+ //------------- Command Block Wrapper -------------//
+ msc_cbw_add_signature(&cbw, lun);
+
+ cbw.total_bytes = 512*block_count; // Number of bytes
+ cbw.dir = TUSB_DIR_OUT;
+ cbw.cmd_len = sizeof(scsi_write10_t);
- return TUSB_ERROR_NONE;
+ //------------- SCSI command -------------//
+ scsi_write10_t cmd_write10 =
+ {
+ .cmd_code = SCSI_CMD_WRITE_10,
+ .lba = tu_htonl(lba),
+ .block_count = tu_htons(block_count)
+ };
+
+ memcpy(cbw.command, &cmd_write10, cbw.cmd_len);
+
+ return tuh_msc_scsi_command(dev_addr, &cbw, p_buffer, complete_cb);
}
-#endif
#if 0
// MSC interface Reset (not used now)
diff --git a/src/class/msc/msc_host.h b/src/class/msc/msc_host.h
index 3d1963701..d80e3e44d 100644
--- a/src/class/msc/msc_host.h
+++ b/src/class/msc/msc_host.h
@@ -74,20 +74,16 @@ bool tuh_msc_request_sense(uint8_t dev_addr, uint8_t lun, void *resposne, tuh_ms
// Perform SCSI Read Capacity (10) command
bool tuh_msc_read_capacity(uint8_t dev_addr, uint8_t lun, scsi_read_capacity10_resp_t* response, tuh_msc_complete_cb_t complete_cb);
-#if 0
/** \brief Perform SCSI READ 10 command to read data from MassStorage device
* \param[in] dev_addr device address
* \param[in] lun Targeted Logical Unit
- * \param[out] p_buffer Buffer used to store data read from device. Must be accessible by USB controller (see \ref CFG_TUSB_MEM_SECTION)
+ * \param[out] p_buffer Buffer used to store data read from device. Must be accessible by USB controller (see \ref CFG_TUSB_MEM_SECTION)
* \param[in] lba Starting Logical Block Address to be read
* \param[in] block_count Number of Block to be read
- * \retval TUSB_ERROR_NONE on success
- * \retval TUSB_ERROR_INTERFACE_IS_BUSY if the interface is already transferring data with device
- * \retval TUSB_ERROR_DEVICE_NOT_READY if device is not yet configured (by SET CONFIGURED request)
- * \retval TUSB_ERROR_INVALID_PARA if input parameters are not correct
- * \note This function is non-blocking and returns immediately. The result of USB transfer will be reported by the interface's callback function
+ * \retval true on success
+ * \note This function is non-blocking and returns immediately. The result of USB transfer will be reported by \ref complete_cb callback function
*/
-tusb_error_t tuh_msc_read10 (uint8_t dev_addr, uint8_t lun, void * p_buffer, uint32_t lba, uint16_t block_count);
+bool tuh_msc_read10(uint8_t dev_addr, uint8_t lun, void * p_buffer, uint32_t lba, uint16_t block_count, tuh_msc_complete_cb_t complete_cb);
/** \brief Perform SCSI WRITE 10 command to write data to MassStorage device
* \param[in] dev_addr device address
@@ -95,14 +91,10 @@ tusb_error_t tuh_msc_read10 (uint8_t dev_addr, uint8_t lun, void * p_buffer, uin
* \param[in] p_buffer Buffer containing data. Must be accessible by USB controller (see \ref CFG_TUSB_MEM_SECTION)
* \param[in] lba Starting Logical Block Address to be written
* \param[in] block_count Number of Block to be written
- * \retval TUSB_ERROR_NONE on success
- * \retval TUSB_ERROR_INTERFACE_IS_BUSY if the interface is already transferring data with device
- * \retval TUSB_ERROR_DEVICE_NOT_READY if device is not yet configured (by SET CONFIGURED request)
- * \retval TUSB_ERROR_INVALID_PARA if input parameters are not correct
- * \note This function is non-blocking and returns immediately. The result of USB transfer will be reported by the interface's callback function
+ * \retval true on success
+ * \note This function is non-blocking and returns immediately. The result of USB transfer will be reported by \ref complete_cb callback function
*/
-tusb_error_t tuh_msc_write10(uint8_t dev_addr, uint8_t lun, void const * p_buffer, uint32_t lba, uint16_t block_count);
-#endif
+bool tuh_msc_write10(uint8_t dev_addr, uint8_t lun, void * p_buffer, uint32_t lba, uint16_t block_count, tuh_msc_complete_cb_t complete_cb);
//------------- Application Callback -------------//