2.26. 调谐器函数和数据结构

enum tuner_mode

调谐器模式

常量

T_RADIO

调谐器核心将在收音机模式下工作

T_ANALOG_TV

调谐器核心将在模拟电视模式下工作

描述

较旧的板卡只有一个调谐器设备,但某些设备具有单独的收音机调谐器。在任何情况下,调谐器核心都需要知道调谐器芯片是否将在收音机模式或模拟电视模式下使用,因为在收音机模式下,频率的指定范围与电视模式不同。此枚举由调谐器核心使用,以便使用正确的调谐器范围,并最终在收音机模式下使用不同的调谐器芯片。

struct tuner_setup

设置调谐器芯片组

定义:

struct tuner_setup {
    unsigned short  addr;
    unsigned int    type;
    unsigned int    mode_mask;
    void *config;
    int (*tuner_callback)(void *dev, int component, int cmd, int arg);
};

成员

addr

用于控制调谐器设备/芯片组的 I2C 地址

type

调谐器的类型,如 TUNER_* 宏中定义的那样。每个不同的调谐器型号应具有唯一的标识符。

mode_mask

带有允许的调谐器模式的掩码:V4L2_TUNER_RADIO、V4L2_TUNER_ANALOG_TV 和/或 V4L2_TUNER_DIGITAL_TV,描述调谐器是否应用于支持收音机、模拟电视和/或数字电视。

config

用于为需要设置额外参数的复杂调谐器发送调谐器特定的配置。只有极少数调谐器需要它,并且应避免在新调谐器上使用它。

tuner_callback

一些调谐器需要回调桥驱动程序,以便执行某些任务,例如在桥芯片组上升高 GPIO,以便执行诸如重置设备之类的操作。

描述

较旧的板卡只有一个调谐器设备。现在,单个板卡上可能存在多个调谐器设备。使用 TUNER_SET_TYPE_ADDR 传递 tuner_setup 结构可以依次设置每个调谐器设备。

由于可能存在多个设备,因此向单个 i2c 设备发送命令已不再足够。相反,您应该将命令广播到所有 i2c 设备。

通过正确设置 mode_mask,您可以选择特定调谐器设备接受哪些命令。例如,如果设备是仅收音机调谐器,则将 mode_mask 设置为 T_RADIO。该特定调谐器将仅在调谐器处于收音机模式时接受命令,并在调谐器设置为电视模式时忽略它们。

enum param_type

调谐器参数的类型

常量

TUNER_PARAM_TYPE_RADIO

调谐器参数用于 FM 和/或 AM 收音机

TUNER_PARAM_TYPE_PAL

调谐器参数用于 PAL 彩色电视标准

TUNER_PARAM_TYPE_SECAM

调谐器参数用于 SECAM 彩色电视标准

TUNER_PARAM_TYPE_NTSC

调谐器参数用于 NTSC 彩色电视标准

TUNER_PARAM_TYPE_DIGITAL

调谐器参数用于数字电视

struct tuner_range

定义调谐器支持的频率

定义:

struct tuner_range {
    unsigned short limit;
    unsigned char config;
    unsigned char cb;
};

成员

limit

该范围支持的最大频率,以 62.5 kHz (TV) 或 62.5 Hz (Radio) 为单位,由 V4L2_TUNER_CAP_LOW 定义。

config

设置此模式的频带切换字节 (BB) 的值。

cb

设置此模式的 CB 字节的值。

描述

请注意,像 xc3028/xc4000/xc5000 这样的数字调谐器不使用这些范围,因为它们是在驱动程序内部定义的。这由与“Philips 方式”兼容的模拟调谐器用于设置调谐器。在这些设备上,调谐器设置通过 4 个字节完成

  1. 分频器字节 1 (DB1)

  2. 分频器字节 2 (DB2)

  3. 控制字节 (CB)

  4. 频带切换字节 (BB)

一些调谐器还具有一个附加的可选辅助字节 (AB)。

struct tuner_params

用于设置调谐器的参数。这些参数由 drivers/media/tuners/tuner-types.c 使用,以指定调谐器属性。大多数参数用于基于 tda9887 IF-PLL 多标准模拟电视/收音机解调器的调谐器,这在传统的模拟调谐器上非常常见。

定义:

struct tuner_params {
    enum param_type type;
    unsigned int cb_first_if_lower_freq:1;
    unsigned int has_tda9887:1;
    unsigned int port1_fm_high_sensitivity:1;
    unsigned int port2_fm_high_sensitivity:1;
    unsigned int fm_gain_normal:1;
    unsigned int intercarrier_mode:1;
    unsigned int port1_active:1;
    unsigned int port2_active:1;
    unsigned int port1_invert_for_secam_lc:1;
    unsigned int port2_invert_for_secam_lc:1;
    unsigned int port1_set_for_fm_mono:1;
    unsigned int default_pll_gating_18:1;
    unsigned int radio_if:2;
    signed int default_top_low:5;
    signed int default_top_mid:5;
    signed int default_top_high:5;
    signed int default_top_secam_low:5;
    signed int default_top_secam_mid:5;
    signed int default_top_secam_high:5;
    u16 iffreq;
    unsigned int count;
    const struct tuner_range *ranges;
};

成员

type

调谐器参数的类型,如 enum param_type 中定义的那样。如果调谐器支持多种标准,则应使用数组,每种不同的标准一行。

cb_first_if_lower_freq

许多基于 Philips 的调谐器在其数据表中都有这样的注释:“对于涉及频带切换的频道选择,为了确保平滑地调谐到所需的频道而不会导致不必要的充电泵动作,建议考虑所需频道频率与当前频道频率之间的差异。不必要的充电泵动作将导致非常低的调谐电压,这可能会将振荡器驱动到极端条件”。如果此调谐器需要此检查,请将 cb_first_if_lower_freq 设置为 1。我通过首先将电视频率设置为 203 MHz,然后切换到 96.6 MHz FM 收音机来测试了 PAL 的这一点。除非首先发送控制字节,否则结果是静态的。

has_tda9887

如果此调谐器使用 tda9887,则设置为 1

port1_fm_high_sensitivity

许多 Philips 调谐器使用 tda9887 PORT1 来选择 FM 收音机的灵敏度。如果此设置值为 1,则将 PORT1 设置为 1 以获得适当的 FM 接收。

port2_fm_high_sensitivity

一些 Philips 调谐器使用 tda9887 PORT2 来选择 FM 收音机的灵敏度。如果此设置值为 1,则将 PORT2 设置为 1 以获得适当的 FM 接收。

fm_gain_normal

一些 Philips 调谐器使用 tda9887 cGainNormal 来选择 FM 收音机的灵敏度。如果此设置值为 1,则 e 寄存器将使用 cGainNormal 而不是 cGainLow。

intercarrier_mode

大多数带有 tda9887 的调谐器使用 QSS 模式。一些(更便宜的)调谐器使用 Intercarrier 模式。如果此设置值为 1,则需要将调谐器设置为 intercarrier 模式。

port1_active

此设置设置 PORT1 的默认值。0 表示非活动,1 表示活动。注意:写入 tda9887 的实际位值是反转的。因此,这里的 0 表示 B6 位中的 1。

port2_active

此设置设置 PORT2 的默认值。0 表示非活动,1 表示活动。注意:写入 tda9887 的实际位值是反转的。因此,这里的 0 表示 B7 位中的 1。

port1_invert_for_secam_lc

有时,当选择 SECAM-L’ 标准时,PORT1 会反转。如果需要,请将此位设置为 1。

port2_invert_for_secam_lc

有时,当选择 SECAM-L’ 标准时,PORT2 会反转。如果需要,请将此位设置为 1。

port1_set_for_fm_mono

某些卡需要 PORT1 为 1 表示单声道 FM 收音机,为 0 表示立体声。

default_pll_gating_18

选择 18%(或根据数据表 0%)L 标准 PLL 门控,而不是驱动程序的默认值 36%。

radio_if

在收音机模式下使用的 IF。带有单独的收音机 IF 滤波器的调谐器似乎使用 10.7,而没有滤波器的调谐器 PAL/SECAM 调谐器使用 33.3,NTSC 调谐器使用 41.3。0 = 10.7, 1 = 33.3, 2 = 41.3

default_top_low

低频段的默认 tda9887 TOP 值(以 dB 为单位)。默认值为 0。范围:-16:+15

default_top_mid

中频段的默认 tda9887 TOP 值(以 dB 为单位)。默认值为 0。范围:-16:+15

default_top_high

高频段的默认 tda9887 TOP 值(以 dB 为单位)。默认值为 0。范围:-16:+15

default_top_secam_low

SECAM-L/L’ 低频段的默认 tda9887 TOP 值(以 dB 为单位)。默认值为 0。一些调谐器需要 SECAM-L/L’ 标准的不同 TOP 值。范围:-16:+15

default_top_secam_mid

SECAM-L/L’ 中频段的默认 tda9887 TOP 值(以 dB 为单位)。默认值为 0。一些调谐器需要 SECAM-L/L’ 标准的不同 TOP 值。范围:-16:+15

default_top_secam_high

SECAM-L/L’ 高频段的默认 tda9887 TOP 值(以 dB 为单位)。默认值为 0。一些调谐器需要 SECAM-L/L’ 标准的不同 TOP 值。范围:-16:+15

iffreq

数字模式下调谐器使用的中频 (IF)。

count

ranges 数组的大小。

ranges

调谐器支持的频率范围数组。

struct tunertype

描述已知的调谐器。

定义:

struct tunertype {
    char *name;
    unsigned int count;
    const struct tuner_params *params;
    u16 min;
    u16 max;
    u32 stepsize;
    u8 *initdata;
    u8 *sleepdata;
};

成员

name

带有调谐器名称的字符串。

count

struct tuner_params 数组的大小。

params

指向 struct tuner_params 数组的指针。

min

最小调谐器频率,以 62.5 kHz 步长为单位。应乘以 16 以转换为 MHz。

max

最小调谐器频率,以 62.5 kHz 步长为单位。应乘以 16 以转换为 MHz。

stepsize

频率步长,以 Hz 为单位。

initdata

可选的字节序列,用于初始化调谐器。

sleepdata

可选的字节序列,用于关闭调谐器电源。