Merge branch 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media
Pull media updates from Mauro Carvalho Chehab: "The first part of the media updates for Kernel 3.7. This series contain: - A major tree renaming patch series: now, drivers are organized internally by their used bus, instead of by V4L2 and/or DVB API, providing a cleaner driver location for hybrid drivers that implement both APIs, and allowing to cleanup the Kconfig items and make them more intuitive for the end user; - Media Kernel developers are typically very lazy with their duties of keeping the MAINTAINERS entries for their drivers updated. As now the tree is more organized, we're doing an effort to add/update those entries for the drivers that aren't currently orphan; - Several DVB USB drivers got moved to a new DVB USB v2 core; the new core fixes several bugs (as the existing one that got bitroted). Now, suspend/resume finally started to work fine (at least with some devices - we should expect more work with regards to it); - added multistream support for DVB-T2, and unified the API for DVB-S2 and ISDB-S. Backward binary support is preserved; - as usual, a few new drivers, some V4L2 core improvements and lots of drivers improvements and fixes. There are some points to notice on this series: 1) you should expect a trivial merge conflict on your tree, with the removal of Documentation/feature-removal-schedule.txt: this series would be adding two additional entries there. I opted to not rebase it due to this recent change; 2) With regards to the PCTV 520e udev-related breakage, I opted to fix it in a way that the patches can be backported to 3.5 even without your firmware fix patch. This way, Greg doesn't need to rush backporting your patch (as there are still the firmware cache and firmware path customization issues to be addressed there). I'll send later a patch (likely after the end of the merge window) reverting the rest of the DRX-K async firmware request, fully restoring its original behaviour to allow media drivers to initialize everything serialized as before for 3.7 and upper. 3) I'm planning to work on this weekend to test the DMABUF patches for V4L2. The patches are on my queue for several Kernel cycles, but, up to now, there is/was no way to test the series locally. I have some concerns about this particular changeset with regards to security issues, and with regards to the replacement of the old VIDIOC_OVERLAY ioctl's that is broken on modern systems, due to GPU drivers change. The Overlay API allows direct PCI2PCI transfers from a media capture card into the GPU framebuffer, but its API is crappy. Also, the only existing X11 driver that implements it requires a XV extension that is not available anymore on modern drivers. The DMABUF can do the same thing, but with it is promising to be a properly-designed API. If I can successfully test this series and be happy with it, I should be asking you to pull them next week." * 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media: (717 commits) em28xx: regression fix: use DRX-K sync firmware requests on em28xx drxk: allow loading firmware synchrousnously em28xx: Make all em28xx extensions to be initialized asynchronously [media] tda18271: properly report read errors in tda18271_get_id [media] tda18271: delay IR & RF calibration until init() if delay_cal is set [media] MAINTAINERS: add Michael Krufky as tda827x maintainer [media] MAINTAINERS: add Michael Krufky as tda8290 maintainer [media] MAINTAINERS: add Michael Krufky as cxusb maintainer [media] MAINTAINERS: add Michael Krufky as lg2160 maintainer [media] MAINTAINERS: add Michael Krufky as lgdt3305 maintainer [media] MAINTAINERS: add Michael Krufky as mxl111sf maintainer [media] MAINTAINERS: add Michael Krufky as mxl5007t maintainer [media] MAINTAINERS: add Michael Krufky as tda18271 maintainer [media] s5p-tv: Report only multi-plane capabilities in vidioc_querycap [media] s5p-mfc: Fix misplaced return statement in s5p_mfc_suspend() [media] exynos-gsc: Add missing static storage class specifiers [media] exynos-gsc: Remove <linux/version.h> header file inclusion [media] s5p-fimc: Fix incorrect condition in fimc_lite_reqbufs() [media] s5p-tv: Fix potential NULL pointer dereference error [media] s5k6aa: Fix possible NULL pointer dereference ...
This commit is contained in:
commit
0b8e74c6f4
2063 changed files with 376752 additions and 364233 deletions
|
@ -300,7 +300,7 @@ $(MEDIA_OBJ_DIR)/media-entities.tmpl: $(MEDIA_OBJ_DIR)/v4l2.xml
|
|||
@( \
|
||||
for ident in $(IOCTLS) ; do \
|
||||
entity=`echo $$ident | tr _ -` ; \
|
||||
id=`grep "<refname>$$ident" $(MEDIA_OBJ_DIR)/vidioc-*.xml | sed -r s,"^.*/(.*).xml.*","\1",` ; \
|
||||
id=`grep "<refname>$$ident" $(MEDIA_OBJ_DIR)/vidioc-*.xml $(MEDIA_OBJ_DIR)/media-ioc-*.xml | sed -r s,"^.*/(.*).xml.*","\1",` ; \
|
||||
echo "<!ENTITY $$entity \"<link" \
|
||||
"linkend='$$id'><constant>$$ident</constant></link>\">" \
|
||||
>>$@ ; \
|
||||
|
|
|
@ -1,12 +1,16 @@
|
|||
<title>DVB Audio Device</title>
|
||||
<para>The DVB audio device controls the MPEG2 audio decoder of the DVB hardware. It
|
||||
can be accessed through <emphasis role="tt">/dev/dvb/adapter0/audio0</emphasis>. Data types and and
|
||||
ioctl definitions can be accessed by including <emphasis role="tt">linux/dvb/video.h</emphasis> in your
|
||||
ioctl definitions can be accessed by including <emphasis role="tt">linux/dvb/audio.h</emphasis> in your
|
||||
application.
|
||||
</para>
|
||||
<para>Please note that some DVB cards don’t have their own MPEG decoder, which results in
|
||||
the omission of the audio and video device.
|
||||
</para>
|
||||
<para>
|
||||
These ioctls were also used by V4L2 to control MPEG decoders implemented in V4L2. The use
|
||||
of these ioctls for that purpose has been made obsolete and proper V4L2 ioctls or controls
|
||||
have been created to replace that functionality.</para>
|
||||
|
||||
<section id="audio_data_types">
|
||||
<title>Audio Data Types</title>
|
||||
|
@ -558,6 +562,8 @@ role="subsection"><title>AUDIO_SELECT_SOURCE</title>
|
|||
role="subsection"><title>AUDIO_SET_MUTE</title>
|
||||
<para>DESCRIPTION
|
||||
</para>
|
||||
<para>This ioctl is for DVB devices only. To control a V4L2 decoder use the V4L2
|
||||
&VIDIOC-DECODER-CMD; with the <constant>V4L2_DEC_CMD_START_MUTE_AUDIO</constant> flag instead.</para>
|
||||
<informaltable><tgroup cols="1"><tbody><row><entry
|
||||
align="char">
|
||||
<para>This ioctl call asks the audio device to mute the stream that is currently being
|
||||
|
@ -730,6 +736,8 @@ role="subsection"><title>AUDIO_SET_BYPASS_MODE</title>
|
|||
role="subsection"><title>AUDIO_CHANNEL_SELECT</title>
|
||||
<para>DESCRIPTION
|
||||
</para>
|
||||
<para>This ioctl is for DVB devices only. To control a V4L2 decoder use the V4L2
|
||||
<constant>V4L2_CID_MPEG_AUDIO_DEC_PLAYBACK</constant> control instead.</para>
|
||||
<informaltable><tgroup cols="1"><tbody><row><entry
|
||||
align="char">
|
||||
<para>This ioctl call asks the Audio Device to select the requested channel if possible.</para>
|
||||
|
@ -772,6 +780,109 @@ role="subsection"><title>AUDIO_CHANNEL_SELECT</title>
|
|||
</row></tbody></tgroup></informaltable>
|
||||
&return-value-dvb;
|
||||
|
||||
</section><section id="AUDIO_BILINGUAL_CHANNEL_SELECT"
|
||||
role="subsection"><title>AUDIO_BILINGUAL_CHANNEL_SELECT</title>
|
||||
<para>DESCRIPTION
|
||||
</para>
|
||||
<para>This ioctl is obsolete. Do not use in new drivers. It has been replaced by
|
||||
the V4L2 <constant>V4L2_CID_MPEG_AUDIO_DEC_MULTILINGUAL_PLAYBACK</constant> control
|
||||
for MPEG decoders controlled through V4L2.</para>
|
||||
<informaltable><tgroup cols="1"><tbody><row><entry
|
||||
align="char">
|
||||
<para>This ioctl call asks the Audio Device to select the requested channel for bilingual streams if possible.</para>
|
||||
</entry>
|
||||
</row></tbody></tgroup></informaltable>
|
||||
<para>SYNOPSIS
|
||||
</para>
|
||||
<informaltable><tgroup cols="1"><tbody><row><entry
|
||||
align="char">
|
||||
<para>int ioctl(int fd, int request =
|
||||
AUDIO_BILINGUAL_CHANNEL_SELECT, audio_channel_select_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 AUDIO_BILINGUAL_CHANNEL_SELECT for this
|
||||
command.</para>
|
||||
</entry>
|
||||
</row><row><entry
|
||||
align="char">
|
||||
<para>audio_channel_select_t
|
||||
ch</para>
|
||||
</entry><entry
|
||||
align="char">
|
||||
<para>Select the output format of the audio (mono left/right,
|
||||
stereo).</para>
|
||||
</entry>
|
||||
</row>
|
||||
</tbody></tgroup></informaltable>
|
||||
&return-value-dvb;
|
||||
|
||||
</section><section id="AUDIO_GET_PTS"
|
||||
role="subsection"><title>AUDIO_GET_PTS</title>
|
||||
<para>DESCRIPTION
|
||||
</para>
|
||||
<para>This ioctl is obsolete. Do not use in new drivers. If you need this functionality,
|
||||
then please contact the linux-media mailing list (&v4l-ml;).</para>
|
||||
<informaltable><tgroup cols="1"><tbody><row><entry
|
||||
align="char">
|
||||
<para>This ioctl call asks the Audio Device to return the current PTS timestamp.</para>
|
||||
</entry>
|
||||
</row></tbody></tgroup></informaltable>
|
||||
<para>SYNOPSIS
|
||||
</para>
|
||||
<informaltable><tgroup cols="1"><tbody><row><entry
|
||||
align="char">
|
||||
<para>int ioctl(int fd, int request =
|
||||
AUDIO_GET_PTS, __u64 *pts);</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 AUDIO_GET_PTS for this
|
||||
command.</para>
|
||||
</entry>
|
||||
</row><row><entry
|
||||
align="char">
|
||||
<para>__u64 *pts
|
||||
</para>
|
||||
</entry><entry
|
||||
align="char">
|
||||
<para>Returns the 33-bit timestamp as defined in ITU T-REC-H.222.0 / ISO/IEC 13818-1.
|
||||
</para>
|
||||
<para>
|
||||
The PTS should belong to the currently played
|
||||
frame if possible, but may also be a value close to it
|
||||
like the PTS of the last decoded frame or the last PTS
|
||||
extracted by the PES parser.</para>
|
||||
</entry>
|
||||
</row></tbody></tgroup></informaltable>
|
||||
&return-value-dvb;
|
||||
|
||||
</section><section id="AUDIO_GET_STATUS"
|
||||
role="subsection"><title>AUDIO_GET_STATUS</title>
|
||||
<para>DESCRIPTION
|
||||
|
|
|
@ -226,4 +226,357 @@ typedef struct ca_pid {
|
|||
</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>
|
||||
|
|
|
@ -899,4 +899,232 @@ typedef enum {
|
|||
<para>Invalid stc number.</para>
|
||||
</entry>
|
||||
</row></tbody></tgroup></informaltable>
|
||||
</section></section>
|
||||
</section>
|
||||
|
||||
<section id="DMX_GET_PES_PIDS"
|
||||
role="subsection"><title>DMX_GET_PES_PIDS</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 = DMX_GET_PES_PIDS,
|
||||
__u16[5]);</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 DMX_GET_PES_PIDS for this command.</para>
|
||||
</entry>
|
||||
</row><row><entry
|
||||
align="char">
|
||||
<para>__u16[5]
|
||||
</para>
|
||||
</entry><entry
|
||||
align="char">
|
||||
<para>Undocumented.</para>
|
||||
</entry>
|
||||
</row></tbody></tgroup></informaltable>
|
||||
&return-value-dvb;
|
||||
</section>
|
||||
|
||||
<section id="DMX_GET_CAPS"
|
||||
role="subsection"><title>DMX_GET_CAPS</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 = DMX_GET_CAPS,
|
||||
dmx_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 DMX_GET_CAPS for this command.</para>
|
||||
</entry>
|
||||
</row><row><entry
|
||||
align="char">
|
||||
<para>dmx_caps_t *
|
||||
</para>
|
||||
</entry><entry
|
||||
align="char">
|
||||
<para>Undocumented.</para>
|
||||
</entry>
|
||||
</row></tbody></tgroup></informaltable>
|
||||
&return-value-dvb;
|
||||
</section>
|
||||
|
||||
<section id="DMX_SET_SOURCE"
|
||||
role="subsection"><title>DMX_SET_SOURCE</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 = DMX_SET_SOURCE,
|
||||
dmx_source_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 DMX_SET_SOURCE for this command.</para>
|
||||
</entry>
|
||||
</row><row><entry
|
||||
align="char">
|
||||
<para>dmx_source_t *
|
||||
</para>
|
||||
</entry><entry
|
||||
align="char">
|
||||
<para>Undocumented.</para>
|
||||
</entry>
|
||||
</row></tbody></tgroup></informaltable>
|
||||
&return-value-dvb;
|
||||
</section>
|
||||
|
||||
<section id="DMX_ADD_PID"
|
||||
role="subsection"><title>DMX_ADD_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 = DMX_ADD_PID,
|
||||
__u16 *);</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 DMX_ADD_PID for this command.</para>
|
||||
</entry>
|
||||
</row><row><entry
|
||||
align="char">
|
||||
<para>__u16 *
|
||||
</para>
|
||||
</entry><entry
|
||||
align="char">
|
||||
<para>Undocumented.</para>
|
||||
</entry>
|
||||
</row></tbody></tgroup></informaltable>
|
||||
&return-value-dvb;
|
||||
</section>
|
||||
|
||||
<section id="DMX_REMOVE_PID"
|
||||
role="subsection"><title>DMX_REMOVE_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 = DMX_REMOVE_PID,
|
||||
__u16 *);</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 DMX_REMOVE_PID for this command.</para>
|
||||
</entry>
|
||||
</row><row><entry
|
||||
align="char">
|
||||
<para>__u16 *
|
||||
</para>
|
||||
</entry><entry
|
||||
align="char">
|
||||
<para>Undocumented.</para>
|
||||
</entry>
|
||||
</row></tbody></tgroup></informaltable>
|
||||
&return-value-dvb;
|
||||
</section>
|
||||
|
||||
|
||||
</section>
|
||||
|
|
|
@ -28,7 +28,7 @@
|
|||
<holder>Convergence GmbH</holder>
|
||||
</copyright>
|
||||
<copyright>
|
||||
<year>2009-2011</year>
|
||||
<year>2009-2012</year>
|
||||
<holder>Mauro Carvalho Chehab</holder>
|
||||
</copyright>
|
||||
|
||||
|
@ -84,7 +84,7 @@ Added ISDB-T test originally written by Patrick Boettcher
|
|||
|
||||
|
||||
<title>LINUX DVB API</title>
|
||||
<subtitle>Version 5.2</subtitle>
|
||||
<subtitle>Version 5.8</subtitle>
|
||||
<!-- ADD THE CHAPTERS HERE -->
|
||||
<chapter id="dvb_introdution">
|
||||
&sub-intro;
|
||||
|
|
|
@ -194,6 +194,7 @@ get/set up to 64 properties. The actual meaning of each property is described on
|
|||
APSK_16,
|
||||
APSK_32,
|
||||
DQPSK,
|
||||
QAM_4_NR,
|
||||
} fe_modulation_t;
|
||||
</programlisting>
|
||||
</section>
|
||||
|
@ -265,6 +266,7 @@ typedef enum fe_code_rate {
|
|||
FEC_AUTO,
|
||||
FEC_3_5,
|
||||
FEC_9_10,
|
||||
FEC_2_5,
|
||||
} fe_code_rate_t;
|
||||
</programlisting>
|
||||
<para>which correspond to error correction rates of 1/2, 2/3, etc.,
|
||||
|
@ -351,7 +353,7 @@ typedef enum fe_delivery_system {
|
|||
SYS_ISDBC,
|
||||
SYS_ATSC,
|
||||
SYS_ATSCMH,
|
||||
SYS_DMBTH,
|
||||
SYS_DTMB,
|
||||
SYS_CMMB,
|
||||
SYS_DAB,
|
||||
SYS_DVBT2,
|
||||
|
@ -567,28 +569,33 @@ typedef enum fe_delivery_system {
|
|||
<title><constant>DTV_ATSCMH_RS_FRAME_MODE</constant></title>
|
||||
<para>RS frame mode.</para>
|
||||
<para>Possible values are:</para>
|
||||
<para id="atscmh-rs-frame-mode">
|
||||
<programlisting>
|
||||
typedef enum atscmh_rs_frame_mode {
|
||||
ATSCMH_RSFRAME_PRI_ONLY = 0,
|
||||
ATSCMH_RSFRAME_PRI_SEC = 1,
|
||||
} atscmh_rs_frame_mode_t;
|
||||
</programlisting>
|
||||
</para>
|
||||
</section>
|
||||
<section id="DTV-ATSCMH-RS-FRAME-ENSEMBLE">
|
||||
<title><constant>DTV_ATSCMH_RS_FRAME_ENSEMBLE</constant></title>
|
||||
<para>RS frame ensemble.</para>
|
||||
<para>Possible values are:</para>
|
||||
<para id="atscmh-rs-frame-ensemble">
|
||||
<programlisting>
|
||||
typedef enum atscmh_rs_frame_ensemble {
|
||||
ATSCMH_RSFRAME_ENS_PRI = 0,
|
||||
ATSCMH_RSFRAME_ENS_SEC = 1,
|
||||
} atscmh_rs_frame_ensemble_t;
|
||||
</programlisting>
|
||||
</para>
|
||||
</section>
|
||||
<section id="DTV-ATSCMH-RS-CODE-MODE-PRI">
|
||||
<title><constant>DTV_ATSCMH_RS_CODE_MODE_PRI</constant></title>
|
||||
<para>RS code mode (primary).</para>
|
||||
<para>Possible values are:</para>
|
||||
<para id="atscmh-rs-code-mode">
|
||||
<programlisting>
|
||||
typedef enum atscmh_rs_code_mode {
|
||||
ATSCMH_RSCODE_211_187 = 0,
|
||||
|
@ -596,6 +603,7 @@ typedef enum atscmh_rs_code_mode {
|
|||
ATSCMH_RSCODE_235_187 = 2,
|
||||
} atscmh_rs_code_mode_t;
|
||||
</programlisting>
|
||||
</para>
|
||||
</section>
|
||||
<section id="DTV-ATSCMH-RS-CODE-MODE-SEC">
|
||||
<title><constant>DTV_ATSCMH_RS_CODE_MODE_SEC</constant></title>
|
||||
|
@ -613,23 +621,27 @@ typedef enum atscmh_rs_code_mode {
|
|||
<title><constant>DTV_ATSCMH_SCCC_BLOCK_MODE</constant></title>
|
||||
<para>Series Concatenated Convolutional Code Block Mode.</para>
|
||||
<para>Possible values are:</para>
|
||||
<para id="atscmh-sccc-block-mode">
|
||||
<programlisting>
|
||||
typedef enum atscmh_sccc_block_mode {
|
||||
ATSCMH_SCCC_BLK_SEP = 0,
|
||||
ATSCMH_SCCC_BLK_COMB = 1,
|
||||
} atscmh_sccc_block_mode_t;
|
||||
</programlisting>
|
||||
</para>
|
||||
</section>
|
||||
<section id="DTV-ATSCMH-SCCC-CODE-MODE-A">
|
||||
<title><constant>DTV_ATSCMH_SCCC_CODE_MODE_A</constant></title>
|
||||
<para>Series Concatenated Convolutional Code Rate.</para>
|
||||
<para>Possible values are:</para>
|
||||
<para id="atscmh-sccc-code-mode">
|
||||
<programlisting>
|
||||
typedef enum atscmh_sccc_code_mode {
|
||||
ATSCMH_SCCC_CODE_HLF = 0,
|
||||
ATSCMH_SCCC_CODE_QTR = 1,
|
||||
} atscmh_sccc_code_mode_t;
|
||||
</programlisting>
|
||||
</para>
|
||||
</section>
|
||||
<section id="DTV-ATSCMH-SCCC-CODE-MODE-B">
|
||||
<title><constant>DTV_ATSCMH_SCCC_CODE_MODE_B</constant></title>
|
||||
|
@ -725,6 +737,9 @@ typedef enum fe_guard_interval {
|
|||
GUARD_INTERVAL_1_128,
|
||||
GUARD_INTERVAL_19_128,
|
||||
GUARD_INTERVAL_19_256,
|
||||
GUARD_INTERVAL_PN420,
|
||||
GUARD_INTERVAL_PN595,
|
||||
GUARD_INTERVAL_PN945,
|
||||
} fe_guard_interval_t;
|
||||
</programlisting>
|
||||
|
||||
|
@ -733,6 +748,7 @@ typedef enum fe_guard_interval {
|
|||
try to find the correct guard interval (if capable) and will use TMCC to fill
|
||||
in the missing parameters.</para>
|
||||
<para>2) Intervals 1/128, 19/128 and 19/256 are used only for DVB-T2 at present</para>
|
||||
<para>3) DTMB specifies PN420, PN595 and PN945.</para>
|
||||
</section>
|
||||
<section id="DTV-TRANSMISSION-MODE">
|
||||
<title><constant>DTV_TRANSMISSION_MODE</constant></title>
|
||||
|
@ -749,6 +765,8 @@ typedef enum fe_transmit_mode {
|
|||
TRANSMISSION_MODE_1K,
|
||||
TRANSMISSION_MODE_16K,
|
||||
TRANSMISSION_MODE_32K,
|
||||
TRANSMISSION_MODE_C1,
|
||||
TRANSMISSION_MODE_C3780,
|
||||
} fe_transmit_mode_t;
|
||||
</programlisting>
|
||||
<para>Notes:</para>
|
||||
|
@ -760,6 +778,7 @@ typedef enum fe_transmit_mode {
|
|||
use TMCC to fill in the missing parameters.</para>
|
||||
<para>3) DVB-T specifies 2K and 8K as valid sizes.</para>
|
||||
<para>4) DVB-T2 specifies 1K, 2K, 4K, 8K, 16K and 32K.</para>
|
||||
<para>5) DTMB specifies C1 and C3780.</para>
|
||||
</section>
|
||||
<section id="DTV-HIERARCHY">
|
||||
<title><constant>DTV_HIERARCHY</constant></title>
|
||||
|
@ -774,17 +793,28 @@ typedef enum fe_hierarchy {
|
|||
} fe_hierarchy_t;
|
||||
</programlisting>
|
||||
</section>
|
||||
<section id="DTV-ISDBS-TS-ID">
|
||||
<title><constant>DTV_ISDBS_TS_ID</constant></title>
|
||||
<para>Currently unused.</para>
|
||||
<section id="DTV-STREAM-ID">
|
||||
<title><constant>DTV_STREAM_ID</constant></title>
|
||||
<para>DVB-S2, DVB-T2 and ISDB-S support the transmission of several
|
||||
streams on a single transport stream.
|
||||
This property enables the DVB driver to handle substream filtering,
|
||||
when supported by the hardware.
|
||||
By default, substream filtering is disabled.
|
||||
</para><para>
|
||||
For DVB-S2 and DVB-T2, the valid substream id range is from 0 to 255.
|
||||
</para><para>
|
||||
For ISDB, the valid substream id range is from 1 to 65535.
|
||||
</para><para>
|
||||
To disable it, you should use the special macro NO_STREAM_ID_FILTER.
|
||||
</para><para>
|
||||
Note: any value outside the id range also disables filtering.
|
||||
</para>
|
||||
</section>
|
||||
<section id="DTV-DVBT2-PLP-ID">
|
||||
<title><constant>DTV_DVBT2_PLP_ID</constant></title>
|
||||
<para>DVB-T2 supports Physical Layer Pipes (PLP) to allow transmission of
|
||||
many data types via a single multiplex. The API will soon support this
|
||||
at which point this section will be expanded.</para>
|
||||
<section id="DTV-DVBT2-PLP-ID-LEGACY">
|
||||
<title><constant>DTV_DVBT2_PLP_ID_LEGACY</constant></title>
|
||||
<para>Obsolete, replaced with DTV_STREAM_ID.</para>
|
||||
</section>
|
||||
<section id="DTV_ENUM_DELSYS">
|
||||
<section id="DTV-ENUM-DELSYS">
|
||||
<title><constant>DTV_ENUM_DELSYS</constant></title>
|
||||
<para>A Multi standard frontend needs to advertise the delivery systems provided.
|
||||
Applications need to enumerate the provided delivery systems, before using
|
||||
|
@ -796,6 +826,29 @@ typedef enum fe_hierarchy {
|
|||
FE_GET_INFO. In the case of a legacy frontend, the result is just the same
|
||||
as with FE_GET_INFO, but in a more structured format </para>
|
||||
</section>
|
||||
<section id="DTV-INTERLEAVING">
|
||||
<title><constant>DTV_INTERLEAVING</constant></title>
|
||||
<para id="fe-interleaving">Interleaving mode</para>
|
||||
<programlisting>
|
||||
enum fe_interleaving {
|
||||
INTERLEAVING_NONE,
|
||||
INTERLEAVING_AUTO,
|
||||
INTERLEAVING_240,
|
||||
INTERLEAVING_720,
|
||||
};
|
||||
</programlisting>
|
||||
</section>
|
||||
<section id="DTV-LNA">
|
||||
<title><constant>DTV_LNA</constant></title>
|
||||
<para>Low-noise amplifier.</para>
|
||||
<para>Hardware might offer controllable LNA which can be set manually
|
||||
using that parameter. Usually LNA could be found only from
|
||||
terrestrial devices if at all.</para>
|
||||
<para>Possible values: 0, 1, LNA_AUTO</para>
|
||||
<para>0, LNA off</para>
|
||||
<para>1, LNA on</para>
|
||||
<para>use the special macro LNA_AUTO to set LNA auto</para>
|
||||
</section>
|
||||
</section>
|
||||
<section id="frontend-property-terrestrial-systems">
|
||||
<title>Properties used on terrestrial delivery systems</title>
|
||||
|
@ -816,6 +869,7 @@ typedef enum fe_hierarchy {
|
|||
<listitem><para><link linkend="DTV-GUARD-INTERVAL"><constant>DTV_GUARD_INTERVAL</constant></link></para></listitem>
|
||||
<listitem><para><link linkend="DTV-TRANSMISSION-MODE"><constant>DTV_TRANSMISSION_MODE</constant></link></para></listitem>
|
||||
<listitem><para><link linkend="DTV-HIERARCHY"><constant>DTV_HIERARCHY</constant></link></para></listitem>
|
||||
<listitem><para><link linkend="DTV-LNA"><constant>DTV_LNA</constant></link></para></listitem>
|
||||
</itemizedlist>
|
||||
</section>
|
||||
<section id="dvbt2-params">
|
||||
|
@ -838,7 +892,8 @@ typedef enum fe_hierarchy {
|
|||
<listitem><para><link linkend="DTV-GUARD-INTERVAL"><constant>DTV_GUARD_INTERVAL</constant></link></para></listitem>
|
||||
<listitem><para><link linkend="DTV-TRANSMISSION-MODE"><constant>DTV_TRANSMISSION_MODE</constant></link></para></listitem>
|
||||
<listitem><para><link linkend="DTV-HIERARCHY"><constant>DTV_HIERARCHY</constant></link></para></listitem>
|
||||
<listitem><para><link linkend="DTV-DVBT2-PLP-ID"><constant>DTV_DVBT2_PLP_ID</constant></link></para></listitem>
|
||||
<listitem><para><link linkend="DTV-STREAM-ID"><constant>DTV_STREAM_ID</constant></link></para></listitem>
|
||||
<listitem><para><link linkend="DTV-LNA"><constant>DTV_LNA</constant></link></para></listitem>
|
||||
</itemizedlist>
|
||||
</section>
|
||||
<section id="isdbt">
|
||||
|
@ -925,13 +980,32 @@ typedef enum fe_hierarchy {
|
|||
<listitem><para><link linkend="DTV-ATSCMH-PRC"><constant>DTV_ATSCMH_PRC</constant></link></para></listitem>
|
||||
<listitem><para><link linkend="DTV-ATSCMH-RS-FRAME-MODE"><constant>DTV_ATSCMH_RS_FRAME_MODE</constant></link></para></listitem>
|
||||
<listitem><para><link linkend="DTV-ATSCMH-RS-FRAME-ENSEMBLE"><constant>DTV_ATSCMH_RS_FRAME_ENSEMBLE</constant></link></para></listitem>
|
||||
<listitem><para><link linkend="DTV-ATSCMH-CODE-MODE-PRI"><constant>DTV_ATSCMH_CODE_MODE_PRI</constant></link></para></listitem>
|
||||
<listitem><para><link linkend="DTV-ATSCMH-CODE-MODE-SEC"><constant>DTV_ATSCMH_CODE_MODE_SEC</constant></link></para></listitem>
|
||||
<listitem><para><link linkend="DTV-ATSCMH-RS-CODE-MODE-PRI"><constant>DTV_ATSCMH_RS_CODE_MODE_PRI</constant></link></para></listitem>
|
||||
<listitem><para><link linkend="DTV-ATSCMH-RS-CODE-MODE-SEC"><constant>DTV_ATSCMH_RS_CODE_MODE_SEC</constant></link></para></listitem>
|
||||
<listitem><para><link linkend="DTV-ATSCMH-SCCC-BLOCK-MODE"><constant>DTV_ATSCMH_SCCC_BLOCK_MODE</constant></link></para></listitem>
|
||||
<listitem><para><link linkend="DTV-ATSCMH-SCCC-CODE_MODE-A"><constant>DTV_ATSCMH_SCCC_CODE_MODE_A</constant></link></para></listitem>
|
||||
<listitem><para><link linkend="DTV-ATSCMH-SCCC-CODE_MODE-B"><constant>DTV_ATSCMH_SCCC_CODE_MODE_B</constant></link></para></listitem>
|
||||
<listitem><para><link linkend="DTV-ATSCMH-SCCC-CODE_MODE-C"><constant>DTV_ATSCMH_SCCC_CODE_MODE_C</constant></link></para></listitem>
|
||||
<listitem><para><link linkend="DTV-ATSCMH-SCCC-CODE_MODE-D"><constant>DTV_ATSCMH_SCCC_CODE_MODE_D</constant></link></para></listitem>
|
||||
<listitem><para><link linkend="DTV-ATSCMH-SCCC-CODE-MODE-A"><constant>DTV_ATSCMH_SCCC_CODE_MODE_A</constant></link></para></listitem>
|
||||
<listitem><para><link linkend="DTV-ATSCMH-SCCC-CODE-MODE-B"><constant>DTV_ATSCMH_SCCC_CODE_MODE_B</constant></link></para></listitem>
|
||||
<listitem><para><link linkend="DTV-ATSCMH-SCCC-CODE-MODE-C"><constant>DTV_ATSCMH_SCCC_CODE_MODE_C</constant></link></para></listitem>
|
||||
<listitem><para><link linkend="DTV-ATSCMH-SCCC-CODE-MODE-D"><constant>DTV_ATSCMH_SCCC_CODE_MODE_D</constant></link></para></listitem>
|
||||
</itemizedlist>
|
||||
</section>
|
||||
<section id="dtmb-params">
|
||||
<title>DTMB delivery system</title>
|
||||
<para>The following parameters are valid for DTMB:</para>
|
||||
<itemizedlist mark='opencircle'>
|
||||
<listitem><para><link linkend="DTV-API-VERSION"><constant>DTV_API_VERSION</constant></link></para></listitem>
|
||||
<listitem><para><link linkend="DTV-DELIVERY-SYSTEM"><constant>DTV_DELIVERY_SYSTEM</constant></link></para></listitem>
|
||||
<listitem><para><link linkend="DTV-TUNE"><constant>DTV_TUNE</constant></link></para></listitem>
|
||||
<listitem><para><link linkend="DTV-CLEAR"><constant>DTV_CLEAR</constant></link></para></listitem>
|
||||
<listitem><para><link linkend="DTV-FREQUENCY"><constant>DTV_FREQUENCY</constant></link></para></listitem>
|
||||
<listitem><para><link linkend="DTV-MODULATION"><constant>DTV_MODULATION</constant></link></para></listitem>
|
||||
<listitem><para><link linkend="DTV-BANDWIDTH-HZ"><constant>DTV_BANDWIDTH_HZ</constant></link></para></listitem>
|
||||
<listitem><para><link linkend="DTV-INVERSION"><constant>DTV_INVERSION</constant></link></para></listitem>
|
||||
<listitem><para><link linkend="DTV-INNER-FEC"><constant>DTV_INNER_FEC</constant></link></para></listitem>
|
||||
<listitem><para><link linkend="DTV-GUARD-INTERVAL"><constant>DTV_GUARD_INTERVAL</constant></link></para></listitem>
|
||||
<listitem><para><link linkend="DTV-TRANSMISSION-MODE"><constant>DTV_TRANSMISSION_MODE</constant></link></para></listitem>
|
||||
<listitem><para><link linkend="DTV-INTERLEAVING"><constant>DTV_INTERLEAVING</constant></link></para></listitem>
|
||||
<listitem><para><link linkend="DTV-LNA"><constant>DTV_LNA</constant></link></para></listitem>
|
||||
</itemizedlist>
|
||||
</section>
|
||||
</section>
|
||||
|
@ -952,6 +1026,7 @@ typedef enum fe_hierarchy {
|
|||
<listitem><para><link linkend="DTV-INVERSION"><constant>DTV_INVERSION</constant></link></para></listitem>
|
||||
<listitem><para><link linkend="DTV-SYMBOL-RATE"><constant>DTV_SYMBOL_RATE</constant></link></para></listitem>
|
||||
<listitem><para><link linkend="DTV-INNER-FEC"><constant>DTV_INNER_FEC</constant></link></para></listitem>
|
||||
<listitem><para><link linkend="DTV-LNA"><constant>DTV_LNA</constant></link></para></listitem>
|
||||
</itemizedlist>
|
||||
</section>
|
||||
<section id="dvbc-annex-b-params">
|
||||
|
@ -966,6 +1041,7 @@ typedef enum fe_hierarchy {
|
|||
<listitem><para><link linkend="DTV-FREQUENCY"><constant>DTV_FREQUENCY</constant></link></para></listitem>
|
||||
<listitem><para><link linkend="DTV-MODULATION"><constant>DTV_MODULATION</constant></link></para></listitem>
|
||||
<listitem><para><link linkend="DTV-INVERSION"><constant>DTV_INVERSION</constant></link></para></listitem>
|
||||
<listitem><para><link linkend="DTV-LNA"><constant>DTV_LNA</constant></link></para></listitem>
|
||||
</itemizedlist>
|
||||
</section>
|
||||
</section>
|
||||
|
@ -999,6 +1075,7 @@ typedef enum fe_hierarchy {
|
|||
<listitem><para><link linkend="DTV-MODULATION"><constant>DTV_MODULATION</constant></link></para></listitem>
|
||||
<listitem><para><link linkend="DTV-PILOT"><constant>DTV_PILOT</constant></link></para></listitem>
|
||||
<listitem><para><link linkend="DTV-ROLLOFF"><constant>DTV_ROLLOFF</constant></link></para></listitem>
|
||||
<listitem><para><link linkend="DTV-STREAM-ID"><constant>DTV_STREAM_ID</constant></link></para></listitem>
|
||||
</itemizedlist>
|
||||
</section>
|
||||
<section id="turbo-params">
|
||||
|
@ -1021,7 +1098,7 @@ typedef enum fe_hierarchy {
|
|||
<listitem><para><link linkend="DTV-SYMBOL-RATE"><constant>DTV_SYMBOL_RATE</constant></link></para></listitem>
|
||||
<listitem><para><link linkend="DTV-INNER-FEC"><constant>DTV_INNER_FEC</constant></link></para></listitem>
|
||||
<listitem><para><link linkend="DTV-VOLTAGE"><constant>DTV_VOLTAGE</constant></link></para></listitem>
|
||||
<listitem><para><link linkend="DTV-ISDBS-TS-ID"><constant>DTV_ISDBS_TS_ID</constant></link></para></listitem>
|
||||
<listitem><para><link linkend="DTV-STREAM-ID"><constant>DTV_STREAM_ID</constant></link></para></listitem>
|
||||
</itemizedlist>
|
||||
</section>
|
||||
</section>
|
||||
|
|
|
@ -66,7 +66,7 @@ supported via the new <link linkend="FE_GET_SET_PROPERTY">FE_GET_PROPERTY/FE_GET
|
|||
|
||||
<para>The usage of this field is deprecated, as it doesn't report all supported standards, and
|
||||
will provide an incomplete information for frontends that support multiple delivery systems.
|
||||
Please use <link linkend="DTV_ENUM_DELSYS">DTV_ENUM_DELSYS</link> instead.</para>
|
||||
Please use <link linkend="DTV-ENUM-DELSYS">DTV_ENUM_DELSYS</link> instead.</para>
|
||||
</section>
|
||||
|
||||
<section id="fe-caps-t">
|
||||
|
@ -101,6 +101,7 @@ a specific frontend type.</para>
|
|||
FE_CAN_8VSB = 0x200000,
|
||||
FE_CAN_16VSB = 0x400000,
|
||||
FE_HAS_EXTENDED_CAPS = 0x800000,
|
||||
FE_CAN_MULTISTREAM = 0x4000000,
|
||||
FE_CAN_TURBO_FEC = 0x8000000,
|
||||
FE_CAN_2G_MODULATION = 0x10000000,
|
||||
FE_NEEDS_BENDING = 0x20000000,
|
||||
|
@ -207,19 +208,45 @@ spec.</para>
|
|||
<para>Several functions of the frontend device use the fe_status data type defined
|
||||
by</para>
|
||||
<programlisting>
|
||||
typedef enum fe_status {
|
||||
FE_HAS_SIGNAL = 0x01, /⋆ found something above the noise level ⋆/
|
||||
FE_HAS_CARRIER = 0x02, /⋆ found a DVB signal ⋆/
|
||||
FE_HAS_VITERBI = 0x04, /⋆ FEC is stable ⋆/
|
||||
FE_HAS_SYNC = 0x08, /⋆ found sync bytes ⋆/
|
||||
FE_HAS_LOCK = 0x10, /⋆ everything's working... ⋆/
|
||||
FE_TIMEDOUT = 0x20, /⋆ no lock within the last ~2 seconds ⋆/
|
||||
FE_REINIT = 0x40 /⋆ frontend was reinitialized, ⋆/
|
||||
} fe_status_t; /⋆ application is recommned to reset ⋆/
|
||||
typedef enum fe_status {
|
||||
FE_HAS_SIGNAL = 0x01,
|
||||
FE_HAS_CARRIER = 0x02,
|
||||
FE_HAS_VITERBI = 0x04,
|
||||
FE_HAS_SYNC = 0x08,
|
||||
FE_HAS_LOCK = 0x10,
|
||||
FE_TIMEDOUT = 0x20,
|
||||
FE_REINIT = 0x40,
|
||||
} fe_status_t;
|
||||
</programlisting>
|
||||
<para>to indicate the current state and/or state changes of the frontend hardware.
|
||||
<para>to indicate the current state and/or state changes of the frontend hardware:
|
||||
</para>
|
||||
|
||||
<informaltable><tgroup cols="2"><tbody>
|
||||
<row>
|
||||
<entry align="char">FE_HAS_SIGNAL</entry>
|
||||
<entry align="char">The frontend has found something above the noise level</entry>
|
||||
</row><row>
|
||||
<entry align="char">FE_HAS_CARRIER</entry>
|
||||
<entry align="char">The frontend has found a DVB signal</entry>
|
||||
</row><row>
|
||||
<entry align="char">FE_HAS_VITERBI</entry>
|
||||
<entry align="char">The frontend FEC code is stable</entry>
|
||||
</row><row>
|
||||
<entry align="char">FE_HAS_SYNC</entry>
|
||||
<entry align="char">Syncronization bytes was found</entry>
|
||||
</row><row>
|
||||
<entry align="char">FE_HAS_LOCK</entry>
|
||||
<entry align="char">The DVB were locked and everything is working</entry>
|
||||
</row><row>
|
||||
<entry align="char">FE_TIMEDOUT</entry>
|
||||
<entry align="char">no lock within the last about 2 seconds</entry>
|
||||
</row><row>
|
||||
<entry align="char">FE_REINIT</entry>
|
||||
<entry align="char">The frontend was reinitialized, application is
|
||||
recommended to reset DiSEqC, tone and parameters</entry>
|
||||
</row>
|
||||
</tbody></tgroup></informaltable>
|
||||
|
||||
</section>
|
||||
|
||||
<section id="dvb-frontend-parameters">
|
||||
|
@ -238,7 +265,7 @@ and to add newer delivery systems.</para>
|
|||
<constant>FE_GET_PROPERTY/FE_SET_PROPERTY</constant></link> instead, in
|
||||
order to be able to support the newer System Delivery like DVB-S2, DVB-T2,
|
||||
DVB-C2, ISDB, etc.</para>
|
||||
<para>All kinds of parameters are combined as an union in the FrontendParameters structure:</para>
|
||||
<para>All kinds of parameters are combined as an union in the FrontendParameters structure:
|
||||
<programlisting>
|
||||
struct dvb_frontend_parameters {
|
||||
uint32_t frequency; /⋆ (absolute) frequency in Hz for QAM/OFDM ⋆/
|
||||
|
@ -251,12 +278,13 @@ struct dvb_frontend_parameters {
|
|||
struct dvb_vsb_parameters vsb;
|
||||
} u;
|
||||
};
|
||||
</programlisting>
|
||||
</programlisting></para>
|
||||
<para>In the case of QPSK frontends the <constant>frequency</constant> field specifies the intermediate
|
||||
frequency, i.e. the offset which is effectively added to the local oscillator frequency (LOF) of
|
||||
the LNB. The intermediate frequency has to be specified in units of kHz. For QAM and
|
||||
OFDM frontends the <constant>frequency</constant> specifies the absolute frequency and is given in Hz.
|
||||
</para>
|
||||
|
||||
<section id="dvb-qpsk-parameters">
|
||||
<title>QPSK parameters</title>
|
||||
<para>For satellite QPSK frontends you have to use the <constant>dvb_qpsk_parameters</constant> structure:</para>
|
||||
|
@ -321,8 +349,8 @@ itself.
|
|||
<section id="fe-code-rate-t">
|
||||
<title>frontend code rate</title>
|
||||
<para>The possible values for the <constant>fec_inner</constant> field used on
|
||||
<link refend="dvb-qpsk-parameters"><constant>struct dvb_qpsk_parameters</constant></link> and
|
||||
<link refend="dvb-qam-parameters"><constant>struct dvb_qam_parameters</constant></link> are:
|
||||
<link linkend="dvb-qpsk-parameters"><constant>struct dvb_qpsk_parameters</constant></link> and
|
||||
<link linkend="dvb-qam-parameters"><constant>struct dvb_qam_parameters</constant></link> are:
|
||||
</para>
|
||||
<programlisting>
|
||||
typedef enum fe_code_rate {
|
||||
|
@ -347,9 +375,9 @@ detection.
|
|||
<section id="fe-modulation-t">
|
||||
<title>frontend modulation type for QAM, OFDM and VSB</title>
|
||||
<para>For cable and terrestrial frontends, e. g. for
|
||||
<link refend="dvb-qam-parameters"><constant>struct dvb_qpsk_parameters</constant></link>,
|
||||
<link refend="dvb-ofdm-parameters"><constant>struct dvb_qam_parameters</constant></link> and
|
||||
<link refend="dvb-vsb-parameters"><constant>struct dvb_qam_parameters</constant></link>,
|
||||
<link linkend="dvb-qam-parameters"><constant>struct dvb_qpsk_parameters</constant></link>,
|
||||
<link linkend="dvb-ofdm-parameters"><constant>struct dvb_qam_parameters</constant></link> and
|
||||
<link linkend="dvb-vsb-parameters"><constant>struct dvb_qam_parameters</constant></link>,
|
||||
it needs to specify the quadrature modulation mode which can be one of the following:
|
||||
</para>
|
||||
<programlisting>
|
||||
|
@ -370,8 +398,8 @@ it needs to specify the quadrature modulation mode which can be one of the follo
|
|||
} fe_modulation_t;
|
||||
</programlisting>
|
||||
</section>
|
||||
<para>Finally, there are several more parameters for OFDM:
|
||||
</para>
|
||||
<section>
|
||||
<title>More OFDM parameters</title>
|
||||
<section id="fe-transmit-mode-t">
|
||||
<title>Number of carriers per channel</title>
|
||||
<programlisting>
|
||||
|
@ -427,6 +455,7 @@ typedef enum fe_hierarchy {
|
|||
} fe_hierarchy_t;
|
||||
</programlisting>
|
||||
</section>
|
||||
</section>
|
||||
|
||||
</section>
|
||||
|
||||
|
|
|
@ -205,7 +205,7 @@ a partial path like:</para>
|
|||
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.4</emphasis>.
|
||||
describes <emphasis role="tt">DVB_API_VERSION 5.8</emphasis>.
|
||||
</para>
|
||||
|
||||
</section>
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<para>The kernel demux API defines a driver-internal interface for registering low-level,
|
||||
hardware specific driver to a hardware independent demux layer. It is only of interest for
|
||||
DVB device driver writers. The header file for this API is named <emphasis role="tt">demux.h</emphasis> and located in
|
||||
<emphasis role="tt">drivers/media/dvb/dvb-core</emphasis>.
|
||||
<emphasis role="tt">drivers/media/dvb-core</emphasis>.
|
||||
</para>
|
||||
<para>Maintainer note: This section must be reviewed. It is probably out of date.
|
||||
</para>
|
||||
|
|
|
@ -26,4 +26,131 @@ struct dvb_net_if {
|
|||
<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>
|
||||
|
|
|
@ -15,6 +15,10 @@ the audio and video device as well as the video4linux device.
|
|||
<para>The ioctls that deal with SPUs (sub picture units) and navigation packets are only
|
||||
supported on some MPEG decoders made for DVD playback.
|
||||
</para>
|
||||
<para>
|
||||
These ioctls were also used by V4L2 to control MPEG decoders implemented in V4L2. The use
|
||||
of these ioctls for that purpose has been made obsolete and proper V4L2 ioctls or controls
|
||||
have been created to replace that functionality.</para>
|
||||
<section id="video_types">
|
||||
<title>Video Data Types</title>
|
||||
|
||||
|
@ -55,7 +59,7 @@ typedef enum {
|
|||
</section>
|
||||
|
||||
<section id="video-stream-source-t">
|
||||
<title>video stream source</title>
|
||||
<title>video_stream_source_t</title>
|
||||
<para>The video stream source is set through the VIDEO_SELECT_SOURCE call and can take
|
||||
the following values, depending on whether we are replaying from an internal (demuxer) or
|
||||
external (user write) source.
|
||||
|
@ -76,7 +80,7 @@ call.
|
|||
</section>
|
||||
|
||||
<section id="video-play-state-t">
|
||||
<title>video play state</title>
|
||||
<title>video_play_state_t</title>
|
||||
<para>The following values can be returned by the VIDEO_GET_STATUS call representing the
|
||||
state of video playback.
|
||||
</para>
|
||||
|
@ -90,9 +94,9 @@ typedef enum {
|
|||
</section>
|
||||
|
||||
<section id="video-command">
|
||||
<title>struct video_command</title>
|
||||
<para>The structure must be zeroed before use by the application
|
||||
This ensures it can be extended safely in the future.</para>
|
||||
<title>struct video-command</title>
|
||||
<programlisting>
|
||||
struct video_command {
|
||||
__u32 cmd;
|
||||
|
@ -121,7 +125,7 @@ struct video_command {
|
|||
</section>
|
||||
|
||||
<section id="video-size-t">
|
||||
<title>struct video_size-t</title>
|
||||
<title>video_size_t</title>
|
||||
<programlisting>
|
||||
typedef struct {
|
||||
int w;
|
||||
|
@ -217,7 +221,7 @@ bits set according to the hardwares capabilities.
|
|||
</section>
|
||||
|
||||
<section id="video-system">
|
||||
<title>video system</title>
|
||||
<title>video_system_t</title>
|
||||
<para>A call to VIDEO_SET_SYSTEM sets the desired video system for TV output. The
|
||||
following system types can be set:
|
||||
</para>
|
||||
|
@ -263,7 +267,7 @@ call expects the following format for that information:
|
|||
|
||||
</section>
|
||||
<section id="video-spu">
|
||||
<title>video SPU</title>
|
||||
<title>struct video_spu</title>
|
||||
<para>Calling VIDEO_SET_SPU deactivates or activates SPU decoding, according to the
|
||||
following format:
|
||||
</para>
|
||||
|
@ -277,12 +281,12 @@ following format:
|
|||
|
||||
</section>
|
||||
<section id="video-spu-palette">
|
||||
<title>video SPU palette</title>
|
||||
<title>struct video_spu_palette</title>
|
||||
<para>The following structure is used to set the SPU palette by calling VIDEO_SPU_PALETTE:
|
||||
</para>
|
||||
<programlisting>
|
||||
typedef
|
||||
struct video_spu_palette{
|
||||
struct video_spu_palette {
|
||||
int length;
|
||||
uint8_t ⋆palette;
|
||||
} video_spu_palette_t;
|
||||
|
@ -290,13 +294,13 @@ following format:
|
|||
|
||||
</section>
|
||||
<section id="video-navi-pack">
|
||||
<title>video NAVI pack</title>
|
||||
<title>struct video_navi_pack</title>
|
||||
<para>In order to get the navigational data the following structure has to be passed to the ioctl
|
||||
VIDEO_GET_NAVI:
|
||||
</para>
|
||||
<programlisting>
|
||||
typedef
|
||||
struct video_navi_pack{
|
||||
struct video_navi_pack {
|
||||
int length; /⋆ 0 ... 1024 ⋆/
|
||||
uint8_t data[1024];
|
||||
} video_navi_pack_t;
|
||||
|
@ -305,7 +309,7 @@ VIDEO_GET_NAVI:
|
|||
|
||||
|
||||
<section id="video-attributes-t">
|
||||
<title>video attributes</title>
|
||||
<title>video_attributes_t</title>
|
||||
<para>The following attributes can be set by a call to VIDEO_SET_ATTRIBUTES:
|
||||
</para>
|
||||
<programlisting>
|
||||
|
@ -541,6 +545,8 @@ VIDEO_GET_NAVI:
|
|||
role="subsection"><title>VIDEO_STOP</title>
|
||||
<para>DESCRIPTION
|
||||
</para>
|
||||
<para>This ioctl is for DVB devices only. To control a V4L2 decoder use the V4L2
|
||||
&VIDIOC-DECODER-CMD; instead.</para>
|
||||
<informaltable><tgroup cols="1"><tbody><row><entry
|
||||
align="char">
|
||||
<para>This ioctl call asks the Video Device to stop playing the current stream.
|
||||
|
@ -598,6 +604,8 @@ role="subsection"><title>VIDEO_STOP</title>
|
|||
role="subsection"><title>VIDEO_PLAY</title>
|
||||
<para>DESCRIPTION
|
||||
</para>
|
||||
<para>This ioctl is for DVB devices only. To control a V4L2 decoder use the V4L2
|
||||
&VIDIOC-DECODER-CMD; instead.</para>
|
||||
<informaltable><tgroup cols="1"><tbody><row><entry
|
||||
align="char">
|
||||
<para>This ioctl call asks the Video Device to start playing a video stream from the
|
||||
|
@ -634,6 +642,8 @@ role="subsection"><title>VIDEO_PLAY</title>
|
|||
role="subsection"><title>VIDEO_FREEZE</title>
|
||||
<para>DESCRIPTION
|
||||
</para>
|
||||
<para>This ioctl is for DVB devices only. To control a V4L2 decoder use the V4L2
|
||||
&VIDIOC-DECODER-CMD; instead.</para>
|
||||
<informaltable><tgroup cols="1"><tbody><row><entry
|
||||
align="char">
|
||||
<para>This ioctl call suspends the live video stream being played. Decoding
|
||||
|
@ -674,6 +684,8 @@ role="subsection"><title>VIDEO_FREEZE</title>
|
|||
role="subsection"><title>VIDEO_CONTINUE</title>
|
||||
<para>DESCRIPTION
|
||||
</para>
|
||||
<para>This ioctl is for DVB devices only. To control a V4L2 decoder use the V4L2
|
||||
&VIDIOC-DECODER-CMD; instead.</para>
|
||||
<informaltable><tgroup cols="1"><tbody><row><entry
|
||||
align="char">
|
||||
<para>This ioctl call restarts decoding and playing processes of the video stream
|
||||
|
@ -710,6 +722,9 @@ role="subsection"><title>VIDEO_CONTINUE</title>
|
|||
role="subsection"><title>VIDEO_SELECT_SOURCE</title>
|
||||
<para>DESCRIPTION
|
||||
</para>
|
||||
<para>This ioctl is for DVB devices only. This ioctl was also supported by the
|
||||
V4L2 ivtv driver, but that has been replaced by the ivtv-specific
|
||||
<constant>IVTV_IOC_PASSTHROUGH_MODE</constant> ioctl.</para>
|
||||
<informaltable><tgroup cols="1"><tbody><row><entry
|
||||
align="char">
|
||||
<para>This ioctl call informs the video device which source shall be used for the input
|
||||
|
@ -845,10 +860,160 @@ role="subsection"><title>VIDEO_GET_STATUS</title>
|
|||
</row></tbody></tgroup></informaltable>
|
||||
&return-value-dvb;
|
||||
|
||||
</section><section id="VIDEO_GET_FRAME_COUNT"
|
||||
role="subsection"><title>VIDEO_GET_FRAME_COUNT</title>
|
||||
<para>DESCRIPTION
|
||||
</para>
|
||||
<para>This ioctl is obsolete. Do not use in new drivers. For V4L2 decoders this
|
||||
ioctl has been replaced by the <constant>V4L2_CID_MPEG_VIDEO_DEC_FRAME</constant> control.</para>
|
||||
<informaltable><tgroup cols="1"><tbody><row><entry
|
||||
align="char">
|
||||
<para>This ioctl call asks the Video Device to return the number of displayed frames
|
||||
since the decoder was started.</para>
|
||||
</entry>
|
||||
</row></tbody></tgroup></informaltable>
|
||||
<para>SYNOPSIS
|
||||
</para>
|
||||
<informaltable><tgroup cols="1"><tbody><row><entry
|
||||
align="char">
|
||||
<para>int ioctl(int fd, int request =
|
||||
VIDEO_GET_FRAME_COUNT, __u64 *pts);</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 VIDEO_GET_FRAME_COUNT for this
|
||||
command.</para>
|
||||
</entry>
|
||||
</row><row><entry
|
||||
align="char">
|
||||
<para>__u64 *pts
|
||||
</para>
|
||||
</entry><entry
|
||||
align="char">
|
||||
<para>Returns the number of frames displayed since the decoder was started.
|
||||
</para>
|
||||
</entry>
|
||||
</row></tbody></tgroup></informaltable>
|
||||
&return-value-dvb;
|
||||
|
||||
</section><section id="VIDEO_GET_PTS"
|
||||
role="subsection"><title>VIDEO_GET_PTS</title>
|
||||
<para>DESCRIPTION
|
||||
</para>
|
||||
<para>This ioctl is obsolete. Do not use in new drivers. For V4L2 decoders this
|
||||
ioctl has been replaced by the <constant>V4L2_CID_MPEG_VIDEO_DEC_PTS</constant> control.</para>
|
||||
<informaltable><tgroup cols="1"><tbody><row><entry
|
||||
align="char">
|
||||
<para>This ioctl call asks the Video Device to return the current PTS timestamp.</para>
|
||||
</entry>
|
||||
</row></tbody></tgroup></informaltable>
|
||||
<para>SYNOPSIS
|
||||
</para>
|
||||
<informaltable><tgroup cols="1"><tbody><row><entry
|
||||
align="char">
|
||||
<para>int ioctl(int fd, int request =
|
||||
VIDEO_GET_PTS, __u64 *pts);</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 VIDEO_GET_PTS for this
|
||||
command.</para>
|
||||
</entry>
|
||||
</row><row><entry
|
||||
align="char">
|
||||
<para>__u64 *pts
|
||||
</para>
|
||||
</entry><entry
|
||||
align="char">
|
||||
<para>Returns the 33-bit timestamp as defined in ITU T-REC-H.222.0 / ISO/IEC 13818-1.
|
||||
</para>
|
||||
<para>
|
||||
The PTS should belong to the currently played
|
||||
frame if possible, but may also be a value close to it
|
||||
like the PTS of the last decoded frame or the last PTS
|
||||
extracted by the PES parser.</para>
|
||||
</entry>
|
||||
</row></tbody></tgroup></informaltable>
|
||||
&return-value-dvb;
|
||||
|
||||
</section><section id="VIDEO_GET_FRAME_RATE"
|
||||
role="subsection"><title>VIDEO_GET_FRAME_RATE</title>
|
||||
<para>DESCRIPTION
|
||||
</para>
|
||||
<informaltable><tgroup cols="1"><tbody><row><entry
|
||||
align="char">
|
||||
<para>This ioctl call asks the Video Device to return the current framerate.</para>
|
||||
</entry>
|
||||
</row></tbody></tgroup></informaltable>
|
||||
<para>SYNOPSIS
|
||||
</para>
|
||||
<informaltable><tgroup cols="1"><tbody><row><entry
|
||||
align="char">
|
||||
<para>int ioctl(int fd, int request =
|
||||
VIDEO_GET_FRAME_RATE, unsigned int *rate);</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 VIDEO_GET_FRAME_RATE for this
|
||||
command.</para>
|
||||
</entry>
|
||||
</row><row><entry
|
||||
align="char">
|
||||
<para>unsigned int *rate
|
||||
</para>
|
||||
</entry><entry
|
||||
align="char">
|
||||
<para>Returns the framerate in number of frames per 1000 seconds.
|
||||
</para>
|
||||
</entry>
|
||||
</row></tbody></tgroup></informaltable>
|
||||
&return-value-dvb;
|
||||
|
||||
</section><section id="VIDEO_GET_EVENT"
|
||||
role="subsection"><title>VIDEO_GET_EVENT</title>
|
||||
<para>DESCRIPTION
|
||||
</para>
|
||||
<para>This ioctl is for DVB devices only. To get events from a V4L2 decoder use the V4L2
|
||||
&VIDIOC-DQEVENT; ioctl instead.</para>
|
||||
<informaltable><tgroup cols="1"><tbody><row><entry
|
||||
align="char">
|
||||
<para>This ioctl call returns an event of type video_event if available. If an event is
|
||||
|
@ -914,6 +1079,152 @@ role="subsection"><title>VIDEO_GET_EVENT</title>
|
|||
</entry>
|
||||
</row></tbody></tgroup></informaltable>
|
||||
|
||||
</section><section id="VIDEO_COMMAND"
|
||||
role="subsection"><title>VIDEO_COMMAND</title>
|
||||
<para>DESCRIPTION
|
||||
</para>
|
||||
<para>This ioctl is obsolete. Do not use in new drivers. For V4L2 decoders this
|
||||
ioctl has been replaced by the &VIDIOC-DECODER-CMD; ioctl.</para>
|
||||
<informaltable><tgroup cols="1"><tbody><row><entry
|
||||
align="char">
|
||||
<para>This ioctl commands the decoder. The <constant>video_command</constant> struct
|
||||
is a subset of the <constant>v4l2_decoder_cmd</constant> struct, so refer to the
|
||||
&VIDIOC-DECODER-CMD; documentation for more information.</para>
|
||||
</entry>
|
||||
</row></tbody></tgroup></informaltable>
|
||||
<para>SYNOPSIS
|
||||
</para>
|
||||
<informaltable><tgroup cols="1"><tbody><row><entry
|
||||
align="char">
|
||||
<para>int ioctl(int fd, int request =
|
||||
VIDEO_COMMAND, struct video_command *cmd);</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 VIDEO_COMMAND for this
|
||||
command.</para>
|
||||
</entry>
|
||||
</row><row><entry
|
||||
align="char">
|
||||
<para>struct video_command *cmd
|
||||
</para>
|
||||
</entry><entry
|
||||
align="char">
|
||||
<para>Commands the decoder.
|
||||
</para>
|
||||
</entry>
|
||||
</row></tbody></tgroup></informaltable>
|
||||
&return-value-dvb;
|
||||
|
||||
</section><section id="VIDEO_TRY_COMMAND"
|
||||
role="subsection"><title>VIDEO_TRY_COMMAND</title>
|
||||
<para>DESCRIPTION
|
||||
</para>
|
||||
<para>This ioctl is obsolete. Do not use in new drivers. For V4L2 decoders this
|
||||
ioctl has been replaced by the &VIDIOC-TRY-DECODER-CMD; ioctl.</para>
|
||||
<informaltable><tgroup cols="1"><tbody><row><entry
|
||||
align="char">
|
||||
<para>This ioctl tries a decoder command. The <constant>video_command</constant> struct
|
||||
is a subset of the <constant>v4l2_decoder_cmd</constant> struct, so refer to the
|
||||
&VIDIOC-TRY-DECODER-CMD; documentation for more information.</para>
|
||||
</entry>
|
||||
</row></tbody></tgroup></informaltable>
|
||||
<para>SYNOPSIS
|
||||
</para>
|
||||
<informaltable><tgroup cols="1"><tbody><row><entry
|
||||
align="char">
|
||||
<para>int ioctl(int fd, int request =
|
||||
VIDEO_TRY_COMMAND, struct video_command *cmd);</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 VIDEO_TRY_COMMAND for this
|
||||
command.</para>
|
||||
</entry>
|
||||
</row><row><entry
|
||||
align="char">
|
||||
<para>struct video_command *cmd
|
||||
</para>
|
||||
</entry><entry
|
||||
align="char">
|
||||
<para>Try a decoder command.
|
||||
</para>
|
||||
</entry>
|
||||
</row></tbody></tgroup></informaltable>
|
||||
&return-value-dvb;
|
||||
|
||||
</section><section id="VIDEO_GET_SIZE"
|
||||
role="subsection"><title>VIDEO_GET_SIZE</title>
|
||||
<para>DESCRIPTION
|
||||
</para>
|
||||
<informaltable><tgroup cols="1"><tbody><row><entry
|
||||
align="char">
|
||||
<para>This ioctl returns the size and aspect ratio.</para>
|
||||
</entry>
|
||||
</row></tbody></tgroup></informaltable>
|
||||
<para>SYNOPSIS
|
||||
</para>
|
||||
<informaltable><tgroup cols="1"><tbody><row><entry
|
||||
align="char">
|
||||
<para>int ioctl(int fd, int request =
|
||||
VIDEO_GET_SIZE, video_size_t *size);</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 VIDEO_GET_SIZE for this
|
||||
command.</para>
|
||||
</entry>
|
||||
</row><row><entry
|
||||
align="char">
|
||||
<para>video_size_t *size
|
||||
</para>
|
||||
</entry><entry
|
||||
align="char">
|
||||
<para>Returns the size and aspect ratio.
|
||||
</para>
|
||||
</entry>
|
||||
</row></tbody></tgroup></informaltable>
|
||||
&return-value-dvb;
|
||||
|
||||
</section><section id="VIDEO_SET_DISPLAY_FORMAT"
|
||||
role="subsection"><title>VIDEO_SET_DISPLAY_FORMAT</title>
|
||||
<para>DESCRIPTION
|
||||
|
|
|
@ -178,23 +178,23 @@ Signal - NTSC for Studio Applications"</title>
|
|||
1125-Line High-Definition Production"</title>
|
||||
</biblioentry>
|
||||
|
||||
<biblioentry id="en50067">
|
||||
<abbrev>EN 50067</abbrev>
|
||||
<biblioentry id="iec62106">
|
||||
<abbrev>IEC 62106</abbrev>
|
||||
<authorgroup>
|
||||
<corpauthor>European Committee for Electrotechnical Standardization
|
||||
(<ulink url="http://www.cenelec.eu">http://www.cenelec.eu</ulink>)</corpauthor>
|
||||
<corpauthor>International Electrotechnical Commission
|
||||
(<ulink url="http://www.iec.ch">http://www.iec.ch</ulink>)</corpauthor>
|
||||
</authorgroup>
|
||||
<title>Specification of the radio data system (RDS) for VHF/FM sound broadcasting
|
||||
in the frequency range from 87,5 to 108,0 MHz</title>
|
||||
</biblioentry>
|
||||
|
||||
<biblioentry id="nrsc4">
|
||||
<abbrev>NRSC-4</abbrev>
|
||||
<abbrev>NRSC-4-B</abbrev>
|
||||
<authorgroup>
|
||||
<corpauthor>National Radio Systems Committee
|
||||
(<ulink url="http://www.nrscstandards.org">http://www.nrscstandards.org</ulink>)</corpauthor>
|
||||
</authorgroup>
|
||||
<title>NRSC-4: United States RBDS Standard</title>
|
||||
<title>NRSC-4-B: United States RBDS Standard</title>
|
||||
</biblioentry>
|
||||
|
||||
<biblioentry id="iso12232">
|
||||
|
@ -226,4 +226,44 @@ in the frequency range from 87,5 to 108,0 MHz</title>
|
|||
<title>VESA and Industry Standards and Guidelines for Computer Display Monitor Timing (DMT)</title>
|
||||
</biblioentry>
|
||||
|
||||
<biblioentry id="vesaedid">
|
||||
<abbrev>EDID</abbrev>
|
||||
<authorgroup>
|
||||
<corpauthor>Video Electronics Standards Association
|
||||
(<ulink url="http://www.vesa.org">http://www.vesa.org</ulink>)</corpauthor>
|
||||
</authorgroup>
|
||||
<title>VESA Enhanced Extended Display Identification Data Standard</title>
|
||||
<subtitle>Release A, Revision 2</subtitle>
|
||||
</biblioentry>
|
||||
|
||||
<biblioentry id="hdcp">
|
||||
<abbrev>HDCP</abbrev>
|
||||
<authorgroup>
|
||||
<corpauthor>Digital Content Protection LLC
|
||||
(<ulink url="http://www.digital-cp.com">http://www.digital-cp.com</ulink>)</corpauthor>
|
||||
</authorgroup>
|
||||
<title>High-bandwidth Digital Content Protection System</title>
|
||||
<subtitle>Revision 1.3</subtitle>
|
||||
</biblioentry>
|
||||
|
||||
<biblioentry id="hdmi">
|
||||
<abbrev>HDMI</abbrev>
|
||||
<authorgroup>
|
||||
<corpauthor>HDMI Licensing LLC
|
||||
(<ulink url="http://www.hdmi.org">http://www.hdmi.org</ulink>)</corpauthor>
|
||||
</authorgroup>
|
||||
<title>High-Definition Multimedia Interface</title>
|
||||
<subtitle>Specification Version 1.4a</subtitle>
|
||||
</biblioentry>
|
||||
|
||||
<biblioentry id="dp">
|
||||
<abbrev>DP</abbrev>
|
||||
<authorgroup>
|
||||
<corpauthor>Video Electronics Standards Association
|
||||
(<ulink url="http://www.vesa.org">http://www.vesa.org</ulink>)</corpauthor>
|
||||
</authorgroup>
|
||||
<title>VESA DisplayPort Standard</title>
|
||||
<subtitle>Version 1, Revision 2</subtitle>
|
||||
</biblioentry>
|
||||
|
||||
</bibliography>
|
||||
|
|
|
@ -564,7 +564,7 @@ automatically.</para>
|
|||
<para>To query and select the standard used by the current video
|
||||
input or output applications call the &VIDIOC-G-STD; and
|
||||
&VIDIOC-S-STD; ioctl, respectively. The <emphasis>received</emphasis>
|
||||
standard can be sensed with the &VIDIOC-QUERYSTD; ioctl. Note parameter of all these ioctls is a pointer to a &v4l2-std-id; type (a standard set), <emphasis>not</emphasis> an index into the standard enumeration.<footnote>
|
||||
standard can be sensed with the &VIDIOC-QUERYSTD; ioctl. Note that the parameter of all these ioctls is a pointer to a &v4l2-std-id; type (a standard set), <emphasis>not</emphasis> an index into the standard enumeration.<footnote>
|
||||
<para>An alternative to the current scheme is to use pointers
|
||||
to indices as arguments of <constant>VIDIOC_G_STD</constant> and
|
||||
<constant>VIDIOC_S_STD</constant>, the &v4l2-input; and
|
||||
|
@ -588,30 +588,28 @@ switch to a standard by &v4l2-std-id;.</para>
|
|||
</footnote> Drivers must implement all video standard ioctls
|
||||
when the device has one or more video inputs or outputs.</para>
|
||||
|
||||
<para>Special rules apply to USB cameras where the notion of video
|
||||
standards makes little sense. More generally any capture device,
|
||||
output devices accordingly, which is <itemizedlist>
|
||||
<para>Special rules apply to devices such as USB cameras where the notion of video
|
||||
standards makes little sense. More generally for any capture or output device
|
||||
which is: <itemizedlist>
|
||||
<listitem>
|
||||
<para>incapable of capturing fields or frames at the nominal
|
||||
rate of the video standard, or</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>where <link linkend="buffer">timestamps</link> refer
|
||||
to the instant the field or frame was received by the driver, not the
|
||||
capture time, or</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>where <link linkend="buffer">sequence numbers</link>
|
||||
refer to the frames received by the driver, not the captured
|
||||
frames.</para>
|
||||
<para>that does not support the video standard formats at all.</para>
|
||||
</listitem>
|
||||
</itemizedlist> Here the driver shall set the
|
||||
<structfield>std</structfield> field of &v4l2-input; and &v4l2-output;
|
||||
to zero, the <constant>VIDIOC_G_STD</constant>,
|
||||
to zero and the <constant>VIDIOC_G_STD</constant>,
|
||||
<constant>VIDIOC_S_STD</constant>,
|
||||
<constant>VIDIOC_QUERYSTD</constant> and
|
||||
<constant>VIDIOC_ENUMSTD</constant> ioctls shall return the
|
||||
&EINVAL;.<footnote>
|
||||
&ENOTTY;.<footnote>
|
||||
<para>See <xref linkend="buffer" /> for a rationale.</para>
|
||||
<para>Applications can make use of the <xref linkend="input-capabilities" /> and
|
||||
<xref linkend="output-capabilities"/> flags to determine whether the video standard ioctls
|
||||
are available for the device.</para>
|
||||
&ENOTTY;.
|
||||
<para>See <xref linkend="buffer" /> for a rationale. Probably
|
||||
even USB cameras follow some well known video standard. It might have
|
||||
been better to explicitly indicate elsewhere if a device cannot live
|
||||
|
@ -626,9 +624,9 @@ up to normal expectations, instead of this exception.</para>
|
|||
&v4l2-standard; standard;
|
||||
|
||||
if (-1 == ioctl (fd, &VIDIOC-G-STD;, &std_id)) {
|
||||
/* Note when VIDIOC_ENUMSTD always returns EINVAL this
|
||||
/* Note when VIDIOC_ENUMSTD always returns ENOTTY this
|
||||
is no video device or it falls under the USB exception,
|
||||
and VIDIOC_G_STD returning EINVAL is no error. */
|
||||
and VIDIOC_G_STD returning ENOTTY is no error. */
|
||||
|
||||
perror ("VIDIOC_G_STD");
|
||||
exit (EXIT_FAILURE);
|
||||
|
|
|
@ -1476,7 +1476,7 @@ follows.<informaltable>
|
|||
</row>
|
||||
<row>
|
||||
<entry><constant>V4L2_BUF_TYPE_PRIVATE_BASE</constant></entry>
|
||||
<entry><constant>V4L2_BUF_TYPE_PRIVATE</constant></entry>
|
||||
<entry><constant>V4L2_BUF_TYPE_PRIVATE</constant> (but this is deprecated)</entry>
|
||||
</row>
|
||||
</tbody>
|
||||
</tgroup>
|
||||
|
@ -2468,21 +2468,9 @@ that used it. It was originally scheduled for removal in 2.6.35.
|
|||
<structfield>reserved2</structfield> and removed
|
||||
<constant>V4L2_BUF_FLAG_INPUT</constant>.</para>
|
||||
</listitem>
|
||||
</orderedlist>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<title>V4L2 in Linux 3.6</title>
|
||||
<orderedlist>
|
||||
<listitem>
|
||||
<para>Added V4L2_CAP_VIDEO_M2M and V4L2_CAP_VIDEO_M2M_MPLANE capabilities.</para>
|
||||
</listitem>
|
||||
</orderedlist>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<title>V4L2 in Linux 3.6</title>
|
||||
<orderedlist>
|
||||
<listitem>
|
||||
<para>Added support for frequency band enumerations: &VIDIOC-ENUM-FREQ-BANDS;.</para>
|
||||
</listitem>
|
||||
|
@ -2567,29 +2555,6 @@ and may change in the future.</para>
|
|||
<para>Video Output Overlay (OSD) Interface, <xref
|
||||
linkend="osd" />.</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para><constant>V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY</constant>,
|
||||
&v4l2-buf-type;, <xref linkend="v4l2-buf-type" />.</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para><constant>V4L2_CAP_VIDEO_OUTPUT_OVERLAY</constant>,
|
||||
&VIDIOC-QUERYCAP; ioctl, <xref linkend="device-capabilities" />.</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>&VIDIOC-ENUM-FRAMESIZES; and
|
||||
&VIDIOC-ENUM-FRAMEINTERVALS; ioctls.</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>&VIDIOC-G-ENC-INDEX; ioctl.</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>&VIDIOC-ENCODER-CMD; and &VIDIOC-TRY-ENCODER-CMD;
|
||||
ioctls.</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>&VIDIOC-DECODER-CMD; and &VIDIOC-TRY-DECODER-CMD;
|
||||
ioctls.</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>&VIDIOC-DBG-G-REGISTER; and &VIDIOC-DBG-S-REGISTER;
|
||||
ioctls.</para>
|
||||
|
@ -2614,10 +2579,6 @@ ioctls.</para>
|
|||
<para>Sub-device selection API: &VIDIOC-SUBDEV-G-SELECTION;
|
||||
and &VIDIOC-SUBDEV-S-SELECTION; ioctls.</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para><link linkend="v4l2-auto-focus-area"><constant>
|
||||
V4L2_CID_AUTO_FOCUS_AREA</constant></link> control.</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>Support for frequency band enumeration: &VIDIOC-ENUM-FREQ-BANDS; ioctl.</para>
|
||||
</listitem>
|
||||
|
|
|
@ -3505,7 +3505,7 @@ This encodes up to 31 pre-defined programme types.</entry>
|
|||
</row>
|
||||
<row><entry spanname="descr">Sets the Programme Service name (PS_NAME) for transmission.
|
||||
It is intended for static display on a receiver. It is the primary aid to listeners in programme service
|
||||
identification and selection. In Annex E of <xref linkend="en50067" />, the RDS specification,
|
||||
identification and selection. In Annex E of <xref linkend="iec62106" />, the RDS specification,
|
||||
there is a full description of the correct character encoding for Programme Service name strings.
|
||||
Also from RDS specification, PS is usually a single eight character text. However, it is also possible
|
||||
to find receivers which can scroll strings sized as 8 x N characters. So, this control must be configured
|
||||
|
@ -3519,7 +3519,7 @@ with steps of 8 characters. The result is it must always contain a string with s
|
|||
what is being broadcasted. RDS Radio Text can be applied when broadcaster wishes to transmit longer PS names,
|
||||
programme-related information or any other text. In these cases, RadioText should be used in addition to
|
||||
<constant>V4L2_CID_RDS_TX_PS_NAME</constant>. The encoding for Radio Text strings is also fully described
|
||||
in Annex E of <xref linkend="en50067" />. The length of Radio Text strings depends on which RDS Block is being
|
||||
in Annex E of <xref linkend="iec62106" />. The length of Radio Text strings depends on which RDS Block is being
|
||||
used to transmit it, either 32 (2A block) or 64 (2B block). However, it is also possible
|
||||
to find receivers which can scroll strings sized as 32 x N or 64 x N characters. So, this control must be configured
|
||||
with steps of 32 or 64 characters. The result is it must always contain a string with size multiple of 32 or 64. </entry>
|
||||
|
@ -3650,7 +3650,7 @@ manually or automatically if set to zero. Unit, range and step are driver-specif
|
|||
</table>
|
||||
|
||||
<para>For more details about RDS specification, refer to
|
||||
<xref linkend="en50067" /> document, from CENELEC.</para>
|
||||
<xref linkend="iec62106" /> document, from CENELEC.</para>
|
||||
</section>
|
||||
|
||||
<section id="flash-controls">
|
||||
|
@ -3717,232 +3717,231 @@ interface and may change in the future.</para>
|
|||
use case involving camera or individually.
|
||||
</para>
|
||||
|
||||
|
||||
<table pgwide="1" frame="none" id="flash-control-id">
|
||||
<title>Flash Control IDs</title>
|
||||
|
||||
<tgroup cols="4">
|
||||
<colspec colname="c1" colwidth="1*" />
|
||||
<colspec colname="c2" colwidth="6*" />
|
||||
<colspec colname="c3" colwidth="2*" />
|
||||
<colspec colname="c4" colwidth="6*" />
|
||||
<spanspec namest="c1" nameend="c2" spanname="id" />
|
||||
<spanspec namest="c2" nameend="c4" spanname="descr" />
|
||||
<thead>
|
||||
<row>
|
||||
<entry spanname="id" align="left">ID</entry>
|
||||
<entry align="left">Type</entry>
|
||||
</row><row rowsep="1"><entry spanname="descr" align="left">Description</entry>
|
||||
</row>
|
||||
</thead>
|
||||
<tbody valign="top">
|
||||
<row><entry></entry></row>
|
||||
<row>
|
||||
<entry spanname="id"><constant>V4L2_CID_FLASH_CLASS</constant></entry>
|
||||
<entry>class</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry spanname="descr">The FLASH class descriptor.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry spanname="id"><constant>V4L2_CID_FLASH_LED_MODE</constant></entry>
|
||||
<entry>menu</entry>
|
||||
</row>
|
||||
<row id="v4l2-flash-led-mode">
|
||||
<entry spanname="descr">Defines the mode of the flash LED,
|
||||
the high-power white LED attached to the flash controller.
|
||||
Setting this control may not be possible in presence of
|
||||
some faults. See V4L2_CID_FLASH_FAULT.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entrytbl spanname="descr" cols="2">
|
||||
<tbody valign="top">
|
||||
<row>
|
||||
<entry><constant>V4L2_FLASH_LED_MODE_NONE</constant></entry>
|
||||
<entry>Off.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><constant>V4L2_FLASH_LED_MODE_FLASH</constant></entry>
|
||||
<entry>Flash mode.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><constant>V4L2_FLASH_LED_MODE_TORCH</constant></entry>
|
||||
<entry>Torch mode. See V4L2_CID_FLASH_TORCH_INTENSITY.</entry>
|
||||
</row>
|
||||
</tbody>
|
||||
</entrytbl>
|
||||
</row>
|
||||
<row>
|
||||
<entry spanname="id"><constant>V4L2_CID_FLASH_STROBE_SOURCE</constant></entry>
|
||||
<entry>menu</entry>
|
||||
</row>
|
||||
<row id="v4l2-flash-strobe-source"><entry
|
||||
spanname="descr">Defines the source of the flash LED
|
||||
strobe.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entrytbl spanname="descr" cols="2">
|
||||
<tbody valign="top">
|
||||
<row>
|
||||
<entry><constant>V4L2_FLASH_STROBE_SOURCE_SOFTWARE</constant></entry>
|
||||
<entry>The flash strobe is triggered by using
|
||||
the V4L2_CID_FLASH_STROBE control.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><constant>V4L2_FLASH_STROBE_SOURCE_EXTERNAL</constant></entry>
|
||||
<entry>The flash strobe is triggered by an
|
||||
external source. Typically this is a sensor,
|
||||
which makes it possible to synchronises the
|
||||
flash strobe start to exposure start.</entry>
|
||||
</row>
|
||||
</tbody>
|
||||
</entrytbl>
|
||||
</row>
|
||||
<row>
|
||||
<entry spanname="id"><constant>V4L2_CID_FLASH_STROBE</constant></entry>
|
||||
<entry>button</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry spanname="descr">Strobe flash. Valid when
|
||||
V4L2_CID_FLASH_LED_MODE is set to
|
||||
V4L2_FLASH_LED_MODE_FLASH and V4L2_CID_FLASH_STROBE_SOURCE
|
||||
is set to V4L2_FLASH_STROBE_SOURCE_SOFTWARE. Setting this
|
||||
control may not be possible in presence of some faults.
|
||||
See V4L2_CID_FLASH_FAULT.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry spanname="id"><constant>V4L2_CID_FLASH_STROBE_STOP</constant></entry>
|
||||
<entry>button</entry>
|
||||
</row>
|
||||
<row><entry spanname="descr">Stop flash strobe immediately.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry spanname="id"><constant>V4L2_CID_FLASH_STROBE_STATUS</constant></entry>
|
||||
<entry>boolean</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry spanname="descr">Strobe status: whether the flash
|
||||
is strobing at the moment or not. This is a read-only
|
||||
control.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry spanname="id"><constant>V4L2_CID_FLASH_TIMEOUT</constant></entry>
|
||||
<entry>integer</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry spanname="descr">Hardware timeout for flash. The
|
||||
flash strobe is stopped after this period of time has
|
||||
passed from the start of the strobe.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry spanname="id"><constant>V4L2_CID_FLASH_INTENSITY</constant></entry>
|
||||
<entry>integer</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry spanname="descr">Intensity of the flash strobe when
|
||||
the flash LED is in flash mode
|
||||
(V4L2_FLASH_LED_MODE_FLASH). The unit should be milliamps
|
||||
(mA) if possible.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry spanname="id"><constant>V4L2_CID_FLASH_TORCH_INTENSITY</constant></entry>
|
||||
<entry>integer</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry spanname="descr">Intensity of the flash LED in
|
||||
torch mode (V4L2_FLASH_LED_MODE_TORCH). The unit should be
|
||||
milliamps (mA) if possible. Setting this control may not
|
||||
be possible in presence of some faults. See
|
||||
V4L2_CID_FLASH_FAULT.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry spanname="id"><constant>V4L2_CID_FLASH_INDICATOR_INTENSITY</constant></entry>
|
||||
<entry>integer</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry spanname="descr">Intensity of the indicator LED.
|
||||
The indicator LED may be fully independent of the flash
|
||||
LED. The unit should be microamps (uA) if possible.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry spanname="id"><constant>V4L2_CID_FLASH_FAULT</constant></entry>
|
||||
<entry>bitmask</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry spanname="descr">Faults related to the flash. The
|
||||
faults tell about specific problems in the flash chip
|
||||
itself or the LEDs attached to it. Faults may prevent
|
||||
further use of some of the flash controls. In particular,
|
||||
V4L2_CID_FLASH_LED_MODE is set to V4L2_FLASH_LED_MODE_NONE
|
||||
if the fault affects the flash LED. Exactly which faults
|
||||
have such an effect is chip dependent. Reading the faults
|
||||
resets the control and returns the chip to a usable state
|
||||
if possible.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entrytbl spanname="descr" cols="2">
|
||||
<tbody valign="top">
|
||||
<row>
|
||||
<entry><constant>V4L2_FLASH_FAULT_OVER_VOLTAGE</constant></entry>
|
||||
<entry>Flash controller voltage to the flash LED
|
||||
has exceeded the limit specific to the flash
|
||||
controller.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><constant>V4L2_FLASH_FAULT_TIMEOUT</constant></entry>
|
||||
<entry>The flash strobe was still on when
|
||||
the timeout set by the user ---
|
||||
V4L2_CID_FLASH_TIMEOUT control --- has expired.
|
||||
Not all flash controllers may set this in all
|
||||
such conditions.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><constant>V4L2_FLASH_FAULT_OVER_TEMPERATURE</constant></entry>
|
||||
<entry>The flash controller has overheated.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><constant>V4L2_FLASH_FAULT_SHORT_CIRCUIT</constant></entry>
|
||||
<entry>The short circuit protection of the flash
|
||||
controller has been triggered.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><constant>V4L2_FLASH_FAULT_OVER_CURRENT</constant></entry>
|
||||
<entry>Current in the LED power supply has exceeded the limit
|
||||
specific to the flash controller.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><constant>V4L2_FLASH_FAULT_INDICATOR</constant></entry>
|
||||
<entry>The flash controller has detected a short or open
|
||||
circuit condition on the indicator LED.</entry>
|
||||
</row>
|
||||
</tbody>
|
||||
</entrytbl>
|
||||
</row>
|
||||
<row>
|
||||
<entry spanname="id"><constant>V4L2_CID_FLASH_CHARGE</constant></entry>
|
||||
<entry>boolean</entry>
|
||||
</row>
|
||||
<row><entry spanname="descr">Enable or disable charging of the xenon
|
||||
flash capacitor.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry spanname="id"><constant>V4L2_CID_FLASH_READY</constant></entry>
|
||||
<entry>boolean</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry spanname="descr">Is the flash ready to strobe?
|
||||
Xenon flashes require their capacitors charged before
|
||||
strobing. LED flashes often require a cooldown period
|
||||
after strobe during which another strobe will not be
|
||||
possible. This is a read-only control.</entry>
|
||||
</row>
|
||||
<row><entry></entry></row>
|
||||
</tbody>
|
||||
</tgroup>
|
||||
</table>
|
||||
</section>
|
||||
|
||||
</section>
|
||||
|
||||
<table pgwide="1" frame="none" id="flash-control-id">
|
||||
<title>Flash Control IDs</title>
|
||||
|
||||
<tgroup cols="4">
|
||||
<colspec colname="c1" colwidth="1*" />
|
||||
<colspec colname="c2" colwidth="6*" />
|
||||
<colspec colname="c3" colwidth="2*" />
|
||||
<colspec colname="c4" colwidth="6*" />
|
||||
<spanspec namest="c1" nameend="c2" spanname="id" />
|
||||
<spanspec namest="c2" nameend="c4" spanname="descr" />
|
||||
<thead>
|
||||
<row>
|
||||
<entry spanname="id" align="left">ID</entry>
|
||||
<entry align="left">Type</entry>
|
||||
</row><row rowsep="1"><entry spanname="descr" align="left">Description</entry>
|
||||
</row>
|
||||
</thead>
|
||||
<tbody valign="top">
|
||||
<row><entry></entry></row>
|
||||
<row>
|
||||
<entry spanname="id"><constant>V4L2_CID_FLASH_CLASS</constant></entry>
|
||||
<entry>class</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry spanname="descr">The FLASH class descriptor.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry spanname="id"><constant>V4L2_CID_FLASH_LED_MODE</constant></entry>
|
||||
<entry>menu</entry>
|
||||
</row>
|
||||
<row id="v4l2-flash-led-mode">
|
||||
<entry spanname="descr">Defines the mode of the flash LED,
|
||||
the high-power white LED attached to the flash controller.
|
||||
Setting this control may not be possible in presence of
|
||||
some faults. See V4L2_CID_FLASH_FAULT.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entrytbl spanname="descr" cols="2">
|
||||
<tbody valign="top">
|
||||
<row>
|
||||
<entry><constant>V4L2_FLASH_LED_MODE_NONE</constant></entry>
|
||||
<entry>Off.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><constant>V4L2_FLASH_LED_MODE_FLASH</constant></entry>
|
||||
<entry>Flash mode.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><constant>V4L2_FLASH_LED_MODE_TORCH</constant></entry>
|
||||
<entry>Torch mode. See V4L2_CID_FLASH_TORCH_INTENSITY.</entry>
|
||||
</row>
|
||||
</tbody>
|
||||
</entrytbl>
|
||||
</row>
|
||||
<row>
|
||||
<entry spanname="id"><constant>V4L2_CID_FLASH_STROBE_SOURCE</constant></entry>
|
||||
<entry>menu</entry>
|
||||
</row>
|
||||
<row id="v4l2-flash-strobe-source"><entry
|
||||
spanname="descr">Defines the source of the flash LED
|
||||
strobe.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entrytbl spanname="descr" cols="2">
|
||||
<tbody valign="top">
|
||||
<row>
|
||||
<entry><constant>V4L2_FLASH_STROBE_SOURCE_SOFTWARE</constant></entry>
|
||||
<entry>The flash strobe is triggered by using
|
||||
the V4L2_CID_FLASH_STROBE control.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><constant>V4L2_FLASH_STROBE_SOURCE_EXTERNAL</constant></entry>
|
||||
<entry>The flash strobe is triggered by an
|
||||
external source. Typically this is a sensor,
|
||||
which makes it possible to synchronises the
|
||||
flash strobe start to exposure start.</entry>
|
||||
</row>
|
||||
</tbody>
|
||||
</entrytbl>
|
||||
</row>
|
||||
<row>
|
||||
<entry spanname="id"><constant>V4L2_CID_FLASH_STROBE</constant></entry>
|
||||
<entry>button</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry spanname="descr">Strobe flash. Valid when
|
||||
V4L2_CID_FLASH_LED_MODE is set to
|
||||
V4L2_FLASH_LED_MODE_FLASH and V4L2_CID_FLASH_STROBE_SOURCE
|
||||
is set to V4L2_FLASH_STROBE_SOURCE_SOFTWARE. Setting this
|
||||
control may not be possible in presence of some faults.
|
||||
See V4L2_CID_FLASH_FAULT.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry spanname="id"><constant>V4L2_CID_FLASH_STROBE_STOP</constant></entry>
|
||||
<entry>button</entry>
|
||||
</row>
|
||||
<row><entry spanname="descr">Stop flash strobe immediately.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry spanname="id"><constant>V4L2_CID_FLASH_STROBE_STATUS</constant></entry>
|
||||
<entry>boolean</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry spanname="descr">Strobe status: whether the flash
|
||||
is strobing at the moment or not. This is a read-only
|
||||
control.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry spanname="id"><constant>V4L2_CID_FLASH_TIMEOUT</constant></entry>
|
||||
<entry>integer</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry spanname="descr">Hardware timeout for flash. The
|
||||
flash strobe is stopped after this period of time has
|
||||
passed from the start of the strobe.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry spanname="id"><constant>V4L2_CID_FLASH_INTENSITY</constant></entry>
|
||||
<entry>integer</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry spanname="descr">Intensity of the flash strobe when
|
||||
the flash LED is in flash mode
|
||||
(V4L2_FLASH_LED_MODE_FLASH). The unit should be milliamps
|
||||
(mA) if possible.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry spanname="id"><constant>V4L2_CID_FLASH_TORCH_INTENSITY</constant></entry>
|
||||
<entry>integer</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry spanname="descr">Intensity of the flash LED in
|
||||
torch mode (V4L2_FLASH_LED_MODE_TORCH). The unit should be
|
||||
milliamps (mA) if possible. Setting this control may not
|
||||
be possible in presence of some faults. See
|
||||
V4L2_CID_FLASH_FAULT.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry spanname="id"><constant>V4L2_CID_FLASH_INDICATOR_INTENSITY</constant></entry>
|
||||
<entry>integer</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry spanname="descr">Intensity of the indicator LED.
|
||||
The indicator LED may be fully independent of the flash
|
||||
LED. The unit should be microamps (uA) if possible.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry spanname="id"><constant>V4L2_CID_FLASH_FAULT</constant></entry>
|
||||
<entry>bitmask</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry spanname="descr">Faults related to the flash. The
|
||||
faults tell about specific problems in the flash chip
|
||||
itself or the LEDs attached to it. Faults may prevent
|
||||
further use of some of the flash controls. In particular,
|
||||
V4L2_CID_FLASH_LED_MODE is set to V4L2_FLASH_LED_MODE_NONE
|
||||
if the fault affects the flash LED. Exactly which faults
|
||||
have such an effect is chip dependent. Reading the faults
|
||||
resets the control and returns the chip to a usable state
|
||||
if possible.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entrytbl spanname="descr" cols="2">
|
||||
<tbody valign="top">
|
||||
<row>
|
||||
<entry><constant>V4L2_FLASH_FAULT_OVER_VOLTAGE</constant></entry>
|
||||
<entry>Flash controller voltage to the flash LED
|
||||
has exceeded the limit specific to the flash
|
||||
controller.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><constant>V4L2_FLASH_FAULT_TIMEOUT</constant></entry>
|
||||
<entry>The flash strobe was still on when
|
||||
the timeout set by the user ---
|
||||
V4L2_CID_FLASH_TIMEOUT control --- has expired.
|
||||
Not all flash controllers may set this in all
|
||||
such conditions.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><constant>V4L2_FLASH_FAULT_OVER_TEMPERATURE</constant></entry>
|
||||
<entry>The flash controller has overheated.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><constant>V4L2_FLASH_FAULT_SHORT_CIRCUIT</constant></entry>
|
||||
<entry>The short circuit protection of the flash
|
||||
controller has been triggered.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><constant>V4L2_FLASH_FAULT_OVER_CURRENT</constant></entry>
|
||||
<entry>Current in the LED power supply has exceeded the limit
|
||||
specific to the flash controller.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><constant>V4L2_FLASH_FAULT_INDICATOR</constant></entry>
|
||||
<entry>The flash controller has detected a short or open
|
||||
circuit condition on the indicator LED.</entry>
|
||||
</row>
|
||||
</tbody>
|
||||
</entrytbl>
|
||||
</row>
|
||||
<row>
|
||||
<entry spanname="id"><constant>V4L2_CID_FLASH_CHARGE</constant></entry>
|
||||
<entry>boolean</entry>
|
||||
</row>
|
||||
<row><entry spanname="descr">Enable or disable charging of the xenon
|
||||
flash capacitor.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry spanname="id"><constant>V4L2_CID_FLASH_READY</constant></entry>
|
||||
<entry>boolean</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry spanname="descr">Is the flash ready to strobe?
|
||||
Xenon flashes require their capacitors charged before
|
||||
strobing. LED flashes often require a cooldown period
|
||||
after strobe during which another strobe will not be
|
||||
possible. This is a read-only control.</entry>
|
||||
</row>
|
||||
<row><entry></entry></row>
|
||||
</tbody>
|
||||
</tgroup>
|
||||
</table>
|
||||
</section>
|
||||
|
||||
<section id="jpeg-controls">
|
||||
|
@ -4274,4 +4273,165 @@ interface and may change in the future.</para>
|
|||
</table>
|
||||
|
||||
</section>
|
||||
|
||||
<section id="dv-controls">
|
||||
<title>Digital Video Control Reference</title>
|
||||
|
||||
<note>
|
||||
<title>Experimental</title>
|
||||
|
||||
<para>This is an <link
|
||||
linkend="experimental">experimental</link> interface and may
|
||||
change in the future.</para>
|
||||
</note>
|
||||
|
||||
<para>
|
||||
The Digital Video control class is intended to control receivers
|
||||
and transmitters for <ulink url="http://en.wikipedia.org/wiki/Vga">VGA</ulink>,
|
||||
<ulink url="http://en.wikipedia.org/wiki/Digital_Visual_Interface">DVI</ulink>
|
||||
(Digital Visual Interface), HDMI (<xref linkend="hdmi" />) and DisplayPort (<xref linkend="dp" />).
|
||||
These controls are generally expected to be private to the receiver or transmitter
|
||||
subdevice that implements them, so they are only exposed on the
|
||||
<filename>/dev/v4l-subdev*</filename> device node.
|
||||
</para>
|
||||
|
||||
<para>Note that these devices can have multiple input or output pads which are
|
||||
hooked up to e.g. HDMI connectors. Even though the subdevice will receive or
|
||||
transmit video from/to only one of those pads, the other pads can still be
|
||||
active when it comes to EDID (Extended Display Identification Data,
|
||||
<xref linkend="vesaedid" />) and HDCP (High-bandwidth Digital Content
|
||||
Protection System, <xref linkend="hdcp" />) processing, allowing the device
|
||||
to do the fairly slow EDID/HDCP handling in advance. This allows for quick
|
||||
switching between connectors.</para>
|
||||
|
||||
<para>These pads appear in several of the controls in this section as
|
||||
bitmasks, one bit for each pad. Bit 0 corresponds to pad 0, bit 1 to pad 1,
|
||||
etc. The maximum value of the control is the set of valid pads.</para>
|
||||
|
||||
<table pgwide="1" frame="none" id="dv-control-id">
|
||||
<title>Digital Video Control IDs</title>
|
||||
|
||||
<tgroup cols="4">
|
||||
<colspec colname="c1" colwidth="1*" />
|
||||
<colspec colname="c2" colwidth="6*" />
|
||||
<colspec colname="c3" colwidth="2*" />
|
||||
<colspec colname="c4" colwidth="6*" />
|
||||
<spanspec namest="c1" nameend="c2" spanname="id" />
|
||||
<spanspec namest="c2" nameend="c4" spanname="descr" />
|
||||
<thead>
|
||||
<row>
|
||||
<entry spanname="id" align="left">ID</entry>
|
||||
<entry align="left">Type</entry>
|
||||
</row><row rowsep="1"><entry spanname="descr" align="left">Description</entry>
|
||||
</row>
|
||||
</thead>
|
||||
<tbody valign="top">
|
||||
<row><entry></entry></row>
|
||||
<row>
|
||||
<entry spanname="id"><constant>V4L2_CID_DV_CLASS</constant></entry>
|
||||
<entry>class</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry spanname="descr">The Digital Video class descriptor.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry spanname="id"><constant>V4L2_CID_DV_TX_HOTPLUG</constant></entry>
|
||||
<entry>bitmask</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry spanname="descr">Many connectors have a hotplug pin which is high
|
||||
if EDID information is available from the source. This control shows the
|
||||
state of the hotplug pin as seen by the transmitter.
|
||||
Each bit corresponds to an output pad on the transmitter. If an output pad
|
||||
does not have an associated hotplug pin, then the bit for that pad will be 0.
|
||||
This read-only control is applicable to DVI-D, HDMI and DisplayPort connectors.
|
||||
</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry spanname="id"><constant>V4L2_CID_DV_TX_RXSENSE</constant></entry>
|
||||
<entry>bitmask</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry spanname="descr">Rx Sense is the detection of pull-ups on the TMDS
|
||||
clock lines. This normally means that the sink has left/entered standby (i.e.
|
||||
the transmitter can sense that the receiver is ready to receive video).
|
||||
Each bit corresponds to an output pad on the transmitter. If an output pad
|
||||
does not have an associated Rx Sense, then the bit for that pad will be 0.
|
||||
This read-only control is applicable to DVI-D and HDMI devices.
|
||||
</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry spanname="id"><constant>V4L2_CID_DV_TX_EDID_PRESENT</constant></entry>
|
||||
<entry>bitmask</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry spanname="descr">When the transmitter sees the hotplug signal from the
|
||||
receiver it will attempt to read the EDID. If set, then the transmitter has read
|
||||
at least the first block (= 128 bytes).
|
||||
Each bit corresponds to an output pad on the transmitter. If an output pad
|
||||
does not support EDIDs, then the bit for that pad will be 0.
|
||||
This read-only control is applicable to VGA, DVI-A/D, HDMI and DisplayPort connectors.
|
||||
</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry spanname="id"><constant>V4L2_CID_DV_TX_MODE</constant></entry>
|
||||
<entry id="v4l2-dv-tx-mode">enum v4l2_dv_tx_mode</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry spanname="descr">HDMI transmitters can transmit in DVI-D mode (just video)
|
||||
or in HDMI mode (video + audio + auxiliary data). This control selects which mode
|
||||
to use: V4L2_DV_TX_MODE_DVI_D or V4L2_DV_TX_MODE_HDMI.
|
||||
This control is applicable to HDMI connectors.
|
||||
</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry spanname="id"><constant>V4L2_CID_DV_TX_RGB_RANGE</constant></entry>
|
||||
<entry id="v4l2-dv-rgb-range">enum v4l2_dv_rgb_range</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry spanname="descr">Select the quantization range for RGB output. V4L2_DV_RANGE_AUTO
|
||||
follows the RGB quantization range specified in the standard for the video interface
|
||||
(ie. <xref linkend="cea861" /> for HDMI). V4L2_DV_RANGE_LIMITED and V4L2_DV_RANGE_FULL override the standard
|
||||
to be compatible with sinks that have not implemented the standard correctly
|
||||
(unfortunately quite common for HDMI and DVI-D). Full range allows all possible values to be
|
||||
used whereas limited range sets the range to (16 << (N-8)) - (235 << (N-8))
|
||||
where N is the number of bits per component.
|
||||
This control is applicable to VGA, DVI-A/D, HDMI and DisplayPort connectors.
|
||||
</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry spanname="id"><constant>V4L2_CID_DV_RX_POWER_PRESENT</constant></entry>
|
||||
<entry>bitmask</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry spanname="descr">Detects whether the receiver receives power from the source
|
||||
(e.g. HDMI carries 5V on one of the pins). This is often used to power an eeprom
|
||||
which contains EDID information, such that the source can read the EDID even if
|
||||
the sink is in standby/power off.
|
||||
Each bit corresponds to an input pad on the transmitter. If an input pad
|
||||
cannot detect whether power is present, then the bit for that pad will be 0.
|
||||
This read-only control is applicable to DVI-D, HDMI and DisplayPort connectors.
|
||||
</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry spanname="id"><constant>V4L2_CID_DV_RX_RGB_RANGE</constant></entry>
|
||||
<entry>enum v4l2_dv_rgb_range</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry spanname="descr">Select the quantization range for RGB input. V4L2_DV_RANGE_AUTO
|
||||
follows the RGB quantization range specified in the standard for the video interface
|
||||
(ie. <xref linkend="cea861" /> for HDMI). V4L2_DV_RANGE_LIMITED and V4L2_DV_RANGE_FULL override the standard
|
||||
to be compatible with sources that have not implemented the standard correctly
|
||||
(unfortunately quite common for HDMI and DVI-D). Full range allows all possible values to be
|
||||
used whereas limited range sets the range to (16 << (N-8)) - (235 << (N-8))
|
||||
where N is the number of bits per component.
|
||||
This control is applicable to VGA, DVI-A/D, HDMI and DisplayPort connectors.
|
||||
</entry>
|
||||
</row>
|
||||
<row><entry></entry></row>
|
||||
</tbody>
|
||||
</tgroup>
|
||||
</table>
|
||||
|
||||
</section>
|
||||
</section>
|
||||
|
|
|
@ -1,13 +1,6 @@
|
|||
<title>Video Output Overlay Interface</title>
|
||||
<subtitle>Also known as On-Screen Display (OSD)</subtitle>
|
||||
|
||||
<note>
|
||||
<title>Experimental</title>
|
||||
|
||||
<para>This is an <link linkend="experimental">experimental</link>
|
||||
interface and may change in the future.</para>
|
||||
</note>
|
||||
|
||||
<para>Some video output devices can overlay a framebuffer image onto
|
||||
the outgoing video signal. Applications can set up such an overlay
|
||||
using this interface, which borrows structures and ioctls of the <link
|
||||
|
|
|
@ -6,7 +6,7 @@ information, on an inaudible audio subcarrier of a radio program. This
|
|||
interface is aimed at devices capable of receiving and/or transmitting RDS
|
||||
information.</para>
|
||||
|
||||
<para>For more information see the core RDS standard <xref linkend="en50067" />
|
||||
<para>For more information see the core RDS standard <xref linkend="iec62106" />
|
||||
and the RBDS standard <xref linkend="nrsc4" />.</para>
|
||||
|
||||
<para>Note that the RBDS standard as is used in the USA is almost identical
|
||||
|
|
|
@ -374,29 +374,29 @@
|
|||
rectangle --- if it is supported by the hardware.</para>
|
||||
|
||||
<orderedlist>
|
||||
<listitem>Sink pad format. The user configures the sink pad
|
||||
<listitem><para>Sink pad format. The user configures the sink pad
|
||||
format. This format defines the parameters of the image the
|
||||
entity receives through the pad for further processing.</listitem>
|
||||
entity receives through the pad for further processing.</para></listitem>
|
||||
|
||||
<listitem>Sink pad actual crop selection. The sink pad crop
|
||||
defines the crop performed to the sink pad format.</listitem>
|
||||
<listitem><para>Sink pad actual crop selection. The sink pad crop
|
||||
defines the crop performed to the sink pad format.</para></listitem>
|
||||
|
||||
<listitem>Sink pad actual compose selection. The size of the
|
||||
<listitem><para>Sink pad actual compose selection. The size of the
|
||||
sink pad compose rectangle defines the scaling ratio compared
|
||||
to the size of the sink pad crop rectangle. The location of
|
||||
the compose rectangle specifies the location of the actual
|
||||
sink compose rectangle in the sink compose bounds
|
||||
rectangle.</listitem>
|
||||
rectangle.</para></listitem>
|
||||
|
||||
<listitem>Source pad actual crop selection. Crop on the source
|
||||
<listitem><para>Source pad actual crop selection. Crop on the source
|
||||
pad defines crop performed to the image in the sink compose
|
||||
bounds rectangle.</listitem>
|
||||
bounds rectangle.</para></listitem>
|
||||
|
||||
<listitem>Source pad format. The source pad format defines the
|
||||
<listitem><para>Source pad format. The source pad format defines the
|
||||
output pixel format of the subdev, as well as the other
|
||||
parameters with the exception of the image width and height.
|
||||
Width and height are defined by the size of the source pad
|
||||
actual crop selection.</listitem>
|
||||
actual crop selection.</para></listitem>
|
||||
</orderedlist>
|
||||
|
||||
<para>Accessing any of the above rectangles not supported by the
|
||||
|
|
|
@ -6,6 +6,15 @@
|
|||
&cs-str;
|
||||
<tbody valign="top">
|
||||
<!-- Keep it ordered alphabetically -->
|
||||
<row>
|
||||
<entry>EAGAIN (aka EWOULDBLOCK)</entry>
|
||||
<entry>The ioctl can't be handled because the device is in state where
|
||||
it can't perform it. This could happen for example in case where
|
||||
device is sleeping and ioctl is performed to query statistics.
|
||||
It is also returned when the ioctl would need to wait
|
||||
for an event, but the device was opened in non-blocking mode.
|
||||
</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>EBADF</entry>
|
||||
<entry>The file descriptor is not a valid.</entry>
|
||||
|
@ -50,22 +59,12 @@
|
|||
that this request would overcommit the usb bandwidth reserved
|
||||
for periodic transfers (up to 80% of the USB bandwidth).</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>ENOSYS or EOPNOTSUPP</entry>
|
||||
<entry>Function not available for this device (dvb API only. Will likely
|
||||
be replaced anytime soon by ENOTTY).</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>EPERM</entry>
|
||||
<entry>Permission denied. Can be returned if the device needs write
|
||||
permission, or some special capabilities is needed
|
||||
(e. g. root)</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>EWOULDBLOCK</entry>
|
||||
<entry>Operation would block. Used when the ioctl would need to wait
|
||||
for an event, but the device was opened in non-blocking mode.</entry>
|
||||
</row>
|
||||
</tbody>
|
||||
</tgroup>
|
||||
</table>
|
||||
|
|
|
@ -613,8 +613,8 @@ field is independent of the <structfield>timestamp</structfield> and
|
|||
<entry>__u32</entry>
|
||||
<entry><structfield>sequence</structfield></entry>
|
||||
<entry></entry>
|
||||
<entry>Set by the driver, counting the frames in the
|
||||
sequence.</entry>
|
||||
<entry>Set by the driver, counting the frames (not fields!) in
|
||||
sequence. This field is set for both input and output devices.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry spanname="hspan"><para>In <link
|
||||
|
@ -685,18 +685,14 @@ memory, set by the application. See <xref linkend="userp" /> for details.
|
|||
<entry>__u32</entry>
|
||||
<entry><structfield>reserved2</structfield></entry>
|
||||
<entry></entry>
|
||||
<entry>A place holder for future extensions and custom
|
||||
(driver defined) buffer types
|
||||
<constant>V4L2_BUF_TYPE_PRIVATE</constant> and higher. Applications
|
||||
<entry>A place holder for future extensions. Applications
|
||||
should set this to 0.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>__u32</entry>
|
||||
<entry><structfield>reserved</structfield></entry>
|
||||
<entry></entry>
|
||||
<entry>A place holder for future extensions and custom
|
||||
(driver defined) buffer types
|
||||
<constant>V4L2_BUF_TYPE_PRIVATE</constant> and higher. Applications
|
||||
<entry>A place holder for future extensions. Applications
|
||||
should set this to 0.</entry>
|
||||
</row>
|
||||
</tbody>
|
||||
|
@ -827,14 +823,7 @@ should set this to 0.</entry>
|
|||
<entry><constant>V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY</constant></entry>
|
||||
<entry>8</entry>
|
||||
<entry>Buffer for video output overlay (OSD), see <xref
|
||||
linkend="osd" />. Status: <link
|
||||
linkend="experimental">Experimental</link>.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><constant>V4L2_BUF_TYPE_PRIVATE</constant></entry>
|
||||
<entry>0x80</entry>
|
||||
<entry>This and higher values are reserved for custom
|
||||
(driver defined) buffer types.</entry>
|
||||
linkend="osd" />.</entry>
|
||||
</row>
|
||||
</tbody>
|
||||
</tgroup>
|
||||
|
|
|
@ -22,8 +22,7 @@
|
|||
with 10 bits per colour compressed to 8 bits each, using DPCM
|
||||
compression. DPCM, differential pulse-code modulation, is lossy.
|
||||
Each colour component consumes 8 bits of memory. In other respects
|
||||
this format is similar to <xref
|
||||
linkend="pixfmt-srggb10">.</xref></para>
|
||||
this format is similar to <xref linkend="pixfmt-srggb10" />.</para>
|
||||
|
||||
</refsect1>
|
||||
</refentry>
|
||||
|
|
154
Documentation/DocBook/media/v4l/pixfmt-yvu420m.xml
Normal file
154
Documentation/DocBook/media/v4l/pixfmt-yvu420m.xml
Normal file
|
@ -0,0 +1,154 @@
|
|||
<refentry id="V4L2-PIX-FMT-YVU420M">
|
||||
<refmeta>
|
||||
<refentrytitle>V4L2_PIX_FMT_YVU420M ('YM21')</refentrytitle>
|
||||
&manvol;
|
||||
</refmeta>
|
||||
<refnamediv>
|
||||
<refname> <constant>V4L2_PIX_FMT_YVU420M</constant></refname>
|
||||
<refpurpose>Variation of <constant>V4L2_PIX_FMT_YVU420</constant>
|
||||
with planes non contiguous in memory. </refpurpose>
|
||||
</refnamediv>
|
||||
|
||||
<refsect1>
|
||||
<title>Description</title>
|
||||
|
||||
<para>This is a multi-planar format, as opposed to a packed format.
|
||||
The three components are separated into three sub-images or planes.
|
||||
|
||||
The Y plane is first. The Y plane has one byte per pixel. The Cr data
|
||||
constitutes the second plane which is half the width and half
|
||||
the height of the Y plane (and of the image). Each Cr belongs to four
|
||||
pixels, a two-by-two square of the image. For example,
|
||||
Cr<subscript>0</subscript> belongs to Y'<subscript>00</subscript>,
|
||||
Y'<subscript>01</subscript>, Y'<subscript>10</subscript>, and
|
||||
Y'<subscript>11</subscript>. The Cb data, just like the Cr plane, constitutes
|
||||
the third plane. </para>
|
||||
|
||||
<para>If the Y plane has pad bytes after each row, then the Cr
|
||||
and Cb planes have half as many pad bytes after their rows. In other
|
||||
words, two Cx rows (including padding) is exactly as long as one Y row
|
||||
(including padding).</para>
|
||||
|
||||
<para><constant>V4L2_PIX_FMT_YVU420M</constant> is intended to be
|
||||
used only in drivers and applications that support the multi-planar API,
|
||||
described in <xref linkend="planar-apis"/>. </para>
|
||||
|
||||
<example>
|
||||
<title><constant>V4L2_PIX_FMT_YVU420M</constant> 4 × 4
|
||||
pixel image</title>
|
||||
|
||||
<formalpara>
|
||||
<title>Byte Order.</title>
|
||||
<para>Each cell is one byte.
|
||||
<informaltable frame="none">
|
||||
<tgroup cols="5" align="center">
|
||||
<colspec align="left" colwidth="2*" />
|
||||
<tbody valign="top">
|
||||
<row>
|
||||
<entry>start0 + 0:</entry>
|
||||
<entry>Y'<subscript>00</subscript></entry>
|
||||
<entry>Y'<subscript>01</subscript></entry>
|
||||
<entry>Y'<subscript>02</subscript></entry>
|
||||
<entry>Y'<subscript>03</subscript></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>start0 + 4:</entry>
|
||||
<entry>Y'<subscript>10</subscript></entry>
|
||||
<entry>Y'<subscript>11</subscript></entry>
|
||||
<entry>Y'<subscript>12</subscript></entry>
|
||||
<entry>Y'<subscript>13</subscript></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>start0 + 8:</entry>
|
||||
<entry>Y'<subscript>20</subscript></entry>
|
||||
<entry>Y'<subscript>21</subscript></entry>
|
||||
<entry>Y'<subscript>22</subscript></entry>
|
||||
<entry>Y'<subscript>23</subscript></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>start0 + 12:</entry>
|
||||
<entry>Y'<subscript>30</subscript></entry>
|
||||
<entry>Y'<subscript>31</subscript></entry>
|
||||
<entry>Y'<subscript>32</subscript></entry>
|
||||
<entry>Y'<subscript>33</subscript></entry>
|
||||
</row>
|
||||
<row><entry></entry></row>
|
||||
<row>
|
||||
<entry>start1 + 0:</entry>
|
||||
<entry>Cr<subscript>00</subscript></entry>
|
||||
<entry>Cr<subscript>01</subscript></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>start1 + 2:</entry>
|
||||
<entry>Cr<subscript>10</subscript></entry>
|
||||
<entry>Cr<subscript>11</subscript></entry>
|
||||
</row>
|
||||
<row><entry></entry></row>
|
||||
<row>
|
||||
<entry>start2 + 0:</entry>
|
||||
<entry>Cb<subscript>00</subscript></entry>
|
||||
<entry>Cb<subscript>01</subscript></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>start2 + 2:</entry>
|
||||
<entry>Cb<subscript>10</subscript></entry>
|
||||
<entry>Cb<subscript>11</subscript></entry>
|
||||
</row>
|
||||
</tbody>
|
||||
</tgroup>
|
||||
</informaltable>
|
||||
</para>
|
||||
</formalpara>
|
||||
|
||||
<formalpara>
|
||||
<title>Color Sample Location.</title>
|
||||
<para>
|
||||
<informaltable frame="none">
|
||||
<tgroup cols="7" align="center">
|
||||
<tbody valign="top">
|
||||
<row>
|
||||
<entry></entry>
|
||||
<entry>0</entry><entry></entry><entry>1</entry><entry></entry>
|
||||
<entry>2</entry><entry></entry><entry>3</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>0</entry>
|
||||
<entry>Y</entry><entry></entry><entry>Y</entry><entry></entry>
|
||||
<entry>Y</entry><entry></entry><entry>Y</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry></entry>
|
||||
<entry></entry><entry>C</entry><entry></entry><entry></entry>
|
||||
<entry></entry><entry>C</entry><entry></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>1</entry>
|
||||
<entry>Y</entry><entry></entry><entry>Y</entry><entry></entry>
|
||||
<entry>Y</entry><entry></entry><entry>Y</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>2</entry>
|
||||
<entry>Y</entry><entry></entry><entry>Y</entry><entry></entry>
|
||||
<entry>Y</entry><entry></entry><entry>Y</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry></entry>
|
||||
<entry></entry><entry>C</entry><entry></entry><entry></entry>
|
||||
<entry></entry><entry>C</entry><entry></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>3</entry>
|
||||
<entry>Y</entry><entry></entry><entry>Y</entry><entry></entry>
|
||||
<entry>Y</entry><entry></entry><entry>Y</entry>
|
||||
</row>
|
||||
</tbody>
|
||||
</tgroup>
|
||||
</informaltable>
|
||||
</para>
|
||||
</formalpara>
|
||||
</example>
|
||||
</refsect1>
|
||||
</refentry>
|
|
@ -708,6 +708,7 @@ information.</para>
|
|||
&sub-y41p;
|
||||
&sub-yuv420;
|
||||
&sub-yuv420m;
|
||||
&sub-yvu420m;
|
||||
&sub-yuv410;
|
||||
&sub-yuv422p;
|
||||
&sub-yuv411p;
|
||||
|
|
|
@ -40,6 +40,7 @@ cropping and composing rectangles have the same size.</para>
|
|||
<section>
|
||||
<title>Selection targets</title>
|
||||
|
||||
<para>
|
||||
<figure id="sel-targets-capture">
|
||||
<title>Cropping and composing targets</title>
|
||||
<mediaobject>
|
||||
|
@ -52,12 +53,12 @@ cropping and composing rectangles have the same size.</para>
|
|||
</textobject>
|
||||
</mediaobject>
|
||||
</figure>
|
||||
</para>
|
||||
|
||||
<para>See <xref linkend="v4l2-selection-targets" /> for more
|
||||
information.</para>
|
||||
</section>
|
||||
|
||||
See <xref linkend="v4l2-selection-targets" /> for more
|
||||
information.
|
||||
|
||||
<section>
|
||||
|
||||
<title>Configuration</title>
|
||||
|
@ -216,18 +217,17 @@ composing and cropping operations by setting the appropriate targets. The V4L2
|
|||
API lacks any support for composing to and cropping from an image inside a
|
||||
memory buffer. The application could configure a capture device to fill only a
|
||||
part of an image by abusing V4L2 API. Cropping a smaller image from a larger
|
||||
one is achieved by setting the field <structfield>
|
||||
&v4l2-pix-format;::bytesperline </structfield>. Introducing an image offsets
|
||||
could be done by modifying field <structfield> &v4l2-buffer;::m:userptr
|
||||
</structfield> before calling <constant> VIDIOC_QBUF </constant>. Those
|
||||
one is achieved by setting the field
|
||||
&v4l2-pix-format;<structfield>::bytesperline</structfield>. Introducing an image offsets
|
||||
could be done by modifying field &v4l2-buffer;<structfield>::m_userptr</structfield>
|
||||
before calling <constant> VIDIOC_QBUF </constant>. Those
|
||||
operations should be avoided because they are not portable (endianness), and do
|
||||
not work for macroblock and Bayer formats and mmap buffers. The selection API
|
||||
deals with configuration of buffer cropping/composing in a clear, intuitive and
|
||||
portable way. Next, with the selection API the concepts of the padded target
|
||||
and constraints flags are introduced. Finally, <structname> &v4l2-crop;
|
||||
</structname> and <structname> &v4l2-cropcap; </structname> have no reserved
|
||||
fields. Therefore there is no way to extend their functionality. The new
|
||||
<structname> &v4l2-selection; </structname> provides a lot of place for future
|
||||
and constraints flags are introduced. Finally, &v4l2-crop; and &v4l2-cropcap;
|
||||
have no reserved fields. Therefore there is no way to extend their functionality.
|
||||
The new &v4l2-selection; provides a lot of place for future
|
||||
extensions. Driver developers are encouraged to implement only selection API.
|
||||
The former cropping API would be simulated using the new one. </para>
|
||||
|
||||
|
|
|
@ -145,9 +145,12 @@ applications. -->
|
|||
<authorinitials>hv</authorinitials>
|
||||
<revremark>Added VIDIOC_ENUM_FREQ_BANDS.
|
||||
</revremark>
|
||||
</revision>
|
||||
|
||||
<revision>
|
||||
<revnumber>3.5</revnumber>
|
||||
<date>2012-05-07</date>
|
||||
<authorinitials>sa, sn</authorinitials>
|
||||
<authorinitials>sa, sn, hv</authorinitials>
|
||||
<revremark>Added V4L2_CTRL_TYPE_INTEGER_MENU and V4L2 subdev
|
||||
selections API. Improved the description of V4L2_CID_COLORFX
|
||||
control, added V4L2_CID_COLORFX_CBCR control.
|
||||
|
@ -158,11 +161,8 @@ applications. -->
|
|||
V4L2_CID_3A_LOCK, V4L2_CID_AUTO_FOCUS_START,
|
||||
V4L2_CID_AUTO_FOCUS_STOP, V4L2_CID_AUTO_FOCUS_STATUS
|
||||
and V4L2_CID_AUTO_FOCUS_RANGE.
|
||||
</revremark>
|
||||
<date>2012-05-01</date>
|
||||
<authorinitials>hv</authorinitials>
|
||||
<revremark>Added VIDIOC_ENUM_DV_TIMINGS, VIDIOC_QUERY_DV_TIMINGS and
|
||||
VIDIOC_DV_TIMINGS_CAP.
|
||||
Added VIDIOC_ENUM_DV_TIMINGS, VIDIOC_QUERY_DV_TIMINGS and
|
||||
VIDIOC_DV_TIMINGS_CAP.
|
||||
</revremark>
|
||||
</revision>
|
||||
|
||||
|
@ -472,7 +472,7 @@ and discussions on the V4L mailing list.</revremark>
|
|||
</partinfo>
|
||||
|
||||
<title>Video for Linux Two API Specification</title>
|
||||
<subtitle>Revision 3.5</subtitle>
|
||||
<subtitle>Revision 3.6</subtitle>
|
||||
|
||||
<chapter id="common">
|
||||
&sub-common;
|
||||
|
@ -581,6 +581,7 @@ and discussions on the V4L mailing list.</revremark>
|
|||
&sub-subdev-enum-frame-size;
|
||||
&sub-subdev-enum-mbus-code;
|
||||
&sub-subdev-g-crop;
|
||||
&sub-subdev-g-edid;
|
||||
&sub-subdev-g-fmt;
|
||||
&sub-subdev-g-frame-interval;
|
||||
&sub-subdev-g-selection;
|
||||
|
|
|
@ -59,6 +59,9 @@ constant except when switching the video standard. Remember this
|
|||
switch can occur implicit when switching the video input or
|
||||
output.</para>
|
||||
|
||||
<para>This ioctl must be implemented for video capture or output devices that
|
||||
support cropping and/or scaling and/or have non-square pixels, and for overlay devices.</para>
|
||||
|
||||
<table pgwide="1" frame="none" id="v4l2-cropcap">
|
||||
<title>struct <structname>v4l2_cropcap</structname></title>
|
||||
<tgroup cols="3">
|
||||
|
@ -70,10 +73,10 @@ output.</para>
|
|||
<entry>Type of the data stream, set by the application.
|
||||
Only these types are valid here:
|
||||
<constant>V4L2_BUF_TYPE_VIDEO_CAPTURE</constant>,
|
||||
<constant>V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE</constant>,
|
||||
<constant>V4L2_BUF_TYPE_VIDEO_OUTPUT</constant>,
|
||||
<constant>V4L2_BUF_TYPE_VIDEO_OVERLAY</constant>, and custom (driver
|
||||
defined) types with code <constant>V4L2_BUF_TYPE_PRIVATE</constant>
|
||||
and higher. See <xref linkend="v4l2-buf-type" />.</entry>
|
||||
<constant>V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE</constant> and
|
||||
<constant>V4L2_BUF_TYPE_VIDEO_OVERLAY</constant>. See <xref linkend="v4l2-buf-type" />.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>struct <link linkend="v4l2-rect-crop">v4l2_rect</link></entry>
|
||||
|
@ -156,8 +159,7 @@ on 22 Oct 2002 subject "Re:[V4L][patches!] Re:v4l2/kernel-2.5" -->
|
|||
<term><errorcode>EINVAL</errorcode></term>
|
||||
<listitem>
|
||||
<para>The &v4l2-cropcap; <structfield>type</structfield> is
|
||||
invalid. This is not permitted for video capture, output and overlay devices,
|
||||
which must support <constant>VIDIOC_CROPCAP</constant>.</para>
|
||||
invalid.</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
</variablelist>
|
||||
|
|
|
@ -49,13 +49,6 @@
|
|||
<refsect1>
|
||||
<title>Description</title>
|
||||
|
||||
<note>
|
||||
<title>Experimental</title>
|
||||
|
||||
<para>This is an <link linkend="experimental">experimental</link>
|
||||
interface and may change in the future.</para>
|
||||
</note>
|
||||
|
||||
<para>These ioctls control an audio/video (usually MPEG-) decoder.
|
||||
<constant>VIDIOC_DECODER_CMD</constant> sends a command to the
|
||||
decoder, <constant>VIDIOC_TRY_DECODER_CMD</constant> can be used to
|
||||
|
|
|
@ -49,13 +49,6 @@
|
|||
<refsect1>
|
||||
<title>Description</title>
|
||||
|
||||
<note>
|
||||
<title>Experimental</title>
|
||||
|
||||
<para>This is an <link linkend="experimental">experimental</link>
|
||||
interface and may change in the future.</para>
|
||||
</note>
|
||||
|
||||
<para>These ioctls control an audio/video (usually MPEG-) encoder.
|
||||
<constant>VIDIOC_ENCODER_CMD</constant> sends a command to the
|
||||
encoder, <constant>VIDIOC_TRY_ENCODER_CMD</constant> can be used to
|
||||
|
|
|
@ -229,6 +229,12 @@ intended for the user.</entry>
|
|||
is out of bounds.</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term><errorcode>ENODATA</errorcode></term>
|
||||
<listitem>
|
||||
<para>Digital video presets are not supported for this input or output.</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
</variablelist>
|
||||
</refsect1>
|
||||
</refentry>
|
||||
|
|
|
@ -106,6 +106,12 @@ application.</entry>
|
|||
is out of bounds.</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term><errorcode>ENODATA</errorcode></term>
|
||||
<listitem>
|
||||
<para>Digital video presets are not supported for this input or output.</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
</variablelist>
|
||||
</refsect1>
|
||||
</refentry>
|
||||
|
|
|
@ -58,6 +58,9 @@ structure. Drivers fill the rest of the structure or return an
|
|||
incrementing by one until <errorcode>EINVAL</errorcode> is
|
||||
returned.</para>
|
||||
|
||||
<para>Note that after switching input or output the list of enumerated image
|
||||
formats may be different.</para>
|
||||
|
||||
<table pgwide="1" frame="none" id="v4l2-fmtdesc">
|
||||
<title>struct <structname>v4l2_fmtdesc</structname></title>
|
||||
<tgroup cols="3">
|
||||
|
@ -78,10 +81,8 @@ Only these types are valid here:
|
|||
<constant>V4L2_BUF_TYPE_VIDEO_CAPTURE</constant>,
|
||||
<constant>V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE</constant>,
|
||||
<constant>V4L2_BUF_TYPE_VIDEO_OUTPUT</constant>,
|
||||
<constant>V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE</constant>,
|
||||
<constant>V4L2_BUF_TYPE_VIDEO_OVERLAY</constant>, and custom (driver
|
||||
defined) types with code <constant>V4L2_BUF_TYPE_PRIVATE</constant>
|
||||
and higher. See <xref linkend="v4l2-buf-type" />.</entry>
|
||||
<constant>V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE</constant> and
|
||||
<constant>V4L2_BUF_TYPE_VIDEO_OVERLAY</constant>. See <xref linkend="v4l2-buf-type" />.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>__u32</entry>
|
||||
|
|
|
@ -50,13 +50,6 @@ and pixel format and receives a frame width and height.</para>
|
|||
<refsect1>
|
||||
<title>Description</title>
|
||||
|
||||
<note>
|
||||
<title>Experimental</title>
|
||||
|
||||
<para>This is an <link linkend="experimental">experimental</link>
|
||||
interface and may change in the future.</para>
|
||||
</note>
|
||||
|
||||
<para>This ioctl allows applications to enumerate all frame sizes
|
||||
(&ie; width and height in pixels) that the device supports for the
|
||||
given pixel format.</para>
|
||||
|
|
|
@ -283,7 +283,7 @@ input/output interface to linux-media@vger.kernel.org on 19 Oct 2009.
|
|||
<entry>This input supports setting DV presets by using VIDIOC_S_DV_PRESET.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><constant>V4L2_IN_CAP_CUSTOM_TIMINGS</constant></entry>
|
||||
<entry><constant>V4L2_IN_CAP_DV_TIMINGS</constant></entry>
|
||||
<entry>0x00000002</entry>
|
||||
<entry>This input supports setting video timings by using VIDIOC_S_DV_TIMINGS.</entry>
|
||||
</row>
|
||||
|
|
|
@ -168,7 +168,7 @@ input/output interface to linux-media@vger.kernel.org on 19 Oct 2009.
|
|||
<entry>This output supports setting DV presets by using VIDIOC_S_DV_PRESET.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><constant>V4L2_OUT_CAP_CUSTOM_TIMINGS</constant></entry>
|
||||
<entry><constant>V4L2_OUT_CAP_DV_TIMINGS</constant></entry>
|
||||
<entry>0x00000002</entry>
|
||||
<entry>This output supports setting video timings by using VIDIOC_S_DV_TIMINGS.</entry>
|
||||
</row>
|
||||
|
|
|
@ -378,6 +378,12 @@ system)</para></footnote></para></entry>
|
|||
is out of bounds.</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term><errorcode>ENODATA</errorcode></term>
|
||||
<listitem>
|
||||
<para>Standard video timings are not supported for this input or output.</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
</variablelist>
|
||||
</refsect1>
|
||||
</refentry>
|
||||
|
|
|
@ -104,10 +104,8 @@ changed and <constant>VIDIOC_S_CROP</constant> returns the
|
|||
<entry><structfield>type</structfield></entry>
|
||||
<entry>Type of the data stream, set by the application.
|
||||
Only these types are valid here: <constant>V4L2_BUF_TYPE_VIDEO_CAPTURE</constant>,
|
||||
<constant>V4L2_BUF_TYPE_VIDEO_OUTPUT</constant>,
|
||||
<constant>V4L2_BUF_TYPE_VIDEO_OVERLAY</constant>, and custom (driver
|
||||
defined) types with code <constant>V4L2_BUF_TYPE_PRIVATE</constant>
|
||||
and higher. See <xref linkend="v4l2-buf-type" />.</entry>
|
||||
<constant>V4L2_BUF_TYPE_VIDEO_OUTPUT</constant> and
|
||||
<constant>V4L2_BUF_TYPE_VIDEO_OVERLAY</constant>. See <xref linkend="v4l2-buf-type" />.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>&v4l2-rect;</entry>
|
||||
|
|
|
@ -77,6 +77,12 @@ If the preset is not supported, it returns an &EINVAL; </para>
|
|||
<constant>VIDIOC_S_DV_PRESET</constant>,<constant>VIDIOC_S_DV_PRESET</constant> parameter was unsuitable.</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term><errorcode>ENODATA</errorcode></term>
|
||||
<listitem>
|
||||
<para>Digital video presets are not supported for this input or output.</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term><errorcode>EBUSY</errorcode></term>
|
||||
<listitem>
|
||||
|
@ -104,7 +110,4 @@ If the preset is not supported, it returns an &EINVAL; </para>
|
|||
</tgroup>
|
||||
</table>
|
||||
</refsect1>
|
||||
<refsect1>
|
||||
&return-value;
|
||||
</refsect1>
|
||||
</refentry>
|
||||
|
|
|
@ -56,7 +56,9 @@ a pointer to the &v4l2-dv-timings; structure as argument. If the ioctl is not su
|
|||
or the timing values are not correct, the driver returns &EINVAL;.</para>
|
||||
<para>The <filename>linux/v4l2-dv-timings.h</filename> header can be used to get the
|
||||
timings of the formats in the <xref linkend="cea861" /> and <xref linkend="vesadmt" />
|
||||
standards.</para>
|
||||
standards. If the current input or output does not support DV timings (e.g. if
|
||||
&VIDIOC-ENUMINPUT; does not set the <constant>V4L2_IN_CAP_DV_TIMINGS</constant> flag), then
|
||||
&ENODATA; is returned.</para>
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
|
@ -70,6 +72,12 @@ standards.</para>
|
|||
<constant>VIDIOC_S_DV_TIMINGS</constant> parameter was unsuitable.</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term><errorcode>ENODATA</errorcode></term>
|
||||
<listitem>
|
||||
<para>Digital video timings are not supported for this input or output.</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term><errorcode>EBUSY</errorcode></term>
|
||||
<listitem>
|
||||
|
@ -320,7 +328,4 @@ detected or used depends on the hardware.
|
|||
</tgroup>
|
||||
</table>
|
||||
</refsect1>
|
||||
<refsect1>
|
||||
&return-value;
|
||||
</refsect1>
|
||||
</refentry>
|
||||
|
|
|
@ -48,13 +48,6 @@
|
|||
<refsect1>
|
||||
<title>Description</title>
|
||||
|
||||
<note>
|
||||
<title>Experimental</title>
|
||||
|
||||
<para>This is an <link linkend="experimental">experimental</link>
|
||||
interface and may change in the future.</para>
|
||||
</note>
|
||||
|
||||
<para>The <constant>VIDIOC_G_ENC_INDEX</constant> ioctl provides
|
||||
meta data about a compressed video stream the same or another
|
||||
application currently reads from the driver, which is useful for
|
||||
|
|
|
@ -81,7 +81,7 @@ the application calls the <constant>VIDIOC_S_FMT</constant> ioctl
|
|||
with a pointer to a <structname>v4l2_format</structname> structure
|
||||
the driver checks
|
||||
and adjusts the parameters against hardware abilities. Drivers
|
||||
should not return an error code unless the input is ambiguous, this is
|
||||
should not return an error code unless the <structfield>type</structfield> field is invalid, this is
|
||||
a mechanism to fathom device capabilities and to approach parameters
|
||||
acceptable for both the application and driver. On success the driver
|
||||
may program the hardware, allocate resources and generally prepare for
|
||||
|
@ -107,6 +107,10 @@ disabling I/O or possibly time consuming hardware preparations.
|
|||
Although strongly recommended drivers are not required to implement
|
||||
this ioctl.</para>
|
||||
|
||||
<para>The format as returned by <constant>VIDIOC_TRY_FMT</constant>
|
||||
must be identical to what <constant>VIDIOC_S_FMT</constant> returns for
|
||||
the same input or output.</para>
|
||||
|
||||
<table pgwide="1" frame="none" id="v4l2-format">
|
||||
<title>struct <structname>v4l2_format</structname></title>
|
||||
<tgroup cols="4">
|
||||
|
@ -170,9 +174,7 @@ capture and output devices.</entry>
|
|||
<entry></entry>
|
||||
<entry>__u8</entry>
|
||||
<entry><structfield>raw_data</structfield>[200]</entry>
|
||||
<entry>Place holder for future extensions and custom
|
||||
(driver defined) formats with <structfield>type</structfield>
|
||||
<constant>V4L2_BUF_TYPE_PRIVATE</constant> and higher.</entry>
|
||||
<entry>Place holder for future extensions.</entry>
|
||||
</row>
|
||||
</tbody>
|
||||
</tgroup>
|
||||
|
@ -187,8 +189,7 @@ capture and output devices.</entry>
|
|||
<term><errorcode>EINVAL</errorcode></term>
|
||||
<listitem>
|
||||
<para>The &v4l2-format; <structfield>type</structfield>
|
||||
field is invalid, the requested buffer type not supported, or the
|
||||
format is not supported with this buffer type.</para>
|
||||
field is invalid or the requested buffer type not supported.</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
</variablelist>
|
||||
|
|
|
@ -108,9 +108,7 @@ devices.</para>
|
|||
<entry></entry>
|
||||
<entry>__u8</entry>
|
||||
<entry><structfield>raw_data</structfield>[200]</entry>
|
||||
<entry>A place holder for future extensions and custom
|
||||
(driver defined) buffer types <constant>V4L2_BUF_TYPE_PRIVATE</constant> and
|
||||
higher.</entry>
|
||||
<entry>A place holder for future extensions.</entry>
|
||||
</row>
|
||||
</tbody>
|
||||
</tgroup>
|
||||
|
|
|
@ -152,12 +152,10 @@ satisfactory parameters have been negotiated. If constraints flags have to be
|
|||
violated at then ERANGE is returned. The error indicates that <emphasis> there
|
||||
exist no rectangle </emphasis> that satisfies the constraints.</para>
|
||||
|
||||
</refsect1>
|
||||
|
||||
<para>Selection targets and flags are documented in <xref
|
||||
linkend="v4l2-selections-common"/>.</para>
|
||||
|
||||
<section>
|
||||
<para>
|
||||
<figure id="sel-const-adjust">
|
||||
<title>Size adjustments with constraint flags.</title>
|
||||
<mediaobject>
|
||||
|
@ -170,9 +168,9 @@ exist no rectangle </emphasis> that satisfies the constraints.</para>
|
|||
</textobject>
|
||||
</mediaobject>
|
||||
</figure>
|
||||
</section>
|
||||
</para>
|
||||
|
||||
<refsect1>
|
||||
<para>
|
||||
<table pgwide="1" frame="none" id="v4l2-selection">
|
||||
<title>struct <structname>v4l2_selection</structname></title>
|
||||
<tgroup cols="3">
|
||||
|
@ -208,6 +206,7 @@ exist no rectangle </emphasis> that satisfies the constraints.</para>
|
|||
</tbody>
|
||||
</tgroup>
|
||||
</table>
|
||||
</para>
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
|
|
|
@ -72,7 +72,9 @@ flags, being a write-only ioctl it does not return the actual new standard as
|
|||
the current input does not support the requested standard the driver
|
||||
returns an &EINVAL;. When the standard set is ambiguous drivers may
|
||||
return <errorcode>EINVAL</errorcode> or choose any of the requested
|
||||
standards.</para>
|
||||
standards. If the current input or output does not support standard video timings (e.g. if
|
||||
&VIDIOC-ENUMINPUT; does not set the <constant>V4L2_IN_CAP_STD</constant> flag), then
|
||||
&ENODATA; is returned.</para>
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
|
@ -85,6 +87,12 @@ standards.</para>
|
|||
<para>The <constant>VIDIOC_S_STD</constant> parameter was unsuitable.</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term><errorcode>ENODATA</errorcode></term>
|
||||
<listitem>
|
||||
<para>Standard video timings are not supported for this input or output.</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
</variablelist>
|
||||
</refsect1>
|
||||
</refentry>
|
||||
|
|
|
@ -354,6 +354,12 @@ radio tuners.</entry>
|
|||
<entry>The &VIDIOC-ENUM-FREQ-BANDS; ioctl can be used to enumerate
|
||||
the available frequency bands.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><constant>V4L2_TUNER_CAP_HWSEEK_PROG_LIM</constant></entry>
|
||||
<entry>0x0800</entry>
|
||||
<entry>The range to search when using the hardware seek functionality
|
||||
is programmable, see &VIDIOC-S-HW-FREQ-SEEK; for details.</entry>
|
||||
</row>
|
||||
</tbody>
|
||||
</tgroup>
|
||||
</table>
|
||||
|
|
|
@ -155,6 +155,8 @@ or no buffers have been allocated yet, or the
|
|||
<structfield>userptr</structfield> or
|
||||
<structfield>length</structfield> are invalid.</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term><errorcode>EIO</errorcode></term>
|
||||
<listitem>
|
||||
<para><constant>VIDIOC_DQBUF</constant> failed due to an
|
||||
|
|
|
@ -65,5 +65,14 @@ returned.</para>
|
|||
|
||||
<refsect1>
|
||||
&return-value;
|
||||
|
||||
<variablelist>
|
||||
<varlistentry>
|
||||
<term><errorcode>ENODATA</errorcode></term>
|
||||
<listitem>
|
||||
<para>Digital video presets are not supported for this input or output.</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
</variablelist>
|
||||
</refsect1>
|
||||
</refentry>
|
||||
|
|
|
@ -77,6 +77,12 @@ capabilities in order to give more precise feedback to the user.
|
|||
&return-value;
|
||||
|
||||
<variablelist>
|
||||
<varlistentry>
|
||||
<term><errorcode>ENODATA</errorcode></term>
|
||||
<listitem>
|
||||
<para>Digital video timings are not supported for this input or output.</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term><errorcode>ENOLINK</errorcode></term>
|
||||
<listitem>
|
||||
|
|
|
@ -90,11 +90,13 @@ ambiguities.</entry>
|
|||
<entry>__u8</entry>
|
||||
<entry><structfield>bus_info</structfield>[32]</entry>
|
||||
<entry>Location of the device in the system, a
|
||||
NUL-terminated ASCII string. For example: "PCI Slot 4". This
|
||||
NUL-terminated ASCII string. For example: "PCI:0000:05:06.0". This
|
||||
information is intended for users, to distinguish multiple
|
||||
identical devices. If no such information is available the field may
|
||||
simply count the devices controlled by the driver, or contain the
|
||||
empty string (<structfield>bus_info</structfield>[0] = 0).<!-- XXX pci_dev->slot_name example --></entry>
|
||||
identical devices. If no such information is available the field must
|
||||
simply count the devices controlled by the driver ("platform:vivi-000").
|
||||
The bus_info must start with "PCI:" for PCI boards, "PCIe:" for PCI Express boards,
|
||||
"usb-" for USB devices, "I2C:" for i2c devices, "ISA:" for ISA devices,
|
||||
"parport" for parallel port devices and "platform:" for platform devices.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>__u32</entry>
|
||||
|
|
|
@ -62,5 +62,13 @@ current video input or output.</para>
|
|||
|
||||
<refsect1>
|
||||
&return-value;
|
||||
<variablelist>
|
||||
<varlistentry>
|
||||
<term><errorcode>ENODATA</errorcode></term>
|
||||
<listitem>
|
||||
<para>Standard video timings are not supported for this input or output.</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
</variablelist>
|
||||
</refsect1>
|
||||
</refentry>
|
||||
|
|
|
@ -109,9 +109,8 @@ as the &v4l2-format; <structfield>type</structfield> field. See <xref
|
|||
<row>
|
||||
<entry>__u32</entry>
|
||||
<entry><structfield>reserved</structfield>[2]</entry>
|
||||
<entry>A place holder for future extensions and custom
|
||||
(driver defined) buffer types <constant>V4L2_BUF_TYPE_PRIVATE</constant> and
|
||||
higher. This array should be zeroed by applications.</entry>
|
||||
<entry>A place holder for future extensions. This array should
|
||||
be zeroed by applications.</entry>
|
||||
</row>
|
||||
</tbody>
|
||||
</tgroup>
|
||||
|
|
|
@ -75,6 +75,9 @@ seek is started.</para>
|
|||
|
||||
<para>This ioctl is supported if the <constant>V4L2_CAP_HW_FREQ_SEEK</constant> capability is set.</para>
|
||||
|
||||
<para>If this ioctl is called from a non-blocking filehandle, then &EAGAIN; is
|
||||
returned and no seek takes place.</para>
|
||||
|
||||
<table pgwide="1" frame="none" id="v4l2-hw-freq-seek">
|
||||
<title>struct <structname>v4l2_hw_freq_seek</structname></title>
|
||||
<tgroup cols="3">
|
||||
|
@ -157,6 +160,13 @@ one of the values in the <structfield>type</structfield>,
|
|||
fields is wrong.</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term><errorcode>EAGAIN</errorcode></term>
|
||||
<listitem>
|
||||
<para>Attempted to call <constant>VIDIOC_S_HW_FREQ_SEEK</constant>
|
||||
with the filehandle in non-blocking mode.</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term><errorcode>ENODATA</errorcode></term>
|
||||
<listitem>
|
||||
|
|
|
@ -74,7 +74,12 @@ not transmitted yet. I/O returns to the same state as after calling
|
|||
stream type. This is the same as &v4l2-requestbuffers;
|
||||
<structfield>type</structfield>.</para>
|
||||
|
||||
<para>Note applications can be preempted for unknown periods right
|
||||
<para>If <constant>VIDIOC_STREAMON</constant> is called when streaming
|
||||
is already in progress, or if <constant>VIDIOC_STREAMOFF</constant> is called
|
||||
when streaming is already stopped, then the ioctl does nothing and 0 is
|
||||
returned.</para>
|
||||
|
||||
<para>Note that applications can be preempted for unknown periods right
|
||||
before or after the <constant>VIDIOC_STREAMON</constant> or
|
||||
<constant>VIDIOC_STREAMOFF</constant> calls, there is no notion of
|
||||
starting or stopping "now". Buffer timestamps can be used to
|
||||
|
|
152
Documentation/DocBook/media/v4l/vidioc-subdev-g-edid.xml
Normal file
152
Documentation/DocBook/media/v4l/vidioc-subdev-g-edid.xml
Normal file
|
@ -0,0 +1,152 @@
|
|||
<refentry id="vidioc-subdev-g-edid">
|
||||
<refmeta>
|
||||
<refentrytitle>ioctl VIDIOC_SUBDEV_G_EDID, VIDIOC_SUBDEV_S_EDID</refentrytitle>
|
||||
&manvol;
|
||||
</refmeta>
|
||||
|
||||
<refnamediv>
|
||||
<refname>VIDIOC_SUBDEV_G_EDID</refname>
|
||||
<refname>VIDIOC_SUBDEV_S_EDID</refname>
|
||||
<refpurpose>Get or set the EDID of a video receiver/transmitter</refpurpose>
|
||||
</refnamediv>
|
||||
|
||||
<refsynopsisdiv>
|
||||
<funcsynopsis>
|
||||
<funcprototype>
|
||||
<funcdef>int <function>ioctl</function></funcdef>
|
||||
<paramdef>int <parameter>fd</parameter></paramdef>
|
||||
<paramdef>int <parameter>request</parameter></paramdef>
|
||||
<paramdef>struct v4l2_subdev_edid *<parameter>argp</parameter></paramdef>
|
||||
</funcprototype>
|
||||
</funcsynopsis>
|
||||
<funcsynopsis>
|
||||
<funcprototype>
|
||||
<funcdef>int <function>ioctl</function></funcdef>
|
||||
<paramdef>int <parameter>fd</parameter></paramdef>
|
||||
<paramdef>int <parameter>request</parameter></paramdef>
|
||||
<paramdef>const struct v4l2_subdev_edid *<parameter>argp</parameter></paramdef>
|
||||
</funcprototype>
|
||||
</funcsynopsis>
|
||||
</refsynopsisdiv>
|
||||
|
||||
<refsect1>
|
||||
<title>Arguments</title>
|
||||
|
||||
<variablelist>
|
||||
<varlistentry>
|
||||
<term><parameter>fd</parameter></term>
|
||||
<listitem>
|
||||
<para>&fd;</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term><parameter>request</parameter></term>
|
||||
<listitem>
|
||||
<para>VIDIOC_SUBDEV_G_EDID, VIDIOC_SUBDEV_S_EDID</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term><parameter>argp</parameter></term>
|
||||
<listitem>
|
||||
<para></para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
</variablelist>
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>Description</title>
|
||||
<para>These ioctls can be used to get or set an EDID associated with an input pad
|
||||
from a receiver or an output pad of a transmitter subdevice.</para>
|
||||
|
||||
<para>To get the EDID data the application has to fill in the <structfield>pad</structfield>,
|
||||
<structfield>start_block</structfield>, <structfield>blocks</structfield> and <structfield>edid</structfield>
|
||||
fields and call <constant>VIDIOC_SUBDEV_G_EDID</constant>. The current EDID from block
|
||||
<structfield>start_block</structfield> and of size <structfield>blocks</structfield>
|
||||
will be placed in the memory <structfield>edid</structfield> points to. The <structfield>edid</structfield>
|
||||
pointer must point to memory at least <structfield>blocks</structfield> * 128 bytes
|
||||
large (the size of one block is 128 bytes).</para>
|
||||
|
||||
<para>If there are fewer blocks than specified, then the driver will set <structfield>blocks</structfield>
|
||||
to the actual number of blocks. If there are no EDID blocks available at all, then the error code
|
||||
ENODATA is set.</para>
|
||||
|
||||
<para>If blocks have to be retrieved from the sink, then this call will block until they
|
||||
have been read.</para>
|
||||
|
||||
<para>To set the EDID blocks of a receiver the application has to fill in the <structfield>pad</structfield>,
|
||||
<structfield>blocks</structfield> and <structfield>edid</structfield> fields and set
|
||||
<structfield>start_block</structfield> to 0. It is not possible to set part of an EDID,
|
||||
it is always all or nothing. Setting the EDID data is only valid for receivers as it makes
|
||||
no sense for a transmitter.</para>
|
||||
|
||||
<para>The driver assumes that the full EDID is passed in. If there are more EDID blocks than
|
||||
the hardware can handle then the EDID is not written, but instead the error code E2BIG is set
|
||||
and <structfield>blocks</structfield> is set to the maximum that the hardware supports.
|
||||
If <structfield>start_block</structfield> is any
|
||||
value other than 0 then the error code EINVAL is set.</para>
|
||||
|
||||
<para>To disable an EDID you set <structfield>blocks</structfield> to 0. Depending on the
|
||||
hardware this will drive the hotplug pin low and/or block the source from reading the EDID
|
||||
data in some way. In any case, the end result is the same: the EDID is no longer available.
|
||||
</para>
|
||||
|
||||
<table pgwide="1" frame="none" id="v4l2-subdev-edid">
|
||||
<title>struct <structname>v4l2_subdev_edid</structname></title>
|
||||
<tgroup cols="3">
|
||||
&cs-str;
|
||||
<tbody valign="top">
|
||||
<row>
|
||||
<entry>__u32</entry>
|
||||
<entry><structfield>pad</structfield></entry>
|
||||
<entry>Pad for which to get/set the EDID blocks.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>__u32</entry>
|
||||
<entry><structfield>start_block</structfield></entry>
|
||||
<entry>Read the EDID from starting with this block. Must be 0 when setting
|
||||
the EDID.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>__u32</entry>
|
||||
<entry><structfield>blocks</structfield></entry>
|
||||
<entry>The number of blocks to get or set. Must be less or equal to 256 (the
|
||||
maximum number of blocks as defined by the standard). When you set the EDID and
|
||||
<structfield>blocks</structfield> is 0, then the EDID is disabled or erased.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>__u8 *</entry>
|
||||
<entry><structfield>edid</structfield></entry>
|
||||
<entry>Pointer to memory that contains the EDID. The minimum size is
|
||||
<structfield>blocks</structfield> * 128.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>__u32</entry>
|
||||
<entry><structfield>reserved</structfield>[5]</entry>
|
||||
<entry>Reserved for future extensions. Applications and drivers must
|
||||
set the array to zero.</entry>
|
||||
</row>
|
||||
</tbody>
|
||||
</tgroup>
|
||||
</table>
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
&return-value;
|
||||
|
||||
<variablelist>
|
||||
<varlistentry>
|
||||
<term><errorcode>ENODATA</errorcode></term>
|
||||
<listitem>
|
||||
<para>The EDID data is not available.</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term><errorcode>E2BIG</errorcode></term>
|
||||
<listitem>
|
||||
<para>The EDID data you provided is more than the hardware can handle.</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
</variablelist>
|
||||
</refsect1>
|
||||
</refentry>
|
|
@ -69,23 +69,22 @@
|
|||
more information on how each selection target affects the image
|
||||
processing pipeline inside the subdevice.</para>
|
||||
|
||||
<section>
|
||||
<refsect2>
|
||||
<title>Types of selection targets</title>
|
||||
|
||||
<para>There are two types of selection targets: actual and bounds. The
|
||||
actual targets are the targets which configure the hardware. The BOUNDS
|
||||
target will return a rectangle that contain all possible actual
|
||||
rectangles.</para>
|
||||
</section>
|
||||
</refsect2>
|
||||
|
||||
<section>
|
||||
<refsect2>
|
||||
<title>Discovering supported features</title>
|
||||
|
||||
<para>To discover which targets are supported, the user can
|
||||
perform <constant>VIDIOC_SUBDEV_G_SELECTION</constant> on them.
|
||||
Any unsupported target will return
|
||||
<constant>EINVAL</constant>.</para>
|
||||
</section>
|
||||
|
||||
<para>Selection targets and flags are documented in <xref
|
||||
linkend="v4l2-selections-common"/>.</para>
|
||||
|
@ -132,6 +131,7 @@
|
|||
</tbody>
|
||||
</tgroup>
|
||||
</table>
|
||||
</refsect2>
|
||||
|
||||
</refsect1>
|
||||
|
||||
|
|
|
@ -29,7 +29,7 @@
|
|||
<title>LINUX MEDIA INFRASTRUCTURE API</title>
|
||||
|
||||
<copyright>
|
||||
<year>2009-2011</year>
|
||||
<year>2009-2012</year>
|
||||
<holder>LinuxTV Developers</holder>
|
||||
</copyright>
|
||||
|
||||
|
@ -53,7 +53,7 @@ Foundation. A copy of the license is included in the chapter entitled
|
|||
video and radio straming devices, including video cameras,
|
||||
analog and digital TV receiver cards, AM/FM receiver cards,
|
||||
streaming capture devices.</para>
|
||||
<para>It is divided into three parts.</para>
|
||||
<para>It is divided into four parts.</para>
|
||||
<para>The first part covers radio, capture,
|
||||
cameras and analog TV devices.</para>
|
||||
<para>The second part covers the
|
||||
|
@ -62,7 +62,8 @@ Foundation. A copy of the license is included in the chapter entitled
|
|||
in fact it covers several different video standards including
|
||||
DVB-T, DVB-S, DVB-C and ATSC. The API is currently being updated
|
||||
to documment support also for DVB-S2, ISDB-T and ISDB-S.</para>
|
||||
<para>The third part covers Remote Controller API</para>
|
||||
<para>The third part covers the Remote Controller API.</para>
|
||||
<para>The fourth part covers the Media Controller API.</para>
|
||||
<para>For additional information and for the latest development code,
|
||||
see: <ulink url="http://linuxtv.org">http://linuxtv.org</ulink>.</para>
|
||||
<para>For discussing improvements, reporting troubles, sending new drivers, etc, please mail to: <ulink url="http://vger.kernel.org/vger-lists.html#linux-media">Linux Media Mailing List (LMML).</ulink>.</para>
|
||||
|
@ -87,7 +88,7 @@ Foundation. A copy of the license is included in the chapter entitled
|
|||
</author>
|
||||
</authorgroup>
|
||||
<copyright>
|
||||
<year>2009-2011</year>
|
||||
<year>2009-2012</year>
|
||||
<holder>Mauro Carvalho Chehab</holder>
|
||||
</copyright>
|
||||
|
||||
|
|
|
@ -30,7 +30,7 @@ with the device via the bus. The connection between the DVB-API-functionality
|
|||
is done via callbacks, assigned in a static device-description (struct
|
||||
dvb_usb_device) each device-driver has to have.
|
||||
|
||||
For an example have a look in drivers/media/dvb/dvb-usb/vp7045*.
|
||||
For an example have a look in drivers/media/usb/dvb-usb/vp7045*.
|
||||
|
||||
Objective is to migrate all the usb-devices (dibusb, cinergyT2, maybe the
|
||||
ttusb; flexcop-usb already benefits from the generic flexcop-device) to use
|
||||
|
|
|
@ -116,7 +116,7 @@ sub tda10045 {
|
|||
|
||||
sub tda10046 {
|
||||
my $sourcefile = "TT_PCI_2.19h_28_11_2006.zip";
|
||||
my $url = "http://www.tt-download.com/download/updates/219/$sourcefile";
|
||||
my $url = "http://technotrend.com.ua/download/software/219/$sourcefile";
|
||||
my $hash = "6a7e1e2f2644b162ff0502367553c72d";
|
||||
my $outfile = "dvb-fe-tda10046.fw";
|
||||
my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1);
|
||||
|
|
|
@ -178,7 +178,6 @@ Code Seq#(hex) Include File Comments
|
|||
'V' C0 linux/ivtv.h conflict!
|
||||
'V' C0 media/davinci/vpfe_capture.h conflict!
|
||||
'V' C0 media/si4713.h conflict!
|
||||
'V' C0-CF drivers/media/video/mxb.h conflict!
|
||||
'W' 00-1F linux/watchdog.h conflict!
|
||||
'W' 00-1F linux/wanrouter.h conflict!
|
||||
'W' 00-3F sound/asound.h conflict!
|
||||
|
@ -204,8 +203,6 @@ Code Seq#(hex) Include File Comments
|
|||
'c' A0-AF arch/x86/include/asm/msr.h conflict!
|
||||
'd' 00-FF linux/char/drm/drm/h conflict!
|
||||
'd' 02-40 pcmcia/ds.h conflict!
|
||||
'd' 10-3F drivers/media/video/dabusb.h conflict!
|
||||
'd' C0-CF drivers/media/video/saa7191.h conflict!
|
||||
'd' F0-FF linux/digi1.h
|
||||
'e' all linux/digi1.h conflict!
|
||||
'e' 00-1F drivers/net/irda/irtty-sir.h conflict!
|
||||
|
@ -267,9 +264,7 @@ Code Seq#(hex) Include File Comments
|
|||
'v' 00-1F linux/ext2_fs.h conflict!
|
||||
'v' 00-1F linux/fs.h conflict!
|
||||
'v' 00-0F linux/sonypi.h conflict!
|
||||
'v' C0-DF media/pwc-ioctl.h conflict!
|
||||
'v' C0-FF linux/meye.h conflict!
|
||||
'v' D0-DF drivers/media/video/cpia2/cpia2dev.h conflict!
|
||||
'w' all CERN SCI driver
|
||||
'y' 00-1F packet based user level communications
|
||||
<mailto:zapman@interlan.net>
|
||||
|
|
|
@ -35,3 +35,4 @@
|
|||
34 -> TerraTec Cinergy T PCIe Dual [153b:117e]
|
||||
35 -> TeVii S471 [d471:9022]
|
||||
36 -> Hauppauge WinTV-HVR1255 [0070:2259]
|
||||
37 -> Prof Revolution DVB-S2 8000 [8000:3034]
|
||||
|
|
|
@ -18,7 +18,7 @@ Table of Contents
|
|||
|
||||
1.0 Introduction
|
||||
|
||||
The file ../../drivers/media/video/c-qcam.c is a device driver for
|
||||
The file ../../drivers/media/parport/c-qcam.c is a device driver for
|
||||
the Logitech (nee Connectix) parallel port interface color CCD camera.
|
||||
This is a fairly inexpensive device for capturing images. Logitech
|
||||
does not currently provide information for developers, but many people
|
||||
|
|
|
@ -5,22 +5,22 @@
|
|||
File partitioning
|
||||
-----------------
|
||||
V4L2 display device driver
|
||||
drivers/media/video/davinci/vpbe_display.c
|
||||
drivers/media/video/davinci/vpbe_display.h
|
||||
drivers/media/platform/davinci/vpbe_display.c
|
||||
drivers/media/platform/davinci/vpbe_display.h
|
||||
|
||||
VPBE display controller
|
||||
drivers/media/video/davinci/vpbe.c
|
||||
drivers/media/video/davinci/vpbe.h
|
||||
drivers/media/platform/davinci/vpbe.c
|
||||
drivers/media/platform/davinci/vpbe.h
|
||||
|
||||
VPBE venc sub device driver
|
||||
drivers/media/video/davinci/vpbe_venc.c
|
||||
drivers/media/video/davinci/vpbe_venc.h
|
||||
drivers/media/video/davinci/vpbe_venc_regs.h
|
||||
drivers/media/platform/davinci/vpbe_venc.c
|
||||
drivers/media/platform/davinci/vpbe_venc.h
|
||||
drivers/media/platform/davinci/vpbe_venc_regs.h
|
||||
|
||||
VPBE osd driver
|
||||
drivers/media/video/davinci/vpbe_osd.c
|
||||
drivers/media/video/davinci/vpbe_osd.h
|
||||
drivers/media/video/davinci/vpbe_osd_regs.h
|
||||
drivers/media/platform/davinci/vpbe_osd.c
|
||||
drivers/media/platform/davinci/vpbe_osd.h
|
||||
drivers/media/platform/davinci/vpbe_osd_regs.h
|
||||
|
||||
Functional partitioning
|
||||
-----------------------
|
||||
|
|
|
@ -10,7 +10,7 @@ data from LCD controller (FIMD) through the SoC internal writeback data
|
|||
path. There are multiple FIMC instances in the SoCs (up to 4), having
|
||||
slightly different capabilities, like pixel alignment constraints, rotator
|
||||
availability, LCD writeback support, etc. The driver is located at
|
||||
drivers/media/video/s5p-fimc directory.
|
||||
drivers/media/platform/s5p-fimc directory.
|
||||
|
||||
1. Supported SoCs
|
||||
=================
|
||||
|
@ -36,21 +36,21 @@ Not currently supported:
|
|||
=====================
|
||||
|
||||
- media device driver
|
||||
drivers/media/video/s5p-fimc/fimc-mdevice.[ch]
|
||||
drivers/media/platform/s5p-fimc/fimc-mdevice.[ch]
|
||||
|
||||
- camera capture video device driver
|
||||
drivers/media/video/s5p-fimc/fimc-capture.c
|
||||
drivers/media/platform/s5p-fimc/fimc-capture.c
|
||||
|
||||
- MIPI-CSI2 receiver subdev
|
||||
drivers/media/video/s5p-fimc/mipi-csis.[ch]
|
||||
drivers/media/platform/s5p-fimc/mipi-csis.[ch]
|
||||
|
||||
- video post-processor (mem-to-mem)
|
||||
drivers/media/video/s5p-fimc/fimc-core.c
|
||||
drivers/media/platform/s5p-fimc/fimc-core.c
|
||||
|
||||
- common files
|
||||
drivers/media/video/s5p-fimc/fimc-core.h
|
||||
drivers/media/video/s5p-fimc/fimc-reg.h
|
||||
drivers/media/video/s5p-fimc/regs-fimc.h
|
||||
drivers/media/platform/s5p-fimc/fimc-core.h
|
||||
drivers/media/platform/s5p-fimc/fimc-reg.h
|
||||
drivers/media/platform/s5p-fimc/regs-fimc.h
|
||||
|
||||
4. User space interfaces
|
||||
========================
|
||||
|
|
|
@ -12,7 +12,7 @@ Introduction
|
|||
============
|
||||
|
||||
This file documents the Texas Instruments OMAP 3 Image Signal Processor (ISP)
|
||||
driver located under drivers/media/video/omap3isp. The original driver was
|
||||
driver located under drivers/media/platform/omap3isp. The original driver was
|
||||
written by Texas Instruments but since that it has been rewritten (twice) at
|
||||
Nokia.
|
||||
|
||||
|
|
|
@ -594,7 +594,11 @@ handler and finally add the first handler to the second. For example:
|
|||
v4l2_ctrl_new_std(&radio_ctrl_handler, &radio_ops, V4L2_CID_AUDIO_MUTE, ...);
|
||||
v4l2_ctrl_new_std(&video_ctrl_handler, &video_ops, V4L2_CID_BRIGHTNESS, ...);
|
||||
v4l2_ctrl_new_std(&video_ctrl_handler, &video_ops, V4L2_CID_CONTRAST, ...);
|
||||
v4l2_ctrl_add_handler(&video_ctrl_handler, &radio_ctrl_handler);
|
||||
v4l2_ctrl_add_handler(&video_ctrl_handler, &radio_ctrl_handler, NULL);
|
||||
|
||||
The last argument to v4l2_ctrl_add_handler() is a filter function that allows
|
||||
you to filter which controls will be added. Set it to NULL if you want to add
|
||||
all controls.
|
||||
|
||||
Or you can add specific controls to a handler:
|
||||
|
||||
|
|
|
@ -583,11 +583,19 @@ You should also set these fields:
|
|||
|
||||
- name: set to something descriptive and unique.
|
||||
|
||||
- vfl_dir: set this to VFL_DIR_RX for capture devices (VFL_DIR_RX has value 0,
|
||||
so this is normally already the default), set to VFL_DIR_TX for output
|
||||
devices and VFL_DIR_M2M for mem2mem (codec) devices.
|
||||
|
||||
- fops: set to the v4l2_file_operations struct.
|
||||
|
||||
- ioctl_ops: if you use the v4l2_ioctl_ops to simplify ioctl maintenance
|
||||
(highly recommended to use this and it might become compulsory in the
|
||||
future!), then set this to your v4l2_ioctl_ops struct.
|
||||
future!), then set this to your v4l2_ioctl_ops struct. The vfl_type and
|
||||
vfl_dir fields are used to disable ops that do not match the type/dir
|
||||
combination. E.g. VBI ops are disabled for non-VBI nodes, and output ops
|
||||
are disabled for a capture device. This makes it possible to provide
|
||||
just one v4l2_ioctl_ops struct for both vbi and video nodes.
|
||||
|
||||
- lock: leave to NULL if you want to do all the locking in the driver.
|
||||
Otherwise you give it a pointer to a struct mutex_lock and before the
|
||||
|
@ -1054,4 +1062,4 @@ The first event type in the class is reserved for future use, so the first
|
|||
available event type is 'class base + 1'.
|
||||
|
||||
An example on how the V4L2 events may be used can be found in the OMAP
|
||||
3 ISP driver (drivers/media/video/omap3isp).
|
||||
3 ISP driver (drivers/media/platform/omap3isp).
|
||||
|
|
|
@ -349,7 +349,7 @@ again.
|
|||
Developers who are interested in more information can go into the relevant
|
||||
header files; there are a few low-level functions declared there which have
|
||||
not been talked about here. Also worthwhile is the vivi driver
|
||||
(drivers/media/video/vivi.c), which is maintained as an example of how V4L2
|
||||
(drivers/media/platform/vivi.c), which is maintained as an example of how V4L2
|
||||
drivers should be written. Vivi only uses the vmalloc() API, but it's good
|
||||
enough to get started with. Note also that all of these calls are exported
|
||||
GPL-only, so they will not be available to non-GPL kernel modules.
|
||||
|
|
404
MAINTAINERS
404
MAINTAINERS
|
@ -184,6 +184,16 @@ S: Maintained
|
|||
F: Documentation/filesystems/9p.txt
|
||||
F: fs/9p/
|
||||
|
||||
A8293 MEDIA DRIVER
|
||||
M: Antti Palosaari <crope@iki.fi>
|
||||
L: linux-media@vger.kernel.org
|
||||
W: http://linuxtv.org/
|
||||
W: http://palosaari.fi/linux/
|
||||
Q: http://patchwork.linuxtv.org/project/linux-media/list/
|
||||
T: git git://linuxtv.org/anttip/media_tree.git
|
||||
S: Maintained
|
||||
F: drivers/media/dvb-frontends/a8293*
|
||||
|
||||
AACRAID SCSI RAID DRIVER
|
||||
M: Adaptec OEM Raid Solutions <aacraid@adaptec.com>
|
||||
L: linux-scsi@vger.kernel.org
|
||||
|
@ -391,6 +401,26 @@ M: Riccardo Facchetti <fizban@tin.it>
|
|||
S: Maintained
|
||||
F: sound/oss/aedsp16.c
|
||||
|
||||
AF9013 MEDIA DRIVER
|
||||
M: Antti Palosaari <crope@iki.fi>
|
||||
L: linux-media@vger.kernel.org
|
||||
W: http://linuxtv.org/
|
||||
W: http://palosaari.fi/linux/
|
||||
Q: http://patchwork.linuxtv.org/project/linux-media/list/
|
||||
T: git git://linuxtv.org/anttip/media_tree.git
|
||||
S: Maintained
|
||||
F: drivers/media/dvb-frontends/af9013*
|
||||
|
||||
AF9033 MEDIA DRIVER
|
||||
M: Antti Palosaari <crope@iki.fi>
|
||||
L: linux-media@vger.kernel.org
|
||||
W: http://linuxtv.org/
|
||||
W: http://palosaari.fi/linux/
|
||||
Q: http://patchwork.linuxtv.org/project/linux-media/list/
|
||||
T: git git://linuxtv.org/anttip/media_tree.git
|
||||
S: Maintained
|
||||
F: drivers/media/dvb-frontends/af9033*
|
||||
|
||||
AFFS FILE SYSTEM
|
||||
L: linux-fsdevel@vger.kernel.org
|
||||
S: Orphan
|
||||
|
@ -1063,7 +1093,7 @@ L: linux-media@vger.kernel.org
|
|||
S: Maintained
|
||||
F: arch/arm/plat-s5p/dev-fimc*
|
||||
F: arch/arm/plat-samsung/include/plat/*fimc*
|
||||
F: drivers/media/video/s5p-fimc/
|
||||
F: drivers/media/platform/s5p-fimc/
|
||||
|
||||
ARM/SAMSUNG S5P SERIES Multi Format Codec (MFC) SUPPORT
|
||||
M: Kyungmin Park <kyungmin.park@samsung.com>
|
||||
|
@ -1073,7 +1103,7 @@ L: linux-arm-kernel@lists.infradead.org
|
|||
L: linux-media@vger.kernel.org
|
||||
S: Maintained
|
||||
F: arch/arm/plat-s5p/dev-mfc.c
|
||||
F: drivers/media/video/s5p-mfc/
|
||||
F: drivers/media/platform/s5p-mfc/
|
||||
|
||||
ARM/SAMSUNG S5P SERIES TV SUBSYSTEM SUPPORT
|
||||
M: Kyungmin Park <kyungmin.park@samsung.com>
|
||||
|
@ -1081,7 +1111,7 @@ M: Tomasz Stanislawski <t.stanislaws@samsung.com>
|
|||
L: linux-arm-kernel@lists.infradead.org
|
||||
L: linux-media@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/media/video/s5p-tv/
|
||||
F: drivers/media/platform/s5p-tv/
|
||||
|
||||
ARM/SHMOBILE ARM ARCHITECTURE
|
||||
M: Paul Mundt <lethal@linux-sh.org>
|
||||
|
@ -1353,7 +1383,7 @@ ATMEL ISI DRIVER
|
|||
M: Josh Wu <josh.wu@atmel.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
S: Supported
|
||||
F: drivers/media/video/atmel-isi.c
|
||||
F: drivers/media/platform/atmel-isi.c
|
||||
F: include/media/atmel-isi.h
|
||||
|
||||
ATMEL LCDFB DRIVER
|
||||
|
@ -1700,7 +1730,7 @@ W: http://linuxtv.org
|
|||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media.git
|
||||
S: Maintained
|
||||
F: Documentation/video4linux/bttv/
|
||||
F: drivers/media/video/bt8xx/bttv*
|
||||
F: drivers/media/pci/bt8xx/bttv*
|
||||
|
||||
C-MEDIA CMI8788 DRIVER
|
||||
M: Clemens Ladisch <clemens@ladisch.de>
|
||||
|
@ -1730,7 +1760,7 @@ L: linux-media@vger.kernel.org
|
|||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media.git
|
||||
S: Maintained
|
||||
F: Documentation/video4linux/cafe_ccic
|
||||
F: drivers/media/video/marvell-ccic/
|
||||
F: drivers/media/platform/marvell-ccic/
|
||||
|
||||
CAIF NETWORK LAYER
|
||||
M: Sjur Braendeland <sjur.brandeland@stericsson.com>
|
||||
|
@ -2119,7 +2149,17 @@ W: http://linuxtv.org
|
|||
W: http://www.ivtvdriver.org/index.php/Cx18
|
||||
S: Maintained
|
||||
F: Documentation/video4linux/cx18.txt
|
||||
F: drivers/media/video/cx18/
|
||||
F: drivers/media/pci/cx18/
|
||||
|
||||
CXD2820R MEDIA DRIVER
|
||||
M: Antti Palosaari <crope@iki.fi>
|
||||
L: linux-media@vger.kernel.org
|
||||
W: http://linuxtv.org/
|
||||
W: http://palosaari.fi/linux/
|
||||
Q: http://patchwork.linuxtv.org/project/linux-media/list/
|
||||
T: git git://linuxtv.org/anttip/media_tree.git
|
||||
S: Maintained
|
||||
F: drivers/media/dvb-frontends/cxd2820r*
|
||||
|
||||
CXGB3 ETHERNET DRIVER (CXGB3)
|
||||
M: Divy Le Ray <divy@chelsio.com>
|
||||
|
@ -2474,6 +2514,117 @@ L: netdev@vger.kernel.org
|
|||
S: Maintained
|
||||
F: drivers/net/wan/dscc4.c
|
||||
|
||||
DVB_USB_AF9015 MEDIA DRIVER
|
||||
M: Antti Palosaari <crope@iki.fi>
|
||||
L: linux-media@vger.kernel.org
|
||||
W: http://linuxtv.org/
|
||||
W: http://palosaari.fi/linux/
|
||||
Q: http://patchwork.linuxtv.org/project/linux-media/list/
|
||||
T: git git://linuxtv.org/anttip/media_tree.git
|
||||
S: Maintained
|
||||
F: drivers/media/usb/dvb-usb-v2/af9015*
|
||||
|
||||
DVB_USB_AF9035 MEDIA DRIVER
|
||||
M: Antti Palosaari <crope@iki.fi>
|
||||
L: linux-media@vger.kernel.org
|
||||
W: http://linuxtv.org/
|
||||
W: http://palosaari.fi/linux/
|
||||
Q: http://patchwork.linuxtv.org/project/linux-media/list/
|
||||
T: git git://linuxtv.org/anttip/media_tree.git
|
||||
S: Maintained
|
||||
F: drivers/media/usb/dvb-usb-v2/af9035*
|
||||
|
||||
DVB_USB_ANYSEE MEDIA DRIVER
|
||||
M: Antti Palosaari <crope@iki.fi>
|
||||
L: linux-media@vger.kernel.org
|
||||
W: http://linuxtv.org/
|
||||
W: http://palosaari.fi/linux/
|
||||
Q: http://patchwork.linuxtv.org/project/linux-media/list/
|
||||
T: git git://linuxtv.org/anttip/media_tree.git
|
||||
S: Maintained
|
||||
F: drivers/media/usb/dvb-usb-v2/anysee*
|
||||
|
||||
DVB_USB_AU6610 MEDIA DRIVER
|
||||
M: Antti Palosaari <crope@iki.fi>
|
||||
L: linux-media@vger.kernel.org
|
||||
W: http://linuxtv.org/
|
||||
W: http://palosaari.fi/linux/
|
||||
Q: http://patchwork.linuxtv.org/project/linux-media/list/
|
||||
T: git git://linuxtv.org/anttip/media_tree.git
|
||||
S: Maintained
|
||||
F: drivers/media/usb/dvb-usb-v2/au6610*
|
||||
|
||||
DVB_USB_CE6230 MEDIA DRIVER
|
||||
M: Antti Palosaari <crope@iki.fi>
|
||||
L: linux-media@vger.kernel.org
|
||||
W: http://linuxtv.org/
|
||||
W: http://palosaari.fi/linux/
|
||||
Q: http://patchwork.linuxtv.org/project/linux-media/list/
|
||||
T: git git://linuxtv.org/anttip/media_tree.git
|
||||
S: Maintained
|
||||
F: drivers/media/usb/dvb-usb-v2/ce6230*
|
||||
|
||||
DVB_USB_CXUSB MEDIA DRIVER
|
||||
M: Michael Krufky <mkrufky@linuxtv.org>
|
||||
L: linux-media@vger.kernel.org
|
||||
W: http://linuxtv.org/
|
||||
W: http://github.com/mkrufky
|
||||
Q: http://patchwork.linuxtv.org/project/linux-media/list/
|
||||
T: git git://linuxtv.org/media_tree.git
|
||||
S: Maintained
|
||||
F: drivers/media/usb/dvb-usb-v2/cxusb*
|
||||
|
||||
DVB_USB_CYPRESS_FIRMWARE MEDIA DRIVER
|
||||
M: Antti Palosaari <crope@iki.fi>
|
||||
L: linux-media@vger.kernel.org
|
||||
W: http://linuxtv.org/
|
||||
W: http://palosaari.fi/linux/
|
||||
Q: http://patchwork.linuxtv.org/project/linux-media/list/
|
||||
T: git git://linuxtv.org/anttip/media_tree.git
|
||||
S: Maintained
|
||||
F: drivers/media/usb/dvb-usb-v2/cypress_firmware*
|
||||
|
||||
DVB_USB_EC168 MEDIA DRIVER
|
||||
M: Antti Palosaari <crope@iki.fi>
|
||||
L: linux-media@vger.kernel.org
|
||||
W: http://linuxtv.org/
|
||||
W: http://palosaari.fi/linux/
|
||||
Q: http://patchwork.linuxtv.org/project/linux-media/list/
|
||||
T: git git://linuxtv.org/anttip/media_tree.git
|
||||
S: Maintained
|
||||
F: drivers/media/usb/dvb-usb-v2/ec168*
|
||||
|
||||
DVB_USB_MXL111SF MEDIA DRIVER
|
||||
M: Michael Krufky <mkrufky@linuxtv.org>
|
||||
L: linux-media@vger.kernel.org
|
||||
W: http://linuxtv.org/
|
||||
W: http://github.com/mkrufky
|
||||
Q: http://patchwork.linuxtv.org/project/linux-media/list/
|
||||
T: git git://linuxtv.org/mkrufky/mxl111sf.git
|
||||
S: Maintained
|
||||
F: drivers/media/usb/dvb-usb-v2/mxl111sf*
|
||||
|
||||
DVB_USB_RTL28XXU MEDIA DRIVER
|
||||
M: Antti Palosaari <crope@iki.fi>
|
||||
L: linux-media@vger.kernel.org
|
||||
W: http://linuxtv.org/
|
||||
W: http://palosaari.fi/linux/
|
||||
Q: http://patchwork.linuxtv.org/project/linux-media/list/
|
||||
T: git git://linuxtv.org/anttip/media_tree.git
|
||||
S: Maintained
|
||||
F: drivers/media/usb/dvb-usb-v2/rtl28xxu*
|
||||
|
||||
DVB_USB_V2 MEDIA DRIVER
|
||||
M: Antti Palosaari <crope@iki.fi>
|
||||
L: linux-media@vger.kernel.org
|
||||
W: http://linuxtv.org/
|
||||
W: http://palosaari.fi/linux/
|
||||
Q: http://patchwork.linuxtv.org/project/linux-media/list/
|
||||
T: git git://linuxtv.org/anttip/media_tree.git
|
||||
S: Maintained
|
||||
F: drivers/media/usb/dvb-usb-v2/dvb_usb*
|
||||
F: drivers/media/usb/dvb-usb-v2/usb_urb.c
|
||||
|
||||
DYNAMIC DEBUG
|
||||
M: Jason Baron <jbaron@redhat.com>
|
||||
S: Maintained
|
||||
|
@ -2485,6 +2636,16 @@ M: "Maciej W. Rozycki" <macro@linux-mips.org>
|
|||
S: Maintained
|
||||
F: drivers/tty/serial/dz.*
|
||||
|
||||
E4000 MEDIA DRIVER
|
||||
M: Antti Palosaari <crope@iki.fi>
|
||||
L: linux-media@vger.kernel.org
|
||||
W: http://linuxtv.org/
|
||||
W: http://palosaari.fi/linux/
|
||||
Q: http://patchwork.linuxtv.org/project/linux-media/list/
|
||||
T: git git://linuxtv.org/anttip/media_tree.git
|
||||
S: Maintained
|
||||
F: drivers/media/tuners/e4000*
|
||||
|
||||
EATA-DMA SCSI DRIVER
|
||||
M: Michael Neuffer <mike@i-Connect.Net>
|
||||
L: linux-eata@i-connect.net
|
||||
|
@ -2513,6 +2674,16 @@ S: Maintained
|
|||
F: include/linux/netfilter_bridge/ebt_*.h
|
||||
F: net/bridge/netfilter/ebt*.c
|
||||
|
||||
EC100 MEDIA DRIVER
|
||||
M: Antti Palosaari <crope@iki.fi>
|
||||
L: linux-media@vger.kernel.org
|
||||
W: http://linuxtv.org/
|
||||
W: http://palosaari.fi/linux/
|
||||
Q: http://patchwork.linuxtv.org/project/linux-media/list/
|
||||
T: git git://linuxtv.org/anttip/media_tree.git
|
||||
S: Maintained
|
||||
F: drivers/media/dvb-frontends/ec100*
|
||||
|
||||
ECRYPT FILE SYSTEM
|
||||
M: Tyler Hicks <tyhicks@canonical.com>
|
||||
M: Dustin Kirkland <dustin.kirkland@gazzang.com>
|
||||
|
@ -2795,8 +2966,18 @@ FC0011 TUNER DRIVER
|
|||
M: Michael Buesch <m@bues.ch>
|
||||
L: linux-media@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/media/common/tuners/fc0011.h
|
||||
F: drivers/media/common/tuners/fc0011.c
|
||||
F: drivers/media/tuners/fc0011.h
|
||||
F: drivers/media/tuners/fc0011.c
|
||||
|
||||
FC2580 MEDIA DRIVER
|
||||
M: Antti Palosaari <crope@iki.fi>
|
||||
L: linux-media@vger.kernel.org
|
||||
W: http://linuxtv.org/
|
||||
W: http://palosaari.fi/linux/
|
||||
Q: http://patchwork.linuxtv.org/project/linux-media/list/
|
||||
T: git git://linuxtv.org/anttip/media_tree.git
|
||||
S: Maintained
|
||||
F: drivers/media/tuners/fc2580*
|
||||
|
||||
FANOTIFY
|
||||
M: Eric Paris <eparis@redhat.com>
|
||||
|
@ -3026,7 +3207,7 @@ M: Kyungmin Park <kyungmin.park@samsung.com>
|
|||
M: Heungjun Kim <riverful.kim@samsung.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/media/video/m5mols/
|
||||
F: drivers/media/i2c/m5mols/
|
||||
F: include/media/m5mols.h
|
||||
|
||||
FUJITSU TABLET EXTRAS
|
||||
|
@ -3144,49 +3325,56 @@ M: Frank Zago <frank@zago.net>
|
|||
L: linux-media@vger.kernel.org
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media.git
|
||||
S: Maintained
|
||||
F: drivers/media/video/gspca/finepix.c
|
||||
F: drivers/media/usb/gspca/finepix.c
|
||||
|
||||
GSPCA GL860 SUBDRIVER
|
||||
M: Olivier Lorin <o.lorin@laposte.net>
|
||||
L: linux-media@vger.kernel.org
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media.git
|
||||
S: Maintained
|
||||
F: drivers/media/video/gspca/gl860/
|
||||
F: drivers/media/usb/gspca/gl860/
|
||||
|
||||
GSPCA M5602 SUBDRIVER
|
||||
M: Erik Andren <erik.andren@gmail.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media.git
|
||||
S: Maintained
|
||||
F: drivers/media/video/gspca/m5602/
|
||||
F: drivers/media/usb/gspca/m5602/
|
||||
|
||||
GSPCA PAC207 SONIXB SUBDRIVER
|
||||
M: Hans de Goede <hdegoede@redhat.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media.git
|
||||
S: Maintained
|
||||
F: drivers/media/video/gspca/pac207.c
|
||||
F: drivers/media/usb/gspca/pac207.c
|
||||
|
||||
GSPCA SN9C20X SUBDRIVER
|
||||
M: Brian Johnson <brijohn@gmail.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media.git
|
||||
S: Maintained
|
||||
F: drivers/media/video/gspca/sn9c20x.c
|
||||
F: drivers/media/usb/gspca/sn9c20x.c
|
||||
|
||||
GSPCA T613 SUBDRIVER
|
||||
M: Leandro Costantino <lcostantino@gmail.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media.git
|
||||
S: Maintained
|
||||
F: drivers/media/video/gspca/t613.c
|
||||
F: drivers/media/usb/gspca/t613.c
|
||||
|
||||
GSPCA USB WEBCAM DRIVER
|
||||
M: Hans de Goede <hdegoede@redhat.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media.git
|
||||
S: Maintained
|
||||
F: drivers/media/video/gspca/
|
||||
F: drivers/media/usb/gspca/
|
||||
|
||||
STK1160 USB VIDEO CAPTURE DRIVER
|
||||
M: Ezequiel Garcia <elezegarcia@gmail.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media.git
|
||||
S: Maintained
|
||||
F: drivers/media/usb/stk1160/
|
||||
|
||||
HARD DRIVE ACTIVE PROTECTION SYSTEM (HDAPS) DRIVER
|
||||
M: Frank Seidel <frank@f-seidel.de>
|
||||
|
@ -3240,6 +3428,16 @@ L: linux-parisc@vger.kernel.org
|
|||
S: Maintained
|
||||
F: sound/parisc/harmony.*
|
||||
|
||||
HD29L2 MEDIA DRIVER
|
||||
M: Antti Palosaari <crope@iki.fi>
|
||||
L: linux-media@vger.kernel.org
|
||||
W: http://linuxtv.org/
|
||||
W: http://palosaari.fi/linux/
|
||||
Q: http://patchwork.linuxtv.org/project/linux-media/list/
|
||||
T: git git://linuxtv.org/anttip/media_tree.git
|
||||
S: Maintained
|
||||
F: drivers/media/dvb-frontends/hd29l2*
|
||||
|
||||
HEWLETT-PACKARD SMART2 RAID DRIVER
|
||||
M: Chirag Kantharia <chirag.kantharia@hp.com>
|
||||
L: iss_storagedev@hp.com
|
||||
|
@ -3906,7 +4104,7 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media.git
|
|||
W: http://www.ivtvdriver.org
|
||||
S: Maintained
|
||||
F: Documentation/video4linux/*.ivtv
|
||||
F: drivers/media/video/ivtv/
|
||||
F: drivers/media/pci/ivtv/
|
||||
F: include/linux/ivtv*
|
||||
|
||||
JC42.4 TEMPERATURE SENSOR DRIVER
|
||||
|
@ -4200,6 +4398,26 @@ W: http://legousb.sourceforge.net/
|
|||
S: Maintained
|
||||
F: drivers/usb/misc/legousbtower.c
|
||||
|
||||
LG2160 MEDIA DRIVER
|
||||
M: Michael Krufky <mkrufky@linuxtv.org>
|
||||
L: linux-media@vger.kernel.org
|
||||
W: http://linuxtv.org/
|
||||
W: http://github.com/mkrufky
|
||||
Q: http://patchwork.linuxtv.org/project/linux-media/list/
|
||||
T: git git://linuxtv.org/mkrufky/tuners.git
|
||||
S: Maintained
|
||||
F: drivers/media/dvb-frontends/lg2160.*
|
||||
|
||||
LGDT3305 MEDIA DRIVER
|
||||
M: Michael Krufky <mkrufky@linuxtv.org>
|
||||
L: linux-media@vger.kernel.org
|
||||
W: http://linuxtv.org/
|
||||
W: http://github.com/mkrufky
|
||||
Q: http://patchwork.linuxtv.org/project/linux-media/list/
|
||||
T: git git://linuxtv.org/mkrufky/tuners.git
|
||||
S: Maintained
|
||||
F: drivers/media/dvb-frontends/lgdt3305.*
|
||||
|
||||
LGUEST
|
||||
M: Rusty Russell <rusty@rustcorp.com.au>
|
||||
L: lguest@lists.ozlabs.org
|
||||
|
@ -4602,7 +4820,7 @@ MOTION EYE VAIO PICTUREBOOK CAMERA DRIVER
|
|||
W: http://popies.net/meye/
|
||||
S: Orphan
|
||||
F: Documentation/video4linux/meye.txt
|
||||
F: drivers/media/video/meye.*
|
||||
F: drivers/media/pci/meye/
|
||||
F: include/linux/meye.h
|
||||
|
||||
MOTOROLA IMX MMC/SD HOST CONTROLLER INTERFACE DRIVER
|
||||
|
@ -4666,6 +4884,16 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb.git
|
|||
S: Maintained
|
||||
F: drivers/usb/musb/
|
||||
|
||||
MXL5007T MEDIA DRIVER
|
||||
M: Michael Krufky <mkrufky@linuxtv.org>
|
||||
L: linux-media@vger.kernel.org
|
||||
W: http://linuxtv.org/
|
||||
W: http://github.com/mkrufky
|
||||
Q: http://patchwork.linuxtv.org/project/linux-media/list/
|
||||
T: git git://linuxtv.org/mkrufky/tuners.git
|
||||
S: Maintained
|
||||
F: drivers/media/tuners/mxl5007t.*
|
||||
|
||||
MYRICOM MYRI-10G 10GbE DRIVER (MYRI10GE)
|
||||
M: Andrew Gallatin <gallatin@myri.com>
|
||||
L: netdev@vger.kernel.org
|
||||
|
@ -5006,7 +5234,7 @@ OMAP IMAGE SIGNAL PROCESSOR (ISP)
|
|||
M: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/media/video/omap3isp/*
|
||||
F: drivers/media/platform/omap3isp/
|
||||
|
||||
OMAP USB SUPPORT
|
||||
M: Felipe Balbi <balbi@ti.com>
|
||||
|
@ -5047,7 +5275,7 @@ M: Jonathan Corbet <corbet@lwn.net>
|
|||
L: linux-media@vger.kernel.org
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media.git
|
||||
S: Maintained
|
||||
F: drivers/media/video/ov7670.c
|
||||
F: drivers/media/i2c/ov7670.c
|
||||
|
||||
ONENAND FLASH DRIVER
|
||||
M: Kyungmin Park <kyungmin.park@samsung.com>
|
||||
|
@ -5591,7 +5819,7 @@ W: http://www.isely.net/pvrusb2/
|
|||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media.git
|
||||
S: Maintained
|
||||
F: Documentation/video4linux/README.pvrusb2
|
||||
F: drivers/media/video/pvrusb2/
|
||||
F: drivers/media/usb/pvrusb2/
|
||||
|
||||
PWM SUBSYSTEM
|
||||
M: Thierry Reding <thierry.reding@avionic-design.de>
|
||||
|
@ -5701,6 +5929,16 @@ F: fs/qnx4/
|
|||
F: include/linux/qnx4_fs.h
|
||||
F: include/linux/qnxtypes.h
|
||||
|
||||
QT1010 MEDIA DRIVER
|
||||
M: Antti Palosaari <crope@iki.fi>
|
||||
L: linux-media@vger.kernel.org
|
||||
W: http://linuxtv.org/
|
||||
W: http://palosaari.fi/linux/
|
||||
Q: http://patchwork.linuxtv.org/project/linux-media/list/
|
||||
T: git git://linuxtv.org/anttip/media_tree.git
|
||||
S: Maintained
|
||||
F: drivers/media/tuners/qt1010*
|
||||
|
||||
QUALCOMM HEXAGON ARCHITECTURE
|
||||
M: Richard Kuo <rkuo@codeaurora.org>
|
||||
L: linux-hexagon@vger.kernel.org
|
||||
|
@ -5867,6 +6105,16 @@ F: include/linux/rose.h
|
|||
F: include/net/rose.h
|
||||
F: net/rose/
|
||||
|
||||
RTL2830 MEDIA DRIVER
|
||||
M: Antti Palosaari <crope@iki.fi>
|
||||
L: linux-media@vger.kernel.org
|
||||
W: http://linuxtv.org/
|
||||
W: http://palosaari.fi/linux/
|
||||
Q: http://patchwork.linuxtv.org/project/linux-media/list/
|
||||
T: git git://linuxtv.org/anttip/media_tree.git
|
||||
S: Maintained
|
||||
F: drivers/media/dvb-frontends/rtl2830*
|
||||
|
||||
RTL8180 WIRELESS DRIVER
|
||||
M: "John W. Linville" <linville@tuxdriver.com>
|
||||
L: linux-wireless@vger.kernel.org
|
||||
|
@ -5961,9 +6209,9 @@ L: linux-media@vger.kernel.org
|
|||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media.git
|
||||
W: http://www.mihu.de/linux/saa7146
|
||||
S: Maintained
|
||||
F: drivers/media/common/saa7146*
|
||||
F: drivers/media/video/*7146*
|
||||
F: include/media/*7146*
|
||||
F: drivers/media/common/saa7146/
|
||||
F: drivers/media/pci/saa7146/
|
||||
F: include/media/saa7146*
|
||||
|
||||
SAMSUNG LAPTOP DRIVER
|
||||
M: Corentin Chary <corentincj@iksaif.net>
|
||||
|
@ -6024,7 +6272,7 @@ M: Huang Shijie <shijie8@gmail.com>
|
|||
M: Kang Yong <kangyong@telegent.com>
|
||||
M: Zhang Xiaobing <xbzhang@telegent.com>
|
||||
S: Supported
|
||||
F: drivers/media/video/tlg2300
|
||||
F: drivers/media/usb/tlg2300
|
||||
|
||||
SC1200 WDT DRIVER
|
||||
M: Zwane Mwaikambo <zwane@arm.linux.org.uk>
|
||||
|
@ -6412,8 +6660,9 @@ M: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
|
|||
L: linux-media@vger.kernel.org
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media.git
|
||||
S: Maintained
|
||||
F: include/media/v4l2*
|
||||
F: drivers/media/video/v4l2*
|
||||
F: include/media/soc*
|
||||
F: drivers/media/i2c/soc_camera/
|
||||
F: drivers/media/platform/soc_camera/
|
||||
|
||||
SOEKRIS NET48XX LED SUPPORT
|
||||
M: Chris Boot <bootc@bootc.net>
|
||||
|
@ -6831,6 +7080,66 @@ W: http://tcp-lp-mod.sourceforge.net/
|
|||
S: Maintained
|
||||
F: net/ipv4/tcp_lp.c
|
||||
|
||||
TDA10071 MEDIA DRIVER
|
||||
M: Antti Palosaari <crope@iki.fi>
|
||||
L: linux-media@vger.kernel.org
|
||||
W: http://linuxtv.org/
|
||||
W: http://palosaari.fi/linux/
|
||||
Q: http://patchwork.linuxtv.org/project/linux-media/list/
|
||||
T: git git://linuxtv.org/anttip/media_tree.git
|
||||
S: Maintained
|
||||
F: drivers/media/dvb-frontends/tda10071*
|
||||
|
||||
TDA18212 MEDIA DRIVER
|
||||
M: Antti Palosaari <crope@iki.fi>
|
||||
L: linux-media@vger.kernel.org
|
||||
W: http://linuxtv.org/
|
||||
W: http://palosaari.fi/linux/
|
||||
Q: http://patchwork.linuxtv.org/project/linux-media/list/
|
||||
T: git git://linuxtv.org/anttip/media_tree.git
|
||||
S: Maintained
|
||||
F: drivers/media/tuners/tda18212*
|
||||
|
||||
TDA18218 MEDIA DRIVER
|
||||
M: Antti Palosaari <crope@iki.fi>
|
||||
L: linux-media@vger.kernel.org
|
||||
W: http://linuxtv.org/
|
||||
W: http://palosaari.fi/linux/
|
||||
Q: http://patchwork.linuxtv.org/project/linux-media/list/
|
||||
T: git git://linuxtv.org/anttip/media_tree.git
|
||||
S: Maintained
|
||||
F: drivers/media/tuners/tda18218*
|
||||
|
||||
TDA18271 MEDIA DRIVER
|
||||
M: Michael Krufky <mkrufky@linuxtv.org>
|
||||
L: linux-media@vger.kernel.org
|
||||
W: http://linuxtv.org/
|
||||
W: http://github.com/mkrufky
|
||||
Q: http://patchwork.linuxtv.org/project/linux-media/list/
|
||||
T: git git://linuxtv.org/mkrufky/tuners.git
|
||||
S: Maintained
|
||||
F: drivers/media/tuners/tda18271*
|
||||
|
||||
TDA827x MEDIA DRIVER
|
||||
M: Michael Krufky <mkrufky@linuxtv.org>
|
||||
L: linux-media@vger.kernel.org
|
||||
W: http://linuxtv.org/
|
||||
W: http://github.com/mkrufky
|
||||
Q: http://patchwork.linuxtv.org/project/linux-media/list/
|
||||
T: git git://linuxtv.org/mkrufky/tuners.git
|
||||
S: Maintained
|
||||
F: drivers/media/tuners/tda8290.*
|
||||
|
||||
TDA8290 MEDIA DRIVER
|
||||
M: Michael Krufky <mkrufky@linuxtv.org>
|
||||
L: linux-media@vger.kernel.org
|
||||
W: http://linuxtv.org/
|
||||
W: http://github.com/mkrufky
|
||||
Q: http://patchwork.linuxtv.org/project/linux-media/list/
|
||||
T: git git://linuxtv.org/mkrufky/tuners.git
|
||||
S: Maintained
|
||||
F: drivers/media/tuners/tda8290.*
|
||||
|
||||
TEAM DRIVER
|
||||
M: Jiri Pirko <jpirko@redhat.com>
|
||||
L: netdev@vger.kernel.org
|
||||
|
@ -7021,6 +7330,16 @@ F: include/linux/serial_core.h
|
|||
F: include/linux/serial.h
|
||||
F: include/linux/tty.h
|
||||
|
||||
TUA9001 MEDIA DRIVER
|
||||
M: Antti Palosaari <crope@iki.fi>
|
||||
L: linux-media@vger.kernel.org
|
||||
W: http://linuxtv.org/
|
||||
W: http://palosaari.fi/linux/
|
||||
Q: http://patchwork.linuxtv.org/project/linux-media/list/
|
||||
T: git git://linuxtv.org/anttip/media_tree.git
|
||||
S: Maintained
|
||||
F: drivers/media/tuners/tua9001*
|
||||
|
||||
TULIP NETWORK DRIVERS
|
||||
M: Grant Grundler <grundler@parisc-linux.org>
|
||||
L: netdev@vger.kernel.org
|
||||
|
@ -7193,15 +7512,6 @@ S: Maintained
|
|||
F: Documentation/usb/ehci.txt
|
||||
F: drivers/usb/host/ehci*
|
||||
|
||||
USB ET61X[12]51 DRIVER
|
||||
M: Luca Risolia <luca.risolia@studio.unibo.it>
|
||||
L: linux-usb@vger.kernel.org
|
||||
L: linux-media@vger.kernel.org
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media.git
|
||||
W: http://www.linux-projects.org
|
||||
S: Maintained
|
||||
F: drivers/media/video/et61x251/
|
||||
|
||||
USB GADGET/PERIPHERAL SUBSYSTEM
|
||||
M: Felipe Balbi <balbi@ti.com>
|
||||
L: linux-usb@vger.kernel.org
|
||||
|
@ -7371,7 +7681,7 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media.git
|
|||
W: http://www.linux-projects.org
|
||||
S: Maintained
|
||||
F: Documentation/video4linux/sn9c102.txt
|
||||
F: drivers/media/video/sn9c102/
|
||||
F: drivers/media/usb/sn9c102/
|
||||
|
||||
USB SUBSYSTEM
|
||||
M: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
@ -7406,17 +7716,7 @@ L: linux-media@vger.kernel.org
|
|||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media.git
|
||||
W: http://www.ideasonboard.org/uvc/
|
||||
S: Maintained
|
||||
F: drivers/media/video/uvc/
|
||||
|
||||
USB W996[87]CF DRIVER
|
||||
M: Luca Risolia <luca.risolia@studio.unibo.it>
|
||||
L: linux-usb@vger.kernel.org
|
||||
L: linux-media@vger.kernel.org
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media.git
|
||||
W: http://www.linux-projects.org
|
||||
S: Maintained
|
||||
F: Documentation/video4linux/w9968cf.txt
|
||||
F: drivers/media/video/w996*
|
||||
F: drivers/media/usb/uvc/
|
||||
|
||||
USB WIRELESS RNDIS DRIVER (rndis_wlan)
|
||||
M: Jussi Kivilinna <jussi.kivilinna@mbnet.fi>
|
||||
|
@ -7445,7 +7745,7 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media.git
|
|||
W: http://royale.zerezo.com/zr364xx/
|
||||
S: Maintained
|
||||
F: Documentation/video4linux/zr364xx.txt
|
||||
F: drivers/media/video/zr364xx.c
|
||||
F: drivers/media/usb/zr364xx/
|
||||
|
||||
USER-MODE LINUX (UML)
|
||||
M: Jeff Dike <jdike@addtoit.com>
|
||||
|
@ -7503,7 +7803,7 @@ M: Marek Szyprowski <m.szyprowski@samsung.com>
|
|||
M: Kyungmin Park <kyungmin.park@samsung.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/media/video/videobuf2-*
|
||||
F: drivers/media/v4l2-core/videobuf2-*
|
||||
F: include/media/videobuf2-*
|
||||
|
||||
VIRTIO CONSOLE DRIVER
|
||||
|
@ -7912,7 +8212,7 @@ L: linux-media@vger.kernel.org
|
|||
W: http://mjpeg.sourceforge.net/driver-zoran/
|
||||
T: Mercurial http://linuxtv.org/hg/v4l-dvb
|
||||
S: Odd Fixes
|
||||
F: drivers/media/video/zoran/
|
||||
F: drivers/media/pci/zoran/
|
||||
|
||||
ZS DECSTATION Z85C30 SERIAL DRIVER
|
||||
M: "Maciej W. Rozycki" <macro@linux-mips.org>
|
||||
|
|
|
@ -239,8 +239,8 @@ int __init mx27_clocks_init(unsigned long fref)
|
|||
clk_register_clkdev(clk[ssi1_ipg_gate], NULL, "imx-ssi.0");
|
||||
clk_register_clkdev(clk[ssi2_ipg_gate], NULL, "imx-ssi.1");
|
||||
clk_register_clkdev(clk[nfc_baud_gate], NULL, "mxc_nand.0");
|
||||
clk_register_clkdev(clk[vpu_baud_gate], "per", "imx-vpu");
|
||||
clk_register_clkdev(clk[vpu_ahb_gate], "ahb", "imx-vpu");
|
||||
clk_register_clkdev(clk[vpu_baud_gate], "per", "coda-imx27.0");
|
||||
clk_register_clkdev(clk[vpu_ahb_gate], "ahb", "coda-imx27.0");
|
||||
clk_register_clkdev(clk[dma_ahb_gate], "ahb", "imx-dma");
|
||||
clk_register_clkdev(clk[dma_ipg_gate], "ipg", "imx-dma");
|
||||
clk_register_clkdev(clk[fec_ipg_gate], "ipg", "imx27-fec.0");
|
||||
|
|
|
@ -17,6 +17,10 @@ extern const struct imx_fsl_usb2_udc_data imx27_fsl_usb2_udc_data;
|
|||
#define imx27_add_fsl_usb2_udc(pdata) \
|
||||
imx_add_fsl_usb2_udc(&imx27_fsl_usb2_udc_data, pdata)
|
||||
|
||||
extern const struct imx_imx27_coda_data imx27_coda_data;
|
||||
#define imx27_add_coda() \
|
||||
imx_add_imx27_coda(&imx27_coda_data)
|
||||
|
||||
extern const struct imx_imx2_wdt_data imx27_imx2_wdt_data;
|
||||
#define imx27_add_imx2_wdt() \
|
||||
imx_add_imx2_wdt(&imx27_imx2_wdt_data)
|
||||
|
|
|
@ -32,13 +32,13 @@
|
|||
#include <linux/delay.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/leds.h>
|
||||
#include <linux/memblock.h>
|
||||
#include <media/soc_camera.h>
|
||||
#include <sound/tlv320aic32x4.h>
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/time.h>
|
||||
#include <asm/system_info.h>
|
||||
#include <asm/memblock.h>
|
||||
#include <mach/common.h>
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/iomux-mx27.h>
|
||||
|
@ -233,10 +233,8 @@ static void __init visstrim_camera_init(void)
|
|||
static void __init visstrim_reserve(void)
|
||||
{
|
||||
/* reserve 4 MiB for mx2-camera */
|
||||
mx2_camera_base = memblock_alloc(MX2_CAMERA_BUF_SIZE,
|
||||
mx2_camera_base = arm_memblock_steal(3 * MX2_CAMERA_BUF_SIZE,
|
||||
MX2_CAMERA_BUF_SIZE);
|
||||
memblock_free(mx2_camera_base, MX2_CAMERA_BUF_SIZE);
|
||||
memblock_remove(mx2_camera_base, MX2_CAMERA_BUF_SIZE);
|
||||
}
|
||||
|
||||
/* GPIOs used as events for applications */
|
||||
|
@ -405,6 +403,47 @@ static const struct imx_ssi_platform_data visstrim_m10_ssi_pdata __initconst = {
|
|||
.flags = IMX_SSI_DMA | IMX_SSI_SYN,
|
||||
};
|
||||
|
||||
/* coda */
|
||||
|
||||
static void __init visstrim_coda_init(void)
|
||||
{
|
||||
struct platform_device *pdev;
|
||||
int dma;
|
||||
|
||||
pdev = imx27_add_coda();
|
||||
dma = dma_declare_coherent_memory(&pdev->dev,
|
||||
mx2_camera_base + MX2_CAMERA_BUF_SIZE,
|
||||
mx2_camera_base + MX2_CAMERA_BUF_SIZE,
|
||||
MX2_CAMERA_BUF_SIZE,
|
||||
DMA_MEMORY_MAP | DMA_MEMORY_EXCLUSIVE);
|
||||
if (!(dma & DMA_MEMORY_MAP))
|
||||
return;
|
||||
}
|
||||
|
||||
/* DMA deinterlace */
|
||||
static struct platform_device visstrim_deinterlace = {
|
||||
.name = "m2m-deinterlace",
|
||||
.id = 0,
|
||||
};
|
||||
|
||||
static void __init visstrim_deinterlace_init(void)
|
||||
{
|
||||
int ret = -ENOMEM;
|
||||
struct platform_device *pdev = &visstrim_deinterlace;
|
||||
int dma;
|
||||
|
||||
ret = platform_device_register(pdev);
|
||||
|
||||
dma = dma_declare_coherent_memory(&pdev->dev,
|
||||
mx2_camera_base + 2 * MX2_CAMERA_BUF_SIZE,
|
||||
mx2_camera_base + 2 * MX2_CAMERA_BUF_SIZE,
|
||||
MX2_CAMERA_BUF_SIZE,
|
||||
DMA_MEMORY_MAP | DMA_MEMORY_EXCLUSIVE);
|
||||
if (!(dma & DMA_MEMORY_MAP))
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
static void __init visstrim_m10_revision(void)
|
||||
{
|
||||
int exp_version = 0;
|
||||
|
@ -467,7 +506,9 @@ static void __init visstrim_m10_board_init(void)
|
|||
platform_device_register_resndata(NULL, "soc-camera-pdrv", 0, NULL, 0,
|
||||
&iclink_tvp5150, sizeof(iclink_tvp5150));
|
||||
gpio_led_register_device(0, &visstrim_m10_led_data);
|
||||
visstrim_deinterlace_init();
|
||||
visstrim_camera_init();
|
||||
visstrim_coda_init();
|
||||
}
|
||||
|
||||
static void __init visstrim_m10_timer_init(void)
|
||||
|
|
|
@ -33,6 +33,7 @@
|
|||
#include "common.h"
|
||||
#include <plat/dma.h>
|
||||
#include <plat/gpmc.h>
|
||||
#include <plat/omap-pm.h>
|
||||
#include "gpmc-smc91x.h"
|
||||
|
||||
#include "board-rx51.h"
|
||||
|
@ -46,6 +47,10 @@
|
|||
#include <../drivers/staging/iio/light/tsl2563.h>
|
||||
#include <linux/lis3lv02d.h>
|
||||
|
||||
#if defined(CONFIG_IR_RX51) || defined(CONFIG_IR_RX51_MODULE)
|
||||
#include <media/ir-rx51.h>
|
||||
#endif
|
||||
|
||||
#include "mux.h"
|
||||
#include "hsmmc.h"
|
||||
#include "common-board-devices.h"
|
||||
|
@ -1217,6 +1222,30 @@ static void __init rx51_init_tsc2005(void)
|
|||
gpio_to_irq(RX51_TSC2005_IRQ_GPIO);
|
||||
}
|
||||
|
||||
#if defined(CONFIG_IR_RX51) || defined(CONFIG_IR_RX51_MODULE)
|
||||
static struct lirc_rx51_platform_data rx51_lirc_data = {
|
||||
.set_max_mpu_wakeup_lat = omap_pm_set_max_mpu_wakeup_lat,
|
||||
.pwm_timer = 9, /* Use GPT 9 for CIR */
|
||||
};
|
||||
|
||||
static struct platform_device rx51_lirc_device = {
|
||||
.name = "lirc_rx51",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &rx51_lirc_data,
|
||||
},
|
||||
};
|
||||
|
||||
static void __init rx51_init_lirc(void)
|
||||
{
|
||||
platform_device_register(&rx51_lirc_device);
|
||||
}
|
||||
#else
|
||||
static void __init rx51_init_lirc(void)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
void __init rx51_peripherals_init(void)
|
||||
{
|
||||
rx51_i2c_init();
|
||||
|
@ -1227,6 +1256,7 @@ void __init rx51_peripherals_init(void)
|
|||
rx51_init_wl1251();
|
||||
rx51_init_tsc2005();
|
||||
rx51_init_si4713();
|
||||
rx51_init_lirc();
|
||||
spi_register_board_info(rx51_peripherals_spi_board_info,
|
||||
ARRAY_SIZE(rx51_peripherals_spi_board_info));
|
||||
|
||||
|
|
|
@ -15,7 +15,11 @@ config IMX_HAVE_PLATFORM_GPIO_KEYS
|
|||
|
||||
config IMX_HAVE_PLATFORM_IMX21_HCD
|
||||
bool
|
||||
|
||||
|
||||
config IMX_HAVE_PLATFORM_IMX27_CODA
|
||||
bool
|
||||
default y if SOC_IMX27
|
||||
|
||||
config IMX_HAVE_PLATFORM_IMX2_WDT
|
||||
bool
|
||||
|
||||
|
|
|
@ -4,6 +4,7 @@ obj-$(CONFIG_IMX_HAVE_PLATFORM_FSL_USB2_UDC) += platform-fsl-usb2-udc.o
|
|||
obj-$(CONFIG_IMX_HAVE_PLATFORM_GPIO_KEYS) += platform-gpio_keys.o
|
||||
obj-y += platform-gpio-mxc.o
|
||||
obj-$(CONFIG_IMX_HAVE_PLATFORM_IMX21_HCD) += platform-imx21-hcd.o
|
||||
obj-$(CONFIG_IMX_HAVE_PLATFORM_IMX27_CODA) += platform-imx27-coda.o
|
||||
obj-$(CONFIG_IMX_HAVE_PLATFORM_IMX2_WDT) += platform-imx2-wdt.o
|
||||
obj-$(CONFIG_IMX_HAVE_PLATFORM_IMXDI_RTC) += platform-imxdi_rtc.o
|
||||
obj-y += platform-imx-dma.o
|
||||
|
|
37
arch/arm/plat-mxc/devices/platform-imx27-coda.c
Normal file
37
arch/arm/plat-mxc/devices/platform-imx27-coda.c
Normal file
|
@ -0,0 +1,37 @@
|
|||
/*
|
||||
* Copyright (C) 2012 Vista Silicon
|
||||
* Javier Martin <javier.martin@vista-silicon.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU General Public License version 2 as published by the
|
||||
* Free Software Foundation.
|
||||
*/
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/devices-common.h>
|
||||
|
||||
#ifdef CONFIG_SOC_IMX27
|
||||
const struct imx_imx27_coda_data imx27_coda_data __initconst = {
|
||||
.iobase = MX27_VPU_BASE_ADDR,
|
||||
.iosize = SZ_512,
|
||||
.irq = MX27_INT_VPU,
|
||||
};
|
||||
#endif
|
||||
|
||||
struct platform_device *__init imx_add_imx27_coda(
|
||||
const struct imx_imx27_coda_data *data)
|
||||
{
|
||||
struct resource res[] = {
|
||||
{
|
||||
.start = data->iobase,
|
||||
.end = data->iobase + data->iosize - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
}, {
|
||||
.start = data->irq,
|
||||
.end = data->irq,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
return imx_add_platform_device_dmamask("coda-imx27", 0, res, 2, NULL,
|
||||
0, DMA_BIT_MASK(32));
|
||||
}
|
|
@ -83,6 +83,14 @@ struct platform_device *__init imx_add_imx21_hcd(
|
|||
const struct imx_imx21_hcd_data *data,
|
||||
const struct mx21_usbh_platform_data *pdata);
|
||||
|
||||
struct imx_imx27_coda_data {
|
||||
resource_size_t iobase;
|
||||
resource_size_t iosize;
|
||||
resource_size_t irq;
|
||||
};
|
||||
struct platform_device *__init imx_add_imx27_coda(
|
||||
const struct imx_imx27_coda_data *data);
|
||||
|
||||
struct imx_imx2_wdt_data {
|
||||
int id;
|
||||
resource_size_t iobase;
|
||||
|
|
|
@ -50,7 +50,7 @@
|
|||
#include <linux/slab.h>
|
||||
|
||||
/* Steal the hardware definitions from the bttv driver. */
|
||||
#include "../media/video/bt8xx/bt848.h"
|
||||
#include "../media/pci/bt8xx/bt848.h"
|
||||
|
||||
|
||||
#define BT8XXGPIO_NR_GPIOS 24 /* We have 24 GPIO pins */
|
||||
|
|
|
@ -99,11 +99,6 @@ config VIDEO_DEV
|
|||
depends on MEDIA_CAMERA_SUPPORT || MEDIA_ANALOG_TV_SUPPORT || MEDIA_RADIO_SUPPORT
|
||||
default y
|
||||
|
||||
config VIDEO_V4L2_COMMON
|
||||
tristate
|
||||
depends on (I2C || I2C=n) && VIDEO_DEV
|
||||
default (I2C || I2C=n) && VIDEO_DEV
|
||||
|
||||
config VIDEO_V4L2_SUBDEV_API
|
||||
bool "V4L2 sub-device userspace API (EXPERIMENTAL)"
|
||||
depends on VIDEO_DEV && MEDIA_CONTROLLER && EXPERIMENTAL
|
||||
|
@ -113,6 +108,8 @@ config VIDEO_V4L2_SUBDEV_API
|
|||
|
||||
This API is mostly used by camera interfaces in embedded platforms.
|
||||
|
||||
source "drivers/media/v4l2-core/Kconfig"
|
||||
|
||||
#
|
||||
# DVB Core
|
||||
# Only enables if one of DTV is selected
|
||||
|
@ -138,28 +135,54 @@ config DVB_NET
|
|||
You may want to disable the network support on embedded devices. If
|
||||
unsure say Y.
|
||||
|
||||
source "drivers/media/dvb-core/Kconfig"
|
||||
|
||||
comment "Media drivers"
|
||||
source "drivers/media/common/Kconfig"
|
||||
source "drivers/media/rc/Kconfig"
|
||||
|
||||
#
|
||||
# Tuner drivers for DVB and V4L
|
||||
# V4L platform/mem2mem drivers
|
||||
#
|
||||
|
||||
source "drivers/media/common/tuners/Kconfig"
|
||||
|
||||
#
|
||||
# Video/Radio/Hybrid adapters
|
||||
#
|
||||
|
||||
source "drivers/media/video/Kconfig"
|
||||
|
||||
source "drivers/media/usb/Kconfig"
|
||||
source "drivers/media/pci/Kconfig"
|
||||
source "drivers/media/platform/Kconfig"
|
||||
source "drivers/media/mmc/Kconfig"
|
||||
source "drivers/media/parport/Kconfig"
|
||||
source "drivers/media/radio/Kconfig"
|
||||
|
||||
comment "Supported FireWire (IEEE 1394) Adapters"
|
||||
depends on DVB_CORE && FIREWIRE
|
||||
source "drivers/media/firewire/Kconfig"
|
||||
|
||||
# Common driver options
|
||||
source "drivers/media/common/Kconfig"
|
||||
|
||||
#
|
||||
# DVB adapters
|
||||
# Ancillary drivers (tuners, i2c, frontends)
|
||||
#
|
||||
|
||||
source "drivers/media/dvb/Kconfig"
|
||||
config MEDIA_SUBDRV_AUTOSELECT
|
||||
bool "Autoselect analog and hybrid tuner modules to build"
|
||||
depends on MEDIA_TUNER
|
||||
default y
|
||||
help
|
||||
By default, a TV driver auto-selects all possible tuners
|
||||
thar could be used by the driver.
|
||||
|
||||
This is generally the right thing to do, except when there
|
||||
are strict constraints with regards to the kernel size.
|
||||
|
||||
Use this option with care, as deselecting tuner drivers which
|
||||
are in fact necessary will result in TV devices which cannot
|
||||
be tuned due to lack of the tuning driver.
|
||||
|
||||
If unsure say Y.
|
||||
|
||||
comment "Media ancillary drivers (tuners, sensors, i2c, frontends)"
|
||||
|
||||
source "drivers/media/i2c/Kconfig"
|
||||
source "drivers/media/tuners/Kconfig"
|
||||
source "drivers/media/dvb-frontends/Kconfig"
|
||||
|
||||
endif # MEDIA_SUPPORT
|
||||
|
|
|
@ -4,11 +4,30 @@
|
|||
|
||||
media-objs := media-device.o media-devnode.o media-entity.o
|
||||
|
||||
#
|
||||
# I2C drivers should come before other drivers, otherwise they'll fail
|
||||
# when compiled as builtin drivers
|
||||
#
|
||||
obj-y += i2c/ tuners/
|
||||
obj-$(CONFIG_DVB_CORE) += dvb-frontends/
|
||||
|
||||
#
|
||||
# Now, let's link-in the media core
|
||||
#
|
||||
ifeq ($(CONFIG_MEDIA_CONTROLLER),y)
|
||||
obj-$(CONFIG_MEDIA_SUPPORT) += media.o
|
||||
endif
|
||||
|
||||
obj-y += common/ rc/ video/
|
||||
obj-$(CONFIG_VIDEO_DEV) += v4l2-core/
|
||||
obj-$(CONFIG_DVB_CORE) += dvb-core/
|
||||
|
||||
# There are both core and drivers at RC subtree - merge before drivers
|
||||
obj-y += rc/
|
||||
|
||||
#
|
||||
# Finally, merge the drivers that require the core
|
||||
#
|
||||
|
||||
obj-y += common/ platform/ pci/ usb/ mmc/ firewire/ parport/
|
||||
obj-$(CONFIG_VIDEO_DEV) += radio/
|
||||
obj-$(CONFIG_DVB_CORE) += dvb/
|
||||
|
||||
|
|
|
@ -1,9 +1,3 @@
|
|||
config VIDEO_SAA7146
|
||||
tristate
|
||||
depends on I2C && PCI
|
||||
|
||||
config VIDEO_SAA7146_VV
|
||||
tristate
|
||||
depends on VIDEO_V4L2
|
||||
select VIDEOBUF_DMA_SG
|
||||
select VIDEO_SAA7146
|
||||
source "drivers/media/common/b2c2/Kconfig"
|
||||
source "drivers/media/common/saa7146/Kconfig"
|
||||
source "drivers/media/common/siano/Kconfig"
|
||||
|
|
|
@ -1,6 +1 @@
|
|||
saa7146-objs := saa7146_i2c.o saa7146_core.o
|
||||
saa7146_vv-objs := saa7146_fops.o saa7146_video.o saa7146_hlp.o saa7146_vbi.o
|
||||
|
||||
obj-y += tuners/
|
||||
obj-$(CONFIG_VIDEO_SAA7146) += saa7146.o
|
||||
obj-$(CONFIG_VIDEO_SAA7146_VV) += saa7146_vv.o
|
||||
obj-y += b2c2/ saa7146/ siano/
|
||||
|
|
28
drivers/media/common/b2c2/Kconfig
Normal file
28
drivers/media/common/b2c2/Kconfig
Normal file
|
@ -0,0 +1,28 @@
|
|||
config DVB_B2C2_FLEXCOP
|
||||
tristate
|
||||
depends on DVB_CORE && I2C
|
||||
depends on DVB_B2C2_FLEXCOP_PCI || DVB_B2C2_FLEXCOP_USB
|
||||
default y
|
||||
select DVB_PLL if MEDIA_SUBDRV_AUTOSELECT
|
||||
select DVB_STV0299 if MEDIA_SUBDRV_AUTOSELECT
|
||||
select DVB_MT352 if MEDIA_SUBDRV_AUTOSELECT
|
||||
select DVB_MT312 if MEDIA_SUBDRV_AUTOSELECT
|
||||
select DVB_NXT200X if MEDIA_SUBDRV_AUTOSELECT
|
||||
select DVB_STV0297 if MEDIA_SUBDRV_AUTOSELECT
|
||||
select DVB_BCM3510 if MEDIA_SUBDRV_AUTOSELECT
|
||||
select DVB_LGDT330X if MEDIA_SUBDRV_AUTOSELECT
|
||||
select DVB_S5H1420 if MEDIA_SUBDRV_AUTOSELECT
|
||||
select DVB_TUNER_ITD1000 if MEDIA_SUBDRV_AUTOSELECT
|
||||
select DVB_ISL6421 if MEDIA_SUBDRV_AUTOSELECT
|
||||
select DVB_CX24123 if MEDIA_SUBDRV_AUTOSELECT
|
||||
select MEDIA_TUNER_SIMPLE if MEDIA_SUBDRV_AUTOSELECT
|
||||
select DVB_TUNER_CX24113 if MEDIA_SUBDRV_AUTOSELECT
|
||||
help
|
||||
Support for the digital TV receiver chip made by B2C2 Inc. included in
|
||||
Technisats PCI cards and USB boxes.
|
||||
|
||||
Say Y if you own such a device and want to use it.
|
||||
|
||||
# Selected via the PCI or USB flexcop drivers
|
||||
config DVB_B2C2_FLEXCOP_DEBUG
|
||||
bool
|
8
drivers/media/common/b2c2/Makefile
Normal file
8
drivers/media/common/b2c2/Makefile
Normal file
|
@ -0,0 +1,8 @@
|
|||
b2c2-flexcop-objs += flexcop.o flexcop-fe-tuner.o flexcop-i2c.o
|
||||
b2c2-flexcop-objs += flexcop-sram.o flexcop-eeprom.o flexcop-misc.o
|
||||
b2c2-flexcop-objs += flexcop-hw-filter.o
|
||||
obj-$(CONFIG_DVB_B2C2_FLEXCOP) += b2c2-flexcop.o
|
||||
|
||||
ccflags-y += -Idrivers/media/dvb-core/
|
||||
ccflags-y += -Idrivers/media/dvb-frontends/
|
||||
ccflags-y += -Idrivers/media/tuners/
|
325
drivers/media/common/b2c2/flexcop.c
Normal file
325
drivers/media/common/b2c2/flexcop.c
Normal file
|
@ -0,0 +1,325 @@
|
|||
/*
|
||||
* Linux driver for digital TV devices equipped with B2C2 FlexcopII(b)/III
|
||||
* flexcop.c - main module part
|
||||
* Copyright (C) 2004-9 Patrick Boettcher <patrick.boettcher@desy.de>
|
||||
* based on skystar2-driver Copyright (C) 2003 Vadim Catana, skystar@moldova.cc
|
||||
*
|
||||
* Acknowledgements:
|
||||
* John Jurrius from BBTI, Inc. for extensive support
|
||||
* with code examples and data books
|
||||
* Bjarne Steinsbo, bjarne at steinsbo.com (some ideas for rewriting)
|
||||
*
|
||||
* Contributions to the skystar2-driver have been done by
|
||||
* Vincenzo Di Massa, hawk.it at tiscalinet.it (several DiSEqC fixes)
|
||||
* Roberto Ragusa, r.ragusa at libero.it (polishing, restyling the code)
|
||||
* Uwe Bugla, uwe.bugla at gmx.de (doing tests, restyling code, writing docu)
|
||||
* Niklas Peinecke, peinecke at gdv.uni-hannover.de (hardware pid/mac
|
||||
* filtering)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public License
|
||||
* as published by the Free Software Foundation; either version 2.1
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#include "flexcop.h"
|
||||
|
||||
#define DRIVER_NAME "B2C2 FlexcopII/II(b)/III digital TV receiver chip"
|
||||
#define DRIVER_AUTHOR "Patrick Boettcher <patrick.boettcher@desy.de"
|
||||
|
||||
#ifdef CONFIG_DVB_B2C2_FLEXCOP_DEBUG
|
||||
#define DEBSTATUS ""
|
||||
#else
|
||||
#define DEBSTATUS " (debugging is not enabled)"
|
||||
#endif
|
||||
|
||||
int b2c2_flexcop_debug;
|
||||
EXPORT_SYMBOL_GPL(b2c2_flexcop_debug);
|
||||
module_param_named(debug, b2c2_flexcop_debug, int, 0644);
|
||||
MODULE_PARM_DESC(debug,
|
||||
"set debug level (1=info,2=tuner,4=i2c,8=ts,"
|
||||
"16=sram,32=reg (|-able))."
|
||||
DEBSTATUS);
|
||||
#undef DEBSTATUS
|
||||
|
||||
DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
|
||||
|
||||
/* global zero for ibi values */
|
||||
flexcop_ibi_value ibi_zero;
|
||||
|
||||
static int flexcop_dvb_start_feed(struct dvb_demux_feed *dvbdmxfeed)
|
||||
{
|
||||
struct flexcop_device *fc = dvbdmxfeed->demux->priv;
|
||||
return flexcop_pid_feed_control(fc, dvbdmxfeed, 1);
|
||||
}
|
||||
|
||||
static int flexcop_dvb_stop_feed(struct dvb_demux_feed *dvbdmxfeed)
|
||||
{
|
||||
struct flexcop_device *fc = dvbdmxfeed->demux->priv;
|
||||
return flexcop_pid_feed_control(fc, dvbdmxfeed, 0);
|
||||
}
|
||||
|
||||
static int flexcop_dvb_init(struct flexcop_device *fc)
|
||||
{
|
||||
int ret = dvb_register_adapter(&fc->dvb_adapter,
|
||||
"FlexCop Digital TV device", fc->owner,
|
||||
fc->dev, adapter_nr);
|
||||
if (ret < 0) {
|
||||
err("error registering DVB adapter");
|
||||
return ret;
|
||||
}
|
||||
fc->dvb_adapter.priv = fc;
|
||||
|
||||
fc->demux.dmx.capabilities = (DMX_TS_FILTERING | DMX_SECTION_FILTERING
|
||||
| DMX_MEMORY_BASED_FILTERING);
|
||||
fc->demux.priv = fc;
|
||||
fc->demux.filternum = fc->demux.feednum = FC_MAX_FEED;
|
||||
fc->demux.start_feed = flexcop_dvb_start_feed;
|
||||
fc->demux.stop_feed = flexcop_dvb_stop_feed;
|
||||
fc->demux.write_to_decoder = NULL;
|
||||
|
||||
ret = dvb_dmx_init(&fc->demux);
|
||||
if (ret < 0) {
|
||||
err("dvb_dmx failed: error %d", ret);
|
||||
goto err_dmx;
|
||||
}
|
||||
|
||||
fc->hw_frontend.source = DMX_FRONTEND_0;
|
||||
|
||||
fc->dmxdev.filternum = fc->demux.feednum;
|
||||
fc->dmxdev.demux = &fc->demux.dmx;
|
||||
fc->dmxdev.capabilities = 0;
|
||||
ret = dvb_dmxdev_init(&fc->dmxdev, &fc->dvb_adapter);
|
||||
if (ret < 0) {
|
||||
err("dvb_dmxdev_init failed: error %d", ret);
|
||||
goto err_dmx_dev;
|
||||
}
|
||||
|
||||
ret = fc->demux.dmx.add_frontend(&fc->demux.dmx, &fc->hw_frontend);
|
||||
if (ret < 0) {
|
||||
err("adding hw_frontend to dmx failed: error %d", ret);
|
||||
goto err_dmx_add_hw_frontend;
|
||||
}
|
||||
|
||||
fc->mem_frontend.source = DMX_MEMORY_FE;
|
||||
ret = fc->demux.dmx.add_frontend(&fc->demux.dmx, &fc->mem_frontend);
|
||||
if (ret < 0) {
|
||||
err("adding mem_frontend to dmx failed: error %d", ret);
|
||||
goto err_dmx_add_mem_frontend;
|
||||
}
|
||||
|
||||
ret = fc->demux.dmx.connect_frontend(&fc->demux.dmx, &fc->hw_frontend);
|
||||
if (ret < 0) {
|
||||
err("connect frontend failed: error %d", ret);
|
||||
goto err_connect_frontend;
|
||||
}
|
||||
|
||||
ret = dvb_net_init(&fc->dvb_adapter, &fc->dvbnet, &fc->demux.dmx);
|
||||
if (ret < 0) {
|
||||
err("dvb_net_init failed: error %d", ret);
|
||||
goto err_net;
|
||||
}
|
||||
|
||||
fc->init_state |= FC_STATE_DVB_INIT;
|
||||
return 0;
|
||||
|
||||
err_net:
|
||||
fc->demux.dmx.disconnect_frontend(&fc->demux.dmx);
|
||||
err_connect_frontend:
|
||||
fc->demux.dmx.remove_frontend(&fc->demux.dmx, &fc->mem_frontend);
|
||||
err_dmx_add_mem_frontend:
|
||||
fc->demux.dmx.remove_frontend(&fc->demux.dmx, &fc->hw_frontend);
|
||||
err_dmx_add_hw_frontend:
|
||||
dvb_dmxdev_release(&fc->dmxdev);
|
||||
err_dmx_dev:
|
||||
dvb_dmx_release(&fc->demux);
|
||||
err_dmx:
|
||||
dvb_unregister_adapter(&fc->dvb_adapter);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void flexcop_dvb_exit(struct flexcop_device *fc)
|
||||
{
|
||||
if (fc->init_state & FC_STATE_DVB_INIT) {
|
||||
dvb_net_release(&fc->dvbnet);
|
||||
|
||||
fc->demux.dmx.close(&fc->demux.dmx);
|
||||
fc->demux.dmx.remove_frontend(&fc->demux.dmx,
|
||||
&fc->mem_frontend);
|
||||
fc->demux.dmx.remove_frontend(&fc->demux.dmx,
|
||||
&fc->hw_frontend);
|
||||
dvb_dmxdev_release(&fc->dmxdev);
|
||||
dvb_dmx_release(&fc->demux);
|
||||
dvb_unregister_adapter(&fc->dvb_adapter);
|
||||
deb_info("deinitialized dvb stuff\n");
|
||||
}
|
||||
fc->init_state &= ~FC_STATE_DVB_INIT;
|
||||
}
|
||||
|
||||
/* these methods are necessary to achieve the long-term-goal of hiding the
|
||||
* struct flexcop_device from the bus-parts */
|
||||
void flexcop_pass_dmx_data(struct flexcop_device *fc, u8 *buf, u32 len)
|
||||
{
|
||||
dvb_dmx_swfilter(&fc->demux, buf, len);
|
||||
}
|
||||
EXPORT_SYMBOL(flexcop_pass_dmx_data);
|
||||
|
||||
void flexcop_pass_dmx_packets(struct flexcop_device *fc, u8 *buf, u32 no)
|
||||
{
|
||||
dvb_dmx_swfilter_packets(&fc->demux, buf, no);
|
||||
}
|
||||
EXPORT_SYMBOL(flexcop_pass_dmx_packets);
|
||||
|
||||
static void flexcop_reset(struct flexcop_device *fc)
|
||||
{
|
||||
flexcop_ibi_value v210, v204;
|
||||
|
||||
/* reset the flexcop itself */
|
||||
fc->write_ibi_reg(fc,ctrl_208,ibi_zero);
|
||||
|
||||
v210.raw = 0;
|
||||
v210.sw_reset_210.reset_block_000 = 1;
|
||||
v210.sw_reset_210.reset_block_100 = 1;
|
||||
v210.sw_reset_210.reset_block_200 = 1;
|
||||
v210.sw_reset_210.reset_block_300 = 1;
|
||||
v210.sw_reset_210.reset_block_400 = 1;
|
||||
v210.sw_reset_210.reset_block_500 = 1;
|
||||
v210.sw_reset_210.reset_block_600 = 1;
|
||||
v210.sw_reset_210.reset_block_700 = 1;
|
||||
v210.sw_reset_210.Block_reset_enable = 0xb2;
|
||||
v210.sw_reset_210.Special_controls = 0xc259;
|
||||
fc->write_ibi_reg(fc,sw_reset_210,v210);
|
||||
msleep(1);
|
||||
|
||||
/* reset the periphical devices */
|
||||
|
||||
v204 = fc->read_ibi_reg(fc,misc_204);
|
||||
v204.misc_204.Per_reset_sig = 0;
|
||||
fc->write_ibi_reg(fc,misc_204,v204);
|
||||
msleep(1);
|
||||
v204.misc_204.Per_reset_sig = 1;
|
||||
fc->write_ibi_reg(fc,misc_204,v204);
|
||||
}
|
||||
|
||||
void flexcop_reset_block_300(struct flexcop_device *fc)
|
||||
{
|
||||
flexcop_ibi_value v208_save = fc->read_ibi_reg(fc, ctrl_208),
|
||||
v210 = fc->read_ibi_reg(fc, sw_reset_210);
|
||||
|
||||
deb_rdump("208: %08x, 210: %08x\n", v208_save.raw, v210.raw);
|
||||
fc->write_ibi_reg(fc,ctrl_208,ibi_zero);
|
||||
|
||||
v210.sw_reset_210.reset_block_300 = 1;
|
||||
v210.sw_reset_210.Block_reset_enable = 0xb2;
|
||||
|
||||
fc->write_ibi_reg(fc,sw_reset_210,v210);
|
||||
fc->write_ibi_reg(fc,ctrl_208,v208_save);
|
||||
}
|
||||
|
||||
struct flexcop_device *flexcop_device_kmalloc(size_t bus_specific_len)
|
||||
{
|
||||
void *bus;
|
||||
struct flexcop_device *fc = kzalloc(sizeof(struct flexcop_device),
|
||||
GFP_KERNEL);
|
||||
if (!fc) {
|
||||
err("no memory");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
bus = kzalloc(bus_specific_len, GFP_KERNEL);
|
||||
if (!bus) {
|
||||
err("no memory");
|
||||
kfree(fc);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
fc->bus_specific = bus;
|
||||
|
||||
return fc;
|
||||
}
|
||||
EXPORT_SYMBOL(flexcop_device_kmalloc);
|
||||
|
||||
void flexcop_device_kfree(struct flexcop_device *fc)
|
||||
{
|
||||
kfree(fc->bus_specific);
|
||||
kfree(fc);
|
||||
}
|
||||
EXPORT_SYMBOL(flexcop_device_kfree);
|
||||
|
||||
int flexcop_device_initialize(struct flexcop_device *fc)
|
||||
{
|
||||
int ret;
|
||||
ibi_zero.raw = 0;
|
||||
|
||||
flexcop_reset(fc);
|
||||
flexcop_determine_revision(fc);
|
||||
flexcop_sram_init(fc);
|
||||
flexcop_hw_filter_init(fc);
|
||||
flexcop_smc_ctrl(fc, 0);
|
||||
|
||||
ret = flexcop_dvb_init(fc);
|
||||
if (ret)
|
||||
goto error;
|
||||
|
||||
/* i2c has to be done before doing EEProm stuff -
|
||||
* because the EEProm is accessed via i2c */
|
||||
ret = flexcop_i2c_init(fc);
|
||||
if (ret)
|
||||
goto error;
|
||||
|
||||
/* do the MAC address reading after initializing the dvb_adapter */
|
||||
if (fc->get_mac_addr(fc, 0) == 0) {
|
||||
u8 *b = fc->dvb_adapter.proposed_mac;
|
||||
info("MAC address = %pM", b);
|
||||
flexcop_set_mac_filter(fc,b);
|
||||
flexcop_mac_filter_ctrl(fc,1);
|
||||
} else
|
||||
warn("reading of MAC address failed.\n");
|
||||
|
||||
ret = flexcop_frontend_init(fc);
|
||||
if (ret)
|
||||
goto error;
|
||||
|
||||
flexcop_device_name(fc,"initialization of","complete");
|
||||
return 0;
|
||||
|
||||
error:
|
||||
flexcop_device_exit(fc);
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(flexcop_device_initialize);
|
||||
|
||||
void flexcop_device_exit(struct flexcop_device *fc)
|
||||
{
|
||||
flexcop_frontend_exit(fc);
|
||||
flexcop_i2c_exit(fc);
|
||||
flexcop_dvb_exit(fc);
|
||||
}
|
||||
EXPORT_SYMBOL(flexcop_device_exit);
|
||||
|
||||
static int flexcop_module_init(void)
|
||||
{
|
||||
info(DRIVER_NAME " loaded successfully");
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void flexcop_module_cleanup(void)
|
||||
{
|
||||
info(DRIVER_NAME " unloaded successfully");
|
||||
}
|
||||
|
||||
module_init(flexcop_module_init);
|
||||
module_exit(flexcop_module_cleanup);
|
||||
|
||||
MODULE_AUTHOR(DRIVER_AUTHOR);
|
||||
MODULE_DESCRIPTION(DRIVER_NAME);
|
||||
MODULE_LICENSE("GPL");
|
9
drivers/media/common/saa7146/Kconfig
Normal file
9
drivers/media/common/saa7146/Kconfig
Normal file
|
@ -0,0 +1,9 @@
|
|||
config VIDEO_SAA7146
|
||||
tristate
|
||||
depends on I2C && PCI
|
||||
|
||||
config VIDEO_SAA7146_VV
|
||||
tristate
|
||||
depends on VIDEO_V4L2
|
||||
select VIDEOBUF_DMA_SG
|
||||
select VIDEO_SAA7146
|
5
drivers/media/common/saa7146/Makefile
Normal file
5
drivers/media/common/saa7146/Makefile
Normal file
|
@ -0,0 +1,5 @@
|
|||
saa7146-objs := saa7146_i2c.o saa7146_core.o
|
||||
saa7146_vv-objs := saa7146_fops.o saa7146_video.o saa7146_hlp.o saa7146_vbi.o
|
||||
|
||||
obj-$(CONFIG_VIDEO_SAA7146) += saa7146.o
|
||||
obj-$(CONFIG_VIDEO_SAA7146_VV) += saa7146_vv.o
|
592
drivers/media/common/saa7146/saa7146_core.c
Normal file
592
drivers/media/common/saa7146/saa7146_core.c
Normal file
|
@ -0,0 +1,592 @@
|
|||
/*
|
||||
saa7146.o - driver for generic saa7146-based hardware
|
||||
|
||||
Copyright (C) 1998-2003 Michael Hunold <michael@mihu.de>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||
|
||||
#include <media/saa7146.h>
|
||||
#include <linux/module.h>
|
||||
|
||||
static int saa7146_num;
|
||||
|
||||
unsigned int saa7146_debug;
|
||||
|
||||
module_param(saa7146_debug, uint, 0644);
|
||||
MODULE_PARM_DESC(saa7146_debug, "debug level (default: 0)");
|
||||
|
||||
#if 0
|
||||
static void dump_registers(struct saa7146_dev* dev)
|
||||
{
|
||||
int i = 0;
|
||||
|
||||
pr_info(" @ %li jiffies:\n", jiffies);
|
||||
for (i = 0; i <= 0x148; i += 4)
|
||||
pr_info("0x%03x: 0x%08x\n", i, saa7146_read(dev, i));
|
||||
}
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* gpio and debi helper functions
|
||||
****************************************************************************/
|
||||
|
||||
void saa7146_setgpio(struct saa7146_dev *dev, int port, u32 data)
|
||||
{
|
||||
u32 value = 0;
|
||||
|
||||
BUG_ON(port > 3);
|
||||
|
||||
value = saa7146_read(dev, GPIO_CTRL);
|
||||
value &= ~(0xff << (8*port));
|
||||
value |= (data << (8*port));
|
||||
saa7146_write(dev, GPIO_CTRL, value);
|
||||
}
|
||||
|
||||
/* This DEBI code is based on the saa7146 Stradis driver by Nathan Laredo */
|
||||
static inline int saa7146_wait_for_debi_done_sleep(struct saa7146_dev *dev,
|
||||
unsigned long us1, unsigned long us2)
|
||||
{
|
||||
unsigned long timeout;
|
||||
int err;
|
||||
|
||||
/* wait for registers to be programmed */
|
||||
timeout = jiffies + usecs_to_jiffies(us1);
|
||||
while (1) {
|
||||
err = time_after(jiffies, timeout);
|
||||
if (saa7146_read(dev, MC2) & 2)
|
||||
break;
|
||||
if (err) {
|
||||
pr_err("%s: %s timed out while waiting for registers getting programmed\n",
|
||||
dev->name, __func__);
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
msleep(1);
|
||||
}
|
||||
|
||||
/* wait for transfer to complete */
|
||||
timeout = jiffies + usecs_to_jiffies(us2);
|
||||
while (1) {
|
||||
err = time_after(jiffies, timeout);
|
||||
if (!(saa7146_read(dev, PSR) & SPCI_DEBI_S))
|
||||
break;
|
||||
saa7146_read(dev, MC2);
|
||||
if (err) {
|
||||
DEB_S("%s: %s timed out while waiting for transfer completion\n",
|
||||
dev->name, __func__);
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
msleep(1);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int saa7146_wait_for_debi_done_busyloop(struct saa7146_dev *dev,
|
||||
unsigned long us1, unsigned long us2)
|
||||
{
|
||||
unsigned long loops;
|
||||
|
||||
/* wait for registers to be programmed */
|
||||
loops = us1;
|
||||
while (1) {
|
||||
if (saa7146_read(dev, MC2) & 2)
|
||||
break;
|
||||
if (!loops--) {
|
||||
pr_err("%s: %s timed out while waiting for registers getting programmed\n",
|
||||
dev->name, __func__);
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
udelay(1);
|
||||
}
|
||||
|
||||
/* wait for transfer to complete */
|
||||
loops = us2 / 5;
|
||||
while (1) {
|
||||
if (!(saa7146_read(dev, PSR) & SPCI_DEBI_S))
|
||||
break;
|
||||
saa7146_read(dev, MC2);
|
||||
if (!loops--) {
|
||||
DEB_S("%s: %s timed out while waiting for transfer completion\n",
|
||||
dev->name, __func__);
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
udelay(5);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int saa7146_wait_for_debi_done(struct saa7146_dev *dev, int nobusyloop)
|
||||
{
|
||||
if (nobusyloop)
|
||||
return saa7146_wait_for_debi_done_sleep(dev, 50000, 250000);
|
||||
else
|
||||
return saa7146_wait_for_debi_done_busyloop(dev, 50000, 250000);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* general helper functions
|
||||
****************************************************************************/
|
||||
|
||||
/* this is videobuf_vmalloc_to_sg() from videobuf-dma-sg.c
|
||||
make sure virt has been allocated with vmalloc_32(), otherwise the BUG()
|
||||
may be triggered on highmem machines */
|
||||
static struct scatterlist* vmalloc_to_sg(unsigned char *virt, int nr_pages)
|
||||
{
|
||||
struct scatterlist *sglist;
|
||||
struct page *pg;
|
||||
int i;
|
||||
|
||||
sglist = kcalloc(nr_pages, sizeof(struct scatterlist), GFP_KERNEL);
|
||||
if (NULL == sglist)
|
||||
return NULL;
|
||||
sg_init_table(sglist, nr_pages);
|
||||
for (i = 0; i < nr_pages; i++, virt += PAGE_SIZE) {
|
||||
pg = vmalloc_to_page(virt);
|
||||
if (NULL == pg)
|
||||
goto err;
|
||||
BUG_ON(PageHighMem(pg));
|
||||
sg_set_page(&sglist[i], pg, PAGE_SIZE, 0);
|
||||
}
|
||||
return sglist;
|
||||
|
||||
err:
|
||||
kfree(sglist);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/********************************************************************************/
|
||||
/* common page table functions */
|
||||
|
||||
void *saa7146_vmalloc_build_pgtable(struct pci_dev *pci, long length, struct saa7146_pgtable *pt)
|
||||
{
|
||||
int pages = (length+PAGE_SIZE-1)/PAGE_SIZE;
|
||||
void *mem = vmalloc_32(length);
|
||||
int slen = 0;
|
||||
|
||||
if (NULL == mem)
|
||||
goto err_null;
|
||||
|
||||
if (!(pt->slist = vmalloc_to_sg(mem, pages)))
|
||||
goto err_free_mem;
|
||||
|
||||
if (saa7146_pgtable_alloc(pci, pt))
|
||||
goto err_free_slist;
|
||||
|
||||
pt->nents = pages;
|
||||
slen = pci_map_sg(pci,pt->slist,pt->nents,PCI_DMA_FROMDEVICE);
|
||||
if (0 == slen)
|
||||
goto err_free_pgtable;
|
||||
|
||||
if (0 != saa7146_pgtable_build_single(pci, pt, pt->slist, slen))
|
||||
goto err_unmap_sg;
|
||||
|
||||
return mem;
|
||||
|
||||
err_unmap_sg:
|
||||
pci_unmap_sg(pci, pt->slist, pt->nents, PCI_DMA_FROMDEVICE);
|
||||
err_free_pgtable:
|
||||
saa7146_pgtable_free(pci, pt);
|
||||
err_free_slist:
|
||||
kfree(pt->slist);
|
||||
pt->slist = NULL;
|
||||
err_free_mem:
|
||||
vfree(mem);
|
||||
err_null:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void saa7146_vfree_destroy_pgtable(struct pci_dev *pci, void *mem, struct saa7146_pgtable *pt)
|
||||
{
|
||||
pci_unmap_sg(pci, pt->slist, pt->nents, PCI_DMA_FROMDEVICE);
|
||||
saa7146_pgtable_free(pci, pt);
|
||||
kfree(pt->slist);
|
||||
pt->slist = NULL;
|
||||
vfree(mem);
|
||||
}
|
||||
|
||||
void saa7146_pgtable_free(struct pci_dev *pci, struct saa7146_pgtable *pt)
|
||||
{
|
||||
if (NULL == pt->cpu)
|
||||
return;
|
||||
pci_free_consistent(pci, pt->size, pt->cpu, pt->dma);
|
||||
pt->cpu = NULL;
|
||||
}
|
||||
|
||||
int saa7146_pgtable_alloc(struct pci_dev *pci, struct saa7146_pgtable *pt)
|
||||
{
|
||||
__le32 *cpu;
|
||||
dma_addr_t dma_addr = 0;
|
||||
|
||||
cpu = pci_alloc_consistent(pci, PAGE_SIZE, &dma_addr);
|
||||
if (NULL == cpu) {
|
||||
return -ENOMEM;
|
||||
}
|
||||
pt->size = PAGE_SIZE;
|
||||
pt->cpu = cpu;
|
||||
pt->dma = dma_addr;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int saa7146_pgtable_build_single(struct pci_dev *pci, struct saa7146_pgtable *pt,
|
||||
struct scatterlist *list, int sglen )
|
||||
{
|
||||
__le32 *ptr, fill;
|
||||
int nr_pages = 0;
|
||||
int i,p;
|
||||
|
||||
BUG_ON(0 == sglen);
|
||||
BUG_ON(list->offset > PAGE_SIZE);
|
||||
|
||||
/* if we have a user buffer, the first page may not be
|
||||
aligned to a page boundary. */
|
||||
pt->offset = list->offset;
|
||||
|
||||
ptr = pt->cpu;
|
||||
for (i = 0; i < sglen; i++, list++) {
|
||||
/*
|
||||
pr_debug("i:%d, adr:0x%08x, len:%d, offset:%d\n",
|
||||
i, sg_dma_address(list), sg_dma_len(list),
|
||||
list->offset);
|
||||
*/
|
||||
for (p = 0; p * 4096 < list->length; p++, ptr++) {
|
||||
*ptr = cpu_to_le32(sg_dma_address(list) + p * 4096);
|
||||
nr_pages++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* safety; fill the page table up with the last valid page */
|
||||
fill = *(ptr-1);
|
||||
for(i=nr_pages;i<1024;i++) {
|
||||
*ptr++ = fill;
|
||||
}
|
||||
|
||||
/*
|
||||
ptr = pt->cpu;
|
||||
pr_debug("offset: %d\n", pt->offset);
|
||||
for(i=0;i<5;i++) {
|
||||
pr_debug("ptr1 %d: 0x%08x\n", i, ptr[i]);
|
||||
}
|
||||
*/
|
||||
return 0;
|
||||
}
|
||||
|
||||
/********************************************************************************/
|
||||
/* interrupt handler */
|
||||
static irqreturn_t interrupt_hw(int irq, void *dev_id)
|
||||
{
|
||||
struct saa7146_dev *dev = dev_id;
|
||||
u32 isr;
|
||||
u32 ack_isr;
|
||||
|
||||
/* read out the interrupt status register */
|
||||
ack_isr = isr = saa7146_read(dev, ISR);
|
||||
|
||||
/* is this our interrupt? */
|
||||
if ( 0 == isr ) {
|
||||
/* nope, some other device */
|
||||
return IRQ_NONE;
|
||||
}
|
||||
|
||||
if (dev->ext) {
|
||||
if (dev->ext->irq_mask & isr) {
|
||||
if (dev->ext->irq_func)
|
||||
dev->ext->irq_func(dev, &isr);
|
||||
isr &= ~dev->ext->irq_mask;
|
||||
}
|
||||
}
|
||||
if (0 != (isr & (MASK_27))) {
|
||||
DEB_INT("irq: RPS0 (0x%08x)\n", isr);
|
||||
if (dev->vv_data && dev->vv_callback)
|
||||
dev->vv_callback(dev,isr);
|
||||
isr &= ~MASK_27;
|
||||
}
|
||||
if (0 != (isr & (MASK_28))) {
|
||||
if (dev->vv_data && dev->vv_callback)
|
||||
dev->vv_callback(dev,isr);
|
||||
isr &= ~MASK_28;
|
||||
}
|
||||
if (0 != (isr & (MASK_16|MASK_17))) {
|
||||
SAA7146_IER_DISABLE(dev, MASK_16|MASK_17);
|
||||
/* only wake up if we expect something */
|
||||
if (0 != dev->i2c_op) {
|
||||
dev->i2c_op = 0;
|
||||
wake_up(&dev->i2c_wq);
|
||||
} else {
|
||||
u32 psr = saa7146_read(dev, PSR);
|
||||
u32 ssr = saa7146_read(dev, SSR);
|
||||
pr_warn("%s: unexpected i2c irq: isr %08x psr %08x ssr %08x\n",
|
||||
dev->name, isr, psr, ssr);
|
||||
}
|
||||
isr &= ~(MASK_16|MASK_17);
|
||||
}
|
||||
if( 0 != isr ) {
|
||||
ERR("warning: interrupt enabled, but not handled properly.(0x%08x)\n",
|
||||
isr);
|
||||
ERR("disabling interrupt source(s)!\n");
|
||||
SAA7146_IER_DISABLE(dev,isr);
|
||||
}
|
||||
saa7146_write(dev, ISR, ack_isr);
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
/*********************************************************************************/
|
||||
/* configuration-functions */
|
||||
|
||||
static int saa7146_init_one(struct pci_dev *pci, const struct pci_device_id *ent)
|
||||
{
|
||||
struct saa7146_pci_extension_data *pci_ext = (struct saa7146_pci_extension_data *)ent->driver_data;
|
||||
struct saa7146_extension *ext = pci_ext->ext;
|
||||
struct saa7146_dev *dev;
|
||||
int err = -ENOMEM;
|
||||
|
||||
/* clear out mem for sure */
|
||||
dev = kzalloc(sizeof(struct saa7146_dev), GFP_KERNEL);
|
||||
if (!dev) {
|
||||
ERR("out of memory\n");
|
||||
goto out;
|
||||
}
|
||||
|
||||
DEB_EE("pci:%p\n", pci);
|
||||
|
||||
err = pci_enable_device(pci);
|
||||
if (err < 0) {
|
||||
ERR("pci_enable_device() failed\n");
|
||||
goto err_free;
|
||||
}
|
||||
|
||||
/* enable bus-mastering */
|
||||
pci_set_master(pci);
|
||||
|
||||
dev->pci = pci;
|
||||
|
||||
/* get chip-revision; this is needed to enable bug-fixes */
|
||||
dev->revision = pci->revision;
|
||||
|
||||
/* remap the memory from virtual to physical address */
|
||||
|
||||
err = pci_request_region(pci, 0, "saa7146");
|
||||
if (err < 0)
|
||||
goto err_disable;
|
||||
|
||||
dev->mem = ioremap(pci_resource_start(pci, 0),
|
||||
pci_resource_len(pci, 0));
|
||||
if (!dev->mem) {
|
||||
ERR("ioremap() failed\n");
|
||||
err = -ENODEV;
|
||||
goto err_release;
|
||||
}
|
||||
|
||||
/* we don't do a master reset here anymore, it screws up
|
||||
some boards that don't have an i2c-eeprom for configuration
|
||||
values */
|
||||
/*
|
||||
saa7146_write(dev, MC1, MASK_31);
|
||||
*/
|
||||
|
||||
/* disable all irqs */
|
||||
saa7146_write(dev, IER, 0);
|
||||
|
||||
/* shut down all dma transfers and rps tasks */
|
||||
saa7146_write(dev, MC1, 0x30ff0000);
|
||||
|
||||
/* clear out any rps-signals pending */
|
||||
saa7146_write(dev, MC2, 0xf8000000);
|
||||
|
||||
/* request an interrupt for the saa7146 */
|
||||
err = request_irq(pci->irq, interrupt_hw, IRQF_SHARED | IRQF_DISABLED,
|
||||
dev->name, dev);
|
||||
if (err < 0) {
|
||||
ERR("request_irq() failed\n");
|
||||
goto err_unmap;
|
||||
}
|
||||
|
||||
err = -ENOMEM;
|
||||
|
||||
/* get memory for various stuff */
|
||||
dev->d_rps0.cpu_addr = pci_alloc_consistent(pci, SAA7146_RPS_MEM,
|
||||
&dev->d_rps0.dma_handle);
|
||||
if (!dev->d_rps0.cpu_addr)
|
||||
goto err_free_irq;
|
||||
memset(dev->d_rps0.cpu_addr, 0x0, SAA7146_RPS_MEM);
|
||||
|
||||
dev->d_rps1.cpu_addr = pci_alloc_consistent(pci, SAA7146_RPS_MEM,
|
||||
&dev->d_rps1.dma_handle);
|
||||
if (!dev->d_rps1.cpu_addr)
|
||||
goto err_free_rps0;
|
||||
memset(dev->d_rps1.cpu_addr, 0x0, SAA7146_RPS_MEM);
|
||||
|
||||
dev->d_i2c.cpu_addr = pci_alloc_consistent(pci, SAA7146_RPS_MEM,
|
||||
&dev->d_i2c.dma_handle);
|
||||
if (!dev->d_i2c.cpu_addr)
|
||||
goto err_free_rps1;
|
||||
memset(dev->d_i2c.cpu_addr, 0x0, SAA7146_RPS_MEM);
|
||||
|
||||
/* the rest + print status message */
|
||||
|
||||
/* create a nice device name */
|
||||
sprintf(dev->name, "saa7146 (%d)", saa7146_num);
|
||||
|
||||
pr_info("found saa7146 @ mem %p (revision %d, irq %d) (0x%04x,0x%04x)\n",
|
||||
dev->mem, dev->revision, pci->irq,
|
||||
pci->subsystem_vendor, pci->subsystem_device);
|
||||
dev->ext = ext;
|
||||
|
||||
mutex_init(&dev->v4l2_lock);
|
||||
spin_lock_init(&dev->int_slock);
|
||||
spin_lock_init(&dev->slock);
|
||||
|
||||
mutex_init(&dev->i2c_lock);
|
||||
|
||||
dev->module = THIS_MODULE;
|
||||
init_waitqueue_head(&dev->i2c_wq);
|
||||
|
||||
/* set some sane pci arbitrition values */
|
||||
saa7146_write(dev, PCI_BT_V1, 0x1c00101f);
|
||||
|
||||
/* TODO: use the status code of the callback */
|
||||
|
||||
err = -ENODEV;
|
||||
|
||||
if (ext->probe && ext->probe(dev)) {
|
||||
DEB_D("ext->probe() failed for %p. skipping device.\n", dev);
|
||||
goto err_free_i2c;
|
||||
}
|
||||
|
||||
if (ext->attach(dev, pci_ext)) {
|
||||
DEB_D("ext->attach() failed for %p. skipping device.\n", dev);
|
||||
goto err_free_i2c;
|
||||
}
|
||||
/* V4L extensions will set the pci drvdata to the v4l2_device in the
|
||||
attach() above. So for those cards that do not use V4L we have to
|
||||
set it explicitly. */
|
||||
pci_set_drvdata(pci, &dev->v4l2_dev);
|
||||
|
||||
saa7146_num++;
|
||||
|
||||
err = 0;
|
||||
out:
|
||||
return err;
|
||||
|
||||
err_free_i2c:
|
||||
pci_free_consistent(pci, SAA7146_RPS_MEM, dev->d_i2c.cpu_addr,
|
||||
dev->d_i2c.dma_handle);
|
||||
err_free_rps1:
|
||||
pci_free_consistent(pci, SAA7146_RPS_MEM, dev->d_rps1.cpu_addr,
|
||||
dev->d_rps1.dma_handle);
|
||||
err_free_rps0:
|
||||
pci_free_consistent(pci, SAA7146_RPS_MEM, dev->d_rps0.cpu_addr,
|
||||
dev->d_rps0.dma_handle);
|
||||
err_free_irq:
|
||||
free_irq(pci->irq, (void *)dev);
|
||||
err_unmap:
|
||||
iounmap(dev->mem);
|
||||
err_release:
|
||||
pci_release_region(pci, 0);
|
||||
err_disable:
|
||||
pci_disable_device(pci);
|
||||
err_free:
|
||||
kfree(dev);
|
||||
goto out;
|
||||
}
|
||||
|
||||
static void saa7146_remove_one(struct pci_dev *pdev)
|
||||
{
|
||||
struct v4l2_device *v4l2_dev = pci_get_drvdata(pdev);
|
||||
struct saa7146_dev *dev = to_saa7146_dev(v4l2_dev);
|
||||
struct {
|
||||
void *addr;
|
||||
dma_addr_t dma;
|
||||
} dev_map[] = {
|
||||
{ dev->d_i2c.cpu_addr, dev->d_i2c.dma_handle },
|
||||
{ dev->d_rps1.cpu_addr, dev->d_rps1.dma_handle },
|
||||
{ dev->d_rps0.cpu_addr, dev->d_rps0.dma_handle },
|
||||
{ NULL, 0 }
|
||||
}, *p;
|
||||
|
||||
DEB_EE("dev:%p\n", dev);
|
||||
|
||||
dev->ext->detach(dev);
|
||||
/* Zero the PCI drvdata after use. */
|
||||
pci_set_drvdata(pdev, NULL);
|
||||
|
||||
/* shut down all video dma transfers */
|
||||
saa7146_write(dev, MC1, 0x00ff0000);
|
||||
|
||||
/* disable all irqs, release irq-routine */
|
||||
saa7146_write(dev, IER, 0);
|
||||
|
||||
free_irq(pdev->irq, dev);
|
||||
|
||||
for (p = dev_map; p->addr; p++)
|
||||
pci_free_consistent(pdev, SAA7146_RPS_MEM, p->addr, p->dma);
|
||||
|
||||
iounmap(dev->mem);
|
||||
pci_release_region(pdev, 0);
|
||||
pci_disable_device(pdev);
|
||||
kfree(dev);
|
||||
|
||||
saa7146_num--;
|
||||
}
|
||||
|
||||
/*********************************************************************************/
|
||||
/* extension handling functions */
|
||||
|
||||
int saa7146_register_extension(struct saa7146_extension* ext)
|
||||
{
|
||||
DEB_EE("ext:%p\n", ext);
|
||||
|
||||
ext->driver.name = ext->name;
|
||||
ext->driver.id_table = ext->pci_tbl;
|
||||
ext->driver.probe = saa7146_init_one;
|
||||
ext->driver.remove = saa7146_remove_one;
|
||||
|
||||
pr_info("register extension '%s'\n", ext->name);
|
||||
return pci_register_driver(&ext->driver);
|
||||
}
|
||||
|
||||
int saa7146_unregister_extension(struct saa7146_extension* ext)
|
||||
{
|
||||
DEB_EE("ext:%p\n", ext);
|
||||
pr_info("unregister extension '%s'\n", ext->name);
|
||||
pci_unregister_driver(&ext->driver);
|
||||
return 0;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL_GPL(saa7146_register_extension);
|
||||
EXPORT_SYMBOL_GPL(saa7146_unregister_extension);
|
||||
|
||||
/* misc functions used by extension modules */
|
||||
EXPORT_SYMBOL_GPL(saa7146_pgtable_alloc);
|
||||
EXPORT_SYMBOL_GPL(saa7146_pgtable_free);
|
||||
EXPORT_SYMBOL_GPL(saa7146_pgtable_build_single);
|
||||
EXPORT_SYMBOL_GPL(saa7146_vmalloc_build_pgtable);
|
||||
EXPORT_SYMBOL_GPL(saa7146_vfree_destroy_pgtable);
|
||||
EXPORT_SYMBOL_GPL(saa7146_wait_for_debi_done);
|
||||
|
||||
EXPORT_SYMBOL_GPL(saa7146_setgpio);
|
||||
|
||||
EXPORT_SYMBOL_GPL(saa7146_i2c_adapter_prepare);
|
||||
|
||||
EXPORT_SYMBOL_GPL(saa7146_debug);
|
||||
|
||||
MODULE_AUTHOR("Michael Hunold <michael@mihu.de>");
|
||||
MODULE_DESCRIPTION("driver for generic saa7146-based hardware");
|
||||
MODULE_LICENSE("GPL");
|
664
drivers/media/common/saa7146/saa7146_fops.c
Normal file
664
drivers/media/common/saa7146/saa7146_fops.c
Normal file
|
@ -0,0 +1,664 @@
|
|||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||
|
||||
#include <media/saa7146_vv.h>
|
||||
#include <linux/module.h>
|
||||
|
||||
/****************************************************************************/
|
||||
/* resource management functions, shamelessly stolen from saa7134 driver */
|
||||
|
||||
int saa7146_res_get(struct saa7146_fh *fh, unsigned int bit)
|
||||
{
|
||||
struct saa7146_dev *dev = fh->dev;
|
||||
struct saa7146_vv *vv = dev->vv_data;
|
||||
|
||||
if (fh->resources & bit) {
|
||||
DEB_D("already allocated! want: 0x%02x, cur:0x%02x\n",
|
||||
bit, vv->resources);
|
||||
/* have it already allocated */
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* is it free? */
|
||||
if (vv->resources & bit) {
|
||||
DEB_D("locked! vv->resources:0x%02x, we want:0x%02x\n",
|
||||
vv->resources, bit);
|
||||
/* no, someone else uses it */
|
||||
return 0;
|
||||
}
|
||||
/* it's free, grab it */
|
||||
fh->resources |= bit;
|
||||
vv->resources |= bit;
|
||||
DEB_D("res: get 0x%02x, cur:0x%02x\n", bit, vv->resources);
|
||||
return 1;
|
||||
}
|
||||
|
||||
void saa7146_res_free(struct saa7146_fh *fh, unsigned int bits)
|
||||
{
|
||||
struct saa7146_dev *dev = fh->dev;
|
||||
struct saa7146_vv *vv = dev->vv_data;
|
||||
|
||||
BUG_ON((fh->resources & bits) != bits);
|
||||
|
||||
fh->resources &= ~bits;
|
||||
vv->resources &= ~bits;
|
||||
DEB_D("res: put 0x%02x, cur:0x%02x\n", bits, vv->resources);
|
||||
}
|
||||
|
||||
|
||||
/********************************************************************************/
|
||||
/* common dma functions */
|
||||
|
||||
void saa7146_dma_free(struct saa7146_dev *dev,struct videobuf_queue *q,
|
||||
struct saa7146_buf *buf)
|
||||
{
|
||||
struct videobuf_dmabuf *dma=videobuf_to_dma(&buf->vb);
|
||||
DEB_EE("dev:%p, buf:%p\n", dev, buf);
|
||||
|
||||
BUG_ON(in_interrupt());
|
||||
|
||||
videobuf_waiton(q, &buf->vb, 0, 0);
|
||||
videobuf_dma_unmap(q->dev, dma);
|
||||
videobuf_dma_free(dma);
|
||||
buf->vb.state = VIDEOBUF_NEEDS_INIT;
|
||||
}
|
||||
|
||||
|
||||
/********************************************************************************/
|
||||
/* common buffer functions */
|
||||
|
||||
int saa7146_buffer_queue(struct saa7146_dev *dev,
|
||||
struct saa7146_dmaqueue *q,
|
||||
struct saa7146_buf *buf)
|
||||
{
|
||||
assert_spin_locked(&dev->slock);
|
||||
DEB_EE("dev:%p, dmaq:%p, buf:%p\n", dev, q, buf);
|
||||
|
||||
BUG_ON(!q);
|
||||
|
||||
if (NULL == q->curr) {
|
||||
q->curr = buf;
|
||||
DEB_D("immediately activating buffer %p\n", buf);
|
||||
buf->activate(dev,buf,NULL);
|
||||
} else {
|
||||
list_add_tail(&buf->vb.queue,&q->queue);
|
||||
buf->vb.state = VIDEOBUF_QUEUED;
|
||||
DEB_D("adding buffer %p to queue. (active buffer present)\n",
|
||||
buf);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void saa7146_buffer_finish(struct saa7146_dev *dev,
|
||||
struct saa7146_dmaqueue *q,
|
||||
int state)
|
||||
{
|
||||
assert_spin_locked(&dev->slock);
|
||||
DEB_EE("dev:%p, dmaq:%p, state:%d\n", dev, q, state);
|
||||
DEB_EE("q->curr:%p\n", q->curr);
|
||||
|
||||
BUG_ON(!q->curr);
|
||||
|
||||
/* finish current buffer */
|
||||
if (NULL == q->curr) {
|
||||
DEB_D("aiii. no current buffer\n");
|
||||
return;
|
||||
}
|
||||
|
||||
q->curr->vb.state = state;
|
||||
do_gettimeofday(&q->curr->vb.ts);
|
||||
wake_up(&q->curr->vb.done);
|
||||
|
||||
q->curr = NULL;
|
||||
}
|
||||
|
||||
void saa7146_buffer_next(struct saa7146_dev *dev,
|
||||
struct saa7146_dmaqueue *q, int vbi)
|
||||
{
|
||||
struct saa7146_buf *buf,*next = NULL;
|
||||
|
||||
BUG_ON(!q);
|
||||
|
||||
DEB_INT("dev:%p, dmaq:%p, vbi:%d\n", dev, q, vbi);
|
||||
|
||||
assert_spin_locked(&dev->slock);
|
||||
if (!list_empty(&q->queue)) {
|
||||
/* activate next one from queue */
|
||||
buf = list_entry(q->queue.next,struct saa7146_buf,vb.queue);
|
||||
list_del(&buf->vb.queue);
|
||||
if (!list_empty(&q->queue))
|
||||
next = list_entry(q->queue.next,struct saa7146_buf, vb.queue);
|
||||
q->curr = buf;
|
||||
DEB_INT("next buffer: buf:%p, prev:%p, next:%p\n",
|
||||
buf, q->queue.prev, q->queue.next);
|
||||
buf->activate(dev,buf,next);
|
||||
} else {
|
||||
DEB_INT("no next buffer. stopping.\n");
|
||||
if( 0 != vbi ) {
|
||||
/* turn off video-dma3 */
|
||||
saa7146_write(dev,MC1, MASK_20);
|
||||
} else {
|
||||
/* nothing to do -- just prevent next video-dma1 transfer
|
||||
by lowering the protection address */
|
||||
|
||||
// fixme: fix this for vflip != 0
|
||||
|
||||
saa7146_write(dev, PROT_ADDR1, 0);
|
||||
saa7146_write(dev, MC2, (MASK_02|MASK_18));
|
||||
|
||||
/* write the address of the rps-program */
|
||||
saa7146_write(dev, RPS_ADDR0, dev->d_rps0.dma_handle);
|
||||
/* turn on rps */
|
||||
saa7146_write(dev, MC1, (MASK_12 | MASK_28));
|
||||
|
||||
/*
|
||||
printk("vdma%d.base_even: 0x%08x\n", 1,saa7146_read(dev,BASE_EVEN1));
|
||||
printk("vdma%d.base_odd: 0x%08x\n", 1,saa7146_read(dev,BASE_ODD1));
|
||||
printk("vdma%d.prot_addr: 0x%08x\n", 1,saa7146_read(dev,PROT_ADDR1));
|
||||
printk("vdma%d.base_page: 0x%08x\n", 1,saa7146_read(dev,BASE_PAGE1));
|
||||
printk("vdma%d.pitch: 0x%08x\n", 1,saa7146_read(dev,PITCH1));
|
||||
printk("vdma%d.num_line_byte: 0x%08x\n", 1,saa7146_read(dev,NUM_LINE_BYTE1));
|
||||
*/
|
||||
}
|
||||
del_timer(&q->timeout);
|
||||
}
|
||||
}
|
||||
|
||||
void saa7146_buffer_timeout(unsigned long data)
|
||||
{
|
||||
struct saa7146_dmaqueue *q = (struct saa7146_dmaqueue*)data;
|
||||
struct saa7146_dev *dev = q->dev;
|
||||
unsigned long flags;
|
||||
|
||||
DEB_EE("dev:%p, dmaq:%p\n", dev, q);
|
||||
|
||||
spin_lock_irqsave(&dev->slock,flags);
|
||||
if (q->curr) {
|
||||
DEB_D("timeout on %p\n", q->curr);
|
||||
saa7146_buffer_finish(dev,q,VIDEOBUF_ERROR);
|
||||
}
|
||||
|
||||
/* we don't restart the transfer here like other drivers do. when
|
||||
a streaming capture is disabled, the timeout function will be
|
||||
called for the current buffer. if we activate the next buffer now,
|
||||
we mess up our capture logic. if a timeout occurs on another buffer,
|
||||
then something is seriously broken before, so no need to buffer the
|
||||
next capture IMHO... */
|
||||
/*
|
||||
saa7146_buffer_next(dev,q);
|
||||
*/
|
||||
spin_unlock_irqrestore(&dev->slock,flags);
|
||||
}
|
||||
|
||||
/********************************************************************************/
|
||||
/* file operations */
|
||||
|
||||
static int fops_open(struct file *file)
|
||||
{
|
||||
struct video_device *vdev = video_devdata(file);
|
||||
struct saa7146_dev *dev = video_drvdata(file);
|
||||
struct saa7146_fh *fh = NULL;
|
||||
int result = 0;
|
||||
|
||||
DEB_EE("file:%p, dev:%s\n", file, video_device_node_name(vdev));
|
||||
|
||||
if (mutex_lock_interruptible(vdev->lock))
|
||||
return -ERESTARTSYS;
|
||||
|
||||
DEB_D("using: %p\n", dev);
|
||||
|
||||
/* check if an extension is registered */
|
||||
if( NULL == dev->ext ) {
|
||||
DEB_S("no extension registered for this device\n");
|
||||
result = -ENODEV;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* allocate per open data */
|
||||
fh = kzalloc(sizeof(*fh),GFP_KERNEL);
|
||||
if (NULL == fh) {
|
||||
DEB_S("cannot allocate memory for per open data\n");
|
||||
result = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
|
||||
v4l2_fh_init(&fh->fh, vdev);
|
||||
|
||||
file->private_data = &fh->fh;
|
||||
fh->dev = dev;
|
||||
|
||||
if (vdev->vfl_type == VFL_TYPE_VBI) {
|
||||
DEB_S("initializing vbi...\n");
|
||||
if (dev->ext_vv_data->capabilities & V4L2_CAP_VBI_CAPTURE)
|
||||
result = saa7146_vbi_uops.open(dev,file);
|
||||
if (dev->ext_vv_data->vbi_fops.open)
|
||||
dev->ext_vv_data->vbi_fops.open(file);
|
||||
} else {
|
||||
DEB_S("initializing video...\n");
|
||||
result = saa7146_video_uops.open(dev,file);
|
||||
}
|
||||
|
||||
if (0 != result) {
|
||||
goto out;
|
||||
}
|
||||
|
||||
if( 0 == try_module_get(dev->ext->module)) {
|
||||
result = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
result = 0;
|
||||
v4l2_fh_add(&fh->fh);
|
||||
out:
|
||||
if (fh && result != 0) {
|
||||
kfree(fh);
|
||||
file->private_data = NULL;
|
||||
}
|
||||
mutex_unlock(vdev->lock);
|
||||
return result;
|
||||
}
|
||||
|
||||
static int fops_release(struct file *file)
|
||||
{
|
||||
struct video_device *vdev = video_devdata(file);
|
||||
struct saa7146_fh *fh = file->private_data;
|
||||
struct saa7146_dev *dev = fh->dev;
|
||||
|
||||
DEB_EE("file:%p\n", file);
|
||||
|
||||
if (mutex_lock_interruptible(vdev->lock))
|
||||
return -ERESTARTSYS;
|
||||
|
||||
if (vdev->vfl_type == VFL_TYPE_VBI) {
|
||||
if (dev->ext_vv_data->capabilities & V4L2_CAP_VBI_CAPTURE)
|
||||
saa7146_vbi_uops.release(dev,file);
|
||||
if (dev->ext_vv_data->vbi_fops.release)
|
||||
dev->ext_vv_data->vbi_fops.release(file);
|
||||
} else {
|
||||
saa7146_video_uops.release(dev,file);
|
||||
}
|
||||
|
||||
v4l2_fh_del(&fh->fh);
|
||||
v4l2_fh_exit(&fh->fh);
|
||||
module_put(dev->ext->module);
|
||||
file->private_data = NULL;
|
||||
kfree(fh);
|
||||
|
||||
mutex_unlock(vdev->lock);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int fops_mmap(struct file *file, struct vm_area_struct * vma)
|
||||
{
|
||||
struct video_device *vdev = video_devdata(file);
|
||||
struct saa7146_fh *fh = file->private_data;
|
||||
struct videobuf_queue *q;
|
||||
int res;
|
||||
|
||||
switch (vdev->vfl_type) {
|
||||
case VFL_TYPE_GRABBER: {
|
||||
DEB_EE("V4L2_BUF_TYPE_VIDEO_CAPTURE: file:%p, vma:%p\n",
|
||||
file, vma);
|
||||
q = &fh->video_q;
|
||||
break;
|
||||
}
|
||||
case VFL_TYPE_VBI: {
|
||||
DEB_EE("V4L2_BUF_TYPE_VBI_CAPTURE: file:%p, vma:%p\n",
|
||||
file, vma);
|
||||
if (fh->dev->ext_vv_data->capabilities & V4L2_CAP_SLICED_VBI_OUTPUT)
|
||||
return -ENODEV;
|
||||
q = &fh->vbi_q;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
BUG();
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (mutex_lock_interruptible(vdev->lock))
|
||||
return -ERESTARTSYS;
|
||||
res = videobuf_mmap_mapper(q, vma);
|
||||
mutex_unlock(vdev->lock);
|
||||
return res;
|
||||
}
|
||||
|
||||
static unsigned int __fops_poll(struct file *file, struct poll_table_struct *wait)
|
||||
{
|
||||
struct video_device *vdev = video_devdata(file);
|
||||
struct saa7146_fh *fh = file->private_data;
|
||||
struct videobuf_buffer *buf = NULL;
|
||||
struct videobuf_queue *q;
|
||||
unsigned int res = v4l2_ctrl_poll(file, wait);
|
||||
|
||||
DEB_EE("file:%p, poll:%p\n", file, wait);
|
||||
|
||||
if (vdev->vfl_type == VFL_TYPE_VBI) {
|
||||
if (fh->dev->ext_vv_data->capabilities & V4L2_CAP_SLICED_VBI_OUTPUT)
|
||||
return res | POLLOUT | POLLWRNORM;
|
||||
if( 0 == fh->vbi_q.streaming )
|
||||
return res | videobuf_poll_stream(file, &fh->vbi_q, wait);
|
||||
q = &fh->vbi_q;
|
||||
} else {
|
||||
DEB_D("using video queue\n");
|
||||
q = &fh->video_q;
|
||||
}
|
||||
|
||||
if (!list_empty(&q->stream))
|
||||
buf = list_entry(q->stream.next, struct videobuf_buffer, stream);
|
||||
|
||||
if (!buf) {
|
||||
DEB_D("buf == NULL!\n");
|
||||
return res | POLLERR;
|
||||
}
|
||||
|
||||
poll_wait(file, &buf->done, wait);
|
||||
if (buf->state == VIDEOBUF_DONE || buf->state == VIDEOBUF_ERROR) {
|
||||
DEB_D("poll succeeded!\n");
|
||||
return res | POLLIN | POLLRDNORM;
|
||||
}
|
||||
|
||||
DEB_D("nothing to poll for, buf->state:%d\n", buf->state);
|
||||
return res;
|
||||
}
|
||||
|
||||
static unsigned int fops_poll(struct file *file, struct poll_table_struct *wait)
|
||||
{
|
||||
struct video_device *vdev = video_devdata(file);
|
||||
unsigned int res;
|
||||
|
||||
mutex_lock(vdev->lock);
|
||||
res = __fops_poll(file, wait);
|
||||
mutex_unlock(vdev->lock);
|
||||
return res;
|
||||
}
|
||||
|
||||
static ssize_t fops_read(struct file *file, char __user *data, size_t count, loff_t *ppos)
|
||||
{
|
||||
struct video_device *vdev = video_devdata(file);
|
||||
struct saa7146_fh *fh = file->private_data;
|
||||
int ret;
|
||||
|
||||
switch (vdev->vfl_type) {
|
||||
case VFL_TYPE_GRABBER:
|
||||
/*
|
||||
DEB_EE("V4L2_BUF_TYPE_VIDEO_CAPTURE: file:%p, data:%p, count:%lun",
|
||||
file, data, (unsigned long)count);
|
||||
*/
|
||||
return saa7146_video_uops.read(file,data,count,ppos);
|
||||
case VFL_TYPE_VBI:
|
||||
/*
|
||||
DEB_EE("V4L2_BUF_TYPE_VBI_CAPTURE: file:%p, data:%p, count:%lu\n",
|
||||
file, data, (unsigned long)count);
|
||||
*/
|
||||
if (fh->dev->ext_vv_data->capabilities & V4L2_CAP_VBI_CAPTURE) {
|
||||
if (mutex_lock_interruptible(vdev->lock))
|
||||
return -ERESTARTSYS;
|
||||
ret = saa7146_vbi_uops.read(file, data, count, ppos);
|
||||
mutex_unlock(vdev->lock);
|
||||
return ret;
|
||||
}
|
||||
return -EINVAL;
|
||||
default:
|
||||
BUG();
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
static ssize_t fops_write(struct file *file, const char __user *data, size_t count, loff_t *ppos)
|
||||
{
|
||||
struct video_device *vdev = video_devdata(file);
|
||||
struct saa7146_fh *fh = file->private_data;
|
||||
int ret;
|
||||
|
||||
switch (vdev->vfl_type) {
|
||||
case VFL_TYPE_GRABBER:
|
||||
return -EINVAL;
|
||||
case VFL_TYPE_VBI:
|
||||
if (fh->dev->ext_vv_data->vbi_fops.write) {
|
||||
if (mutex_lock_interruptible(vdev->lock))
|
||||
return -ERESTARTSYS;
|
||||
ret = fh->dev->ext_vv_data->vbi_fops.write(file, data, count, ppos);
|
||||
mutex_unlock(vdev->lock);
|
||||
return ret;
|
||||
}
|
||||
return -EINVAL;
|
||||
default:
|
||||
BUG();
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
static const struct v4l2_file_operations video_fops =
|
||||
{
|
||||
.owner = THIS_MODULE,
|
||||
.open = fops_open,
|
||||
.release = fops_release,
|
||||
.read = fops_read,
|
||||
.write = fops_write,
|
||||
.poll = fops_poll,
|
||||
.mmap = fops_mmap,
|
||||
.unlocked_ioctl = video_ioctl2,
|
||||
};
|
||||
|
||||
static void vv_callback(struct saa7146_dev *dev, unsigned long status)
|
||||
{
|
||||
u32 isr = status;
|
||||
|
||||
DEB_INT("dev:%p, isr:0x%08x\n", dev, (u32)status);
|
||||
|
||||
if (0 != (isr & (MASK_27))) {
|
||||
DEB_INT("irq: RPS0 (0x%08x)\n", isr);
|
||||
saa7146_video_uops.irq_done(dev,isr);
|
||||
}
|
||||
|
||||
if (0 != (isr & (MASK_28))) {
|
||||
u32 mc2 = saa7146_read(dev, MC2);
|
||||
if( 0 != (mc2 & MASK_15)) {
|
||||
DEB_INT("irq: RPS1 vbi workaround (0x%08x)\n", isr);
|
||||
wake_up(&dev->vv_data->vbi_wq);
|
||||
saa7146_write(dev,MC2, MASK_31);
|
||||
return;
|
||||
}
|
||||
DEB_INT("irq: RPS1 (0x%08x)\n", isr);
|
||||
saa7146_vbi_uops.irq_done(dev,isr);
|
||||
}
|
||||
}
|
||||
|
||||
static const struct v4l2_ctrl_ops saa7146_ctrl_ops = {
|
||||
.s_ctrl = saa7146_s_ctrl,
|
||||
};
|
||||
|
||||
int saa7146_vv_init(struct saa7146_dev* dev, struct saa7146_ext_vv *ext_vv)
|
||||
{
|
||||
struct v4l2_ctrl_handler *hdl = &dev->ctrl_handler;
|
||||
struct v4l2_pix_format *fmt;
|
||||
struct v4l2_vbi_format *vbi;
|
||||
struct saa7146_vv *vv;
|
||||
int err;
|
||||
|
||||
err = v4l2_device_register(&dev->pci->dev, &dev->v4l2_dev);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
v4l2_ctrl_handler_init(hdl, 6);
|
||||
v4l2_ctrl_new_std(hdl, &saa7146_ctrl_ops,
|
||||
V4L2_CID_BRIGHTNESS, 0, 255, 1, 128);
|
||||
v4l2_ctrl_new_std(hdl, &saa7146_ctrl_ops,
|
||||
V4L2_CID_CONTRAST, 0, 127, 1, 64);
|
||||
v4l2_ctrl_new_std(hdl, &saa7146_ctrl_ops,
|
||||
V4L2_CID_SATURATION, 0, 127, 1, 64);
|
||||
v4l2_ctrl_new_std(hdl, &saa7146_ctrl_ops,
|
||||
V4L2_CID_VFLIP, 0, 1, 1, 0);
|
||||
v4l2_ctrl_new_std(hdl, &saa7146_ctrl_ops,
|
||||
V4L2_CID_HFLIP, 0, 1, 1, 0);
|
||||
if (hdl->error) {
|
||||
err = hdl->error;
|
||||
v4l2_ctrl_handler_free(hdl);
|
||||
return err;
|
||||
}
|
||||
dev->v4l2_dev.ctrl_handler = hdl;
|
||||
|
||||
vv = kzalloc(sizeof(struct saa7146_vv), GFP_KERNEL);
|
||||
if (vv == NULL) {
|
||||
ERR("out of memory. aborting.\n");
|
||||
v4l2_ctrl_handler_free(hdl);
|
||||
return -ENOMEM;
|
||||
}
|
||||
ext_vv->vid_ops = saa7146_video_ioctl_ops;
|
||||
ext_vv->vbi_ops = saa7146_vbi_ioctl_ops;
|
||||
ext_vv->core_ops = &saa7146_video_ioctl_ops;
|
||||
|
||||
DEB_EE("dev:%p\n", dev);
|
||||
|
||||
/* set default values for video parts of the saa7146 */
|
||||
saa7146_write(dev, BCS_CTRL, 0x80400040);
|
||||
|
||||
/* enable video-port pins */
|
||||
saa7146_write(dev, MC1, (MASK_10 | MASK_26));
|
||||
|
||||
/* save per-device extension data (one extension can
|
||||
handle different devices that might need different
|
||||
configuration data) */
|
||||
dev->ext_vv_data = ext_vv;
|
||||
|
||||
vv->d_clipping.cpu_addr = pci_alloc_consistent(dev->pci, SAA7146_CLIPPING_MEM, &vv->d_clipping.dma_handle);
|
||||
if( NULL == vv->d_clipping.cpu_addr ) {
|
||||
ERR("out of memory. aborting.\n");
|
||||
kfree(vv);
|
||||
v4l2_ctrl_handler_free(hdl);
|
||||
return -1;
|
||||
}
|
||||
memset(vv->d_clipping.cpu_addr, 0x0, SAA7146_CLIPPING_MEM);
|
||||
|
||||
saa7146_video_uops.init(dev,vv);
|
||||
if (dev->ext_vv_data->capabilities & V4L2_CAP_VBI_CAPTURE)
|
||||
saa7146_vbi_uops.init(dev,vv);
|
||||
|
||||
fmt = &vv->ov_fb.fmt;
|
||||
fmt->width = vv->standard->h_max_out;
|
||||
fmt->height = vv->standard->v_max_out;
|
||||
fmt->pixelformat = V4L2_PIX_FMT_RGB565;
|
||||
fmt->bytesperline = 2 * fmt->width;
|
||||
fmt->sizeimage = fmt->bytesperline * fmt->height;
|
||||
fmt->colorspace = V4L2_COLORSPACE_SRGB;
|
||||
|
||||
fmt = &vv->video_fmt;
|
||||
fmt->width = 384;
|
||||
fmt->height = 288;
|
||||
fmt->pixelformat = V4L2_PIX_FMT_BGR24;
|
||||
fmt->field = V4L2_FIELD_ANY;
|
||||
fmt->colorspace = V4L2_COLORSPACE_SMPTE170M;
|
||||
fmt->bytesperline = 3 * fmt->width;
|
||||
fmt->sizeimage = fmt->bytesperline * fmt->height;
|
||||
|
||||
vbi = &vv->vbi_fmt;
|
||||
vbi->sampling_rate = 27000000;
|
||||
vbi->offset = 248; /* todo */
|
||||
vbi->samples_per_line = 720 * 2;
|
||||
vbi->sample_format = V4L2_PIX_FMT_GREY;
|
||||
|
||||
/* fixme: this only works for PAL */
|
||||
vbi->start[0] = 5;
|
||||
vbi->count[0] = 16;
|
||||
vbi->start[1] = 312;
|
||||
vbi->count[1] = 16;
|
||||
|
||||
init_timer(&vv->vbi_read_timeout);
|
||||
|
||||
vv->ov_fb.capability = V4L2_FBUF_CAP_LIST_CLIPPING;
|
||||
vv->ov_fb.flags = V4L2_FBUF_FLAG_PRIMARY;
|
||||
dev->vv_data = vv;
|
||||
dev->vv_callback = &vv_callback;
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(saa7146_vv_init);
|
||||
|
||||
int saa7146_vv_release(struct saa7146_dev* dev)
|
||||
{
|
||||
struct saa7146_vv *vv = dev->vv_data;
|
||||
|
||||
DEB_EE("dev:%p\n", dev);
|
||||
|
||||
v4l2_device_unregister(&dev->v4l2_dev);
|
||||
pci_free_consistent(dev->pci, SAA7146_CLIPPING_MEM, vv->d_clipping.cpu_addr, vv->d_clipping.dma_handle);
|
||||
v4l2_ctrl_handler_free(&dev->ctrl_handler);
|
||||
kfree(vv);
|
||||
dev->vv_data = NULL;
|
||||
dev->vv_callback = NULL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(saa7146_vv_release);
|
||||
|
||||
int saa7146_register_device(struct video_device **vid, struct saa7146_dev* dev,
|
||||
char *name, int type)
|
||||
{
|
||||
struct video_device *vfd;
|
||||
int err;
|
||||
int i;
|
||||
|
||||
DEB_EE("dev:%p, name:'%s', type:%d\n", dev, name, type);
|
||||
|
||||
// released by vfd->release
|
||||
vfd = video_device_alloc();
|
||||
if (vfd == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
vfd->fops = &video_fops;
|
||||
if (type == VFL_TYPE_GRABBER)
|
||||
vfd->ioctl_ops = &dev->ext_vv_data->vid_ops;
|
||||
else
|
||||
vfd->ioctl_ops = &dev->ext_vv_data->vbi_ops;
|
||||
vfd->release = video_device_release;
|
||||
vfd->lock = &dev->v4l2_lock;
|
||||
vfd->v4l2_dev = &dev->v4l2_dev;
|
||||
vfd->tvnorms = 0;
|
||||
set_bit(V4L2_FL_USE_FH_PRIO, &vfd->flags);
|
||||
for (i = 0; i < dev->ext_vv_data->num_stds; i++)
|
||||
vfd->tvnorms |= dev->ext_vv_data->stds[i].id;
|
||||
strlcpy(vfd->name, name, sizeof(vfd->name));
|
||||
video_set_drvdata(vfd, dev);
|
||||
|
||||
err = video_register_device(vfd, type, -1);
|
||||
if (err < 0) {
|
||||
ERR("cannot register v4l2 device. skipping.\n");
|
||||
video_device_release(vfd);
|
||||
return err;
|
||||
}
|
||||
|
||||
pr_info("%s: registered device %s [v4l2]\n",
|
||||
dev->name, video_device_node_name(vfd));
|
||||
|
||||
*vid = vfd;
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(saa7146_register_device);
|
||||
|
||||
int saa7146_unregister_device(struct video_device **vid, struct saa7146_dev* dev)
|
||||
{
|
||||
DEB_EE("dev:%p\n", dev);
|
||||
|
||||
video_unregister_device(*vid);
|
||||
*vid = NULL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(saa7146_unregister_device);
|
||||
|
||||
static int __init saa7146_vv_init_module(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static void __exit saa7146_vv_cleanup_module(void)
|
||||
{
|
||||
}
|
||||
|
||||
module_init(saa7146_vv_init_module);
|
||||
module_exit(saa7146_vv_cleanup_module);
|
||||
|
||||
MODULE_AUTHOR("Michael Hunold <michael@mihu.de>");
|
||||
MODULE_DESCRIPTION("video4linux driver for saa7146-based hardware");
|
||||
MODULE_LICENSE("GPL");
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue