Henry, I suppose that these pauses appear in end of URB transfer, when
last transaction
on bus for that URB completed, but interrupt threshold not yet occurs.
Correct me if I’m wrong.
How big are these pauses ?
Can you try issuing usbd_io requests of multiples of 16k
Let me give full information.
We using QNX 6.3.0 SP1.
The host system CPU is P4, 2.4GHz, 1MB cache. On-board memory is 1GB.
The USB host is USB 2.0, EHCI type, embedded into Intel ICH5 South bridge.
The device under test based on Cypress MCU CY7C68013. USB 2.0 cable
length 1.5m. Device is always ready to send data to host controller.
Application allocates few hundreds URBs and queues all of them into USB
2.0 stack,
after that sends a command to the device to start streaming. Application
uses BULK USB 2.0 transfers. During each experiment URB buffer size is set
to the value mentioned in buffer column (see table below).
Bandwidth column states achieved bandwidth,
period column is a period between two adjacent gaps, gap column
is a duration of gap. Measurements was made with Tektronix TDS-2024
oscilloscope. The gaps was measured as repeated periods of inactivity of
USB host when it was not ready to receive data. Measurements was made
for default int_thresh and for int_thresh = 1.
default int_thresh (int_thresh =
buffer Bandwidth period gap
128K 42.5Mb/s 3.0ms 300us
64K 31.224Mb/s 2.0ms 600us
32K 31.2Mb/s 1.02ms 300us
16K 15.62MB/s 1.02ms 640us
int_thresh = 1
128K 43.46MB/s 2.8ms 160us
64K 41.664MB/s 1.5ms 160us
32K 41.3MB/s 740us 56us
16K 31.056MB/s 490us 140us
Another values of buffer size give similar results.
As you can calculate,
period = buffer/Bandwidth (approx).
Therefore, gap happens every URB.
Maximum available bandwidth 46.2MB/s, achievable on same hardware
with Windows 2k/XP USB 2.0 stack with all the latest updates installed.
We cant achieve it on QNX because of these pauses.
Question is - how get rid of these gaps?
Windows USB stack have not such pauses in stream.
WBR, Maxim Shvyndia aka Max Shan.