162306a36Sopenharmony_ci.. SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci 362306a36Sopenharmony_ci.. include:: <isonum.txt> 462306a36Sopenharmony_ci 562306a36Sopenharmony_ciThe Silicon Labs Si4713 FM Radio Transmitter Driver 662306a36Sopenharmony_ci=================================================== 762306a36Sopenharmony_ci 862306a36Sopenharmony_ciCopyright |copy| 2009 Nokia Corporation 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ciContact: Eduardo Valentin <eduardo.valentin@nokia.com> 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ciInformation about the Device 1462306a36Sopenharmony_ci---------------------------- 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ciThis chip is a Silicon Labs product. It is a I2C device, currently on 0x63 address. 1762306a36Sopenharmony_ciBasically, it has transmission and signal noise level measurement features. 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ciThe Si4713 integrates transmit functions for FM broadcast stereo transmission. 2062306a36Sopenharmony_ciThe chip also allows integrated receive power scanning to identify low signal 2162306a36Sopenharmony_cipower FM channels. 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ciThe chip is programmed using commands and responses. There are also several 2462306a36Sopenharmony_ciproperties which can change the behavior of this chip. 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ciUsers must comply with local regulations on radio frequency (RF) transmission. 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ciDevice driver description 2962306a36Sopenharmony_ci------------------------- 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ciThere are two modules to handle this device. One is a I2C device driver 3262306a36Sopenharmony_ciand the other is a platform driver. 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ciThe I2C device driver exports a v4l2-subdev interface to the kernel. 3562306a36Sopenharmony_ciAll properties can also be accessed by v4l2 extended controls interface, by 3662306a36Sopenharmony_ciusing the v4l2-subdev calls (g_ext_ctrls, s_ext_ctrls). 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ciThe platform device driver exports a v4l2 radio device interface to user land. 3962306a36Sopenharmony_ciSo, it uses the I2C device driver as a sub device in order to send the user 4062306a36Sopenharmony_cicommands to the actual device. Basically it is a wrapper to the I2C device driver. 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_ciApplications can use v4l2 radio API to specify frequency of operation, mute state, 4362306a36Sopenharmony_cietc. But mostly of its properties will be present in the extended controls. 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ciWhen the v4l2 mute property is set to 1 (true), the driver will turn the chip off. 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_ciProperties description 4862306a36Sopenharmony_ci---------------------- 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ciThe properties can be accessed using v4l2 extended controls. 5162306a36Sopenharmony_ciHere is an output from v4l2-ctl util: 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_ci.. code-block:: none 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_ci / # v4l2-ctl -d /dev/radio0 --all -L 5662306a36Sopenharmony_ci Driver Info: 5762306a36Sopenharmony_ci Driver name : radio-si4713 5862306a36Sopenharmony_ci Card type : Silicon Labs Si4713 Modulator 5962306a36Sopenharmony_ci Bus info : 6062306a36Sopenharmony_ci Driver version: 0 6162306a36Sopenharmony_ci Capabilities : 0x00080800 6262306a36Sopenharmony_ci RDS Output 6362306a36Sopenharmony_ci Modulator 6462306a36Sopenharmony_ci Audio output: 0 (FM Modulator Audio Out) 6562306a36Sopenharmony_ci Frequency: 1408000 (88.000000 MHz) 6662306a36Sopenharmony_ci Video Standard = 0x00000000 6762306a36Sopenharmony_ci Modulator: 6862306a36Sopenharmony_ci Name : FM Modulator 6962306a36Sopenharmony_ci Capabilities : 62.5 Hz stereo rds 7062306a36Sopenharmony_ci Frequency range : 76.0 MHz - 108.0 MHz 7162306a36Sopenharmony_ci Subchannel modulation: stereo+rds 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_ci User Controls 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_ci mute (bool) : default=1 value=0 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci FM Radio Modulator Controls 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_ci rds_signal_deviation (int) : min=0 max=90000 step=10 default=200 value=200 flags=slider 8062306a36Sopenharmony_ci rds_program_id (int) : min=0 max=65535 step=1 default=0 value=0 8162306a36Sopenharmony_ci rds_program_type (int) : min=0 max=31 step=1 default=0 value=0 8262306a36Sopenharmony_ci rds_ps_name (str) : min=0 max=96 step=8 value='si4713 ' 8362306a36Sopenharmony_ci rds_radio_text (str) : min=0 max=384 step=32 value='' 8462306a36Sopenharmony_ci audio_limiter_feature_enabled (bool) : default=1 value=1 8562306a36Sopenharmony_ci audio_limiter_release_time (int) : min=250 max=102390 step=50 default=5010 value=5010 flags=slider 8662306a36Sopenharmony_ci audio_limiter_deviation (int) : min=0 max=90000 step=10 default=66250 value=66250 flags=slider 8762306a36Sopenharmony_ci audio_compression_feature_enabl (bool) : default=1 value=1 8862306a36Sopenharmony_ci audio_compression_gain (int) : min=0 max=20 step=1 default=15 value=15 flags=slider 8962306a36Sopenharmony_ci audio_compression_threshold (int) : min=-40 max=0 step=1 default=-40 value=-40 flags=slider 9062306a36Sopenharmony_ci audio_compression_attack_time (int) : min=0 max=5000 step=500 default=0 value=0 flags=slider 9162306a36Sopenharmony_ci audio_compression_release_time (int) : min=100000 max=1000000 step=100000 default=1000000 value=1000000 flags=slider 9262306a36Sopenharmony_ci pilot_tone_feature_enabled (bool) : default=1 value=1 9362306a36Sopenharmony_ci pilot_tone_deviation (int) : min=0 max=90000 step=10 default=6750 value=6750 flags=slider 9462306a36Sopenharmony_ci pilot_tone_frequency (int) : min=0 max=19000 step=1 default=19000 value=19000 flags=slider 9562306a36Sopenharmony_ci pre_emphasis_settings (menu) : min=0 max=2 default=1 value=1 9662306a36Sopenharmony_ci tune_power_level (int) : min=0 max=120 step=1 default=88 value=88 flags=slider 9762306a36Sopenharmony_ci tune_antenna_capacitor (int) : min=0 max=191 step=1 default=0 value=110 flags=slider 9862306a36Sopenharmony_ci 9962306a36Sopenharmony_ciHere is a summary of them: 10062306a36Sopenharmony_ci 10162306a36Sopenharmony_ci* Pilot is an audible tone sent by the device. 10262306a36Sopenharmony_ci 10362306a36Sopenharmony_ci- pilot_frequency - Configures the frequency of the stereo pilot tone. 10462306a36Sopenharmony_ci- pilot_deviation - Configures pilot tone frequency deviation level. 10562306a36Sopenharmony_ci- pilot_enabled - Enables or disables the pilot tone feature. 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_ci* The si4713 device is capable of applying audio compression to the 10862306a36Sopenharmony_ci transmitted signal. 10962306a36Sopenharmony_ci 11062306a36Sopenharmony_ci- acomp_enabled - Enables or disables the audio dynamic range control feature. 11162306a36Sopenharmony_ci- acomp_gain - Sets the gain for audio dynamic range control. 11262306a36Sopenharmony_ci- acomp_threshold - Sets the threshold level for audio dynamic range control. 11362306a36Sopenharmony_ci- acomp_attack_time - Sets the attack time for audio dynamic range control. 11462306a36Sopenharmony_ci- acomp_release_time - Sets the release time for audio dynamic range control. 11562306a36Sopenharmony_ci 11662306a36Sopenharmony_ci* Limiter setups audio deviation limiter feature. Once a over deviation occurs, 11762306a36Sopenharmony_ci it is possible to adjust the front-end gain of the audio input and always 11862306a36Sopenharmony_ci prevent over deviation. 11962306a36Sopenharmony_ci 12062306a36Sopenharmony_ci- limiter_enabled - Enables or disables the limiter feature. 12162306a36Sopenharmony_ci- limiter_deviation - Configures audio frequency deviation level. 12262306a36Sopenharmony_ci- limiter_release_time - Sets the limiter release time. 12362306a36Sopenharmony_ci 12462306a36Sopenharmony_ci* Tuning power 12562306a36Sopenharmony_ci 12662306a36Sopenharmony_ci- power_level - Sets the output power level for signal transmission. 12762306a36Sopenharmony_ci antenna_capacitor - This selects the value of antenna tuning capacitor 12862306a36Sopenharmony_ci manually or automatically if set to zero. 12962306a36Sopenharmony_ci 13062306a36Sopenharmony_ci* RDS related 13162306a36Sopenharmony_ci 13262306a36Sopenharmony_ci- rds_ps_name - Sets the RDS ps name field for transmission. 13362306a36Sopenharmony_ci- rds_radio_text - Sets the RDS radio text for transmission. 13462306a36Sopenharmony_ci- rds_pi - Sets the RDS PI field for transmission. 13562306a36Sopenharmony_ci- rds_pty - Sets the RDS PTY field for transmission. 13662306a36Sopenharmony_ci 13762306a36Sopenharmony_ci* Region related 13862306a36Sopenharmony_ci 13962306a36Sopenharmony_ci- preemphasis - sets the preemphasis to be applied for transmission. 14062306a36Sopenharmony_ci 14162306a36Sopenharmony_ciRNL 14262306a36Sopenharmony_ci--- 14362306a36Sopenharmony_ci 14462306a36Sopenharmony_ciThis device also has an interface to measure received noise level. To do that, you should 14562306a36Sopenharmony_ciioctl the device node. Here is an code of example: 14662306a36Sopenharmony_ci 14762306a36Sopenharmony_ci.. code-block:: none 14862306a36Sopenharmony_ci 14962306a36Sopenharmony_ci int main (int argc, char *argv[]) 15062306a36Sopenharmony_ci { 15162306a36Sopenharmony_ci struct si4713_rnl rnl; 15262306a36Sopenharmony_ci int fd = open("/dev/radio0", O_RDWR); 15362306a36Sopenharmony_ci int rval; 15462306a36Sopenharmony_ci 15562306a36Sopenharmony_ci if (argc < 2) 15662306a36Sopenharmony_ci return -EINVAL; 15762306a36Sopenharmony_ci 15862306a36Sopenharmony_ci if (fd < 0) 15962306a36Sopenharmony_ci return fd; 16062306a36Sopenharmony_ci 16162306a36Sopenharmony_ci sscanf(argv[1], "%d", &rnl.frequency); 16262306a36Sopenharmony_ci 16362306a36Sopenharmony_ci rval = ioctl(fd, SI4713_IOC_MEASURE_RNL, &rnl); 16462306a36Sopenharmony_ci if (rval < 0) 16562306a36Sopenharmony_ci return rval; 16662306a36Sopenharmony_ci 16762306a36Sopenharmony_ci printf("received noise level: %d\n", rnl.rnl); 16862306a36Sopenharmony_ci 16962306a36Sopenharmony_ci close(fd); 17062306a36Sopenharmony_ci } 17162306a36Sopenharmony_ci 17262306a36Sopenharmony_ciThe struct si4713_rnl and SI4713_IOC_MEASURE_RNL are defined under 17362306a36Sopenharmony_ciinclude/linux/platform_data/media/si4713.h. 17462306a36Sopenharmony_ci 17562306a36Sopenharmony_ciStereo/Mono and RDS subchannels 17662306a36Sopenharmony_ci------------------------------- 17762306a36Sopenharmony_ci 17862306a36Sopenharmony_ciThe device can also be configured using the available sub channels for 17962306a36Sopenharmony_citransmission. To do that use S/G_MODULATOR ioctl and configure txsubchans properly. 18062306a36Sopenharmony_ciRefer to the V4L2 API specification for proper use of this ioctl. 18162306a36Sopenharmony_ci 18262306a36Sopenharmony_ciTesting 18362306a36Sopenharmony_ci------- 18462306a36Sopenharmony_ciTesting is usually done with v4l2-ctl utility for managing FM tuner cards. 18562306a36Sopenharmony_ciThe tool can be found in v4l-dvb repository under v4l2-apps/util directory. 18662306a36Sopenharmony_ci 18762306a36Sopenharmony_ciExample for setting rds ps name: 18862306a36Sopenharmony_ci 18962306a36Sopenharmony_ci.. code-block:: none 19062306a36Sopenharmony_ci 19162306a36Sopenharmony_ci # v4l2-ctl -d /dev/radio0 --set-ctrl=rds_ps_name="Dummy" 19262306a36Sopenharmony_ci 193