4.9. RDS 接口

无线电数据系统以二进制格式传输补充信息,例如电台名称或旅行信息,在无线电节目的听不见的音频副载波上。 此接口针对能够接收和/或传输 RDS 信息的设备。

有关更多信息,请参阅核心 RDS 标准 IEC 62106 和 RBDS 标准 NRSC-4-B

注意

请注意,在美国使用的 RBDS 标准与 RDS 标准几乎相同。 任何 RDS 解码器/编码器也可以处理 RBDS。 只有一些字段的含义略有不同。 有关更多信息,请参阅 RBDS 标准。

RBDS 标准还指定了对 MMBS(修改的移动搜索)的支持。 这是一种专有格式,似乎已停止使用。 RDS 接口不支持此格式。 如果需要支持 MMBS(或通常所说的“E 块”),请联系 linux-media 邮件列表:https://linuxtv.org/lists.php

4.9.1. 查询能力

支持 RDS 捕获 API 的设备在 v4l2_capability 结构体的 capabilities 字段中设置 V4L2_CAP_RDS_CAPTURE 标志,该结构体由 ioctl VIDIOC_QUERYCAP ioctl 返回。 任何支持 RDS 的调谐器都会在 v4l2_tuner 结构体的 capability 字段中设置 V4L2_TUNER_CAP_RDS 标志。 如果驱动程序仅传递 RDS 块而不解释数据,则必须设置 V4L2_TUNER_CAP_RDS_BLOCK_IO 标志,请参阅 读取 RDS 数据。 为了将来使用,还定义了标志 V4L2_TUNER_CAP_RDS_CONTROLS。 但是,具有此功能的无线电调谐器驱动程序尚不存在,因此如果您计划编写这样的驱动程序,则应在 linux-media 邮件列表上进行讨论:https://linuxtv.org/lists.php

可以通过查看 v4l2_tuner 结构体的 rxsubchans 字段来检测是否存在 RDS 信号:如果检测到 RDS 数据,则将设置 V4L2_TUNER_SUB_RDS

支持 RDS 输出 API 的设备在 v4l2_capability 结构体的 capabilities 字段中设置 V4L2_CAP_RDS_OUTPUT 标志,该结构体由 ioctl VIDIOC_QUERYCAP ioctl 返回。 任何支持 RDS 的调制器都会在 v4l2_modulator 结构体的 capability 字段中设置 V4L2_TUNER_CAP_RDS 标志。 为了启用 RDS 传输,必须在 v4l2_modulator 结构体的 txsubchans 字段中设置 V4L2_TUNER_SUB_RDS 位。 如果驱动程序仅传递 RDS 块而不解释数据,则必须设置 V4L2_TUNER_CAP_RDS_BLOCK_IO 标志。 如果调谐器能够处理 RDS 实体,例如节目识别码和无线电文本,则应设置标志 V4L2_TUNER_CAP_RDS_CONTROLS,请参阅 写入 RDS 数据FM 发射器控制参考

4.9.2. 读取 RDS 数据

可以使用 read() 函数从无线电设备读取 RDS 数据。 数据以三字节为一组打包。

4.9.3. 写入 RDS 数据

可以使用 write() 函数将 RDS 数据写入无线电设备。 数据以三字节为一组打包,如下所示

4.9.4. RDS 数据结构

type v4l2_rds_data
struct v4l2_rds_data

__u8

lsb

RDS 块的最低有效字节

__u8

msb

RDS 块的最高有效字节

__u8

block

块描述

块描述

位 0-2

接收数据的块(又名偏移量)。

位 3-5

已弃用。 目前与位 0-2 相同。 不要使用这些位。

位 6

已纠正位。 指示已为此数据块纠正了错误。

位 7

错误位。 指示在此块的接收过程中发生了无法纠正的错误。

块定义

V4L2_RDS_BLOCK_MSK

7

用于获取块 ID 的位 0-2 的掩码。

V4L2_RDS_BLOCK_A

0

块 A。

V4L2_RDS_BLOCK_B

1

块 B。

V4L2_RDS_BLOCK_C

2

块 C。

V4L2_RDS_BLOCK_D

3

块 D。

V4L2_RDS_BLOCK_C_ALT

4

块 C’。

V4L2_RDS_BLOCK_INVALID

只读

7

无效块。

V4L2_RDS_BLOCK_CORRECTED

只读

0x40

检测到位错误,但已纠正。

V4L2_RDS_BLOCK_ERROR

只读

0x80

发生了无法纠正的错误。