xref: /OK3568_Linux_fs/kernel/Documentation/admin-guide/media/si4713.rst (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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