This is the bug/patch tracker for Rockbox. Click here for more information.
Quick links: Bugs · Patches · Rockbox frontpage
FS#10015 - Use chained transfer descriptor to speed up USB transfers on PP and iMX31
Attached to Project:
Rockbox
Opened by Frank Gevaerts (fg) - Thursday, 12 March 2009, 20:09 GMT+2
Last edited by Frank Gevaerts (fg) - Sunday, 29 March 2009, 21:59 GMT+2
Opened by Frank Gevaerts (fg) - Thursday, 12 March 2009, 20:09 GMT+2
Last edited by Frank Gevaerts (fg) - Sunday, 29 March 2009, 21:59 GMT+2
|
DetailsUse chained transfer descriptors to allow larger blocks of data in a single transfer. This speeds up USB transfers significantly.
|
This task depends upon
Closed by Frank Gevaerts (fg)
Sunday, 29 March 2009, 21:59 GMT+2
Reason for closing: Accepted
Additional comments about closing: Committed as r20570
Sunday, 29 March 2009, 21:59 GMT+2
Reason for closing: Accepted
Additional comments about closing: Committed as r20570
USB wite (PC->H10) speed is 9.4MB/s (about 1.5MB/s faster then using OF) without the patch and about 11.2MB/s with the patch, and USB read speed is 8MB/s (OF attains 14-18MB/s) no matter the patch is applied or not.
3.1mb/s write, 6.1mb/s read without patch.
3.3mb/s write, 6.1mb/s read with patch.
FS#9708v0.6 (UDMA1 and UDMA4) on my 5.5G.Keeping the CPU at 80MHz I get:
PIO4: 8100 KB/s write, 4700 KB/s read
UDMA1: 7100 KB/s write, 9400 KB/s read
UDMA4: 7100 KB/s write, 11300 KB/s read
When setting the CPU to 100MHz I get:
UDMA1: 8100 KB/s write, 9400 KB/s read
UDMA4: 8100 KB/s write, 11300 KB/s read
Edit: Oops, corrected read/write.
Edit: I forgot the buffer size change to usb_storage in this one. It needs that too of course to get proper speed benefits
while(td!=QH_NEXT_TERMINATE)
{
length += ((td->reserved & DTD_RESERVED_LENGTH_MASK) -
((td->size_ioc_sts & DTD_PACKET_SIZE) >> DTD_LENGTH_BIT_POS));
td=td->next_td_ptr;
}
By the way, do 'transfer_descriptor' and 'queue_head' need to be byte packed? If the related struct members are accessed often, there might be a performance loss.
transfer_descriptor and queue_head are used directly by the hardware, so they need to be precisely packed and aligned. They only consist of 4-byte int fields though, so I don't think it should make any difference