Article 26th: USB high-bandwidth ISO (48 Kbytes/125us) Practice

Source: Internet
Author: User

Usb3.1 technology has been released, and the 10 Gbps speed is enough to meet the data and HD video transmission requirements.

To enter the R & D of USB, You have to build a solid foundation of USB.


The Super Mutt provided by Microsoft only contains one interface 0, which contains two ALT, Alt 1 and Alt 2, which respectively contain two pairs of ISO in/out endpoints. However, only bmaxburst of ISO out EP under Alt 2 is 1, while bmaxburst of the other three iso ep is 0, and the mult of all iso ep is 0.

That is, only one iso ep supports 2 Kbytes/125us, and the other three iso ep only supports 1 Kbytes/125us. Technically speaking, far from reaching the upper limit of high bandwidth (48 Kbytes/125us.


Such a device is even worse than a high-bandwidth USB device (3 Kbytes/125us), which is used to measure the high-bandwidth capability of USB xhci host in the system.

Therefore, the self-developed usb3.0 silicon was used to slightly modify the device driver, which was verified by the lecory advisor T3 usb3.0 analyzer, it proves that the iso ep of the device has the ability to receive and send 48 Kbytes/125us.


Next, you need to use this device to verify the ISO high-bandwidth capability of xhci usb3.0 host.

The test platform is Intel xhci usb3.0 host and Win8 usb3 stack.

First, the test results are given:

(1.1) host sends 48*8 Kbytes of data

ISO maxpacketsize = 49152

2017008302131842206read-write IRP failed with status c0000001

20170085011618000034urb header status c0000b00
00000089 0.01843355 isopacket [0]. offset = 0 isopacket [0]. Length = 49152 isopacket [0]. Status = c0030000
00000091 0.01843889 isopacket [1]. offset = 49152 isopacket [1]. Length = 49152 isopacket [1]. Status = c0030000
00000093 0.01844382 isopacket [2]. offset = 98304 isopacket [2]. Length = 49152 isopacket [2]. Status = c0030000
00000095 0.01844915 isopacket [3]. offset = 147456 isopacket [3]. Length = 49152 isopacket [3]. Status = c0030000
00000097 0.01846065 isopacket [4]. offset = 196608 isopacket [4]. Length = 49152 isopacket [4]. Status = c0030000
00000099 0.01846393 isopacket [5]. offset = 245760 isopacket [5]. Length = 49152 isopacket [5]. Status = c0030000
00000101 0.01846763 isopacket [6]. offset = 294912 isopacket [6]. Length = 49152 isopacket [6]. Status = c0030000
00000103 0.01847091 isopacket [7]. offset = 344064 isopacket [7]. Length = 49152 isopacket [7]. Status = c0030000

Total data transferred = 0 (DEC), 0 (HEX)


(1.2) host receives 48*8 Kbytes data

000001690.02440798 isopacket [0]. offset = 0 isopacket [0]. Length = 49152 isopacket [0]. Status = 0
00000171 0.02441290 isopacket [1]. offset = 49152 isopacket [1]. Length = 49152 isopacket [1]. Status = 0
00000173 0.02441824 isopacket [2]. offset = 98304 isopacket [2]. Length = 0 isopacket [2]. Status = c0030000
00000175 0.02442317 isopacket [3]. offset = 147456 isopacket [3]. Length = 0 isopacket [3]. Status = c0030000
00000177 0.02442850 isopacket [4]. offset = 196608 isopacket [4]. Length = 49152 isopacket [4]. Status = c0030000
00000179 0.02443343 isopacket [5]. offset = 245760 isopacket [5]. Length = 0 isopacket [5]. Status = c0030000
00000181 0.02444533 isopacket [6]. offset = 294912 isopacket [6]. Length = 0 isopacket [6]. Status = c0030000
00000183 0.02444821 isopacket [7]. offset = 344064 isopacket [7]. Length = 49152 isopacket [7]. Status = 0

What is interesting here is:

Three of the eight packages (0, 1, 7) are successfully transmitted for 48 KB, and one of them is also transmitted for 48 KB, however, the system usb3.0 stack considers the ISO packet (4) as unsuccessful.

The reason for this failure will be explained later.

What I'm talking about is that when usb3 stack fills in urbisochronoustransfer. transferbufferlength, It is 4*48 k instead of 3*48 k.



From the data in the above USB analyzer, we can find that there are two reasons for these eight Write Failures:

1. xhci host does not finish sending data in a uframe,

2. xhci host does not send data at all, and even does not send ping in this uframe

It is caused by a series of factors such as the system USB subsystem, and even memory controller and system bus.


When the read is successful, xhci host triggers the reading of (32 + 16) 1 K packets in a uframe.

If the operation fails, the xhci host in the uframe does not issue ack in to read the data on the device, or even the ping fails.


(2.1) 48 K * 1 write:

000000820.00891627 read-write IRP failed with status c0000001
00000084 0.00891914urb header status c0000b00
00000088 0.00892735 isopacket [0]. offset = 0 isopacket [0]. Length = 49152 isopacket [0]. Status = c0030000
00000090 0.00893269 isopacket [1]. offset = 49152 isopacket [1]. Length = 0 isopacket [1]. Status = c0020000
00000092 0.00893803 isopacket [2]. offset = 98304 isopacket [2]. Length = 0 isopacket [2]. Status = c0020000
00000094 0.00894295 isopacket [3]. offset = 147456 isopacket [3]. Length = 0 isopacket [3]. Status = c0020000
00000096 0.00895527 isopacket [4]. offset = 196608 isopacket [4]. Length = 0 isopacket [4]. Status = c0020000
00000098 0.00895855 isopacket [5]. offset = 245760 isopacket [5]. Length = 0 isopacket [5]. Status = c0020000
00000100 0.00896184 isopacket [6]. offset = 294912 isopacket [6]. Length = 0 isopacket [6]. Status = c0020000
00000102 0.00896471 isopacket [7]. offset = 344064 isopacket [7]. Length = 0 isopacket [7]. Status = c0020000
00000110 0.00897498 total data transferred = 0 (DEC), 0 (HEX)


The write was unsuccessful because it was the same as 48*8 K. Data was not completely sent in a uframe.

The following error code c0020000 is not a real error, but is caused by no data being sent at the upper layer.


(2.2) 48 K * 1 read:

000001680.01482911 isopacket [0]. offset = 0 isopacket [0]. Length = 49152 isopacket [0]. Status = 0
00000170 0.01483404 isopacket [1]. offset = 49152 isopacket [1]. Length = 0 isopacket [1]. Status = c0030000
00000172 0.01483938 isopacket [2]. offset = 98304 isopacket [2]. Length = 0 isopacket [2]. Status = c0030000
00000174 0.01484389 isopacket [3]. offset = 147456 isopacket [3]. Length = 49152 isopacket [3]. Status = 0
00000176 0.01485498 isopacket [4]. offset = 196608 isopacket [4]. Length = 0 isopacket [4]. Status = c0030000
00000178 0.01485826 isopacket [5]. offset = 245760 isopacket [5]. Length = 0 isopacket [5]. Status = c0030000
00000182 0.01486196 isopacket [6]. offset = 294912 isopacket [6]. Length = 49152 isopacket [6]. Status = 0
00000186 0.01486524 isopacket [7]. offset = 344064 isopacket [7]. Length = 0 isopacket [7]. Status = c0030000

The situation is the same as that of 48 K * 8.

However, there is no error in both data transmission and data transmission.


(3.1) 32 K * 8 Write

(3.2) 32 K * 8 read

All are successful.



Summary:

The xhci System of Intel and the usb3 stack of Win8 can achieve 32 KB/uframe, but not 48kb/uframe.


Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.