The free OSR Learning Library has more than 50 articles on a wide variety of topics about writing and debugging device drivers and Minifilters. From introductory level to advanced. All the articles have been recently reviewed and updated, and are written using the clear and definitive style you've come to expect from OSR over the years.
Check out The OSR Learning Library at: https://www.osr.com/osr-learning-library/
I have a USB 3.0 device that contiguously transfers data using isochronous pipe (interval=1, imul=2, burst=changeable on the device side).
I implemented a WDF USB kernel mode driver that works with the device. it is a Windows 10 x64 the latest update.
I have simple driver logic when I want to start data transmitting:
1. the driver allocates 1000 URB requests, each request is 8 microframes * packet size (the packet size depends on the current burst value) - the driver receives 1000 requests a second, each request contains 8 microframes. I think, 1000 URB requests have to be enough for contiguous reading the isochronous pipe.
2. Each time completition callback is called, I just safe the received data size and send the same request again (I reuse the request and memory according to the MSDN). So far, I don't work with payload, just work with length and reusing a request.
Everything looks pretty easy, however , I have some issue:
if burst value is not high, like 1-10 then everything works nice.
if burst value is 12-13 I have about 10 microframes a seconds with zero length. I don't know why so. The device side says the same like about 10 packets were completed but 0 bytes were really send for them.
if burst value is 14-15 I have about 100-200 microframes a seconds with zero length.
I think, it might be a Windows driver issue, in case the driver does not use enough requests for contiguous transfer. However, if I increase count of URB packets it does not help.
Unfortunately, I don't see any errors on either windows or devices sides.
The device sends maximum data size according to the Super Speed config, it is a test data.
My questions are:
1. why do I have those 0-length packets? is that normal situation if the device side always sends full packet size but really the data are not transferred?
2. I have not found any known issues with the isochronous pipe on Windows, does it really support maximum isochronous Super Speed bandwidth which is about 3Gbps?
3. Could you share any worked sample that supports contiguous isochronous Super Speed transfer with 3Gbps bandwidth?
I think it is a windows side issue, because it looks like if windows does not read a data in time it must be the same behaviour.
Thanks in advance for any reply
It looks like you're new here. If you want to get involved, click one of these buttons!
|Upcoming OSR Seminars|
|OSR has suspended in-person seminars due to the Covid-19 outbreak. But, don't miss your training! Attend via the internet instead!||Kernel Debugging||30 Mar 2020||OSR Seminar Space|
|Developing Minifilters||15 Jun 2020||LIVE ONLINE|
|Writing WDF Drivers||22 June 2020||LIVE ONLINE|
|Internals & Software Drivers||28 Sept 2020||Dulles, VA|