Airspy patch to enable USB bit packing

Dimitri Stolnikov horiz0n at gmx.net
Sun Feb 28 17:00:55 UTC 2016


Thanks, applied.

On Mon, 11 Jan 2016 01:29:12 +0100, Martin Smith <martin_z_smith at yahoo.ie>  
wrote:

> Last July there were several changes made to the Airspy firmware and
> libairspy that added support for a new bit packing mode where 4 sets of
> 12 bit samples are packed into 3 sets of 16 bits for the transfer across
> the USB bus ( https://i.imgur.com/qXnWoEK.png?1 ). 25% less data is
> transferred across the bus and this is good for some computers with
> cheap USB chipsets. There is an overhead of extra memory bandwidth
> required on the host side to unpack the data into a useful format, so
> for optimal performance bit packing is disabled by default.
>
> The data is automatically unpacked within libairspy before being passed
> along, so no changes are required anywhere else if packing is enabled
> (or not enabled). Airspy firmware older than v1.0.0-rc6 does not have
> the function, but that is detected and handled by libairspy.
>
> I wrote the attached patch to enable packing in gr-osmosdr, which I
> tested and it works. It is basically a clone of the bias=0|1 lines as
> pack=0|1 and calls the needed libairspy function.
>
> ref:
> https://github.com/airspy/firmware/commit/7e1806b
> https://github.com/airspy/firmware/commit/5b7dcab
> https://github.com/airspy/host/commit/a51eccb
>
>
> ---
> Do some Baseline test with Airspy command line tools to have something
> to compare USB throughput results
> --------------------------------------------------------------------------------------------------------
> $ sudo mount -t debugfs none /sys/kernel/debug
> $ sudo modprobe usbmon
> $ wireshark -i usbmod3 &
> $ airspy_info ; sleep 120 ; \
> airspy_rx -t 4 -r /dev/null -n 2400000000 ; sleep 120 ; \
> airspy_rx -t 4 -r /dev/null -p 1 -n 2400000000 ; sleep 120 ; \
> airspy_info
> Wireshark->Statistics->IO Graph
> The Bytes/Tick are double the actual data rate because of way wireshark
> collects the USB packets, I could have added a filter to fix this. But
> the relationship is valid 25% less with packing enabled. The data rate
> in the IO Grahp drops from 80MB/sec (in+out) [really 40MB/sec] to
> 60MB/second (in+out) [really 30MB/sec] from unpacked to packed.
> 10MSPS no packing, packing https://i.imgur.com/pA9LPdE.png?1
> 2.5MSPS no packing, packing https://i.imgur.com/lA8q5aq.png?1
>
>
> Verification test with my patched gr-osmosdr
> --------------------------------------------
> $ sudo mount -t debugfs none /sys/kernel/debug
> $ sudo modprobe usbmon
> $ wireshark -i usbmod3 &
> $ osmocom_fft -a "airspy=0" -s 10000000 --fft-rate=1
> $ osmocom_fft -a "airspy=0,pack=1" -s 10000000 --fft-rate=1
> $ osmocom_fft -a "airspy=0" -s 2500000 --fft-rate=1
> $ osmocom_fft -a "airspy=0,pack=1" -s 2500000 --fft-rate=1
> $ osmocom_fft -a "airspy=0" -s 2500000 --fft-rate=1
> $ osmocom_fft -a "airspy=0,pack=0" -s 2500000 --fft-rate=1
>
> I ran all of the above tests and the wireshark USB throughput graphs
> showed exactly what was expected.
> 40MB/sec(10MSPS+normal),30MB/sec(10MSPS+packing),10MB/sec(2.5MSPS+normal),7.5MB/sec(2.5MSPS+packing),10MB/sec(2.5MSPS+normal),10MB/sec(2.5MSPS+normal).
>
> 25% less when packing was enabled and if you did not specify the
> "pack=1", then no bit packing is performed by libairspy. All the
> magnitudes within the FFT windows looked exactly the same as they do
> without bit packing.


More information about the osmocom-sdr mailing list