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