dev-rds.rst 5.5 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
.. -*- coding: utf-8; mode: rst -*-

.. _rds:

*************
RDS Interface
*************

The Radio Data System transmits supplementary information in binary
format, for example the station name or travel information, on an
inaudible audio subcarrier of a radio program. This interface is aimed
at devices capable of receiving and/or transmitting RDS information.

For more information see the core RDS standard :ref:`iec62106` and the
RBDS standard :ref:`nrsc4`.

17 18 19 20
.. note:: Note that the RBDS standard as is used in the USA is almost
   identical to the RDS standard. Any RDS decoder/encoder can also handle
   RBDS. Only some of the fields have slightly different meanings. See the
   RBDS standard for more information.
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35

The RBDS standard also specifies support for MMBS (Modified Mobile
Search). This is a proprietary format which seems to be discontinued.
The RDS interface does not support this format. Should support for MMBS
(or the so-called 'E blocks' in general) be needed, then please contact
the linux-media mailing list:
`https://linuxtv.org/lists.php <https://linuxtv.org/lists.php>`__.


Querying Capabilities
=====================

Devices supporting the RDS capturing API set the
``V4L2_CAP_RDS_CAPTURE`` flag in the ``capabilities`` field of struct
:ref:`v4l2_capability <v4l2-capability>` returned by the
36
:ref:`VIDIOC_QUERYCAP` ioctl. Any tuner that
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
supports RDS will set the ``V4L2_TUNER_CAP_RDS`` flag in the
``capability`` field of struct :ref:`v4l2_tuner <v4l2-tuner>`. If the
driver only passes RDS blocks without interpreting the data the
``V4L2_TUNER_CAP_RDS_BLOCK_IO`` flag has to be set, see
:ref:`Reading RDS data <reading-rds-data>`. For future use the flag
``V4L2_TUNER_CAP_RDS_CONTROLS`` has also been defined. However, a driver
for a radio tuner with this capability does not yet exist, so if you are
planning to write such a driver you should discuss this on the
linux-media mailing list:
`https://linuxtv.org/lists.php <https://linuxtv.org/lists.php>`__.

Whether an RDS signal is present can be detected by looking at the
``rxsubchans`` field of struct :ref:`v4l2_tuner <v4l2-tuner>`: the
``V4L2_TUNER_SUB_RDS`` will be set if RDS data was detected.

Devices supporting the RDS output API set the ``V4L2_CAP_RDS_OUTPUT``
flag in the ``capabilities`` field of struct
:ref:`v4l2_capability <v4l2-capability>` returned by the
55
:ref:`VIDIOC_QUERYCAP` ioctl. Any modulator that
56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
supports RDS will set the ``V4L2_TUNER_CAP_RDS`` flag in the
``capability`` field of struct
:ref:`v4l2_modulator <v4l2-modulator>`. In order to enable the RDS
transmission one must set the ``V4L2_TUNER_SUB_RDS`` bit in the
``txsubchans`` field of struct
:ref:`v4l2_modulator <v4l2-modulator>`. If the driver only passes RDS
blocks without interpreting the data the ``V4L2_TUNER_CAP_RDS_BLOCK_IO``
flag has to be set. If the tuner is capable of handling RDS entities
like program identification codes and radio text, the flag
``V4L2_TUNER_CAP_RDS_CONTROLS`` should be set, see
:ref:`Writing RDS data <writing-rds-data>` and
:ref:`FM Transmitter Control Reference <fm-tx-controls>`.


.. _reading-rds-data:

Reading RDS data
================

RDS data can be read from the radio device with the
:ref:`read() <func-read>` function. The data is packed in groups of
three bytes.


.. _writing-rds-data:

Writing RDS data
================

RDS data can be written to the radio device with the
:ref:`write() <func-write>` function. The data is packed in groups of
three bytes, as follows:


RDS datastructures
==================


.. _v4l2-rds-data:

.. flat-table:: struct v4l2_rds_data
    :header-rows:  0
    :stub-columns: 0
    :widths:       1 1 5


    -  .. row 1

       -  __u8

       -  ``lsb``

       -  Least Significant Byte of RDS Block

    -  .. row 2

       -  __u8

       -  ``msb``

       -  Most Significant Byte of RDS Block

    -  .. row 3

       -  __u8

       -  ``block``

       -  Block description



.. _v4l2-rds-block:

.. flat-table:: Block description
    :header-rows:  0
    :stub-columns: 0
    :widths:       1 5


    -  .. row 1

       -  Bits 0-2

       -  Block (aka offset) of the received data.

    -  .. row 2

       -  Bits 3-5

       -  Deprecated. Currently identical to bits 0-2. Do not use these
147
	  bits.
148 149 150 151 152 153

    -  .. row 3

       -  Bit 6

       -  Corrected bit. Indicates that an error was corrected for this data
154
	  block.
155 156 157 158 159 160

    -  .. row 4

       -  Bit 7

       -  Error bit. Indicates that an uncorrectable error occurred during
161
	  reception of this block.
162 163 164 165 166 167 168 169 170 171 172 173 174 175 176



.. _v4l2-rds-block-codes:

.. flat-table:: Block defines
    :header-rows:  0
    :stub-columns: 0
    :widths:       1 1 1 5


    -  .. row 1

       -  V4L2_RDS_BLOCK_MSK

177
       -
178 179 180 181 182 183 184 185
       -  7

       -  Mask for bits 0-2 to get the block ID.

    -  .. row 2

       -  V4L2_RDS_BLOCK_A

186
       -
187 188 189 190 191 192 193 194
       -  0

       -  Block A.

    -  .. row 3

       -  V4L2_RDS_BLOCK_B

195
       -
196 197 198 199 200 201 202 203
       -  1

       -  Block B.

    -  .. row 4

       -  V4L2_RDS_BLOCK_C

204
       -
205 206 207 208 209 210 211 212
       -  2

       -  Block C.

    -  .. row 5

       -  V4L2_RDS_BLOCK_D

213
       -
214 215 216 217 218 219 220 221
       -  3

       -  Block D.

    -  .. row 6

       -  V4L2_RDS_BLOCK_C_ALT

222
       -
223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255
       -  4

       -  Block C'.

    -  .. row 7

       -  V4L2_RDS_BLOCK_INVALID

       -  read-only

       -  7

       -  An invalid block.

    -  .. row 8

       -  V4L2_RDS_BLOCK_CORRECTED

       -  read-only

       -  0x40

       -  A bit error was detected but corrected.

    -  .. row 9

       -  V4L2_RDS_BLOCK_ERROR

       -  read-only

       -  0x80

       -  An uncorrectable error occurred.