2016-06-30 16:18:56 +03:00
|
|
|
.. -*- coding: utf-8; mode: rst -*-
|
|
|
|
|
|
|
|
.. _sdr:
|
|
|
|
|
|
|
|
**************************************
|
|
|
|
Software Defined Radio Interface (SDR)
|
|
|
|
**************************************
|
|
|
|
|
|
|
|
SDR is an abbreviation of Software Defined Radio, the radio device which
|
|
|
|
uses application software for modulation or demodulation. This interface
|
|
|
|
is intended for controlling and data streaming of such devices.
|
|
|
|
|
|
|
|
SDR devices are accessed through character device special files named
|
|
|
|
``/dev/swradio0`` to ``/dev/swradio255`` with major number 81 and
|
|
|
|
dynamically allocated minor numbers 0 to 255.
|
|
|
|
|
|
|
|
|
|
|
|
Querying Capabilities
|
|
|
|
=====================
|
|
|
|
|
|
|
|
Devices supporting the SDR receiver interface set the
|
|
|
|
``V4L2_CAP_SDR_CAPTURE`` and ``V4L2_CAP_TUNER`` flag in the
|
|
|
|
``capabilities`` field of struct
|
2016-08-29 23:37:59 +03:00
|
|
|
:c:type:`v4l2_capability` returned by the
|
2016-07-01 19:58:44 +03:00
|
|
|
:ref:`VIDIOC_QUERYCAP` ioctl. That flag means the
|
2016-06-30 16:18:56 +03:00
|
|
|
device has an Analog to Digital Converter (ADC), which is a mandatory
|
|
|
|
element for the SDR receiver.
|
|
|
|
|
|
|
|
Devices supporting the SDR transmitter interface set the
|
|
|
|
``V4L2_CAP_SDR_OUTPUT`` and ``V4L2_CAP_MODULATOR`` flag in the
|
|
|
|
``capabilities`` field of struct
|
2016-08-29 23:37:59 +03:00
|
|
|
:c:type:`v4l2_capability` returned by the
|
2016-07-01 19:58:44 +03:00
|
|
|
:ref:`VIDIOC_QUERYCAP` ioctl. That flag means the
|
2016-06-30 16:18:56 +03:00
|
|
|
device has an Digital to Analog Converter (DAC), which is a mandatory
|
|
|
|
element for the SDR transmitter.
|
|
|
|
|
|
|
|
At least one of the read/write, streaming or asynchronous I/O methods
|
|
|
|
must be supported.
|
|
|
|
|
|
|
|
|
|
|
|
Supplemental Functions
|
|
|
|
======================
|
|
|
|
|
|
|
|
SDR devices can support :ref:`controls <control>`, and must support
|
2016-07-01 19:58:44 +03:00
|
|
|
the :ref:`tuner` ioctls. Tuner ioctls are used for setting the
|
2016-06-30 16:18:56 +03:00
|
|
|
ADC/DAC sampling rate (sampling frequency) and the possible radio
|
|
|
|
frequency (RF).
|
|
|
|
|
|
|
|
The ``V4L2_TUNER_SDR`` tuner type is used for setting SDR device ADC/DAC
|
|
|
|
frequency, and the ``V4L2_TUNER_RF`` tuner type is used for setting
|
|
|
|
radio frequency. The tuner index of the RF tuner (if any) must always
|
|
|
|
follow the SDR tuner index. Normally the SDR tuner is #0 and the RF
|
|
|
|
tuner is #1.
|
|
|
|
|
2016-07-01 19:58:44 +03:00
|
|
|
The :ref:`VIDIOC_S_HW_FREQ_SEEK` ioctl is
|
2016-06-30 16:18:56 +03:00
|
|
|
not supported.
|
|
|
|
|
|
|
|
|
|
|
|
Data Format Negotiation
|
|
|
|
=======================
|
|
|
|
|
2016-07-01 19:58:44 +03:00
|
|
|
The SDR device uses the :ref:`format` ioctls to select the
|
2016-06-30 16:18:56 +03:00
|
|
|
capture and output format. Both the sampling resolution and the data
|
|
|
|
streaming format are bound to that selectable format. In addition to the
|
2016-07-01 19:58:44 +03:00
|
|
|
basic :ref:`format` ioctls, the
|
|
|
|
:ref:`VIDIOC_ENUM_FMT` ioctl must be supported as
|
2016-06-30 16:18:56 +03:00
|
|
|
well.
|
|
|
|
|
2016-07-01 19:58:44 +03:00
|
|
|
To use the :ref:`format` ioctls applications set the ``type``
|
2016-08-29 23:37:59 +03:00
|
|
|
field of a struct :c:type:`v4l2_format` to
|
2016-06-30 16:18:56 +03:00
|
|
|
``V4L2_BUF_TYPE_SDR_CAPTURE`` or ``V4L2_BUF_TYPE_SDR_OUTPUT`` and use
|
2016-08-29 23:37:59 +03:00
|
|
|
the struct :c:type:`v4l2_sdr_format` ``sdr`` member
|
2016-06-30 16:18:56 +03:00
|
|
|
of the ``fmt`` union as needed per the desired operation. Currently
|
|
|
|
there is two fields, ``pixelformat`` and ``buffersize``, of struct
|
2016-08-29 23:37:59 +03:00
|
|
|
struct :c:type:`v4l2_sdr_format` which are used.
|
2016-06-30 16:18:56 +03:00
|
|
|
Content of the ``pixelformat`` is V4L2 FourCC code of the data format.
|
|
|
|
The ``buffersize`` field is maximum buffer size in bytes required for
|
|
|
|
data transfer, set by the driver in order to inform application.
|
|
|
|
|
|
|
|
|
2016-08-29 23:37:59 +03:00
|
|
|
.. c:type:: v4l2_sdr_format
|
2016-06-30 16:18:56 +03:00
|
|
|
|
[media] docs-rst: add tabularcolumns to all tables
LaTeX doesn't handle too well auto-width on tables, and ReST
markup requires an special tag to give it the needed hints.
As we're using A4 paper, we have 17cm of useful spaces. As
most media tables have widths, let's use it to generate the
needed via the following perl script:
my ($line_size, $table_header, $has_cols) = (17.5, 0, 0);
my $out;
my $header = "";
my @widths = ();
sub round { $_[0] > 0 ? int($_[0] + .5) : -int(-$_[0] + .5) }
while (<>) {
if (!$table_header) {
$has_cols = 1 if (m/..\s+tabularcolumns::/);
if (m/..\s+flat-table::/) {
$table_header = 1;
$header = $_;
next;
}
$out .= $_;
next;
}
$header .= $_;
@widths = split(/ /, $1) if (m/:widths:\s+(.*)/);
if (m/^\n$/) {
if (!$has_cols && @widths) {
my ($tot, $t, $i) = (0, 0, 0);
foreach my $v(@widths) { $tot += $v; };
$out .= ".. tabularcolumns:: |";
for ($i = 0; $i < scalar @widths - 1; $i++) {
my $v = $widths[$i];
my $w = round(10 * ($v * $line_size) / $tot) / 10;
$out .= sprintf "p{%.1fcm}|", $w;
$t += $w;
}
my $w = $line_size - $t;
$out .= sprintf "p{%.1fcm}|\n\n", $w;
}
$out .= $header;
$table_header = 0;
$has_cols = 0;
$header = "";
@widths = ();
}
}
print $out;
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
2016-08-17 14:14:19 +03:00
|
|
|
.. tabularcolumns:: |p{4.4cm}|p{4.4cm}|p{8.7cm}|
|
|
|
|
|
2016-06-30 16:18:56 +03:00
|
|
|
.. flat-table:: struct v4l2_sdr_format
|
|
|
|
:header-rows: 0
|
|
|
|
:stub-columns: 0
|
|
|
|
:widths: 1 1 2
|
|
|
|
|
[media] v4l: doc: Remove row numbers from tables
Shorten the tables by removing row numbers in comments, allowing for
later insertion of rows with minimal diffs.
All changes have been generated by the following script.
import io
import re
import sys
def process_table(fname, data):
if fname.endswith('hist-v4l2.rst'):
data = re.sub(u'\n{1,2}\t( ?) -( ?) ?', u'\n\t\\1 -\\2', data, flags = re.MULTILINE)
data = re.sub(u'\n(\t| )- \.\. row [0-9]+\n\t ?-( ?) ?', u'\\1* -\\2', data, flags = re.MULTILINE)
else:
data = re.sub(u'\n{1,2} -( ?) ?', u'\n -\\1', data, flags = re.MULTILINE)
data = re.sub(u'(\n?)(\n\n - \.\. row 1\n)', u'\n\\2', data, flags = re.MULTILINE)
data = re.sub(u'\n - \.\. row [0-9]+\n -( ?) ?', u' * -\\1', data, flags = re.MULTILINE)
data = re.sub(u'\n - \.\. row [0-9]+\n \.\. (_[A-Z0-9_`-]*:)', u'\n - .. \\1', data, flags = re.MULTILINE)
data = re.sub(u'\n - \.\. (_[A-Z0-9_`-]*:)\n -', u' * .. \\1\n\n -', data, flags = re.MULTILINE)
data = re.sub(u'^ - ', u' -', data, flags = re.MULTILINE)
data = re.sub(u'^(\t{1,2}) ', u'\\1', data, flags = re.MULTILINE)
return data
def process_file(fname, data):
buf = io.StringIO(data)
output = ''
in_table = False
table_separator = 0
for line in buf.readlines():
if line.find('.. flat-table::') != -1:
in_table = True
table = ''
elif in_table and not re.match('^[\t\n]|( )', line):
in_table = False
output += process_table(fname, table)
if in_table:
table += line
else:
output += line
if in_table:
in_table = False
output += process_table(fname, table)
return output
fname = sys.argv[1]
data = file(fname, 'rb').read().decode('utf-8')
data = process_file(fname, data)
file(fname, 'wb').write(data.encode('utf-8'))
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2016-09-05 14:44:34 +03:00
|
|
|
* - __u32
|
|
|
|
- ``pixelformat``
|
|
|
|
- The data format or type of compression, set by the application.
|
|
|
|
This is a little endian
|
|
|
|
:ref:`four character code <v4l2-fourcc>`. V4L2 defines SDR
|
|
|
|
formats in :ref:`sdr-formats`.
|
|
|
|
* - __u32
|
|
|
|
- ``buffersize``
|
|
|
|
- Maximum size in bytes required for data. Value is set by the
|
|
|
|
driver.
|
|
|
|
* - __u8
|
|
|
|
- ``reserved[24]``
|
|
|
|
- This array is reserved for future extensions. Drivers and
|
|
|
|
applications must set it to zero.
|
2016-06-30 16:18:56 +03:00
|
|
|
|
|
|
|
|
|
|
|
An SDR device may support :ref:`read/write <rw>` and/or streaming
|
|
|
|
(:ref:`memory mapping <mmap>` or :ref:`user pointer <userp>`) I/O.
|