@@ -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 (0 )
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,10 @@ 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 ;
398417
399418 switch (p_msc -> stage )
400419 {
@@ -473,12 +492,12 @@ bool mscd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t event, uint32_t
473492 }else
474493 {
475494 // 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 ));
495+ int32_t resplen = proc_builtin_scsi (p_cbw -> lun , p_cbw -> command , p_buf , sizeof (_mscd_buf ));
477496
478497 // Invoke user callback if not built-in
479498 if ( (resplen < 0 ) && (p_msc -> sense_key == 0 ) )
480499 {
481- resplen = tud_msc_scsi_cb (p_cbw -> lun , p_cbw -> command , _mscd_buf , (uint16_t ) p_msc -> total_len );
500+ resplen = tud_msc_scsi_cb (p_cbw -> lun , p_cbw -> command , p_buf , (uint16_t ) p_msc -> total_len );
482501 }
483502
484503 if ( resplen < 0 )
@@ -511,6 +530,8 @@ bool mscd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t event, uint32_t
511530 {
512531 // cannot return more than host expect
513532 p_msc -> total_len = tu_min32 ((uint32_t ) resplen , p_cbw -> total_bytes );
533+ // HINT:
534+ // DMA use a cache-able addr only, so use _mscd_buf here
514535 TU_ASSERT ( usbd_edpt_xfer (rhport , p_msc -> ep_in , _mscd_buf , (uint16_t ) p_msc -> total_len ) );
515536 }
516537 }
@@ -546,7 +567,7 @@ bool mscd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t event, uint32_t
546567 // OUT transfer, invoke callback if needed
547568 if ( !is_data_in (p_cbw -> dir ) )
548569 {
549- int32_t cb_result = tud_msc_scsi_cb (p_cbw -> lun , p_cbw -> command , _mscd_buf , (uint16_t ) p_msc -> total_len );
570+ int32_t cb_result = tud_msc_scsi_cb (p_cbw -> lun , p_cbw -> command , p_buf , (uint16_t ) p_msc -> total_len );
550571
551572 if ( cb_result < 0 )
552573 {
@@ -850,7 +871,8 @@ static int32_t proc_builtin_scsi(uint8_t lun, uint8_t const scsi_cmd[16], uint8_
850871
851872static void proc_read10_cmd (uint8_t rhport , mscd_interface_t * p_msc )
852873{
853- msc_cbw_t const * p_cbw = & _mscd_cbw ;
874+ msc_cbw_t const * p_cbw = _mscd_p_cbw ;
875+ uint8_t * p_buf = _mscd_p_buf ;
854876
855877 // block size already verified not zero
856878 uint16_t const block_sz = rdwr10_get_blocksize (p_cbw );
@@ -863,7 +885,7 @@ static void proc_read10_cmd(uint8_t rhport, mscd_interface_t* p_msc)
863885
864886 // Application can consume smaller bytes
865887 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 );
888+ nbytes = tud_msc_read10_cb (p_cbw -> lun , lba , offset , p_buf , (uint32_t ) nbytes );
867889
868890 if ( nbytes < 0 )
869891 {
@@ -888,7 +910,7 @@ static void proc_read10_cmd(uint8_t rhport, mscd_interface_t* p_msc)
888910
889911static void proc_write10_cmd (uint8_t rhport , mscd_interface_t * p_msc )
890912{
891- msc_cbw_t const * p_cbw = & _mscd_cbw ;
913+ msc_cbw_t const * p_cbw = _mscd_p_cbw ;
892914 bool writable = true;
893915
894916 if ( tud_msc_is_writable_cb )
@@ -915,7 +937,8 @@ static void proc_write10_cmd(uint8_t rhport, mscd_interface_t* p_msc)
915937// process new data arrived from WRITE10
916938static void proc_write10_new_data (uint8_t rhport , mscd_interface_t * p_msc , uint32_t xferred_bytes )
917939{
918- msc_cbw_t const * p_cbw = & _mscd_cbw ;
940+ msc_cbw_t const * p_cbw = _mscd_p_cbw ;
941+ uint8_t * p_buf = _mscd_p_buf ;
919942
920943 // block size already verified not zero
921944 uint16_t const block_sz = rdwr10_get_blocksize (p_cbw );
@@ -925,7 +948,7 @@ static void proc_write10_new_data(uint8_t rhport, mscd_interface_t* p_msc, uint3
925948
926949 // Invoke callback to consume new data
927950 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 );
951+ int32_t nbytes = tud_msc_write10_cb (p_cbw -> lun , lba , offset , p_buf , xferred_bytes );
929952
930953 if ( nbytes < 0 )
931954 {
@@ -948,7 +971,7 @@ static void proc_write10_new_data(uint8_t rhport, mscd_interface_t* p_msc, uint3
948971 if ( nbytes > 0 )
949972 {
950973 p_msc -> xferred_len += (uint16_t ) nbytes ;
951- memmove (_mscd_buf , _mscd_buf + nbytes , left_over );
974+ memmove (p_buf , p_buf + nbytes , left_over );
952975 }
953976
954977 // simulate an transfer complete with adjusted parameters --> callback will be invoked with adjusted parameter
0 commit comments