# 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 decoding RDS information.

For more information see the core RDS standard and the RBDS standard .

Note that the RBDS standard as is used in the USA is almost identical to the RDS standard. Any RDS decoder can also handle RBDS. Only some of the fields have slightly different meanings. See the RBDS standard for more information.

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: &v4l-ml;.

# Querying Capabilities

Devices supporting the RDS capturing API set the `V4L2_CAP_RDS_CAPTURE` flag in the capabilities field of &v4l2-capability; returned by the &VIDIOC-QUERYCAP; ioctl. Any tuner that supports RDS will set the `V4L2_TUNER_CAP_RDS` flag in the capability field of &v4l2-tuner;. Whether an RDS signal is present can be detected by looking at the rxsubchans field of &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 &v4l2-capability; returned by the &VIDIOC-QUERYCAP; ioctl. Any modulator that supports RDS will set the `V4L2_TUNER_CAP_RDS` flag in the capability field of &v4l2-modulator;. In order to enable the RDS transmission one must set the `V4L2_TUNER_SUB_RDS` bit in the txsubchans field of &v4l2-modulator;.

# Reading RDS data

RDS data can be read from the radio device with the &func-read; function. The data is packed in groups of three bytes, as follows:

## struct v4l2_rds_data

__u8 | lsb | Least Significant Byte of RDS Block
__u8 | msb | Most Significant Byte of RDS Block
__u8 | block | Block description

## Block description

Bits 0-2 | Block (aka offset) of the received data.
Bits 3-5 | Deprecated. Currently identical to bits 0-2. Do not use these bits.
Bit 6 | Corrected bit. Indicates that an error was corrected for this data block.
Bit 7 | Error bit. Indicates that an uncorrectable error occurred during reception of this block.

## Block defines

V4L2_RDS_BLOCK_MSK | 7 | Mask for bits 0-2 to get the block ID.
V4L2_RDS_BLOCK_A | 0 | Block A.
V4L2_RDS_BLOCK_B | 1 | Block B.
V4L2_RDS_BLOCK_C | 2 | Block C.
V4L2_RDS_BLOCK_D | 3 | Block D.
V4L2_RDS_BLOCK_C_ALT | 4 | Block C'.
V4L2_RDS_BLOCK_INVALID | 7 | An invalid block.
V4L2_RDS_BLOCK_CORRECTED | 0x40 | A bit error was detected but corrected.
V4L2_RDS_BLOCK_ERROR | 0x80 | An incorrectable error occurred.