7.21. Silicon Labs Si4713 調頻廣播發射器驅動

版權所有 © 2009 Nokia Corporation

聯絡人: Eduardo Valentin <eduardo.valentin@nokia.com>

7.21.1. 裝置資訊

這款晶片是 Silicon Labs 的產品。它是一款 I2C 裝置,目前地址為 0x63。基本上,它具有發射和訊號噪聲水平測量功能。

Si4713 集成了調頻廣播立體聲傳輸的發射功能。該晶片還支援整合的接收功率掃描,以識別低訊號功率的調頻頻道。

該晶片透過命令和響應進行程式設計。還有一些屬性可以改變晶片的行為。

使用者必須遵守當地關於射頻 (RF) 傳輸的規定。

7.21.2. 裝置驅動描述

有兩個模組用於處理此裝置。一個是 I2C 裝置驅動,另一個是平臺驅動。

I2C 裝置驅動向核心暴露了一個 v4l2-subdev 介面。所有屬性也可以透過 v4l2 擴充套件控制元件介面訪問,透過使用 v4l2-subdev 呼叫 (g_ext_ctrls, s_ext_ctrls)。

平臺裝置驅動向使用者空間暴露了一個 v4l2 無線電裝置介面。因此,它使用 I2C 裝置驅動作為子裝置,以便將使用者命令傳送到實際裝置。它基本上是 I2C 裝置驅動的一個包裝器。

應用程式可以使用 v4l2 無線電 API 來指定操作頻率、靜音狀態等。但其大部分屬性將出現在擴充套件控制元件中。

當 v4l2 靜音屬性設定為 1 (真) 時,驅動將關閉晶片。

7.21.3. 屬性描述

屬性可以使用 v4l2 擴充套件控制元件訪問。以下是 v4l2-ctl 工具的輸出示例:

/ # 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.21.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);
}

結構體 si4713_rnl 和 SI4713_IOC_MEASURE_RNL 定義在 include/linux/platform_data/media/si4713.h 中。

7.21.5. 立體聲/單聲道和 RDS 子通道

該裝置還可以使用可用的傳輸子通道進行配置。為此,請使用 S/G_MODULATOR ioctl 並正確配置 txsubchans。有關此 ioctl 的正確使用,請參考 V4L2 API 規範。

7.21.6. 測試

測試通常使用 v4l2-ctl 工具進行,該工具用於管理調頻調諧器卡。該工具可以在 v4l-dvb 倉庫的 v4l2-apps/util 目錄下找到。

設定 rds ps 名稱的示例

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