Rework to copy wrapped word bytes by byte in copy_to_cont_dst etc.

This commit is contained in:
Reinhard Panhuber 2021-03-25 13:53:26 +01:00
parent a60bd0c8ac
commit 1e4e87de51
1 changed files with 41 additions and 24 deletions

View File

@ -215,7 +215,9 @@ static void _ff_push_n(tu_fifo_t* f, void const * data, uint16_t n, uint16_t wRe
// Write full words of linear part to buffer // Write full words of linear part to buffer
uint16_t full_words = nLin >> 2; uint16_t full_words = nLin >> 2;
for(uint16_t i = 0; i < full_words; i++) { uint8_t rem = nLin - (full_words << 2);
while(full_words--)
{
tmp = *rx_fifo; tmp = *rx_fifo;
memcpy(dst_u8, &tmp, 4); memcpy(dst_u8, &tmp, 4);
// dst_u8[0] = tmp & 0x000000FF; // dst_u8[0] = tmp & 0x000000FF;
@ -226,22 +228,29 @@ static void _ff_push_n(tu_fifo_t* f, void const * data, uint16_t n, uint16_t wRe
} }
// Handle wrap around // Handle wrap around
uint8_t rem = nLin - (full_words << 2);
uint8_t remrem = 0;
if (rem > 0) if (rem > 0)
{ {
tmp = *rx_fifo; uint8_t remrem = tu_min16(nWrap, 4-rem);
memcpy(dst_u8, &tmp, rem);
remrem = tu_min16(nWrap, 4-rem);
memcpy(f->buffer, ((uint8_t *) &tmp) + rem, remrem);
nWrap -= remrem; nWrap -= remrem;
tmp = *rx_fifo;
uint8_t * src_u8 = ((uint8_t *) &tmp);
while(rem--)
{
*dst_u8++ = *src_u8++;
}
dst_u8 = f->buffer;
while(remrem--)
{
*dst_u8++ = *src_u8++;
}
}
else
{
dst_u8 = f->buffer;
} }
// Final part // Final part
if (nWrap > 0) if (nWrap > 0) _tu_fifo_read_from_const_src_ptr_in_full_words(dst_u8, data, nWrap);
{
_tu_fifo_read_from_const_src_ptr_in_full_words(f->buffer + remrem, data, nWrap);
}
} }
break; break;
} }
@ -295,31 +304,39 @@ static void _ff_pull_n(tu_fifo_t* f, void * p_buffer, uint16_t n, uint16_t rRel,
CFG_TUSB_MEM_ALIGN uint32_t tmp; CFG_TUSB_MEM_ALIGN uint32_t tmp;
// Pushing full available 32 bit words to FIFO // Pushing full available 32 bit words to FIFO
uint16_t const full_words = nLin >> 2; uint16_t full_words = nLin >> 2;
for(uint16_t i = 0; i < full_words; i++){ uint8_t rem = nLin - (full_words << 2);
while(full_words--)
{
memcpy(&tmp, src_u8, 4); memcpy(&tmp, src_u8, 4);
*tx_fifo = tmp; *tx_fifo = tmp;
src_u8 += 4; src_u8 += 4;
} }
// Handle wrap around // Handle wrap around - do it manually as these are only 4 bytes and its faster without memcpy
uint8_t rem = nLin - (full_words << 2);
uint8_t remrem = 0;
if (rem > 0) if (rem > 0)
{ {
tmp = 0; uint8_t remrem = tu_min16(nWrap, 4-rem);
memcpy(&tmp, src_u8, rem);
remrem = tu_min16(nWrap, 4-rem);
memcpy(((uint8_t *) &tmp) + rem, f->buffer, remrem);
nWrap -= remrem; nWrap -= remrem;
uint8_t * dst_u8 = (uint8_t *)&tmp;
while(rem--)
{
*dst_u8++ = *src_u8++;
}
src_u8 = f->buffer;
while(remrem--)
{
*dst_u8++ = *src_u8++;
}
*tx_fifo = tmp; *tx_fifo = tmp;
} }
else
// Final part
if (nWrap > 0)
{ {
_tu_fifo_write_to_const_dst_ptr_in_full_words(p_buffer, f->buffer + remrem, nWrap); src_u8 = f->buffer;
} }
// Final linear part
if (nWrap > 0) _tu_fifo_write_to_const_dst_ptr_in_full_words(p_buffer, src_u8, nWrap);
} }
break; break;
} }