JohnSwenson wrote: 
> 
> BUT for some reason (presumably cost) the makers of these highly
> integrated processors (which include the USB hardware in the processor
> chip) have left out the hardware TT, thus the driver has to take on the
> responsibility of the TT functionality. The default driver that comes
> with linux for these devices seems to be able to handle the TT functions
> well as long as packets are going unidirectionaly. But Async USB
> interleaves packets going back to the host in the middle of the rapid
> stream of packets going to the DAC, the software TT can't seem to handle
> this. Triode figured out how to hack the driver so it could at least
> handle this situation, but the  processor is not fast enough to handle
> this interleaving at sample rates faster than 48KHz. 
> 

To add to this.  On a "normal" PC USB is implemented in a separate
interface chipset from the processor and there are potentially two
processing blocks one for low/full speed and one for high speed usb
which are selected based on the device plugged in.  Low speed usb
segments data into frames which are scheduled onto the wire inside 1ms
frames.  High speed retains these 1ms frames but adds multiple
microframes within each 1ms frame.  Transaction translators (TT) are
normally only needed in this case when you plug a low speed device into
a hub which is then connected to the host at high speed.  In this case
the TT does the translation between low and high speed frame and the
host computer uses schedules traffic onto the link knowing the device is
a low speed device connected via a transaction translator.

Now the Touch and many ARM system on a chip implementation keep cost
down by implementing USB on the same chip as the processor, but the
commonly used usb processing block implements a cut down transaction
translator.  This has some corners cut which for most use cases don't
cause a problem, but for async usb they do.  Specifically it can't do an
inbound and outbound conversion for isochronous transfers in the same 
1ms frame.  As usb audio normally requires 1 outbound frame every 1ms
frame, this means the inbound frames which are the feedback data for
async usb to work get lost.  Adding a hub fixes this as it adds a fully
featured transaction translator and bypasses the internal one in the
processor system on a chip.  The upto 48k work around is a hack I did to
the usb device drivers which only send outbound data every other 1ms
frame so that there are spaces left for the return traffic.  This haves
the available data rate and hence limits the bandwidth.

Its worth noting that this is a problem which is common to many arm
system on a chip processors - the Wandboard (as used by the community
squeeze project), Cubox, pogoplug all suffer from the same problem -
they work fine with a hub, but async audio doesn't work with the onboard
usb transaction translator.  I believe this is because the all use the
same on chip usb implementation which is one of the the most commonly
available arm usb implementation.  [other arm usb implementations such
as that on the Pi cut even more corners and are much worse for usb
audio]


------------------------------------------------------------------------
Triode's Profile: http://forums.slimdevices.com/member.php?userid=17
View this thread: http://forums.slimdevices.com/showthread.php?t=94512

_______________________________________________
Touch mailing list
Touch@lists.slimdevices.com
http://lists.slimdevices.com/mailman/listinfo/touch

Reply via email to