Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

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