@@ -71,10 +71,25 @@ typedef struct
7171}mscd_interface_t ;
7272
7373CFG_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
7477CFG_TUD_MEM_SECTION CFG_TUSB_MEM_ALIGN tu_static msc_cbw_t _mscd_cbw ;
7578CFG_TUD_MEM_SECTION CFG_TUSB_MEM_ALIGN tu_static msc_csw_t _mscd_csw ;
7679CFG_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
92107static 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
107124static 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
851874static 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
889913static 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
916940static 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