mirror of https://github.com/Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
126 lines
4.2 KiB
126 lines
4.2 KiB
.. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later |
|
|
|
.. _frontend-properties: |
|
|
|
************** |
|
Property types |
|
************** |
|
|
|
Tuning into a Digital TV physical channel and starting decoding it |
|
requires changing a set of parameters, in order to control the tuner, |
|
the demodulator, the Linear Low-noise Amplifier (LNA) and to set the |
|
antenna subsystem via Satellite Equipment Control - SEC (on satellite |
|
systems). The actual parameters are specific to each particular digital |
|
TV standards, and may change as the digital TV specs evolves. |
|
|
|
In the past (up to DVB API version 3 - DVBv3), the strategy used was to have a |
|
union with the parameters needed to tune for DVB-S, DVB-C, DVB-T and |
|
ATSC delivery systems grouped there. The problem is that, as the second |
|
generation standards appeared, the size of such union was not big |
|
enough to group the structs that would be required for those new |
|
standards. Also, extending it would break userspace. |
|
|
|
So, the legacy union/struct based approach was deprecated, in favor |
|
of a properties set approach. On such approach, |
|
:ref:`FE_GET_PROPERTY and FE_SET_PROPERTY <FE_GET_PROPERTY>` are used |
|
to setup the frontend and read its status. |
|
|
|
The actual action is determined by a set of dtv_property cmd/data pairs. |
|
With one single ioctl, is possible to get/set up to 64 properties. |
|
|
|
This section describes the new and recommended way to set the frontend, |
|
with supports all digital TV delivery systems. |
|
|
|
.. note:: |
|
|
|
1. On Linux DVB API version 3, setting a frontend was done via |
|
struct :c:type:`dvb_frontend_parameters`. |
|
|
|
2. Don't use DVB API version 3 calls on hardware with supports |
|
newer standards. Such API provides no support or a very limited |
|
support to new standards and/or new hardware. |
|
|
|
3. Nowadays, most frontends support multiple delivery systems. |
|
Only with DVB API version 5 calls it is possible to switch between |
|
the multiple delivery systems supported by a frontend. |
|
|
|
4. DVB API version 5 is also called *S2API*, as the first |
|
new standard added to it was DVB-S2. |
|
|
|
**Example**: in order to set the hardware to tune into a DVB-C channel |
|
at 651 kHz, modulated with 256-QAM, FEC 3/4 and symbol rate of 5.217 |
|
Mbauds, those properties should be sent to |
|
:ref:`FE_SET_PROPERTY <FE_GET_PROPERTY>` ioctl: |
|
|
|
:ref:`DTV_DELIVERY_SYSTEM <DTV-DELIVERY-SYSTEM>` = SYS_DVBC_ANNEX_A |
|
|
|
:ref:`DTV_FREQUENCY <DTV-FREQUENCY>` = 651000000 |
|
|
|
:ref:`DTV_MODULATION <DTV-MODULATION>` = QAM_256 |
|
|
|
:ref:`DTV_INVERSION <DTV-INVERSION>` = INVERSION_AUTO |
|
|
|
:ref:`DTV_SYMBOL_RATE <DTV-SYMBOL-RATE>` = 5217000 |
|
|
|
:ref:`DTV_INNER_FEC <DTV-INNER-FEC>` = FEC_3_4 |
|
|
|
:ref:`DTV_TUNE <DTV-TUNE>` |
|
|
|
The code that would that would do the above is show in |
|
:ref:`dtv-prop-example`. |
|
|
|
.. code-block:: c |
|
:caption: Example: Setting digital TV frontend properties |
|
:name: dtv-prop-example |
|
|
|
#include <stdio.h> |
|
#include <fcntl.h> |
|
#include <sys/ioctl.h> |
|
#include <linux/dvb/frontend.h> |
|
|
|
static struct dtv_property props[] = { |
|
{ .cmd = DTV_DELIVERY_SYSTEM, .u.data = SYS_DVBC_ANNEX_A }, |
|
{ .cmd = DTV_FREQUENCY, .u.data = 651000000 }, |
|
{ .cmd = DTV_MODULATION, .u.data = QAM_256 }, |
|
{ .cmd = DTV_INVERSION, .u.data = INVERSION_AUTO }, |
|
{ .cmd = DTV_SYMBOL_RATE, .u.data = 5217000 }, |
|
{ .cmd = DTV_INNER_FEC, .u.data = FEC_3_4 }, |
|
{ .cmd = DTV_TUNE } |
|
}; |
|
|
|
static struct dtv_properties dtv_prop = { |
|
.num = 6, .props = props |
|
}; |
|
|
|
int main(void) |
|
{ |
|
int fd = open("/dev/dvb/adapter0/frontend0", O_RDWR); |
|
|
|
if (!fd) { |
|
perror ("open"); |
|
return -1; |
|
} |
|
if (ioctl(fd, FE_SET_PROPERTY, &dtv_prop) == -1) { |
|
perror("ioctl"); |
|
return -1; |
|
} |
|
printf("Frontend set\\n"); |
|
return 0; |
|
} |
|
|
|
.. attention:: While it is possible to directly call the Kernel code like the |
|
above example, it is strongly recommended to use |
|
`libdvbv5 <https://linuxtv.org/docs/libdvbv5/index.html>`__, as it |
|
provides abstraction to work with the supported digital TV standards and |
|
provides methods for usual operations like program scanning and to |
|
read/write channel descriptor files. |
|
|
|
.. toctree:: |
|
:maxdepth: 1 |
|
|
|
fe_property_parameters |
|
frontend-stat-properties |
|
frontend-property-terrestrial-systems |
|
frontend-property-cable-systems |
|
frontend-property-satellite-systems |
|
frontend-header
|
|
|