^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) .. SPDX-License-Identifier: GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) .. include:: <isonum.txt>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) The Silicon Labs Si4713 FM Radio Transmitter Driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) ===================================================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) Copyright |copy| 2009 Nokia Corporation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) Contact: Eduardo Valentin <eduardo.valentin@nokia.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) Information about the Device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) ----------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) This chip is a Silicon Labs product. It is a I2C device, currently on 0x63 address.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) Basically, it has transmission and signal noise level measurement features.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) The Si4713 integrates transmit functions for FM broadcast stereo transmission.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) The chip also allows integrated receive power scanning to identify low signal
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) power FM channels.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) The chip is programmed using commands and responses. There are also several
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) properties which can change the behavior of this chip.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) Users must comply with local regulations on radio frequency (RF) transmission.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) Device driver description
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) -------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) There are two modules to handle this device. One is a I2C device driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) and the other is a platform driver.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) The I2C device driver exports a v4l2-subdev interface to the kernel.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) All properties can also be accessed by v4l2 extended controls interface, by
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) using the v4l2-subdev calls (g_ext_ctrls, s_ext_ctrls).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) The platform device driver exports a v4l2 radio device interface to user land.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) So, it uses the I2C device driver as a sub device in order to send the user
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) commands to the actual device. Basically it is a wrapper to the I2C device driver.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) Applications can use v4l2 radio API to specify frequency of operation, mute state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) etc. But mostly of its properties will be present in the extended controls.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) When the v4l2 mute property is set to 1 (true), the driver will turn the chip off.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) Properties description
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) ----------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) The properties can be accessed using v4l2 extended controls.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) Here is an output from v4l2-ctl util:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) .. code-block:: none
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) / # v4l2-ctl -d /dev/radio0 --all -L
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) Driver Info:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) Driver name : radio-si4713
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) Card type : Silicon Labs Si4713 Modulator
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) Bus info :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) Driver version: 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) Capabilities : 0x00080800
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) RDS Output
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) Modulator
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) Audio output: 0 (FM Modulator Audio Out)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) Frequency: 1408000 (88.000000 MHz)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) Video Standard = 0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) Modulator:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) Name : FM Modulator
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) Capabilities : 62.5 Hz stereo rds
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) Frequency range : 76.0 MHz - 108.0 MHz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) Subchannel modulation: stereo+rds
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) User Controls
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) mute (bool) : default=1 value=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) FM Radio Modulator Controls
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) rds_signal_deviation (int) : min=0 max=90000 step=10 default=200 value=200 flags=slider
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) rds_program_id (int) : min=0 max=65535 step=1 default=0 value=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) rds_program_type (int) : min=0 max=31 step=1 default=0 value=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) rds_ps_name (str) : min=0 max=96 step=8 value='si4713 '
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) rds_radio_text (str) : min=0 max=384 step=32 value=''
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) audio_limiter_feature_enabled (bool) : default=1 value=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) audio_limiter_release_time (int) : min=250 max=102390 step=50 default=5010 value=5010 flags=slider
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) audio_limiter_deviation (int) : min=0 max=90000 step=10 default=66250 value=66250 flags=slider
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) audio_compression_feature_enabl (bool) : default=1 value=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) audio_compression_gain (int) : min=0 max=20 step=1 default=15 value=15 flags=slider
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) audio_compression_threshold (int) : min=-40 max=0 step=1 default=-40 value=-40 flags=slider
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) audio_compression_attack_time (int) : min=0 max=5000 step=500 default=0 value=0 flags=slider
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) audio_compression_release_time (int) : min=100000 max=1000000 step=100000 default=1000000 value=1000000 flags=slider
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) pilot_tone_feature_enabled (bool) : default=1 value=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) pilot_tone_deviation (int) : min=0 max=90000 step=10 default=6750 value=6750 flags=slider
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) pilot_tone_frequency (int) : min=0 max=19000 step=1 default=19000 value=19000 flags=slider
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) pre_emphasis_settings (menu) : min=0 max=2 default=1 value=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) tune_power_level (int) : min=0 max=120 step=1 default=88 value=88 flags=slider
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) tune_antenna_capacitor (int) : min=0 max=191 step=1 default=0 value=110 flags=slider
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) Here is a summary of them:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) * Pilot is an audible tone sent by the device.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) - pilot_frequency - Configures the frequency of the stereo pilot tone.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) - pilot_deviation - Configures pilot tone frequency deviation level.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) - pilot_enabled - Enables or disables the pilot tone feature.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) * The si4713 device is capable of applying audio compression to the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) transmitted signal.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) - acomp_enabled - Enables or disables the audio dynamic range control feature.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) - acomp_gain - Sets the gain for audio dynamic range control.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) - acomp_threshold - Sets the threshold level for audio dynamic range control.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) - acomp_attack_time - Sets the attack time for audio dynamic range control.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) - acomp_release_time - Sets the release time for audio dynamic range control.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) * Limiter setups audio deviation limiter feature. Once a over deviation occurs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) it is possible to adjust the front-end gain of the audio input and always
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) prevent over deviation.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) - limiter_enabled - Enables or disables the limiter feature.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) - limiter_deviation - Configures audio frequency deviation level.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) - limiter_release_time - Sets the limiter release time.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) * Tuning power
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) - power_level - Sets the output power level for signal transmission.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) antenna_capacitor - This selects the value of antenna tuning capacitor
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) manually or automatically if set to zero.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) * RDS related
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) - rds_ps_name - Sets the RDS ps name field for transmission.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) - rds_radio_text - Sets the RDS radio text for transmission.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) - rds_pi - Sets the RDS PI field for transmission.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) - rds_pty - Sets the RDS PTY field for transmission.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) * Region related
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) - preemphasis - sets the preemphasis to be applied for transmission.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) RNL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) ---
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) This device also has an interface to measure received noise level. To do that, you should
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) ioctl the device node. Here is an code of example:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) .. code-block:: none
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) int main (int argc, char *argv[])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) struct si4713_rnl rnl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) int fd = open("/dev/radio0", O_RDWR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) int rval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) if (argc < 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) if (fd < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) return fd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) sscanf(argv[1], "%d", &rnl.frequency);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) rval = ioctl(fd, SI4713_IOC_MEASURE_RNL, &rnl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) if (rval < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) return rval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) printf("received noise level: %d\n", rnl.rnl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) close(fd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) The struct si4713_rnl and SI4713_IOC_MEASURE_RNL are defined under
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) include/linux/platform_data/media/si4713.h.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) Stereo/Mono and RDS subchannels
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) -------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) The device can also be configured using the available sub channels for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) transmission. To do that use S/G_MODULATOR ioctl and configure txsubchans properly.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) Refer to the V4L2 API specification for proper use of this ioctl.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) Testing
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) -------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) Testing is usually done with v4l2-ctl utility for managing FM tuner cards.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) The tool can be found in v4l-dvb repository under v4l2-apps/util directory.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) Example for setting rds ps name:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) .. code-block:: none
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) # v4l2-ctl -d /dev/radio0 --set-ctrl=rds_ps_name="Dummy"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192)