mirror of
https://github.com/AetherDroid/android_kernel_samsung_on5xelte.git
synced 2025-09-08 17:18:05 -04:00
Fixed MTP to work with TWRP
This commit is contained in:
commit
f6dfaef42e
50820 changed files with 20846062 additions and 0 deletions
1314
Documentation/DocBook/media/dvb/audio.xml
Normal file
1314
Documentation/DocBook/media/dvb/audio.xml
Normal file
File diff suppressed because it is too large
Load diff
582
Documentation/DocBook/media/dvb/ca.xml
Normal file
582
Documentation/DocBook/media/dvb/ca.xml
Normal file
|
@ -0,0 +1,582 @@
|
|||
<title>DVB CA Device</title>
|
||||
<para>The DVB CA device controls the conditional access hardware. It can be accessed through
|
||||
<emphasis role="tt">/dev/dvb/adapter0/ca0</emphasis>. Data types and and ioctl definitions can be accessed by
|
||||
including <emphasis role="tt">linux/dvb/ca.h</emphasis> in your application.
|
||||
</para>
|
||||
|
||||
<section id="ca_data_types">
|
||||
<title>CA Data Types</title>
|
||||
|
||||
|
||||
<section id="ca-slot-info">
|
||||
<title>ca_slot_info_t</title>
|
||||
<programlisting>
|
||||
typedef struct ca_slot_info {
|
||||
int num; /⋆ slot number ⋆/
|
||||
|
||||
int type; /⋆ CA interface this slot supports ⋆/
|
||||
#define CA_CI 1 /⋆ CI high level interface ⋆/
|
||||
#define CA_CI_LINK 2 /⋆ CI link layer level interface ⋆/
|
||||
#define CA_CI_PHYS 4 /⋆ CI physical layer level interface ⋆/
|
||||
#define CA_DESCR 8 /⋆ built-in descrambler ⋆/
|
||||
#define CA_SC 128 /⋆ simple smart card interface ⋆/
|
||||
|
||||
unsigned int flags;
|
||||
#define CA_CI_MODULE_PRESENT 1 /⋆ module (or card) inserted ⋆/
|
||||
#define CA_CI_MODULE_READY 2
|
||||
} ca_slot_info_t;
|
||||
</programlisting>
|
||||
|
||||
</section>
|
||||
<section id="ca-descr-info">
|
||||
<title>ca_descr_info_t</title>
|
||||
<programlisting>
|
||||
typedef struct ca_descr_info {
|
||||
unsigned int num; /⋆ number of available descramblers (keys) ⋆/
|
||||
unsigned int type; /⋆ type of supported scrambling system ⋆/
|
||||
#define CA_ECD 1
|
||||
#define CA_NDS 2
|
||||
#define CA_DSS 4
|
||||
} ca_descr_info_t;
|
||||
</programlisting>
|
||||
|
||||
</section>
|
||||
<section id="ca-caps">
|
||||
<title>ca_caps_t</title>
|
||||
<programlisting>
|
||||
typedef struct ca_caps {
|
||||
unsigned int slot_num; /⋆ total number of CA card and module slots ⋆/
|
||||
unsigned int slot_type; /⋆ OR of all supported types ⋆/
|
||||
unsigned int descr_num; /⋆ total number of descrambler slots (keys) ⋆/
|
||||
unsigned int descr_type;/⋆ OR of all supported types ⋆/
|
||||
} ca_cap_t;
|
||||
</programlisting>
|
||||
|
||||
</section>
|
||||
<section id="ca-msg">
|
||||
<title>ca_msg_t</title>
|
||||
<programlisting>
|
||||
/⋆ a message to/from a CI-CAM ⋆/
|
||||
typedef struct ca_msg {
|
||||
unsigned int index;
|
||||
unsigned int type;
|
||||
unsigned int length;
|
||||
unsigned char msg[256];
|
||||
} ca_msg_t;
|
||||
</programlisting>
|
||||
|
||||
</section>
|
||||
<section id="ca-descr">
|
||||
<title>ca_descr_t</title>
|
||||
<programlisting>
|
||||
typedef struct ca_descr {
|
||||
unsigned int index;
|
||||
unsigned int parity;
|
||||
unsigned char cw[8];
|
||||
} ca_descr_t;
|
||||
</programlisting>
|
||||
</section>
|
||||
|
||||
<section id="ca-pid">
|
||||
<title>ca-pid</title>
|
||||
<programlisting>
|
||||
typedef struct ca_pid {
|
||||
unsigned int pid;
|
||||
int index; /⋆ -1 == disable⋆/
|
||||
} ca_pid_t;
|
||||
</programlisting>
|
||||
</section></section>
|
||||
|
||||
<section id="ca_function_calls">
|
||||
<title>CA Function Calls</title>
|
||||
|
||||
|
||||
<section id="ca_fopen">
|
||||
<title>open()</title>
|
||||
<para>DESCRIPTION
|
||||
</para>
|
||||
<informaltable><tgroup cols="1"><tbody><row><entry
|
||||
align="char">
|
||||
<para>This system call opens a named ca device (e.g. /dev/ost/ca) for subsequent use.</para>
|
||||
<para>When an open() call has succeeded, the device will be ready for use.
|
||||
The significance of blocking or non-blocking mode is described in the
|
||||
documentation for functions where there is a difference. It does not affect the
|
||||
semantics of the open() call itself. A device opened in blocking mode can later
|
||||
be put into non-blocking mode (and vice versa) using the F_SETFL command
|
||||
of the fcntl system call. This is a standard system call, documented in the Linux
|
||||
manual page for fcntl. Only one user can open the CA Device in O_RDWR
|
||||
mode. All other attempts to open the device in this mode will fail, and an error
|
||||
code will be returned.</para>
|
||||
</entry>
|
||||
</row></tbody></tgroup></informaltable>
|
||||
<para>SYNOPSIS
|
||||
</para>
|
||||
<informaltable><tgroup cols="1"><tbody><row><entry
|
||||
align="char">
|
||||
<para>int open(const char ⋆deviceName, int flags);</para>
|
||||
</entry>
|
||||
</row></tbody></tgroup></informaltable>
|
||||
<para>PARAMETERS
|
||||
</para>
|
||||
<informaltable><tgroup cols="2"><tbody><row><entry
|
||||
align="char">
|
||||
<para>const char
|
||||
*deviceName</para>
|
||||
</entry><entry
|
||||
align="char">
|
||||
<para>Name of specific video device.</para>
|
||||
</entry>
|
||||
</row><row><entry
|
||||
align="char">
|
||||
<para>int flags</para>
|
||||
</entry><entry
|
||||
align="char">
|
||||
<para>A bit-wise OR of the following flags:</para>
|
||||
</entry>
|
||||
</row><row><entry
|
||||
align="char">
|
||||
</entry><entry
|
||||
align="char">
|
||||
<para>O_RDONLY read-only access</para>
|
||||
</entry>
|
||||
</row><row><entry
|
||||
align="char">
|
||||
</entry><entry
|
||||
align="char">
|
||||
<para>O_RDWR read/write access</para>
|
||||
</entry>
|
||||
</row><row><entry
|
||||
align="char">
|
||||
</entry><entry
|
||||
align="char">
|
||||
<para>O_NONBLOCK open in non-blocking mode</para>
|
||||
</entry>
|
||||
</row><row><entry
|
||||
align="char">
|
||||
</entry><entry
|
||||
align="char">
|
||||
<para>(blocking mode is the default)</para>
|
||||
</entry>
|
||||
</row></tbody></tgroup></informaltable>
|
||||
<para>RETURN VALUE</para>
|
||||
<informaltable><tgroup cols="2"><tbody><row><entry
|
||||
align="char">
|
||||
<para>ENODEV</para>
|
||||
</entry><entry
|
||||
align="char">
|
||||
<para>Device driver not loaded/available.</para>
|
||||
</entry>
|
||||
</row><row><entry
|
||||
align="char">
|
||||
<para>EINTERNAL</para>
|
||||
</entry><entry
|
||||
align="char">
|
||||
<para>Internal error.</para>
|
||||
</entry>
|
||||
</row><row><entry
|
||||
align="char">
|
||||
<para>EBUSY</para>
|
||||
</entry><entry
|
||||
align="char">
|
||||
<para>Device or resource busy.</para>
|
||||
</entry>
|
||||
</row><row><entry
|
||||
align="char">
|
||||
<para>EINVAL</para>
|
||||
</entry><entry
|
||||
align="char">
|
||||
<para>Invalid argument.</para>
|
||||
</entry>
|
||||
</row></tbody></tgroup></informaltable>
|
||||
|
||||
</section>
|
||||
<section id="ca_fclose">
|
||||
<title>close()</title>
|
||||
<para>DESCRIPTION
|
||||
</para>
|
||||
<informaltable><tgroup cols="1"><tbody><row><entry
|
||||
align="char">
|
||||
<para>This system call closes a previously opened audio device.</para>
|
||||
</entry>
|
||||
</row></tbody></tgroup></informaltable>
|
||||
<para>SYNOPSIS
|
||||
</para>
|
||||
<informaltable><tgroup cols="1"><tbody><row><entry
|
||||
align="char">
|
||||
<para>int close(int fd);</para>
|
||||
</entry>
|
||||
</row></tbody></tgroup></informaltable>
|
||||
<para>PARAMETERS
|
||||
</para>
|
||||
<informaltable><tgroup cols="2"><tbody><row><entry
|
||||
align="char">
|
||||
<para>int fd</para>
|
||||
</entry><entry
|
||||
align="char">
|
||||
<para>File descriptor returned by a previous call to open().</para>
|
||||
</entry>
|
||||
</row></tbody></tgroup></informaltable>
|
||||
<para>RETURN VALUE</para>
|
||||
<informaltable><tgroup cols="2"><tbody><row><entry
|
||||
align="char">
|
||||
<para>EBADF</para>
|
||||
</entry><entry
|
||||
align="char">
|
||||
<para>fd is not a valid open file descriptor.</para>
|
||||
</entry>
|
||||
</row></tbody></tgroup></informaltable>
|
||||
</section>
|
||||
|
||||
<section id="CA_RESET"
|
||||
role="subsection"><title>CA_RESET</title>
|
||||
<para>DESCRIPTION
|
||||
</para>
|
||||
<informaltable><tgroup cols="1"><tbody><row><entry
|
||||
align="char">
|
||||
<para>This ioctl is undocumented. Documentation is welcome.</para>
|
||||
</entry>
|
||||
</row></tbody></tgroup></informaltable>
|
||||
<para>SYNOPSIS
|
||||
</para>
|
||||
<informaltable><tgroup cols="1"><tbody><row><entry
|
||||
align="char">
|
||||
<para>int ioctl(fd, int request = CA_RESET);
|
||||
</para>
|
||||
</entry>
|
||||
</row></tbody></tgroup></informaltable>
|
||||
<para>PARAMETERS
|
||||
</para>
|
||||
<informaltable><tgroup cols="2"><tbody><row><entry
|
||||
align="char">
|
||||
<para>int fd</para>
|
||||
</entry><entry
|
||||
align="char">
|
||||
<para>File descriptor returned by a previous call to open().</para>
|
||||
</entry>
|
||||
</row><row><entry
|
||||
align="char">
|
||||
<para>int request</para>
|
||||
</entry><entry
|
||||
align="char">
|
||||
<para>Equals CA_RESET for this command.</para>
|
||||
</entry>
|
||||
</row></tbody></tgroup></informaltable>
|
||||
&return-value-dvb;
|
||||
</section>
|
||||
|
||||
<section id="CA_GET_CAP"
|
||||
role="subsection"><title>CA_GET_CAP</title>
|
||||
<para>DESCRIPTION
|
||||
</para>
|
||||
<informaltable><tgroup cols="1"><tbody><row><entry
|
||||
align="char">
|
||||
<para>This ioctl is undocumented. Documentation is welcome.</para>
|
||||
</entry>
|
||||
</row></tbody></tgroup></informaltable>
|
||||
<para>SYNOPSIS
|
||||
</para>
|
||||
<informaltable><tgroup cols="1"><tbody><row><entry
|
||||
align="char">
|
||||
<para>int ioctl(fd, int request = CA_GET_CAP,
|
||||
ca_caps_t *);</para>
|
||||
</entry>
|
||||
</row></tbody></tgroup></informaltable>
|
||||
<para>PARAMETERS
|
||||
</para>
|
||||
<informaltable><tgroup cols="2"><tbody><row><entry
|
||||
align="char">
|
||||
<para>int fd</para>
|
||||
</entry><entry
|
||||
align="char">
|
||||
<para>File descriptor returned by a previous call to open().</para>
|
||||
</entry>
|
||||
</row><row><entry
|
||||
align="char">
|
||||
<para>int request</para>
|
||||
</entry><entry
|
||||
align="char">
|
||||
<para>Equals CA_GET_CAP for this command.</para>
|
||||
</entry>
|
||||
</row><row><entry
|
||||
align="char">
|
||||
<para>ca_caps_t *
|
||||
</para>
|
||||
</entry><entry
|
||||
align="char">
|
||||
<para>Undocumented.</para>
|
||||
</entry>
|
||||
</row></tbody></tgroup></informaltable>
|
||||
&return-value-dvb;
|
||||
</section>
|
||||
|
||||
<section id="CA_GET_SLOT_INFO"
|
||||
role="subsection"><title>CA_GET_SLOT_INFO</title>
|
||||
<para>DESCRIPTION
|
||||
</para>
|
||||
<informaltable><tgroup cols="1"><tbody><row><entry
|
||||
align="char">
|
||||
<para>This ioctl is undocumented. Documentation is welcome.</para>
|
||||
</entry>
|
||||
</row></tbody></tgroup></informaltable>
|
||||
<para>SYNOPSIS
|
||||
</para>
|
||||
<informaltable><tgroup cols="1"><tbody><row><entry
|
||||
align="char">
|
||||
<para>int ioctl(fd, int request = CA_GET_SLOT_INFO,
|
||||
ca_slot_info_t *);</para>
|
||||
</entry>
|
||||
</row></tbody></tgroup></informaltable>
|
||||
<para>PARAMETERS
|
||||
</para>
|
||||
<informaltable><tgroup cols="2"><tbody><row><entry
|
||||
align="char">
|
||||
<para>int fd</para>
|
||||
</entry><entry
|
||||
align="char">
|
||||
<para>File descriptor returned by a previous call to open().</para>
|
||||
</entry>
|
||||
</row><row><entry
|
||||
align="char">
|
||||
<para>int request</para>
|
||||
</entry><entry
|
||||
align="char">
|
||||
<para>Equals CA_GET_SLOT_INFO for this command.</para>
|
||||
</entry>
|
||||
</row><row><entry
|
||||
align="char">
|
||||
<para>ca_slot_info_t *
|
||||
</para>
|
||||
</entry><entry
|
||||
align="char">
|
||||
<para>Undocumented.</para>
|
||||
</entry>
|
||||
</row></tbody></tgroup></informaltable>
|
||||
&return-value-dvb;
|
||||
</section>
|
||||
|
||||
<section id="CA_GET_DESCR_INFO"
|
||||
role="subsection"><title>CA_GET_DESCR_INFO</title>
|
||||
<para>DESCRIPTION
|
||||
</para>
|
||||
<informaltable><tgroup cols="1"><tbody><row><entry
|
||||
align="char">
|
||||
<para>This ioctl is undocumented. Documentation is welcome.</para>
|
||||
</entry>
|
||||
</row></tbody></tgroup></informaltable>
|
||||
<para>SYNOPSIS
|
||||
</para>
|
||||
<informaltable><tgroup cols="1"><tbody><row><entry
|
||||
align="char">
|
||||
<para>int ioctl(fd, int request = CA_GET_DESCR_INFO,
|
||||
ca_descr_info_t *);</para>
|
||||
</entry>
|
||||
</row></tbody></tgroup></informaltable>
|
||||
<para>PARAMETERS
|
||||
</para>
|
||||
<informaltable><tgroup cols="2"><tbody><row><entry
|
||||
align="char">
|
||||
<para>int fd</para>
|
||||
</entry><entry
|
||||
align="char">
|
||||
<para>File descriptor returned by a previous call to open().</para>
|
||||
</entry>
|
||||
</row><row><entry
|
||||
align="char">
|
||||
<para>int request</para>
|
||||
</entry><entry
|
||||
align="char">
|
||||
<para>Equals CA_GET_DESCR_INFO for this command.</para>
|
||||
</entry>
|
||||
</row><row><entry
|
||||
align="char">
|
||||
<para>ca_descr_info_t *
|
||||
</para>
|
||||
</entry><entry
|
||||
align="char">
|
||||
<para>Undocumented.</para>
|
||||
</entry>
|
||||
</row></tbody></tgroup></informaltable>
|
||||
&return-value-dvb;
|
||||
</section>
|
||||
|
||||
<section id="CA_GET_MSG"
|
||||
role="subsection"><title>CA_GET_MSG</title>
|
||||
<para>DESCRIPTION
|
||||
</para>
|
||||
<informaltable><tgroup cols="1"><tbody><row><entry
|
||||
align="char">
|
||||
<para>This ioctl is undocumented. Documentation is welcome.</para>
|
||||
</entry>
|
||||
</row></tbody></tgroup></informaltable>
|
||||
<para>SYNOPSIS
|
||||
</para>
|
||||
<informaltable><tgroup cols="1"><tbody><row><entry
|
||||
align="char">
|
||||
<para>int ioctl(fd, int request = CA_GET_MSG,
|
||||
ca_msg_t *);</para>
|
||||
</entry>
|
||||
</row></tbody></tgroup></informaltable>
|
||||
<para>PARAMETERS
|
||||
</para>
|
||||
<informaltable><tgroup cols="2"><tbody><row><entry
|
||||
align="char">
|
||||
<para>int fd</para>
|
||||
</entry><entry
|
||||
align="char">
|
||||
<para>File descriptor returned by a previous call to open().</para>
|
||||
</entry>
|
||||
</row><row><entry
|
||||
align="char">
|
||||
<para>int request</para>
|
||||
</entry><entry
|
||||
align="char">
|
||||
<para>Equals CA_GET_MSG for this command.</para>
|
||||
</entry>
|
||||
</row><row><entry
|
||||
align="char">
|
||||
<para>ca_msg_t *
|
||||
</para>
|
||||
</entry><entry
|
||||
align="char">
|
||||
<para>Undocumented.</para>
|
||||
</entry>
|
||||
</row></tbody></tgroup></informaltable>
|
||||
&return-value-dvb;
|
||||
</section>
|
||||
|
||||
<section id="CA_SEND_MSG"
|
||||
role="subsection"><title>CA_SEND_MSG</title>
|
||||
<para>DESCRIPTION
|
||||
</para>
|
||||
<informaltable><tgroup cols="1"><tbody><row><entry
|
||||
align="char">
|
||||
<para>This ioctl is undocumented. Documentation is welcome.</para>
|
||||
</entry>
|
||||
</row></tbody></tgroup></informaltable>
|
||||
<para>SYNOPSIS
|
||||
</para>
|
||||
<informaltable><tgroup cols="1"><tbody><row><entry
|
||||
align="char">
|
||||
<para>int ioctl(fd, int request = CA_SEND_MSG,
|
||||
ca_msg_t *);</para>
|
||||
</entry>
|
||||
</row></tbody></tgroup></informaltable>
|
||||
<para>PARAMETERS
|
||||
</para>
|
||||
<informaltable><tgroup cols="2"><tbody><row><entry
|
||||
align="char">
|
||||
<para>int fd</para>
|
||||
</entry><entry
|
||||
align="char">
|
||||
<para>File descriptor returned by a previous call to open().</para>
|
||||
</entry>
|
||||
</row><row><entry
|
||||
align="char">
|
||||
<para>int request</para>
|
||||
</entry><entry
|
||||
align="char">
|
||||
<para>Equals CA_SEND_MSG for this command.</para>
|
||||
</entry>
|
||||
</row><row><entry
|
||||
align="char">
|
||||
<para>ca_msg_t *
|
||||
</para>
|
||||
</entry><entry
|
||||
align="char">
|
||||
<para>Undocumented.</para>
|
||||
</entry>
|
||||
</row></tbody></tgroup></informaltable>
|
||||
&return-value-dvb;
|
||||
</section>
|
||||
|
||||
<section id="CA_SET_DESCR"
|
||||
role="subsection"><title>CA_SET_DESCR</title>
|
||||
<para>DESCRIPTION
|
||||
</para>
|
||||
<informaltable><tgroup cols="1"><tbody><row><entry
|
||||
align="char">
|
||||
<para>This ioctl is undocumented. Documentation is welcome.</para>
|
||||
</entry>
|
||||
</row></tbody></tgroup></informaltable>
|
||||
<para>SYNOPSIS
|
||||
</para>
|
||||
<informaltable><tgroup cols="1"><tbody><row><entry
|
||||
align="char">
|
||||
<para>int ioctl(fd, int request = CA_SET_DESCR,
|
||||
ca_descr_t *);</para>
|
||||
</entry>
|
||||
</row></tbody></tgroup></informaltable>
|
||||
<para>PARAMETERS
|
||||
</para>
|
||||
<informaltable><tgroup cols="2"><tbody><row><entry
|
||||
align="char">
|
||||
<para>int fd</para>
|
||||
</entry><entry
|
||||
align="char">
|
||||
<para>File descriptor returned by a previous call to open().</para>
|
||||
</entry>
|
||||
</row><row><entry
|
||||
align="char">
|
||||
<para>int request</para>
|
||||
</entry><entry
|
||||
align="char">
|
||||
<para>Equals CA_SET_DESCR for this command.</para>
|
||||
</entry>
|
||||
</row><row><entry
|
||||
align="char">
|
||||
<para>ca_descr_t *
|
||||
</para>
|
||||
</entry><entry
|
||||
align="char">
|
||||
<para>Undocumented.</para>
|
||||
</entry>
|
||||
</row></tbody></tgroup></informaltable>
|
||||
&return-value-dvb;
|
||||
</section>
|
||||
|
||||
<section id="CA_SET_PID"
|
||||
role="subsection"><title>CA_SET_PID</title>
|
||||
<para>DESCRIPTION
|
||||
</para>
|
||||
<informaltable><tgroup cols="1"><tbody><row><entry
|
||||
align="char">
|
||||
<para>This ioctl is undocumented. Documentation is welcome.</para>
|
||||
</entry>
|
||||
</row></tbody></tgroup></informaltable>
|
||||
<para>SYNOPSIS
|
||||
</para>
|
||||
<informaltable><tgroup cols="1"><tbody><row><entry
|
||||
align="char">
|
||||
<para>int ioctl(fd, int request = CA_SET_PID,
|
||||
ca_pid_t *);</para>
|
||||
</entry>
|
||||
</row></tbody></tgroup></informaltable>
|
||||
<para>PARAMETERS
|
||||
</para>
|
||||
<informaltable><tgroup cols="2"><tbody><row><entry
|
||||
align="char">
|
||||
<para>int fd</para>
|
||||
</entry><entry
|
||||
align="char">
|
||||
<para>File descriptor returned by a previous call to open().</para>
|
||||
</entry>
|
||||
</row><row><entry
|
||||
align="char">
|
||||
<para>int request</para>
|
||||
</entry><entry
|
||||
align="char">
|
||||
<para>Equals CA_SET_PID for this command.</para>
|
||||
</entry>
|
||||
</row><row><entry
|
||||
align="char">
|
||||
<para>ca_pid_t *
|
||||
</para>
|
||||
</entry><entry
|
||||
align="char">
|
||||
<para>Undocumented.</para>
|
||||
</entry>
|
||||
</row></tbody></tgroup></informaltable>
|
||||
&return-value-dvb;
|
||||
</section>
|
||||
|
||||
</section>
|
1145
Documentation/DocBook/media/dvb/demux.xml
Normal file
1145
Documentation/DocBook/media/dvb/demux.xml
Normal file
File diff suppressed because it is too large
Load diff
141
Documentation/DocBook/media/dvb/dvbapi.xml
Normal file
141
Documentation/DocBook/media/dvb/dvbapi.xml
Normal file
|
@ -0,0 +1,141 @@
|
|||
<partinfo>
|
||||
<authorgroup>
|
||||
<author>
|
||||
<firstname>Ralph</firstname>
|
||||
<surname>Metzler</surname>
|
||||
<othername role="mi">J. K.</othername>
|
||||
<affiliation><address><email>rjkm@metzlerbros.de</email></address></affiliation>
|
||||
</author>
|
||||
<author>
|
||||
<firstname>Marcus</firstname>
|
||||
<surname>Metzler</surname>
|
||||
<othername role="mi">O. C.</othername>
|
||||
<affiliation><address><email>rjkm@metzlerbros.de</email></address></affiliation>
|
||||
</author>
|
||||
</authorgroup>
|
||||
<authorgroup>
|
||||
<author>
|
||||
<firstname>Mauro</firstname>
|
||||
<othername role="mi">Carvalho</othername>
|
||||
<surname>Chehab</surname>
|
||||
<affiliation><address><email>m.chehab@samsung.com</email></address></affiliation>
|
||||
<contrib>Ported document to Docbook XML.</contrib>
|
||||
</author>
|
||||
</authorgroup>
|
||||
<copyright>
|
||||
<year>2002</year>
|
||||
<year>2003</year>
|
||||
<holder>Convergence GmbH</holder>
|
||||
</copyright>
|
||||
<copyright>
|
||||
<year>2009-2014</year>
|
||||
<holder>Mauro Carvalho Chehab</holder>
|
||||
</copyright>
|
||||
|
||||
<revhistory>
|
||||
<!-- Put document revisions here, newest first. -->
|
||||
<revision>
|
||||
<revnumber>2.0.4</revnumber>
|
||||
<date>2011-05-06</date>
|
||||
<authorinitials>mcc</authorinitials>
|
||||
<revremark>
|
||||
Add more information about DVB APIv5, better describing the frontend GET/SET props ioctl's.
|
||||
</revremark>
|
||||
</revision>
|
||||
<revision>
|
||||
<revnumber>2.0.3</revnumber>
|
||||
<date>2010-07-03</date>
|
||||
<authorinitials>mcc</authorinitials>
|
||||
<revremark>
|
||||
Add some frontend capabilities flags, present on kernel, but missing at the specs.
|
||||
</revremark>
|
||||
</revision>
|
||||
<revision>
|
||||
<revnumber>2.0.2</revnumber>
|
||||
<date>2009-10-25</date>
|
||||
<authorinitials>mcc</authorinitials>
|
||||
<revremark>
|
||||
documents FE_SET_FRONTEND_TUNE_MODE and FE_DISHETWORK_SEND_LEGACY_CMD ioctls.
|
||||
</revremark>
|
||||
</revision>
|
||||
<revision>
|
||||
<revnumber>2.0.1</revnumber>
|
||||
<date>2009-09-16</date>
|
||||
<authorinitials>mcc</authorinitials>
|
||||
<revremark>
|
||||
Added ISDB-T test originally written by Patrick Boettcher
|
||||
</revremark>
|
||||
</revision>
|
||||
<revision>
|
||||
<revnumber>2.0.0</revnumber>
|
||||
<date>2009-09-06</date>
|
||||
<authorinitials>mcc</authorinitials>
|
||||
<revremark>Conversion from LaTex to DocBook XML. The
|
||||
contents is the same as the original LaTex version.</revremark>
|
||||
</revision>
|
||||
<revision>
|
||||
<revnumber>1.0.0</revnumber>
|
||||
<date>2003-07-24</date>
|
||||
<authorinitials>rjkm</authorinitials>
|
||||
<revremark>Initial revision on LaTEX.</revremark>
|
||||
</revision>
|
||||
</revhistory>
|
||||
</partinfo>
|
||||
|
||||
|
||||
<title>LINUX DVB API</title>
|
||||
<subtitle>Version 5.10</subtitle>
|
||||
<!-- ADD THE CHAPTERS HERE -->
|
||||
<chapter id="dvb_introdution">
|
||||
&sub-intro;
|
||||
</chapter>
|
||||
<chapter id="dvb_frontend">
|
||||
&sub-frontend;
|
||||
</chapter>
|
||||
<chapter id="dvb_demux">
|
||||
&sub-demux;
|
||||
</chapter>
|
||||
<chapter id="dvb_video">
|
||||
&sub-video;
|
||||
</chapter>
|
||||
<chapter id="dvb_audio">
|
||||
&sub-audio;
|
||||
</chapter>
|
||||
<chapter id="dvb_ca">
|
||||
&sub-ca;
|
||||
</chapter>
|
||||
<chapter id="dvb_net">
|
||||
&sub-net;
|
||||
</chapter>
|
||||
<chapter id="dvb_kdapi">
|
||||
&sub-kdapi;
|
||||
</chapter>
|
||||
<chapter id="dvb_examples">
|
||||
&sub-examples;
|
||||
</chapter>
|
||||
<!-- END OF CHAPTERS -->
|
||||
<appendix id="audio_h">
|
||||
<title>DVB Audio Header File</title>
|
||||
&sub-audio-h;
|
||||
</appendix>
|
||||
<appendix id="ca_h">
|
||||
<title>DVB Conditional Access Header File</title>
|
||||
&sub-ca-h;
|
||||
</appendix>
|
||||
<appendix id="dmx_h">
|
||||
<title>DVB Demux Header File</title>
|
||||
&sub-dmx-h;
|
||||
</appendix>
|
||||
<appendix id="frontend_h">
|
||||
<title>DVB Frontend Header File</title>
|
||||
&sub-frontend-h;
|
||||
</appendix>
|
||||
<appendix id="net_h">
|
||||
<title>DVB Network Header File</title>
|
||||
&sub-net-h;
|
||||
</appendix>
|
||||
<appendix id="video_h">
|
||||
<title>DVB Video Header File</title>
|
||||
&sub-video-h;
|
||||
</appendix>
|
||||
|
1317
Documentation/DocBook/media/dvb/dvbproperty.xml
Normal file
1317
Documentation/DocBook/media/dvb/dvbproperty.xml
Normal file
File diff suppressed because it is too large
Load diff
BIN
Documentation/DocBook/media/dvb/dvbstb.pdf
Normal file
BIN
Documentation/DocBook/media/dvb/dvbstb.pdf
Normal file
Binary file not shown.
365
Documentation/DocBook/media/dvb/examples.xml
Normal file
365
Documentation/DocBook/media/dvb/examples.xml
Normal file
|
@ -0,0 +1,365 @@
|
|||
<title>Examples</title>
|
||||
<para>In this section we would like to present some examples for using the DVB API.
|
||||
</para>
|
||||
<para>Maintainer note: This section is out of date. Please refer to the sample programs packaged
|
||||
with the driver distribution from <ulink url="http://linuxtv.org/hg/dvb-apps" />.
|
||||
</para>
|
||||
|
||||
<section id="tuning">
|
||||
<title>Tuning</title>
|
||||
<para>We will start with a generic tuning subroutine that uses the frontend and SEC, as well as
|
||||
the demux devices. The example is given for QPSK tuners, but can easily be adjusted for
|
||||
QAM.
|
||||
</para>
|
||||
<programlisting>
|
||||
#include <sys/ioctl.h>
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
#include <time.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <linux/dvb/dmx.h>
|
||||
#include <linux/dvb/frontend.h>
|
||||
#include <linux/dvb/sec.h>
|
||||
#include <sys/poll.h>
|
||||
|
||||
#define DMX "/dev/dvb/adapter0/demux1"
|
||||
#define FRONT "/dev/dvb/adapter0/frontend1"
|
||||
#define SEC "/dev/dvb/adapter0/sec1"
|
||||
|
||||
/⋆ routine for checking if we have a signal and other status information⋆/
|
||||
int FEReadStatus(int fd, fe_status_t ⋆stat)
|
||||
{
|
||||
int ans;
|
||||
|
||||
if ( (ans = ioctl(fd,FE_READ_STATUS,stat) < 0)){
|
||||
perror("FE READ STATUS: ");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (⋆stat & FE_HAS_POWER)
|
||||
printf("FE HAS POWER\n");
|
||||
|
||||
if (⋆stat & FE_HAS_SIGNAL)
|
||||
printf("FE HAS SIGNAL\n");
|
||||
|
||||
if (⋆stat & FE_SPECTRUM_INV)
|
||||
printf("SPEKTRUM INV\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/⋆ tune qpsk ⋆/
|
||||
/⋆ freq: frequency of transponder ⋆/
|
||||
/⋆ vpid, apid, tpid: PIDs of video, audio and teletext TS packets ⋆/
|
||||
/⋆ diseqc: DiSEqC address of the used LNB ⋆/
|
||||
/⋆ pol: Polarisation ⋆/
|
||||
/⋆ srate: Symbol Rate ⋆/
|
||||
/⋆ fec. FEC ⋆/
|
||||
/⋆ lnb_lof1: local frequency of lower LNB band ⋆/
|
||||
/⋆ lnb_lof2: local frequency of upper LNB band ⋆/
|
||||
/⋆ lnb_slof: switch frequency of LNB ⋆/
|
||||
|
||||
int set_qpsk_channel(int freq, int vpid, int apid, int tpid,
|
||||
int diseqc, int pol, int srate, int fec, int lnb_lof1,
|
||||
int lnb_lof2, int lnb_slof)
|
||||
{
|
||||
struct secCommand scmd;
|
||||
struct secCmdSequence scmds;
|
||||
struct dmx_pes_filter_params pesFilterParams;
|
||||
FrontendParameters frp;
|
||||
struct pollfd pfd[1];
|
||||
FrontendEvent event;
|
||||
int demux1, demux2, demux3, front;
|
||||
|
||||
frequency = (uint32_t) freq;
|
||||
symbolrate = (uint32_t) srate;
|
||||
|
||||
if((front = open(FRONT,O_RDWR)) < 0){
|
||||
perror("FRONTEND DEVICE: ");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if((sec = open(SEC,O_RDWR)) < 0){
|
||||
perror("SEC DEVICE: ");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (demux1 < 0){
|
||||
if ((demux1=open(DMX, O_RDWR|O_NONBLOCK))
|
||||
< 0){
|
||||
perror("DEMUX DEVICE: ");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
if (demux2 < 0){
|
||||
if ((demux2=open(DMX, O_RDWR|O_NONBLOCK))
|
||||
< 0){
|
||||
perror("DEMUX DEVICE: ");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
if (demux3 < 0){
|
||||
if ((demux3=open(DMX, O_RDWR|O_NONBLOCK))
|
||||
< 0){
|
||||
perror("DEMUX DEVICE: ");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
if (freq < lnb_slof) {
|
||||
frp.Frequency = (freq - lnb_lof1);
|
||||
scmds.continuousTone = SEC_TONE_OFF;
|
||||
} else {
|
||||
frp.Frequency = (freq - lnb_lof2);
|
||||
scmds.continuousTone = SEC_TONE_ON;
|
||||
}
|
||||
frp.Inversion = INVERSION_AUTO;
|
||||
if (pol) scmds.voltage = SEC_VOLTAGE_18;
|
||||
else scmds.voltage = SEC_VOLTAGE_13;
|
||||
|
||||
scmd.type=0;
|
||||
scmd.u.diseqc.addr=0x10;
|
||||
scmd.u.diseqc.cmd=0x38;
|
||||
scmd.u.diseqc.numParams=1;
|
||||
scmd.u.diseqc.params[0] = 0xF0 | ((diseqc ⋆ 4) & 0x0F) |
|
||||
(scmds.continuousTone == SEC_TONE_ON ? 1 : 0) |
|
||||
(scmds.voltage==SEC_VOLTAGE_18 ? 2 : 0);
|
||||
|
||||
scmds.miniCommand=SEC_MINI_NONE;
|
||||
scmds.numCommands=1;
|
||||
scmds.commands=&scmd;
|
||||
if (ioctl(sec, SEC_SEND_SEQUENCE, &scmds) < 0){
|
||||
perror("SEC SEND: ");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (ioctl(sec, SEC_SEND_SEQUENCE, &scmds) < 0){
|
||||
perror("SEC SEND: ");
|
||||
return -1;
|
||||
}
|
||||
|
||||
frp.u.qpsk.SymbolRate = srate;
|
||||
frp.u.qpsk.FEC_inner = fec;
|
||||
|
||||
if (ioctl(front, FE_SET_FRONTEND, &frp) < 0){
|
||||
perror("QPSK TUNE: ");
|
||||
return -1;
|
||||
}
|
||||
|
||||
pfd[0].fd = front;
|
||||
pfd[0].events = POLLIN;
|
||||
|
||||
if (poll(pfd,1,3000)){
|
||||
if (pfd[0].revents & POLLIN){
|
||||
printf("Getting QPSK event\n");
|
||||
if ( ioctl(front, FE_GET_EVENT, &event)
|
||||
|
||||
== -EOVERFLOW){
|
||||
perror("qpsk get event");
|
||||
return -1;
|
||||
}
|
||||
printf("Received ");
|
||||
switch(event.type){
|
||||
case FE_UNEXPECTED_EV:
|
||||
printf("unexpected event\n");
|
||||
return -1;
|
||||
case FE_FAILURE_EV:
|
||||
printf("failure event\n");
|
||||
return -1;
|
||||
|
||||
case FE_COMPLETION_EV:
|
||||
printf("completion event\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
pesFilterParams.pid = vpid;
|
||||
pesFilterParams.input = DMX_IN_FRONTEND;
|
||||
pesFilterParams.output = DMX_OUT_DECODER;
|
||||
pesFilterParams.pes_type = DMX_PES_VIDEO;
|
||||
pesFilterParams.flags = DMX_IMMEDIATE_START;
|
||||
if (ioctl(demux1, DMX_SET_PES_FILTER, &pesFilterParams) < 0){
|
||||
perror("set_vpid");
|
||||
return -1;
|
||||
}
|
||||
|
||||
pesFilterParams.pid = apid;
|
||||
pesFilterParams.input = DMX_IN_FRONTEND;
|
||||
pesFilterParams.output = DMX_OUT_DECODER;
|
||||
pesFilterParams.pes_type = DMX_PES_AUDIO;
|
||||
pesFilterParams.flags = DMX_IMMEDIATE_START;
|
||||
if (ioctl(demux2, DMX_SET_PES_FILTER, &pesFilterParams) < 0){
|
||||
perror("set_apid");
|
||||
return -1;
|
||||
}
|
||||
|
||||
pesFilterParams.pid = tpid;
|
||||
pesFilterParams.input = DMX_IN_FRONTEND;
|
||||
pesFilterParams.output = DMX_OUT_DECODER;
|
||||
pesFilterParams.pes_type = DMX_PES_TELETEXT;
|
||||
pesFilterParams.flags = DMX_IMMEDIATE_START;
|
||||
if (ioctl(demux3, DMX_SET_PES_FILTER, &pesFilterParams) < 0){
|
||||
perror("set_tpid");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return has_signal(fds);
|
||||
}
|
||||
|
||||
</programlisting>
|
||||
<para>The program assumes that you are using a universal LNB and a standard DiSEqC
|
||||
switch with up to 4 addresses. Of course, you could build in some more checking if
|
||||
tuning was successful and maybe try to repeat the tuning process. Depending on the
|
||||
external hardware, i.e. LNB and DiSEqC switch, and weather conditions this may be
|
||||
necessary.
|
||||
</para>
|
||||
</section>
|
||||
|
||||
<section id="the_dvr_device">
|
||||
<title>The DVR device</title>
|
||||
<para>The following program code shows how to use the DVR device for recording.
|
||||
</para>
|
||||
<programlisting>
|
||||
#include <sys/ioctl.h>
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
#include <time.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <linux/dvb/dmx.h>
|
||||
#include <linux/dvb/video.h>
|
||||
#include <sys/poll.h>
|
||||
#define DVR "/dev/dvb/adapter0/dvr1"
|
||||
#define AUDIO "/dev/dvb/adapter0/audio1"
|
||||
#define VIDEO "/dev/dvb/adapter0/video1"
|
||||
|
||||
#define BUFFY (188⋆20)
|
||||
#define MAX_LENGTH (1024⋆1024⋆5) /⋆ record 5MB ⋆/
|
||||
|
||||
|
||||
/⋆ switch the demuxes to recording, assuming the transponder is tuned ⋆/
|
||||
|
||||
/⋆ demux1, demux2: file descriptor of video and audio filters ⋆/
|
||||
/⋆ vpid, apid: PIDs of video and audio channels ⋆/
|
||||
|
||||
int switch_to_record(int demux1, int demux2, uint16_t vpid, uint16_t apid)
|
||||
{
|
||||
struct dmx_pes_filter_params pesFilterParams;
|
||||
|
||||
if (demux1 < 0){
|
||||
if ((demux1=open(DMX, O_RDWR|O_NONBLOCK))
|
||||
< 0){
|
||||
perror("DEMUX DEVICE: ");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
if (demux2 < 0){
|
||||
if ((demux2=open(DMX, O_RDWR|O_NONBLOCK))
|
||||
< 0){
|
||||
perror("DEMUX DEVICE: ");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
pesFilterParams.pid = vpid;
|
||||
pesFilterParams.input = DMX_IN_FRONTEND;
|
||||
pesFilterParams.output = DMX_OUT_TS_TAP;
|
||||
pesFilterParams.pes_type = DMX_PES_VIDEO;
|
||||
pesFilterParams.flags = DMX_IMMEDIATE_START;
|
||||
if (ioctl(demux1, DMX_SET_PES_FILTER, &pesFilterParams) < 0){
|
||||
perror("DEMUX DEVICE");
|
||||
return -1;
|
||||
}
|
||||
pesFilterParams.pid = apid;
|
||||
pesFilterParams.input = DMX_IN_FRONTEND;
|
||||
pesFilterParams.output = DMX_OUT_TS_TAP;
|
||||
pesFilterParams.pes_type = DMX_PES_AUDIO;
|
||||
pesFilterParams.flags = DMX_IMMEDIATE_START;
|
||||
if (ioctl(demux2, DMX_SET_PES_FILTER, &pesFilterParams) < 0){
|
||||
perror("DEMUX DEVICE");
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/⋆ start recording MAX_LENGTH , assuming the transponder is tuned ⋆/
|
||||
|
||||
/⋆ demux1, demux2: file descriptor of video and audio filters ⋆/
|
||||
/⋆ vpid, apid: PIDs of video and audio channels ⋆/
|
||||
int record_dvr(int demux1, int demux2, uint16_t vpid, uint16_t apid)
|
||||
{
|
||||
int i;
|
||||
int len;
|
||||
int written;
|
||||
uint8_t buf[BUFFY];
|
||||
uint64_t length;
|
||||
struct pollfd pfd[1];
|
||||
int dvr, dvr_out;
|
||||
|
||||
/⋆ open dvr device ⋆/
|
||||
if ((dvr = open(DVR, O_RDONLY|O_NONBLOCK)) < 0){
|
||||
perror("DVR DEVICE");
|
||||
return -1;
|
||||
}
|
||||
|
||||
/⋆ switch video and audio demuxes to dvr ⋆/
|
||||
printf ("Switching dvr on\n");
|
||||
i = switch_to_record(demux1, demux2, vpid, apid);
|
||||
printf("finished: ");
|
||||
|
||||
printf("Recording %2.0f MB of test file in TS format\n",
|
||||
MAX_LENGTH/(1024.0⋆1024.0));
|
||||
length = 0;
|
||||
|
||||
/⋆ open output file ⋆/
|
||||
if ((dvr_out = open(DVR_FILE,O_WRONLY|O_CREAT
|
||||
|O_TRUNC, S_IRUSR|S_IWUSR
|
||||
|S_IRGRP|S_IWGRP|S_IROTH|
|
||||
S_IWOTH)) < 0){
|
||||
perror("Can't open file for dvr test");
|
||||
return -1;
|
||||
}
|
||||
|
||||
pfd[0].fd = dvr;
|
||||
pfd[0].events = POLLIN;
|
||||
|
||||
/⋆ poll for dvr data and write to file ⋆/
|
||||
while (length < MAX_LENGTH ) {
|
||||
if (poll(pfd,1,1)){
|
||||
if (pfd[0].revents & POLLIN){
|
||||
len = read(dvr, buf, BUFFY);
|
||||
if (len < 0){
|
||||
perror("recording");
|
||||
return -1;
|
||||
}
|
||||
if (len > 0){
|
||||
written = 0;
|
||||
while (written < len)
|
||||
written +=
|
||||
write (dvr_out,
|
||||
buf, len);
|
||||
length += len;
|
||||
printf("written %2.0f MB\r",
|
||||
length/1024./1024.);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
</programlisting>
|
||||
|
||||
</section>
|
1548
Documentation/DocBook/media/dvb/frontend.xml
Normal file
1548
Documentation/DocBook/media/dvb/frontend.xml
Normal file
File diff suppressed because it is too large
Load diff
212
Documentation/DocBook/media/dvb/intro.xml
Normal file
212
Documentation/DocBook/media/dvb/intro.xml
Normal file
|
@ -0,0 +1,212 @@
|
|||
<title>Introduction</title>
|
||||
|
||||
<section id="requisites">
|
||||
<title>What you need to know</title>
|
||||
|
||||
<para>The reader of this document is required to have some knowledge in
|
||||
the area of digital video broadcasting (DVB) and should be familiar with
|
||||
part I of the MPEG2 specification ISO/IEC 13818 (aka ITU-T H.222), i.e
|
||||
you should know what a program/transport stream (PS/TS) is and what is
|
||||
meant by a packetized elementary stream (PES) or an I-frame.</para>
|
||||
|
||||
<para>Various DVB standards documents are available from
|
||||
<ulink url="http://www.dvb.org" /> and/or
|
||||
<ulink url="http://www.etsi.org" />.</para>
|
||||
|
||||
<para>It is also necessary to know how to access unix/linux devices and
|
||||
how to use ioctl calls. This also includes the knowledge of C or C++.
|
||||
</para>
|
||||
</section>
|
||||
|
||||
<section id="history">
|
||||
<title>History</title>
|
||||
|
||||
<para>The first API for DVB cards we used at Convergence in late 1999
|
||||
was an extension of the Video4Linux API which was primarily developed
|
||||
for frame grabber cards. As such it was not really well suited to be
|
||||
used for DVB cards and their new features like recording MPEG streams
|
||||
and filtering several section and PES data streams at the same time.
|
||||
</para>
|
||||
|
||||
<para>In early 2000, we were approached by Nokia with a proposal for a
|
||||
new standard Linux DVB API. As a commitment to the development of
|
||||
terminals based on open standards, Nokia and Convergence made it
|
||||
available to all Linux developers and published it on
|
||||
<ulink url="http://www.linuxtv.org/" /> in September 2000.
|
||||
Convergence is the maintainer of the Linux DVB API. Together with the
|
||||
LinuxTV community (i.e. you, the reader of this document), the Linux DVB
|
||||
API will be constantly reviewed and improved. With the Linux driver for
|
||||
the Siemens/Hauppauge DVB PCI card Convergence provides a first
|
||||
implementation of the Linux DVB API.</para>
|
||||
</section>
|
||||
|
||||
<section id="overview">
|
||||
<title>Overview</title>
|
||||
|
||||
<figure id="stb_components">
|
||||
<title>Components of a DVB card/STB</title>
|
||||
<mediaobject>
|
||||
<imageobject>
|
||||
<imagedata fileref="dvbstb.pdf" format="PS" />
|
||||
</imageobject>
|
||||
<imageobject>
|
||||
<imagedata fileref="dvbstb.png" format="PNG" />
|
||||
</imageobject>
|
||||
</mediaobject>
|
||||
</figure>
|
||||
|
||||
<para>A DVB PCI card or DVB set-top-box (STB) usually consists of the
|
||||
following main hardware components: </para>
|
||||
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
|
||||
<para>Frontend consisting of tuner and DVB demodulator</para>
|
||||
|
||||
<para>Here the raw signal reaches the DVB hardware from a satellite dish
|
||||
or antenna or directly from cable. The frontend down-converts and
|
||||
demodulates this signal into an MPEG transport stream (TS). In case of a
|
||||
satellite frontend, this includes a facility for satellite equipment
|
||||
control (SEC), which allows control of LNB polarization, multi feed
|
||||
switches or dish rotors.</para>
|
||||
|
||||
</listitem>
|
||||
<listitem>
|
||||
|
||||
<para>Conditional Access (CA) hardware like CI adapters and smartcard slots
|
||||
</para>
|
||||
|
||||
<para>The complete TS is passed through the CA hardware. Programs to
|
||||
which the user has access (controlled by the smart card) are decoded in
|
||||
real time and re-inserted into the TS.</para>
|
||||
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>Demultiplexer which filters the incoming DVB stream</para>
|
||||
|
||||
<para>The demultiplexer splits the TS into its components like audio and
|
||||
video streams. Besides usually several of such audio and video streams
|
||||
it also contains data streams with information about the programs
|
||||
offered in this or other streams of the same provider.</para>
|
||||
|
||||
</listitem>
|
||||
<listitem>
|
||||
|
||||
<para>MPEG2 audio and video decoder</para>
|
||||
|
||||
<para>The main targets of the demultiplexer are the MPEG2 audio and
|
||||
video decoders. After decoding they pass on the uncompressed audio and
|
||||
video to the computer screen or (through a PAL/NTSC encoder) to a TV
|
||||
set.</para>
|
||||
|
||||
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
|
||||
<para><xref linkend="stb_components" /> shows a crude schematic of the control and data flow
|
||||
between those components.</para>
|
||||
|
||||
<para>On a DVB PCI card not all of these have to be present since some
|
||||
functionality can be provided by the main CPU of the PC (e.g. MPEG
|
||||
picture and sound decoding) or is not needed (e.g. for data-only uses
|
||||
like “internet over satellite”). Also not every card or STB
|
||||
provides conditional access hardware.</para>
|
||||
|
||||
</section>
|
||||
|
||||
<section id="dvb_devices">
|
||||
<title>Linux DVB Devices</title>
|
||||
|
||||
<para>The Linux DVB API lets you control these hardware components
|
||||
through currently six Unix-style character devices for video, audio,
|
||||
frontend, demux, CA and IP-over-DVB networking. The video and audio
|
||||
devices control the MPEG2 decoder hardware, the frontend device the
|
||||
tuner and the DVB demodulator. The demux device gives you control over
|
||||
the PES and section filters of the hardware. If the hardware does not
|
||||
support filtering these filters can be implemented in software. Finally,
|
||||
the CA device controls all the conditional access capabilities of the
|
||||
hardware. It can depend on the individual security requirements of the
|
||||
platform, if and how many of the CA functions are made available to the
|
||||
application through this device.</para>
|
||||
|
||||
<para>All devices can be found in the <emphasis role="tt">/dev</emphasis>
|
||||
tree under <emphasis role="tt">/dev/dvb</emphasis>. The individual devices
|
||||
are called:</para>
|
||||
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
|
||||
<para><emphasis role="tt">/dev/dvb/adapterN/audioM</emphasis>,</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para><emphasis role="tt">/dev/dvb/adapterN/videoM</emphasis>,</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para><emphasis role="tt">/dev/dvb/adapterN/frontendM</emphasis>,</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
|
||||
<para><emphasis role="tt">/dev/dvb/adapterN/netM</emphasis>,</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
|
||||
<para><emphasis role="tt">/dev/dvb/adapterN/demuxM</emphasis>,</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
|
||||
<para><emphasis role="tt">/dev/dvb/adapterN/dvrM</emphasis>,</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
|
||||
<para><emphasis role="tt">/dev/dvb/adapterN/caM</emphasis>,</para></listitem></itemizedlist>
|
||||
|
||||
<para>where N enumerates the DVB PCI cards in a system starting
|
||||
from 0, and M enumerates the devices of each type within each
|
||||
adapter, starting from 0, too. We will omit the “<emphasis
|
||||
role="tt">/dev/dvb/adapterN/</emphasis>” in the further dicussion
|
||||
of these devices. The naming scheme for the devices is the same wheter
|
||||
devfs is used or not.</para>
|
||||
|
||||
<para>More details about the data structures and function calls of all
|
||||
the devices are described in the following chapters.</para>
|
||||
|
||||
</section>
|
||||
|
||||
<section id="include_files">
|
||||
<title>API include files</title>
|
||||
|
||||
<para>For each of the DVB devices a corresponding include file exists.
|
||||
The DVB API include files should be included in application sources with
|
||||
a partial path like:</para>
|
||||
|
||||
<programlisting>
|
||||
#include <linux/dvb/audio.h>
|
||||
</programlisting>
|
||||
<programlisting>
|
||||
#include <linux/dvb/ca.h>
|
||||
</programlisting>
|
||||
<programlisting>
|
||||
#include <linux/dvb/dmx.h>
|
||||
</programlisting>
|
||||
<programlisting>
|
||||
#include <linux/dvb/frontend.h>
|
||||
</programlisting>
|
||||
<programlisting>
|
||||
#include <linux/dvb/net.h>
|
||||
</programlisting>
|
||||
<programlisting>
|
||||
#include <linux/dvb/osd.h>
|
||||
</programlisting>
|
||||
<programlisting>
|
||||
#include <linux/dvb/video.h>
|
||||
</programlisting>
|
||||
|
||||
<para>To enable applications to support different API version, an
|
||||
additional include file <emphasis
|
||||
role="tt">linux/dvb/version.h</emphasis> exists, which defines the
|
||||
constant <emphasis role="tt">DVB_API_VERSION</emphasis>. This document
|
||||
describes <emphasis role="tt">DVB_API_VERSION 5.8</emphasis>.
|
||||
</para>
|
||||
|
||||
</section>
|
||||
|
2309
Documentation/DocBook/media/dvb/kdapi.xml
Normal file
2309
Documentation/DocBook/media/dvb/kdapi.xml
Normal file
File diff suppressed because it is too large
Load diff
156
Documentation/DocBook/media/dvb/net.xml
Normal file
156
Documentation/DocBook/media/dvb/net.xml
Normal file
|
@ -0,0 +1,156 @@
|
|||
<title>DVB Network API</title>
|
||||
<para>The DVB net device enables feeding of MPE (multi protocol encapsulation) packets
|
||||
received via DVB into the Linux network protocol stack, e.g. for internet via satellite
|
||||
applications. It can be accessed through <emphasis role="tt">/dev/dvb/adapter0/net0</emphasis>. Data types and
|
||||
and ioctl definitions can be accessed by including <emphasis role="tt">linux/dvb/net.h</emphasis> in your
|
||||
application.
|
||||
</para>
|
||||
<section id="dvb_net_types">
|
||||
<title>DVB Net Data Types</title>
|
||||
|
||||
<section id="dvb-net-if">
|
||||
<title>struct dvb_net_if</title>
|
||||
<programlisting>
|
||||
struct dvb_net_if {
|
||||
__u16 pid;
|
||||
__u16 if_num;
|
||||
__u8 feedtype;
|
||||
#define DVB_NET_FEEDTYPE_MPE 0 /⋆ multi protocol encapsulation ⋆/
|
||||
#define DVB_NET_FEEDTYPE_ULE 1 /⋆ ultra lightweight encapsulation ⋆/
|
||||
};
|
||||
</programlisting>
|
||||
</section>
|
||||
|
||||
</section>
|
||||
<section id="net_fcalls">
|
||||
<title>DVB net Function Calls</title>
|
||||
<para>To be written…
|
||||
</para>
|
||||
|
||||
<section id="NET_ADD_IF"
|
||||
role="subsection"><title>NET_ADD_IF</title>
|
||||
<para>DESCRIPTION
|
||||
</para>
|
||||
<informaltable><tgroup cols="1"><tbody><row><entry
|
||||
align="char">
|
||||
<para>This ioctl is undocumented. Documentation is welcome.</para>
|
||||
</entry>
|
||||
</row></tbody></tgroup></informaltable>
|
||||
<para>SYNOPSIS
|
||||
</para>
|
||||
<informaltable><tgroup cols="1"><tbody><row><entry
|
||||
align="char">
|
||||
<para>int ioctl(fd, int request = NET_ADD_IF,
|
||||
struct dvb_net_if *if);</para>
|
||||
</entry>
|
||||
</row></tbody></tgroup></informaltable>
|
||||
<para>PARAMETERS
|
||||
</para>
|
||||
<informaltable><tgroup cols="2"><tbody><row><entry
|
||||
align="char">
|
||||
<para>int fd</para>
|
||||
</entry><entry
|
||||
align="char">
|
||||
<para>File descriptor returned by a previous call to open().</para>
|
||||
</entry>
|
||||
</row><row><entry
|
||||
align="char">
|
||||
<para>int request</para>
|
||||
</entry><entry
|
||||
align="char">
|
||||
<para>Equals NET_ADD_IF for this command.</para>
|
||||
</entry>
|
||||
</row><row><entry
|
||||
align="char">
|
||||
<para>struct dvb_net_if *if
|
||||
</para>
|
||||
</entry><entry
|
||||
align="char">
|
||||
<para>Undocumented.</para>
|
||||
</entry>
|
||||
</row></tbody></tgroup></informaltable>
|
||||
&return-value-dvb;
|
||||
</section>
|
||||
|
||||
<section id="NET_REMOVE_IF"
|
||||
role="subsection"><title>NET_REMOVE_IF</title>
|
||||
<para>DESCRIPTION
|
||||
</para>
|
||||
<informaltable><tgroup cols="1"><tbody><row><entry
|
||||
align="char">
|
||||
<para>This ioctl is undocumented. Documentation is welcome.</para>
|
||||
</entry>
|
||||
</row></tbody></tgroup></informaltable>
|
||||
<para>SYNOPSIS
|
||||
</para>
|
||||
<informaltable><tgroup cols="1"><tbody><row><entry
|
||||
align="char">
|
||||
<para>int ioctl(fd, int request = NET_REMOVE_IF);
|
||||
</para>
|
||||
</entry>
|
||||
</row></tbody></tgroup></informaltable>
|
||||
<para>PARAMETERS
|
||||
</para>
|
||||
<informaltable><tgroup cols="2"><tbody><row><entry
|
||||
align="char">
|
||||
<para>int fd</para>
|
||||
</entry><entry
|
||||
align="char">
|
||||
<para>File descriptor returned by a previous call to open().</para>
|
||||
</entry>
|
||||
</row><row><entry
|
||||
align="char">
|
||||
<para>int request</para>
|
||||
</entry><entry
|
||||
align="char">
|
||||
<para>Equals NET_REMOVE_IF for this command.</para>
|
||||
</entry>
|
||||
</row></tbody></tgroup></informaltable>
|
||||
&return-value-dvb;
|
||||
</section>
|
||||
|
||||
<section id="NET_GET_IF"
|
||||
role="subsection"><title>NET_GET_IF</title>
|
||||
<para>DESCRIPTION
|
||||
</para>
|
||||
<informaltable><tgroup cols="1"><tbody><row><entry
|
||||
align="char">
|
||||
<para>This ioctl is undocumented. Documentation is welcome.</para>
|
||||
</entry>
|
||||
</row></tbody></tgroup></informaltable>
|
||||
<para>SYNOPSIS
|
||||
</para>
|
||||
<informaltable><tgroup cols="1"><tbody><row><entry
|
||||
align="char">
|
||||
<para>int ioctl(fd, int request = NET_GET_IF,
|
||||
struct dvb_net_if *if);</para>
|
||||
</entry>
|
||||
</row></tbody></tgroup></informaltable>
|
||||
<para>PARAMETERS
|
||||
</para>
|
||||
<informaltable><tgroup cols="2"><tbody><row><entry
|
||||
align="char">
|
||||
<para>int fd</para>
|
||||
</entry><entry
|
||||
align="char">
|
||||
<para>File descriptor returned by a previous call to open().</para>
|
||||
</entry>
|
||||
</row><row><entry
|
||||
align="char">
|
||||
<para>int request</para>
|
||||
</entry><entry
|
||||
align="char">
|
||||
<para>Equals NET_GET_IF for this command.</para>
|
||||
</entry>
|
||||
</row><row><entry
|
||||
align="char">
|
||||
<para>struct dvb_net_if *if
|
||||
</para>
|
||||
</entry><entry
|
||||
align="char">
|
||||
<para>Undocumented.</para>
|
||||
</entry>
|
||||
</row></tbody></tgroup></informaltable>
|
||||
&return-value-dvb;
|
||||
</section>
|
||||
</section>
|
1968
Documentation/DocBook/media/dvb/video.xml
Normal file
1968
Documentation/DocBook/media/dvb/video.xml
Normal file
File diff suppressed because it is too large
Load diff
Loading…
Add table
Add a link
Reference in a new issue