.. SPDX-License-Identifier: GPL-2.0

.. include:: <isonum.txt>

The Silicon Labs Si4713 FM Radio Transmitter Driver
===================================================

Copyright |copy| 2009 Nokia Corporation

Contact: Eduardo Valentin <eduardo.valentin@nokia.com>


Information about the Device
----------------------------

This chip is a Silicon Labs product. It is a I2C device, currently on 0x63 address.
Basically, it has transmission and signal noise level measurement features.

The Si4713 integrates transmit functions for FM broadcast stereo transmission.
The chip also allows integrated receive power scanning to identify low signal
power FM channels.

The chip is programmed using commands and responses. There are also several
properties which can change the behavior of this chip.

Users must comply with local regulations on radio frequency (RF) transmission.

Device driver description
-------------------------

There are two modules to handle this device. One is a I2C device driver
and the other is a platform driver.

The I2C device driver exports a v4l2-subdev interface to the kernel.
All properties can also be accessed by v4l2 extended controls interface, by
using the v4l2-subdev calls (g_ext_ctrls, s_ext_ctrls).

The platform device driver exports a v4l2 radio device interface to user land.
So, it uses the I2C device driver as a sub device in order to send the user
commands to the actual device. Basically it is a wrapper to the I2C device driver.

Applications can use v4l2 radio API to specify frequency of operation, mute state,
etc. But mostly of its properties will be present in the extended controls.

When the v4l2 mute property is set to 1 (true), the driver will turn the chip off.

Properties description
----------------------

The properties can be accessed using v4l2 extended controls.
Here is an output from v4l2-ctl util:

.. code-block:: none

	/ # 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

Here is a summary of them:

* Pilot is an audible tone sent by the device.

- pilot_frequency - Configures the frequency of the stereo pilot tone.
- pilot_deviation - Configures pilot tone frequency deviation level.
- pilot_enabled - Enables or disables the pilot tone feature.

* The si4713 device is capable of applying audio compression to the
  transmitted signal.

- acomp_enabled - Enables or disables the audio dynamic range control feature.
- acomp_gain - Sets the gain for audio dynamic range control.
- acomp_threshold - Sets the threshold level for audio dynamic range control.
- acomp_attack_time - Sets the attack time for audio dynamic range control.
- acomp_release_time - Sets the release time for audio dynamic range control.

* Limiter setups audio deviation limiter feature. Once a over deviation occurs,
  it is possible to adjust the front-end gain of the audio input and always
  prevent over deviation.

- limiter_enabled - Enables or disables the limiter feature.
- limiter_deviation - Configures audio frequency deviation level.
- limiter_release_time - Sets the limiter release time.

* Tuning power

- power_level - Sets the output power level for signal transmission.
  antenna_capacitor - This selects the value of antenna tuning capacitor
  manually or automatically if set to zero.

* RDS related

- rds_ps_name - Sets the RDS ps name field for transmission.
- rds_radio_text - Sets the RDS radio text for transmission.
- rds_pi - Sets the RDS PI field for transmission.
- rds_pty - Sets the RDS PTY field for transmission.

* Region related

- preemphasis - sets the preemphasis to be applied for transmission.

RNL
---

This device also has an interface to measure received noise level. To do that, you should
ioctl the device node. Here is an code of example:

.. code-block:: none

	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);
	}

The struct si4713_rnl and SI4713_IOC_MEASURE_RNL are defined under
include/linux/platform_data/media/si4713.h.

Stereo/Mono and RDS subchannels
-------------------------------

The device can also be configured using the available sub channels for
transmission. To do that use S/G_MODULATOR ioctl and configure txsubchans properly.
Refer to the V4L2 API specification for proper use of this ioctl.

Testing
-------
Testing is usually done with v4l2-ctl utility for managing FM tuner cards.
The tool can be found in v4l-dvb repository under v4l2-apps/util directory.

Example for setting rds ps name:

.. code-block:: none

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

