mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-09-04 20:19:47 +08:00 
			
		
		
		
	 54f38fcae5
			
		
	
	
		54f38fcae5
		
	
	
	
	
		
			
			Since 2017, there is an space reserved for userspace API,
created by changeset 1d596dee38 ("docs: Create a user-space API guide").
As the media subsystem was one of the first subsystems to use
Sphinx, until this patch, we were keeping things on a separate
place.
Let's just use the new location, as having all uAPI altogether
will likely make things easier for developers.
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
		
	
			
		
			
				
	
	
		
			192 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
			
		
		
	
	
			192 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
| .. Permission is granted to copy, distribute and/or modify this
 | |
| .. document under the terms of the GNU Free Documentation License,
 | |
| .. Version 1.1 or any later version published by the Free Software
 | |
| .. Foundation, with no Invariant Sections, no Front-Cover Texts
 | |
| .. and no Back-Cover Texts. A copy of the license is included at
 | |
| .. Documentation/userspace-api/media/fdl-appendix.rst.
 | |
| ..
 | |
| .. TODO: replace it to GFDL-1.1-or-later WITH no-invariant-sections
 | |
| 
 | |
| .. _rds:
 | |
| 
 | |
| *************
 | |
| RDS Interface
 | |
| *************
 | |
| 
 | |
| The Radio Data System transmits supplementary information in binary
 | |
| format, for example the station name or travel information, on an
 | |
| inaudible audio subcarrier of a radio program. This interface is aimed
 | |
| at devices capable of receiving and/or transmitting RDS information.
 | |
| 
 | |
| For more information see the core RDS standard :ref:`iec62106` and the
 | |
| RBDS standard :ref:`nrsc4`.
 | |
| 
 | |
| .. note::
 | |
| 
 | |
|    Note that the RBDS standard as is used in the USA is almost
 | |
|    identical to the RDS standard. Any RDS decoder/encoder can also handle
 | |
|    RBDS. Only some of the fields have slightly different meanings. See the
 | |
|    RBDS standard for more information.
 | |
| 
 | |
| The RBDS standard also specifies support for MMBS (Modified Mobile
 | |
| Search). This is a proprietary format which seems to be discontinued.
 | |
| The RDS interface does not support this format. Should support for MMBS
 | |
| (or the so-called 'E blocks' in general) be needed, then please contact
 | |
| the linux-media mailing list:
 | |
| `https://linuxtv.org/lists.php <https://linuxtv.org/lists.php>`__.
 | |
| 
 | |
| 
 | |
| Querying Capabilities
 | |
| =====================
 | |
| 
 | |
| Devices supporting the RDS capturing API set the
 | |
| ``V4L2_CAP_RDS_CAPTURE`` flag in the ``capabilities`` field of struct
 | |
| :c:type:`v4l2_capability` returned by the
 | |
| :ref:`VIDIOC_QUERYCAP` ioctl. Any tuner that
 | |
| supports RDS will set the ``V4L2_TUNER_CAP_RDS`` flag in the
 | |
| ``capability`` field of struct :c:type:`v4l2_tuner`. If the
 | |
| driver only passes RDS blocks without interpreting the data the
 | |
| ``V4L2_TUNER_CAP_RDS_BLOCK_IO`` flag has to be set, see
 | |
| :ref:`Reading RDS data <reading-rds-data>`. For future use the flag
 | |
| ``V4L2_TUNER_CAP_RDS_CONTROLS`` has also been defined. However, a driver
 | |
| for a radio tuner with this capability does not yet exist, so if you are
 | |
| planning to write such a driver you should discuss this on the
 | |
| linux-media mailing list:
 | |
| `https://linuxtv.org/lists.php <https://linuxtv.org/lists.php>`__.
 | |
| 
 | |
| Whether an RDS signal is present can be detected by looking at the
 | |
| ``rxsubchans`` field of struct :c:type:`v4l2_tuner`: the
 | |
| ``V4L2_TUNER_SUB_RDS`` will be set if RDS data was detected.
 | |
| 
 | |
| Devices supporting the RDS output API set the ``V4L2_CAP_RDS_OUTPUT``
 | |
| flag in the ``capabilities`` field of struct
 | |
| :c:type:`v4l2_capability` returned by the
 | |
| :ref:`VIDIOC_QUERYCAP` ioctl. Any modulator that
 | |
| supports RDS will set the ``V4L2_TUNER_CAP_RDS`` flag in the
 | |
| ``capability`` field of struct
 | |
| :c:type:`v4l2_modulator`. In order to enable the RDS
 | |
| transmission one must set the ``V4L2_TUNER_SUB_RDS`` bit in the
 | |
| ``txsubchans`` field of struct
 | |
| :c:type:`v4l2_modulator`. If the driver only passes RDS
 | |
| blocks without interpreting the data the ``V4L2_TUNER_CAP_RDS_BLOCK_IO``
 | |
| flag has to be set. If the tuner is capable of handling RDS entities
 | |
| like program identification codes and radio text, the flag
 | |
| ``V4L2_TUNER_CAP_RDS_CONTROLS`` should be set, see
 | |
| :ref:`Writing RDS data <writing-rds-data>` and
 | |
| :ref:`FM Transmitter Control Reference <fm-tx-controls>`.
 | |
| 
 | |
| 
 | |
| .. _reading-rds-data:
 | |
| 
 | |
| Reading RDS data
 | |
| ================
 | |
| 
 | |
| RDS data can be read from the radio device with the
 | |
| :ref:`read() <func-read>` function. The data is packed in groups of
 | |
| three bytes.
 | |
| 
 | |
| 
 | |
| .. _writing-rds-data:
 | |
| 
 | |
| Writing RDS data
 | |
| ================
 | |
| 
 | |
| RDS data can be written to the radio device with the
 | |
| :ref:`write() <func-write>` function. The data is packed in groups of
 | |
| three bytes, as follows:
 | |
| 
 | |
| 
 | |
| RDS datastructures
 | |
| ==================
 | |
| 
 | |
| 
 | |
| .. c:type:: v4l2_rds_data
 | |
| 
 | |
| .. tabularcolumns:: |p{2.5cm}|p{2.5cm}|p{12.5cm}|
 | |
| 
 | |
| .. flat-table:: struct v4l2_rds_data
 | |
|     :header-rows:  0
 | |
|     :stub-columns: 0
 | |
|     :widths:       1 1 5
 | |
| 
 | |
|     * - __u8
 | |
|       - ``lsb``
 | |
|       - Least Significant Byte of RDS Block
 | |
|     * - __u8
 | |
|       - ``msb``
 | |
|       - Most Significant Byte of RDS Block
 | |
|     * - __u8
 | |
|       - ``block``
 | |
|       - Block description
 | |
| 
 | |
| 
 | |
| 
 | |
| .. _v4l2-rds-block:
 | |
| 
 | |
| .. tabularcolumns:: |p{2.9cm}|p{14.6cm}|
 | |
| 
 | |
| .. flat-table:: Block description
 | |
|     :header-rows:  0
 | |
|     :stub-columns: 0
 | |
|     :widths:       1 5
 | |
| 
 | |
|     * - Bits 0-2
 | |
|       - Block (aka offset) of the received data.
 | |
|     * - Bits 3-5
 | |
|       - Deprecated. Currently identical to bits 0-2. Do not use these
 | |
| 	bits.
 | |
|     * - Bit 6
 | |
|       - Corrected bit. Indicates that an error was corrected for this data
 | |
| 	block.
 | |
|     * - Bit 7
 | |
|       - Error bit. Indicates that an uncorrectable error occurred during
 | |
| 	reception of this block.
 | |
| 
 | |
| 
 | |
| 
 | |
| .. _v4l2-rds-block-codes:
 | |
| 
 | |
| .. tabularcolumns:: |p{6.4cm}|p{2.0cm}|p{1.2cm}|p{7.9cm}|
 | |
| 
 | |
| .. flat-table:: Block defines
 | |
|     :header-rows:  0
 | |
|     :stub-columns: 0
 | |
|     :widths:       1 1 1 5
 | |
| 
 | |
|     * - V4L2_RDS_BLOCK_MSK
 | |
|       -
 | |
|       - 7
 | |
|       - Mask for bits 0-2 to get the block ID.
 | |
|     * - V4L2_RDS_BLOCK_A
 | |
|       -
 | |
|       - 0
 | |
|       - Block A.
 | |
|     * - V4L2_RDS_BLOCK_B
 | |
|       -
 | |
|       - 1
 | |
|       - Block B.
 | |
|     * - V4L2_RDS_BLOCK_C
 | |
|       -
 | |
|       - 2
 | |
|       - Block C.
 | |
|     * - V4L2_RDS_BLOCK_D
 | |
|       -
 | |
|       - 3
 | |
|       - Block D.
 | |
|     * - V4L2_RDS_BLOCK_C_ALT
 | |
|       -
 | |
|       - 4
 | |
|       - Block C'.
 | |
|     * - V4L2_RDS_BLOCK_INVALID
 | |
|       - read-only
 | |
|       - 7
 | |
|       - An invalid block.
 | |
|     * - V4L2_RDS_BLOCK_CORRECTED
 | |
|       - read-only
 | |
|       - 0x40
 | |
|       - A bit error was detected but corrected.
 | |
|     * - V4L2_RDS_BLOCK_ERROR
 | |
|       - read-only
 | |
|       - 0x80
 | |
|       - An uncorrectable error occurred.
 |