4.9. RDS 接口

无线数据系统 (Radio Data System, RDS) 在无线电节目的不可听音频副载波上以二进制格式传输补充信息,例如电台名称或旅行信息。此接口旨在用于能够接收和/或发送 RDS 信息的设备。

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

注意

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

RBDS 标准还规定了对 MMBS (Modified Mobile Search, 修改的移动搜索) 的支持。这是一种似乎已停止使用的专有格式。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 数据结构

类型 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

发生了无法更正的错误。