Skip to content

Commit 1f85a0e

Browse files
committed
feature(mscd_class): Optimised cbw and cwb buffers alignment
1 parent e386ebe commit 1f85a0e

File tree

1 file changed

+13
-15
lines changed

1 file changed

+13
-15
lines changed

src/class/msc/msc_device.c

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,6 @@ enum
5555

5656
typedef struct
5757
{
58-
// TODO optimize alignment
59-
CFG_TUSB_MEM_ALIGN msc_cbw_t cbw;
60-
CFG_TUSB_MEM_ALIGN msc_csw_t csw;
61-
6258
uint8_t itf_num;
6359
uint8_t ep_in;
6460
uint8_t ep_out;
@@ -75,6 +71,8 @@ typedef struct
7571
}mscd_interface_t;
7672

7773
CFG_TUD_MEM_SECTION CFG_TUSB_MEM_ALIGN tu_static mscd_interface_t _mscd_itf;
74+
CFG_TUD_MEM_SECTION CFG_TUSB_MEM_ALIGN tu_static msc_cbw_t _mscd_cbw;
75+
CFG_TUD_MEM_SECTION CFG_TUSB_MEM_ALIGN tu_static msc_csw_t _mscd_csw;
7876
CFG_TUD_MEM_SECTION CFG_TUSB_MEM_ALIGN tu_static uint8_t _mscd_buf[CFG_TUD_MSC_EP_BUFSIZE];
7977

8078
//--------------------------------------------------------------------+
@@ -94,25 +92,25 @@ TU_ATTR_ALWAYS_INLINE static inline bool is_data_in(uint8_t dir)
9492
static inline bool send_csw(uint8_t rhport, mscd_interface_t* p_msc)
9593
{
9694
// Data residue is always = host expect - actual transferred
97-
p_msc->csw.data_residue = p_msc->cbw.total_bytes - p_msc->xferred_len;
95+
_mscd_csw.data_residue = _mscd_cbw.total_bytes - p_msc->xferred_len;
9896

9997
p_msc->stage = MSC_STAGE_STATUS_SENT;
100-
return usbd_edpt_xfer(rhport, p_msc->ep_in , (uint8_t*) &p_msc->csw, sizeof(msc_csw_t));
98+
return usbd_edpt_xfer(rhport, p_msc->ep_in , (uint8_t*) &_mscd_csw, sizeof(msc_csw_t));
10199
}
102100

103101
static inline bool prepare_cbw(uint8_t rhport, mscd_interface_t* p_msc)
104102
{
105103
p_msc->stage = MSC_STAGE_CMD;
106-
return usbd_edpt_xfer(rhport, p_msc->ep_out, (uint8_t*) &p_msc->cbw, sizeof(msc_cbw_t));
104+
return usbd_edpt_xfer(rhport, p_msc->ep_out, (uint8_t*) &_mscd_cbw, sizeof(msc_cbw_t));
107105
}
108106

109107
static void fail_scsi_op(uint8_t rhport, mscd_interface_t* p_msc, uint8_t status)
110108
{
111-
msc_cbw_t const * p_cbw = &p_msc->cbw;
112-
msc_csw_t * p_csw = &p_msc->csw;
109+
msc_cbw_t const * p_cbw = &_mscd_cbw;
110+
msc_csw_t * p_csw = &_mscd_csw;
113111

114112
p_csw->status = status;
115-
p_csw->data_residue = p_msc->cbw.total_bytes - p_msc->xferred_len;
113+
p_csw->data_residue = p_cbw->total_bytes - p_msc->xferred_len;
116114
p_msc->stage = MSC_STAGE_STATUS;
117115

118116
// failed but sense key is not set: default to Illegal Request
@@ -395,8 +393,8 @@ bool mscd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t event, uint32_t
395393
(void) event;
396394

397395
mscd_interface_t* p_msc = &_mscd_itf;
398-
msc_cbw_t const * p_cbw = &p_msc->cbw;
399-
msc_csw_t * p_csw = &p_msc->csw;
396+
msc_cbw_t const * p_cbw = &_mscd_cbw;
397+
msc_csw_t * p_csw = &_mscd_csw;
400398

401399
switch (p_msc->stage)
402400
{
@@ -852,7 +850,7 @@ static int32_t proc_builtin_scsi(uint8_t lun, uint8_t const scsi_cmd[16], uint8_
852850

853851
static void proc_read10_cmd(uint8_t rhport, mscd_interface_t* p_msc)
854852
{
855-
msc_cbw_t const * p_cbw = &p_msc->cbw;
853+
msc_cbw_t const * p_cbw = &_mscd_cbw;
856854

857855
// block size already verified not zero
858856
uint16_t const block_sz = rdwr10_get_blocksize(p_cbw);
@@ -890,7 +888,7 @@ static void proc_read10_cmd(uint8_t rhport, mscd_interface_t* p_msc)
890888

891889
static void proc_write10_cmd(uint8_t rhport, mscd_interface_t* p_msc)
892890
{
893-
msc_cbw_t const * p_cbw = &p_msc->cbw;
891+
msc_cbw_t const * p_cbw = &_mscd_cbw;
894892
bool writable = true;
895893

896894
if ( tud_msc_is_writable_cb )
@@ -917,7 +915,7 @@ static void proc_write10_cmd(uint8_t rhport, mscd_interface_t* p_msc)
917915
// process new data arrived from WRITE10
918916
static void proc_write10_new_data(uint8_t rhport, mscd_interface_t* p_msc, uint32_t xferred_bytes)
919917
{
920-
msc_cbw_t const * p_cbw = &p_msc->cbw;
918+
msc_cbw_t const * p_cbw = &_mscd_cbw;
921919

922920
// block size already verified not zero
923921
uint16_t const block_sz = rdwr10_get_blocksize(p_cbw);

0 commit comments

Comments
 (0)