7.20. Silicon Labs Si4713 FM 无线电发射器驱动程序

版权所有 © 2009 Nokia Corporation

联系方式:Eduardo Valentin <eduardo.valentin@nokia.com>

7.20.1. 关于设备的信息

此芯片是 Silicon Labs 的产品。它是一个 I2C 设备,目前地址为 0x63。基本上,它具有发射和信号噪声水平测量功能。

Si4713 集成了用于 FM 广播立体声发射的发射功能。该芯片还允许集成的接收功率扫描,以识别低信号功率 FM 频道。

该芯片使用命令和响应进行编程。还有一些属性可以改变此芯片的行为。

用户必须遵守当地关于射频 (RF) 发射的法规。

7.20.2. 设备驱动程序描述

有两个模块来处理此设备。一个是 I2C 设备驱动程序,另一个是平台驱动程序。

I2C 设备驱动程序向内核导出 v4l2-subdev 接口。所有属性也可以通过 v4l2 扩展控件接口访问,通过使用 v4l2-subdev 调用 (g_ext_ctrls, s_ext_ctrls)。

平台设备驱动程序向用户空间导出 v4l2 无线电设备接口。因此,它使用 I2C 设备驱动程序作为子设备,以便将用户命令发送到实际设备。基本上,它是 I2C 设备驱动程序的包装器。

应用程序可以使用 v4l2 无线电 API 来指定工作频率、静音状态等。但其大部分属性将存在于扩展控件中。

当 v4l2 静音属性设置为 1(真)时,驱动程序将关闭芯片。

7.20.3. 属性描述

可以使用 v4l2 扩展控件访问这些属性。以下是 v4l2-ctl util 的输出

/ # v4l2-ctl -d /dev/radio0 --all -L
Driver Info:
        Driver name   : radio-si4713
        Card type     : Silicon Labs Si4713 Modulator
        Bus info      :
        Driver version: 0
        Capabilities  : 0x00080800
                RDS Output
                Modulator
Audio output: 0 (FM Modulator Audio Out)
Frequency: 1408000 (88.000000 MHz)
Video Standard = 0x00000000
Modulator:
        Name                 : FM Modulator
        Capabilities         : 62.5 Hz stereo rds
        Frequency range      : 76.0 MHz - 108.0 MHz
        Subchannel modulation: stereo+rds

User Controls

                        mute (bool) : default=1 value=0

FM Radio Modulator Controls

        rds_signal_deviation (int)  : min=0 max=90000 step=10 default=200 value=200 flags=slider
                rds_program_id (int)  : min=0 max=65535 step=1 default=0 value=0
        rds_program_type (int)  : min=0 max=31 step=1 default=0 value=0
                rds_ps_name (str)  : min=0 max=96 step=8 value='si4713  '
                rds_radio_text (str)  : min=0 max=384 step=32 value=''
audio_limiter_feature_enabled (bool) : default=1 value=1
audio_limiter_release_time (int)  : min=250 max=102390 step=50 default=5010 value=5010 flags=slider
        audio_limiter_deviation (int)  : min=0 max=90000 step=10 default=66250 value=66250 flags=slider
audio_compression_feature_enabl (bool) : default=1 value=1
        audio_compression_gain (int)  : min=0 max=20 step=1 default=15 value=15 flags=slider
audio_compression_threshold (int)  : min=-40 max=0 step=1 default=-40 value=-40 flags=slider
audio_compression_attack_time (int)  : min=0 max=5000 step=500 default=0 value=0 flags=slider
audio_compression_release_time (int)  : min=100000 max=1000000 step=100000 default=1000000 value=1000000 flags=slider
pilot_tone_feature_enabled (bool) : default=1 value=1
        pilot_tone_deviation (int)  : min=0 max=90000 step=10 default=6750 value=6750 flags=slider
        pilot_tone_frequency (int)  : min=0 max=19000 step=1 default=19000 value=19000 flags=slider
        pre_emphasis_settings (menu) : min=0 max=2 default=1 value=1
        tune_power_level (int)  : min=0 max=120 step=1 default=88 value=88 flags=slider
        tune_antenna_capacitor (int)  : min=0 max=191 step=1 default=0 value=110 flags=slider

以下是它们的摘要

  • 导频是设备发送的可听音调。

  • pilot_frequency - 配置立体声导频音调的频率。

  • pilot_deviation - 配置导频音调频率偏差水平。

  • pilot_enabled - 启用或禁用导频音调功能。

  • si4713 设备能够对发射的信号应用音频压缩。

  • acomp_enabled - 启用或禁用音频动态范围控制功能。

  • acomp_gain - 设置音频动态范围控制的增益。

  • acomp_threshold - 设置音频动态范围控制的阈值水平。

  • acomp_attack_time - 设置音频动态范围控制的起音时间。

  • acomp_release_time - 设置音频动态范围控制的释放时间。

  • 限幅器设置音频偏差限幅器功能。一旦发生过度偏差,可以调整音频输入的前端增益,并始终防止过度偏差。

  • limiter_enabled - 启用或禁用限幅器功能。

  • limiter_deviation - 配置音频频率偏差水平。

  • limiter_release_time - 设置限幅器释放时间。

  • 调谐功率

  • power_level - 设置信号发射的输出功率水平。antenna_capacitor - 如果设置为零,则此值会手动或自动选择天线调谐电容器的值。

  • RDS 相关

  • rds_ps_name - 设置用于发射的 RDS ps 名称字段。

  • rds_radio_text - 设置用于发射的 RDS 无线电文本。

  • rds_pi - 设置用于发射的 RDS PI 字段。

  • rds_pty - 设置用于发射的 RDS PTY 字段。

  • 区域相关

  • preemphasis - 设置用于发射的预加重。

7.20.4. RNL

此设备还具有测量接收噪声水平的接口。为此,您应该 ioctl 设备节点。以下是一个示例代码

int main (int argc, char *argv[])
{
        struct si4713_rnl rnl;
        int fd = open("/dev/radio0", O_RDWR);
        int rval;

        if (argc < 2)
                return -EINVAL;

        if (fd < 0)
                return fd;

        sscanf(argv[1], "%d", &rnl.frequency);

        rval = ioctl(fd, SI4713_IOC_MEASURE_RNL, &rnl);
        if (rval < 0)
                return rval;

        printf("received noise level: %d\n", rnl.rnl);

        close(fd);
}

struct si4713_rnl 和 SI4713_IOC_MEASURE_RNL 定义在 include/linux/platform_data/media/si4713.h 下。

7.20.5. 立体声/单声道和 RDS 子频道

还可以使用可用的子频道进行发射来配置设备。为此,请使用 S/G_MODULATOR ioctl 并正确配置 txsubchans。有关正确使用此 ioctl 的信息,请参阅 V4L2 API 规范。

7.20.6. 测试

测试通常使用 v4l2-ctl 实用程序来管理 FM 调谐器卡。该工具可以在 v4l-dvb 存储库下的 v4l2-apps/util 目录中找到。

设置 rds ps 名称的示例

# v4l2-ctl -d /dev/radio0 --set-ctrl=rds_ps_name="Dummy"