Skip to content

Commit 37cb652

Browse files
committed
feature(mscd_class): Added cache bypassing
1 parent 406e8fb commit 37cb652

File tree

1 file changed

+39
-14
lines changed

1 file changed

+39
-14
lines changed

src/class/msc/msc_device.c

Lines changed: 39 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -71,10 +71,25 @@ typedef struct
7171
}mscd_interface_t;
7272

7373
CFG_TUD_MEM_SECTION CFG_TUSB_MEM_ALIGN tu_static mscd_interface_t _mscd_itf;
74+
75+
// HINT: bypass cache
76+
// All three buffers below should use direct access while read and write
7477
CFG_TUD_MEM_SECTION CFG_TUSB_MEM_ALIGN tu_static msc_cbw_t _mscd_cbw;
7578
CFG_TUD_MEM_SECTION CFG_TUSB_MEM_ALIGN tu_static msc_csw_t _mscd_csw;
7679
CFG_TUD_MEM_SECTION CFG_TUSB_MEM_ALIGN tu_static uint8_t _mscd_buf[CFG_TUD_MSC_EP_BUFSIZE];
7780

81+
// TODO: make dependency from SOC_NON_CACHEABLE_OFFSET and change 1 to it
82+
#if (1)
83+
#define _mscd_p_cbw ((msc_cbw_t*)(((uintptr_t)&_mscd_cbw) + 0x40000000))
84+
#define _mscd_p_csw ((msc_csw_t*)(((uintptr_t)&_mscd_csw) + 0x40000000))
85+
#define _mscd_p_buf ((uint8_t*) (((uintptr_t)_mscd_buf) + 0x40000000))
86+
#else
87+
#define _mscd_p_cbw (&_mscd_cbw)
88+
#define _mscd_p_csw (&_mscd_csw)
89+
#define _mscd_p_buf (_mscd_buf)
90+
#endif // SOC_NON_CACHEABLE_OFFSET
91+
92+
7893
//--------------------------------------------------------------------+
7994
// INTERNAL OBJECT & FUNCTION DECLARATION
8095
//--------------------------------------------------------------------+
@@ -91,8 +106,10 @@ TU_ATTR_ALWAYS_INLINE static inline bool is_data_in(uint8_t dir)
91106

92107
static inline bool send_csw(uint8_t rhport, mscd_interface_t* p_msc)
93108
{
109+
msc_cbw_t const * p_cbw = _mscd_p_cbw;
110+
msc_csw_t * p_csw = _mscd_p_csw;
94111
// Data residue is always = host expect - actual transferred
95-
_mscd_csw.data_residue = _mscd_cbw.total_bytes - p_msc->xferred_len;
112+
p_csw->data_residue = p_cbw->total_bytes - p_msc->xferred_len;
96113

97114
p_msc->stage = MSC_STAGE_STATUS_SENT;
98115
return usbd_edpt_xfer(rhport, p_msc->ep_in , (uint8_t*) &_mscd_csw, sizeof(msc_csw_t));
@@ -106,8 +123,8 @@ static inline bool prepare_cbw(uint8_t rhport, mscd_interface_t* p_msc)
106123

107124
static void fail_scsi_op(uint8_t rhport, mscd_interface_t* p_msc, uint8_t status)
108125
{
109-
msc_cbw_t const * p_cbw = &_mscd_cbw;
110-
msc_csw_t * p_csw = &_mscd_csw;
126+
msc_cbw_t const * p_cbw = _mscd_p_cbw;
127+
msc_csw_t * p_csw = _mscd_p_csw;
111128

112129
p_csw->status = status;
113130
p_csw->data_residue = p_cbw->total_bytes - p_msc->xferred_len;
@@ -393,8 +410,12 @@ bool mscd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t event, uint32_t
393410
(void) event;
394411

395412
mscd_interface_t* p_msc = &_mscd_itf;
396-
msc_cbw_t const * p_cbw = &_mscd_cbw;
397-
msc_csw_t * p_csw = &_mscd_csw;
413+
// HINT: get cache-able or noncache-able addresses
414+
msc_cbw_t const * p_cbw = _mscd_p_cbw;
415+
msc_csw_t * p_csw = _mscd_p_csw;
416+
uint8_t * p_buf = _mscd_p_buf;
417+
418+
TU_LOG1(" %s\r\n", __FUNCTION__);
398419

399420
switch (p_msc->stage)
400421
{
@@ -473,12 +494,12 @@ bool mscd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t event, uint32_t
473494
}else
474495
{
475496
// First process if it is a built-in commands
476-
int32_t resplen = proc_builtin_scsi(p_cbw->lun, p_cbw->command, _mscd_buf, sizeof(_mscd_buf));
497+
int32_t resplen = proc_builtin_scsi(p_cbw->lun, p_cbw->command, p_buf, sizeof(_mscd_buf));
477498

478499
// Invoke user callback if not built-in
479500
if ( (resplen < 0) && (p_msc->sense_key == 0) )
480501
{
481-
resplen = tud_msc_scsi_cb(p_cbw->lun, p_cbw->command, _mscd_buf, (uint16_t) p_msc->total_len);
502+
resplen = tud_msc_scsi_cb(p_cbw->lun, p_cbw->command, p_buf, (uint16_t) p_msc->total_len);
482503
}
483504

484505
if ( resplen < 0 )
@@ -511,6 +532,8 @@ bool mscd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t event, uint32_t
511532
{
512533
// cannot return more than host expect
513534
p_msc->total_len = tu_min32((uint32_t) resplen, p_cbw->total_bytes);
535+
// HINT:
536+
// DMA use a cache-able addr only, so use _mscd_buf here
514537
TU_ASSERT( usbd_edpt_xfer(rhport, p_msc->ep_in, _mscd_buf, (uint16_t) p_msc->total_len) );
515538
}
516539
}
@@ -546,7 +569,7 @@ bool mscd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t event, uint32_t
546569
// OUT transfer, invoke callback if needed
547570
if ( !is_data_in(p_cbw->dir) )
548571
{
549-
int32_t cb_result = tud_msc_scsi_cb(p_cbw->lun, p_cbw->command, _mscd_buf, (uint16_t) p_msc->total_len);
572+
int32_t cb_result = tud_msc_scsi_cb(p_cbw->lun, p_cbw->command, p_buf, (uint16_t) p_msc->total_len);
550573

551574
if ( cb_result < 0 )
552575
{
@@ -850,7 +873,8 @@ static int32_t proc_builtin_scsi(uint8_t lun, uint8_t const scsi_cmd[16], uint8_
850873

851874
static void proc_read10_cmd(uint8_t rhport, mscd_interface_t* p_msc)
852875
{
853-
msc_cbw_t const * p_cbw = &_mscd_cbw;
876+
msc_cbw_t const * p_cbw = _mscd_p_cbw;
877+
uint8_t * p_buf = _mscd_p_buf;
854878

855879
// block size already verified not zero
856880
uint16_t const block_sz = rdwr10_get_blocksize(p_cbw);
@@ -863,7 +887,7 @@ static void proc_read10_cmd(uint8_t rhport, mscd_interface_t* p_msc)
863887

864888
// Application can consume smaller bytes
865889
uint32_t const offset = p_msc->xferred_len % block_sz;
866-
nbytes = tud_msc_read10_cb(p_cbw->lun, lba, offset, _mscd_buf, (uint32_t) nbytes);
890+
nbytes = tud_msc_read10_cb(p_cbw->lun, lba, offset, p_buf, (uint32_t) nbytes);
867891

868892
if ( nbytes < 0 )
869893
{
@@ -888,7 +912,7 @@ static void proc_read10_cmd(uint8_t rhport, mscd_interface_t* p_msc)
888912

889913
static void proc_write10_cmd(uint8_t rhport, mscd_interface_t* p_msc)
890914
{
891-
msc_cbw_t const * p_cbw = &_mscd_cbw;
915+
msc_cbw_t const * p_cbw = _mscd_p_cbw;
892916
bool writable = true;
893917

894918
if ( tud_msc_is_writable_cb )
@@ -915,7 +939,8 @@ static void proc_write10_cmd(uint8_t rhport, mscd_interface_t* p_msc)
915939
// process new data arrived from WRITE10
916940
static void proc_write10_new_data(uint8_t rhport, mscd_interface_t* p_msc, uint32_t xferred_bytes)
917941
{
918-
msc_cbw_t const * p_cbw = &_mscd_cbw;
942+
msc_cbw_t const * p_cbw = _mscd_p_cbw;
943+
uint8_t * p_buf = _mscd_p_buf;
919944

920945
// block size already verified not zero
921946
uint16_t const block_sz = rdwr10_get_blocksize(p_cbw);
@@ -925,7 +950,7 @@ static void proc_write10_new_data(uint8_t rhport, mscd_interface_t* p_msc, uint3
925950

926951
// Invoke callback to consume new data
927952
uint32_t const offset = p_msc->xferred_len % block_sz;
928-
int32_t nbytes = tud_msc_write10_cb(p_cbw->lun, lba, offset, _mscd_buf, xferred_bytes);
953+
int32_t nbytes = tud_msc_write10_cb(p_cbw->lun, lba, offset, p_buf, xferred_bytes);
929954

930955
if ( nbytes < 0 )
931956
{
@@ -948,7 +973,7 @@ static void proc_write10_new_data(uint8_t rhport, mscd_interface_t* p_msc, uint3
948973
if ( nbytes > 0 )
949974
{
950975
p_msc->xferred_len += (uint16_t) nbytes;
951-
memmove(_mscd_buf, _mscd_buf+nbytes, left_over);
976+
memmove(p_buf, p_buf+nbytes, left_over);
952977
}
953978

954979
// simulate an transfer complete with adjusted parameters --> callback will be invoked with adjusted parameter

0 commit comments

Comments
 (0)