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