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(电视)或 62.5 Hz(无线电)为单位,如 V4L2_TUNER_CAP_LOW 所定义。

config

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

cb

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

描述

请注意,像 xc3028/xc4000/xc5000 这样的数字调谐器不使用这些范围,因为它们是在驱动程序内部定义的。这由与“飞利浦方式”兼容的模拟调谐器使用来设置调谐器。在这些设备上,调谐器设置是通过 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;
    struct tuner_range *ranges;
};

成员

type

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

cb_first_if_lower_freq

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

has_tda9887

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

port1_fm_high_sensitivity

许多飞利浦调谐器使用 tda9887 PORT1 来选择 FM 无线电灵敏度。如果此设置是 1,则将 PORT1 设置为 1 以获得适当的 FM 接收效果。

port2_fm_high_sensitivity

某些飞利浦调谐器使用 tda9887 PORT2 来选择 FM 无线电灵敏度。如果此设置是 1,则将 PORT2 设置为 1 以获得适当的 FM 接收效果。

fm_gain_normal

某些飞利浦调谐器使用 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 对于单声道 FM 无线电为 1,对于立体声为 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;
    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

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