mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-11-18 07:35:12 +08:00
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: - Some cleanups at V4L2 documentation - new drivers: ts2020 frontend, ov9650 sensor, s5c73m3 sensor, sh-mobile veu mem2mem driver, radio-ma901, davinci_vpfe staging driver - Lots of missing MAINTAINERS entries added - several em28xx driver improvements, including its conversion to videobuf2 - several fixups on drivers to make them to better comply with the API - DVB core: add support for DVBv5 stats, allowing the implementation of statistics for new standards like ISDB - mb86a20s: add statistics to the driver - lots of new board additions, cleanups, and driver improvements. * 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media: (596 commits) [media] media: Add 0x3009 USB PID to ttusb2 driver (fixed diff) [media] rtl28xxu: Add USB IDs for Compro VideoMate U620F [media] em28xx: add usb id for terratec h5 rev. 3 [media] media: rc: gpio-ir-recv: add support for device tree parsing [media] mceusb: move check earlier to make smatch happy [media] radio-si470x doc: add info about v4l2-ctl and sox+alsa [media] staging: media: Remove unnecessary OOM messages [media] sh_vou: Use vou_dev instead of vou_file wherever possible [media] sh_vou: Use video_drvdata() [media] drivers/media/platform/soc_camera/pxa_camera.c: use devm_ functions [media] mt9t112: mt9t111 format set up differs from mt9t112 [media] sh-mobile-ceu-camera: fix SHARPNESS control default Revert "[media] fc0011: Return early, if the frequency is already tuned" [media] cx18/ivtv: fix regression: remove __init from a non-init function [media] em28xx: fix analog streaming with USB bulk transfers [media] stv0900: remove unnecessary null pointer check [media] fc0011: Return early, if the frequency is already tuned [media] fc0011: Add some sanity checks and cleanups [media] fc0011: Fix xin value clamping Revert "[media] [PATH,1/2] mxl5007 move reset to attach" ...
This commit is contained in:
commit
21fbd5809a
@ -84,7 +84,7 @@ Added ISDB-T test originally written by Patrick Boettcher
|
||||
|
||||
|
||||
<title>LINUX DVB API</title>
|
||||
<subtitle>Version 5.8</subtitle>
|
||||
<subtitle>Version 5.10</subtitle>
|
||||
<!-- ADD THE CHAPTERS HERE -->
|
||||
<chapter id="dvb_introdution">
|
||||
&sub-intro;
|
||||
|
@ -7,14 +7,41 @@ the capability ioctls weren't implemented yet via the new way.</para>
|
||||
<para>The typical usage for the <constant>FE_GET_PROPERTY/FE_SET_PROPERTY</constant>
|
||||
API is to replace the ioctl's were the <link linkend="dvb-frontend-parameters">
|
||||
struct <constant>dvb_frontend_parameters</constant></link> were used.</para>
|
||||
<section id="dtv-stats">
|
||||
<title>DTV stats type</title>
|
||||
<programlisting>
|
||||
struct dtv_stats {
|
||||
__u8 scale; /* enum fecap_scale_params type */
|
||||
union {
|
||||
__u64 uvalue; /* for counters and relative scales */
|
||||
__s64 svalue; /* for 1/1000 dB measures */
|
||||
};
|
||||
} __packed;
|
||||
</programlisting>
|
||||
</section>
|
||||
<section id="dtv-fe-stats">
|
||||
<title>DTV stats type</title>
|
||||
<programlisting>
|
||||
#define MAX_DTV_STATS 4
|
||||
|
||||
struct dtv_fe_stats {
|
||||
__u8 len;
|
||||
struct dtv_stats stat[MAX_DTV_STATS];
|
||||
} __packed;
|
||||
</programlisting>
|
||||
</section>
|
||||
|
||||
<section id="dtv-property">
|
||||
<title>DTV property type</title>
|
||||
<programlisting>
|
||||
/* Reserved fields should be set to 0 */
|
||||
|
||||
struct dtv_property {
|
||||
__u32 cmd;
|
||||
__u32 reserved[3];
|
||||
union {
|
||||
__u32 data;
|
||||
struct dtv_fe_stats st;
|
||||
struct {
|
||||
__u8 data[32];
|
||||
__u32 len;
|
||||
@ -440,7 +467,7 @@ typedef enum fe_delivery_system {
|
||||
<title><constant>DTV-ISDBT-LAYER*</constant> parameters</title>
|
||||
<para>ISDB-T channels can be coded hierarchically. As opposed to DVB-T in
|
||||
ISDB-T hierarchical layers can be decoded simultaneously. For that
|
||||
reason a ISDB-T demodulator has 3 viterbi and 3 reed-solomon-decoders.</para>
|
||||
reason a ISDB-T demodulator has 3 Viterbi and 3 Reed-Solomon decoders.</para>
|
||||
<para>ISDB-T has 3 hierarchical layers which each can use a part of the
|
||||
available segments. The total number of segments over all layers has
|
||||
to 13 in ISDB-T.</para>
|
||||
@ -850,6 +877,147 @@ enum fe_interleaving {
|
||||
<para>use the special macro LNA_AUTO to set LNA auto</para>
|
||||
</section>
|
||||
</section>
|
||||
|
||||
<section id="frontend-stat-properties">
|
||||
<title>Frontend statistics indicators</title>
|
||||
<para>The values are returned via <constant>dtv_property.stat</constant>.
|
||||
If the property is supported, <constant>dtv_property.stat.len</constant> is bigger than zero.</para>
|
||||
<para>For most delivery systems, <constant>dtv_property.stat.len</constant>
|
||||
will be 1 if the stats is supported, and the properties will
|
||||
return a single value for each parameter.</para>
|
||||
<para>It should be noticed, however, that new OFDM delivery systems
|
||||
like ISDB can use different modulation types for each group of
|
||||
carriers. On such standards, up to 3 groups of statistics can be
|
||||
provided, and <constant>dtv_property.stat.len</constant> is updated
|
||||
to reflect the "global" metrics, plus one metric per each carrier
|
||||
group (called "layer" on ISDB).</para>
|
||||
<para>So, in order to be consistent with other delivery systems, the first
|
||||
value at <link linkend="dtv-stats"><constant>dtv_property.stat.dtv_stats</constant></link>
|
||||
array refers to the global metric. The other elements of the array
|
||||
represent each layer, starting from layer A(index 1),
|
||||
layer B (index 2) and so on.</para>
|
||||
<para>The number of filled elements are stored at <constant>dtv_property.stat.len</constant>.</para>
|
||||
<para>Each element of the <constant>dtv_property.stat.dtv_stats</constant> array consists on two elements:</para>
|
||||
<itemizedlist mark='opencircle'>
|
||||
<listitem><para><constant>svalue</constant> or <constant>uvalue</constant>, where
|
||||
<constant>svalue</constant> is for signed values of the measure (dB measures)
|
||||
and <constant>uvalue</constant> is for unsigned values (counters, relative scale)</para></listitem>
|
||||
<listitem><para><constant>scale</constant> - Scale for the value. It can be:</para>
|
||||
<section id = "fecap-scale-params">
|
||||
<itemizedlist mark='bullet'>
|
||||
<listitem><para><constant>FE_SCALE_NOT_AVAILABLE</constant> - The parameter is supported by the frontend, but it was not possible to collect it (could be a transitory or permanent condition)</para></listitem>
|
||||
<listitem><para><constant>FE_SCALE_DECIBEL</constant> - parameter is a signed value, measured in 1/1000 dB</para></listitem>
|
||||
<listitem><para><constant>FE_SCALE_RELATIVE</constant> - parameter is a unsigned value, where 0 means 0% and 65535 means 100%.</para></listitem>
|
||||
<listitem><para><constant>FE_SCALE_COUNTER</constant> - parameter is a unsigned value that counts the occurrence of an event, like bit error, block error, or lapsed time.</para></listitem>
|
||||
</itemizedlist>
|
||||
</section>
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
<section id="DTV-STAT-SIGNAL-STRENGTH">
|
||||
<title><constant>DTV_STAT_SIGNAL_STRENGTH</constant></title>
|
||||
<para>Indicates the signal strength level at the analog part of the tuner or of the demod.</para>
|
||||
<para>Possible scales for this metric are:</para>
|
||||
<itemizedlist mark='bullet'>
|
||||
<listitem><constant>FE_SCALE_NOT_AVAILABLE</constant> - it failed to measure it, or the measurement was not complete yet.</listitem>
|
||||
<listitem><constant>FE_SCALE_DECIBEL</constant> - signal strength is in 0.0001 dBm units, power measured in miliwatts. This value is generally negative.</listitem>
|
||||
<listitem><constant>FE_SCALE_RELATIVE</constant> - The frontend provides a 0% to 100% measurement for power (actually, 0 to 65535).</listitem>
|
||||
</itemizedlist>
|
||||
</section>
|
||||
<section id="DTV-STAT-CNR">
|
||||
<title><constant>DTV_STAT_CNR</constant></title>
|
||||
<para>Indicates the Signal to Noise ratio for the main carrier.</para>
|
||||
<para>Possible scales for this metric are:</para>
|
||||
<itemizedlist mark='bullet'>
|
||||
<listitem><constant>FE_SCALE_NOT_AVAILABLE</constant> - it failed to measure it, or the measurement was not complete yet.</listitem>
|
||||
<listitem><constant>FE_SCALE_DECIBEL</constant> - Signal/Noise ratio is in 0.0001 dB units.</listitem>
|
||||
<listitem><constant>FE_SCALE_RELATIVE</constant> - The frontend provides a 0% to 100% measurement for Signal/Noise (actually, 0 to 65535).</listitem>
|
||||
</itemizedlist>
|
||||
</section>
|
||||
<section id="DTV-STAT-PRE-ERROR-BIT-COUNT">
|
||||
<title><constant>DTV_STAT_PRE_ERROR_BIT_COUNT</constant></title>
|
||||
<para>Measures the number of bit errors before the forward error correction (FEC) on the inner coding block (before Viterbi, LDPC or other inner code).</para>
|
||||
<para>This measure is taken during the same interval as <constant>DTV_STAT_PRE_TOTAL_BIT_COUNT</constant>.</para>
|
||||
<para>In order to get the BER (Bit Error Rate) measurement, it should be divided by
|
||||
<link linkend="DTV-STAT-PRE-TOTAL-BIT-COUNT"><constant>DTV_STAT_PRE_TOTAL_BIT_COUNT</constant></link>.</para>
|
||||
<para>This measurement is monotonically increased, as the frontend gets more bit count measurements.
|
||||
The frontend may reset it when a channel/transponder is tuned.</para>
|
||||
<para>Possible scales for this metric are:</para>
|
||||
<itemizedlist mark='bullet'>
|
||||
<listitem><constant>FE_SCALE_NOT_AVAILABLE</constant> - it failed to measure it, or the measurement was not complete yet.</listitem>
|
||||
<listitem><constant>FE_SCALE_COUNTER</constant> - Number of error bits counted before the inner coding.</listitem>
|
||||
</itemizedlist>
|
||||
</section>
|
||||
<section id="DTV-STAT-PRE-TOTAL-BIT-COUNT">
|
||||
<title><constant>DTV_STAT_PRE_TOTAL_BIT_COUNT</constant></title>
|
||||
<para>Measures the amount of bits received before the inner code block, during the same period as
|
||||
<link linkend="DTV-STAT-PRE-ERROR-BIT-COUNT"><constant>DTV_STAT_PRE_ERROR_BIT_COUNT</constant></link> measurement was taken.</para>
|
||||
<para>It should be noticed that this measurement can be smaller than the total amount of bits on the transport stream,
|
||||
as the frontend may need to manually restart the measurement, loosing some data between each measurement interval.</para>
|
||||
<para>This measurement is monotonically increased, as the frontend gets more bit count measurements.
|
||||
The frontend may reset it when a channel/transponder is tuned.</para>
|
||||
<para>Possible scales for this metric are:</para>
|
||||
<itemizedlist mark='bullet'>
|
||||
<listitem><constant>FE_SCALE_NOT_AVAILABLE</constant> - it failed to measure it, or the measurement was not complete yet.</listitem>
|
||||
<listitem><constant>FE_SCALE_COUNTER</constant> - Number of bits counted while measuring
|
||||
<link linkend="DTV-STAT-PRE-ERROR-BIT-COUNT"><constant>DTV_STAT_PRE_ERROR_BIT_COUNT</constant></link>.</listitem>
|
||||
</itemizedlist>
|
||||
</section>
|
||||
<section id="DTV-STAT-POST-ERROR-BIT-COUNT">
|
||||
<title><constant>DTV_STAT_POST_ERROR_BIT_COUNT</constant></title>
|
||||
<para>Measures the number of bit errors after the forward error correction (FEC) done by inner code block (after Viterbi, LDPC or other inner code).</para>
|
||||
<para>This measure is taken during the same interval as <constant>DTV_STAT_POST_TOTAL_BIT_COUNT</constant>.</para>
|
||||
<para>In order to get the BER (Bit Error Rate) measurement, it should be divided by
|
||||
<link linkend="DTV-STAT-POST-TOTAL-BIT-COUNT"><constant>DTV_STAT_POST_TOTAL_BIT_COUNT</constant></link>.</para>
|
||||
<para>This measurement is monotonically increased, as the frontend gets more bit count measurements.
|
||||
The frontend may reset it when a channel/transponder is tuned.</para>
|
||||
<para>Possible scales for this metric are:</para>
|
||||
<itemizedlist mark='bullet'>
|
||||
<listitem><constant>FE_SCALE_NOT_AVAILABLE</constant> - it failed to measure it, or the measurement was not complete yet.</listitem>
|
||||
<listitem><constant>FE_SCALE_COUNTER</constant> - Number of error bits counted after the inner coding.</listitem>
|
||||
</itemizedlist>
|
||||
</section>
|
||||
<section id="DTV-STAT-POST-TOTAL-BIT-COUNT">
|
||||
<title><constant>DTV_STAT_POST_TOTAL_BIT_COUNT</constant></title>
|
||||
<para>Measures the amount of bits received after the inner coding, during the same period as
|
||||
<link linkend="DTV-STAT-POST-ERROR-BIT-COUNT"><constant>DTV_STAT_POST_ERROR_BIT_COUNT</constant></link> measurement was taken.</para>
|
||||
<para>It should be noticed that this measurement can be smaller than the total amount of bits on the transport stream,
|
||||
as the frontend may need to manually restart the measurement, loosing some data between each measurement interval.</para>
|
||||
<para>This measurement is monotonically increased, as the frontend gets more bit count measurements.
|
||||
The frontend may reset it when a channel/transponder is tuned.</para>
|
||||
<para>Possible scales for this metric are:</para>
|
||||
<itemizedlist mark='bullet'>
|
||||
<listitem><constant>FE_SCALE_NOT_AVAILABLE</constant> - it failed to measure it, or the measurement was not complete yet.</listitem>
|
||||
<listitem><constant>FE_SCALE_COUNTER</constant> - Number of bits counted while measuring
|
||||
<link linkend="DTV-STAT-POST-ERROR-BIT-COUNT"><constant>DTV_STAT_POST_ERROR_BIT_COUNT</constant></link>.</listitem>
|
||||
</itemizedlist>
|
||||
</section>
|
||||
<section id="DTV-STAT-ERROR-BLOCK-COUNT">
|
||||
<title><constant>DTV_STAT_ERROR_BLOCK_COUNT</constant></title>
|
||||
<para>Measures the number of block errors after the outer forward error correction coding (after Reed-Solomon or other outer code).</para>
|
||||
<para>This measurement is monotonically increased, as the frontend gets more bit count measurements.
|
||||
The frontend may reset it when a channel/transponder is tuned.</para>
|
||||
<para>Possible scales for this metric are:</para>
|
||||
<itemizedlist mark='bullet'>
|
||||
<listitem><constant>FE_SCALE_NOT_AVAILABLE</constant> - it failed to measure it, or the measurement was not complete yet.</listitem>
|
||||
<listitem><constant>FE_SCALE_COUNTER</constant> - Number of error blocks counted after the outer coding.</listitem>
|
||||
</itemizedlist>
|
||||
</section>
|
||||
<section id="DTV-STAT-TOTAL-BLOCK-COUNT">
|
||||
<title><constant>DTV-STAT_TOTAL_BLOCK_COUNT</constant></title>
|
||||
<para>Measures the total number of blocks received during the same period as
|
||||
<link linkend="DTV-STAT-ERROR-BLOCK-COUNT"><constant>DTV_STAT_ERROR_BLOCK_COUNT</constant></link> measurement was taken.</para>
|
||||
<para>It can be used to calculate the PER indicator, by dividing
|
||||
<link linkend="DTV-STAT-ERROR-BLOCK-COUNT"><constant>DTV_STAT_ERROR_BLOCK_COUNT</constant></link>
|
||||
by <link linkend="DTV-STAT-TOTAL-BLOCK-COUNT"><constant>DTV-STAT-TOTAL-BLOCK-COUNT</constant></link>.</para>
|
||||
<para>Possible scales for this metric are:</para>
|
||||
<itemizedlist mark='bullet'>
|
||||
<listitem><constant>FE_SCALE_NOT_AVAILABLE</constant> - it failed to measure it, or the measurement was not complete yet.</listitem>
|
||||
<listitem><constant>FE_SCALE_COUNTER</constant> - Number of blocks counted while measuring
|
||||
<link linkend="DTV-STAT-ERROR-BLOCK-COUNT"><constant>DTV_STAT_ERROR_BLOCK_COUNT</constant></link>.</listitem>
|
||||
</itemizedlist>
|
||||
</section>
|
||||
</section>
|
||||
|
||||
<section id="frontend-property-terrestrial-systems">
|
||||
<title>Properties used on terrestrial delivery systems</title>
|
||||
<section id="dvbt-params">
|
||||
@ -871,6 +1039,7 @@ enum fe_interleaving {
|
||||
<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>
|
||||
<para>In addition, the <link linkend="frontend-stat-properties">DTV QoS statistics</link> are also valid.</para>
|
||||
</section>
|
||||
<section id="dvbt2-params">
|
||||
<title>DVB-T2 delivery system</title>
|
||||
@ -895,6 +1064,7 @@ enum fe_interleaving {
|
||||
<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>
|
||||
<para>In addition, the <link linkend="frontend-stat-properties">DTV QoS statistics</link> are also valid.</para>
|
||||
</section>
|
||||
<section id="isdbt">
|
||||
<title>ISDB-T delivery system</title>
|
||||
@ -948,6 +1118,7 @@ enum fe_interleaving {
|
||||
<listitem><para><link linkend="DTV-ISDBT-LAYER-SEGMENT-COUNT"><constant>DTV_ISDBT_LAYERC_SEGMENT_COUNT</constant></link></para></listitem>
|
||||
<listitem><para><link linkend="DTV-ISDBT-LAYER-TIME-INTERLEAVING"><constant>DTV_ISDBT_LAYERC_TIME_INTERLEAVING</constant></link></para></listitem>
|
||||
</itemizedlist>
|
||||
<para>In addition, the <link linkend="frontend-stat-properties">DTV QoS statistics</link> are also valid.</para>
|
||||
</section>
|
||||
<section id="atsc-params">
|
||||
<title>ATSC delivery system</title>
|
||||
@ -961,6 +1132,7 @@ enum fe_interleaving {
|
||||
<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>
|
||||
</itemizedlist>
|
||||
<para>In addition, the <link linkend="frontend-stat-properties">DTV QoS statistics</link> are also valid.</para>
|
||||
</section>
|
||||
<section id="atscmh-params">
|
||||
<title>ATSC-MH delivery system</title>
|
||||
@ -988,6 +1160,7 @@ enum fe_interleaving {
|
||||
<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>
|
||||
<para>In addition, the <link linkend="frontend-stat-properties">DTV QoS statistics</link> are also valid.</para>
|
||||
</section>
|
||||
<section id="dtmb-params">
|
||||
<title>DTMB delivery system</title>
|
||||
@ -1007,6 +1180,7 @@ enum fe_interleaving {
|
||||
<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>
|
||||
<para>In addition, the <link linkend="frontend-stat-properties">DTV QoS statistics</link> are also valid.</para>
|
||||
</section>
|
||||
</section>
|
||||
<section id="frontend-property-cable-systems">
|
||||
@ -1028,6 +1202,7 @@ enum fe_interleaving {
|
||||
<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>
|
||||
<para>In addition, the <link linkend="frontend-stat-properties">DTV QoS statistics</link> are also valid.</para>
|
||||
</section>
|
||||
<section id="dvbc-annex-b-params">
|
||||
<title>DVB-C Annex B delivery system</title>
|
||||
@ -1043,6 +1218,7 @@ enum fe_interleaving {
|
||||
<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>
|
||||
<para>In addition, the <link linkend="frontend-stat-properties">DTV QoS statistics</link> are also valid.</para>
|
||||
</section>
|
||||
</section>
|
||||
<section id="frontend-property-satellital-systems">
|
||||
@ -1062,6 +1238,7 @@ enum fe_interleaving {
|
||||
<listitem><para><link linkend="DTV-VOLTAGE"><constant>DTV_VOLTAGE</constant></link></para></listitem>
|
||||
<listitem><para><link linkend="DTV-TONE"><constant>DTV_TONE</constant></link></para></listitem>
|
||||
</itemizedlist>
|
||||
<para>In addition, the <link linkend="frontend-stat-properties">DTV QoS statistics</link> are also valid.</para>
|
||||
<para>Future implementations might add those two missing parameters:</para>
|
||||
<itemizedlist mark='opencircle'>
|
||||
<listitem><para><link linkend="DTV-DISEQC-MASTER"><constant>DTV_DISEQC_MASTER</constant></link></para></listitem>
|
||||
@ -1077,6 +1254,7 @@ enum fe_interleaving {
|
||||
<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>
|
||||
<para>In addition, the <link linkend="frontend-stat-properties">DTV QoS statistics</link> are also valid.</para>
|
||||
</section>
|
||||
<section id="turbo-params">
|
||||
<title>Turbo code delivery system</title>
|
||||
|
@ -230,7 +230,7 @@ typedef enum fe_status {
|
||||
<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>
|
||||
<entry align="char">The frontend FEC inner coding (Viterbi, LDPC or other inner code) is stable</entry>
|
||||
</row><row>
|
||||
<entry align="char">FE_HAS_SYNC</entry>
|
||||
<entry align="char">Syncronization bytes was found</entry>
|
||||
|
@ -609,7 +609,7 @@ to zero and the <constant>VIDIOC_G_STD</constant>,
|
||||
<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
|
||||
|
@ -2477,6 +2477,22 @@ that used it. It was originally scheduled for removal in 2.6.35.
|
||||
</orderedlist>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<title>V4L2 in Linux 3.9</title>
|
||||
<orderedlist>
|
||||
<listitem>
|
||||
<para>Added timestamp types to
|
||||
<structfield>flags</structfield> field in
|
||||
<structname>v4l2_buffer</structname>. See <xref
|
||||
linkend="buffer-flags" />.</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>Added <constant>V4L2_EVENT_CTRL_CH_RANGE</constant> control event
|
||||
changes flag. See <xref linkend="changes-flags"/>.</para>
|
||||
</listitem>
|
||||
</orderedlist>
|
||||
</section>
|
||||
|
||||
<section id="other">
|
||||
<title>Relation of V4L2 to other Linux multimedia APIs</title>
|
||||
|
||||
|
@ -203,29 +203,6 @@ and should not be used in new drivers and applications.</entry>
|
||||
<entry>boolean</entry>
|
||||
<entry>Mirror the picture vertically.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><constant>V4L2_CID_HCENTER_DEPRECATED</constant> (formerly <constant>V4L2_CID_HCENTER</constant>)</entry>
|
||||
<entry>integer</entry>
|
||||
<entry>Horizontal image centering. This control is
|
||||
deprecated. New drivers and applications should use the <link
|
||||
linkend="camera-controls">Camera class controls</link>
|
||||
<constant>V4L2_CID_PAN_ABSOLUTE</constant>,
|
||||
<constant>V4L2_CID_PAN_RELATIVE</constant> and
|
||||
<constant>V4L2_CID_PAN_RESET</constant> instead.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><constant>V4L2_CID_VCENTER_DEPRECATED</constant>
|
||||
(formerly <constant>V4L2_CID_VCENTER</constant>)</entry>
|
||||
<entry>integer</entry>
|
||||
<entry>Vertical image centering. Centering is intended to
|
||||
<emphasis>physically</emphasis> adjust cameras. For image cropping see
|
||||
<xref linkend="crop" />, for clipping <xref linkend="overlay" />. This
|
||||
control is deprecated. New drivers and applications should use the
|
||||
<link linkend="camera-controls">Camera class controls</link>
|
||||
<constant>V4L2_CID_TILT_ABSOLUTE</constant>,
|
||||
<constant>V4L2_CID_TILT_RELATIVE</constant> and
|
||||
<constant>V4L2_CID_TILT_RESET</constant> instead.</entry>
|
||||
</row>
|
||||
<row id="v4l2-power-line-frequency">
|
||||
<entry><constant>V4L2_CID_POWER_LINE_FREQUENCY</constant></entry>
|
||||
<entry>enum</entry>
|
||||
|
@ -477,7 +477,7 @@ rest should be evident.</para>
|
||||
|
||||
<note>
|
||||
<title>Experimental</title>
|
||||
<para>This is an <link linkend="experimental"> experimental </link>
|
||||
<para>This is an <link linkend="experimental">experimental</link>
|
||||
interface and may change in the future.</para>
|
||||
</note>
|
||||
|
||||
@ -488,7 +488,7 @@ DMA buffer from userspace using a file descriptor previously exported for a
|
||||
different or the same device (known as the importer role), or both. This
|
||||
section describes the DMABUF importer role API in V4L2.</para>
|
||||
|
||||
<para>Refer to <link linked="vidioc-expbuf"> DMABUF exporting </link> for
|
||||
<para>Refer to <link linkend="vidioc-expbuf">DMABUF exporting</link> for
|
||||
details about exporting V4L2 buffers as DMABUF file descriptors.</para>
|
||||
|
||||
<para>Input and output devices support the streaming I/O method when the
|
||||
@ -741,17 +741,19 @@ applications when an output stream.</entry>
|
||||
<entry>struct timeval</entry>
|
||||
<entry><structfield>timestamp</structfield></entry>
|
||||
<entry></entry>
|
||||
<entry><para>For input streams this is the
|
||||
system time (as returned by the <function>gettimeofday()</function>
|
||||
function) when the first data byte was captured. For output streams
|
||||
the data will not be displayed before this time, secondary to the
|
||||
nominal frame rate determined by the current video standard in
|
||||
enqueued order. Applications can for example zero this field to
|
||||
display frames as soon as possible. The driver stores the time at
|
||||
which the first data byte was actually sent out in the
|
||||
<structfield>timestamp</structfield> field. This permits
|
||||
applications to monitor the drift between the video and system
|
||||
clock.</para></entry>
|
||||
<entry><para>For input streams this is time when the first data
|
||||
byte was captured, as returned by the
|
||||
<function>clock_gettime()</function> function for the relevant
|
||||
clock id; see <constant>V4L2_BUF_FLAG_TIMESTAMP_*</constant> in
|
||||
<xref linkend="buffer-flags" />. For output streams the data
|
||||
will not be displayed before this time, secondary to the nominal
|
||||
frame rate determined by the current video standard in enqueued
|
||||
order. Applications can for example zero this field to display
|
||||
frames as soon as possible. The driver stores the time at which
|
||||
the first data byte was actually sent out in the
|
||||
<structfield>timestamp</structfield> field. This permits
|
||||
applications to monitor the drift between the video and system
|
||||
clock.</para></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>&v4l2-timecode;</entry>
|
||||
@ -903,7 +905,7 @@ should set this to 0.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry></entry>
|
||||
<entry>__unsigned long</entry>
|
||||
<entry>unsigned long</entry>
|
||||
<entry><structfield>userptr</structfield></entry>
|
||||
<entry>When the memory type in the containing &v4l2-buffer; is
|
||||
<constant>V4L2_MEMORY_USERPTR</constant>, this is a userspace
|
||||
@ -1114,6 +1116,35 @@ Typically applications shall use this flag for output buffers if the data
|
||||
in this buffer has not been created by the CPU but by some DMA-capable unit,
|
||||
in which case caches have not been used.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><constant>V4L2_BUF_FLAG_TIMESTAMP_MASK</constant></entry>
|
||||
<entry>0xe000</entry>
|
||||
<entry>Mask for timestamp types below. To test the
|
||||
timestamp type, mask out bits not belonging to timestamp
|
||||
type by performing a logical and operation with buffer
|
||||
flags and timestamp mask.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><constant>V4L2_BUF_FLAG_TIMESTAMP_UNKNOWN</constant></entry>
|
||||
<entry>0x0000</entry>
|
||||
<entry>Unknown timestamp type. This type is used by
|
||||
drivers before Linux 3.9 and may be either monotonic (see
|
||||
below) or realtime (wall clock). Monotonic clock has been
|
||||
favoured in embedded systems whereas most of the drivers
|
||||
use the realtime clock. Either kinds of timestamps are
|
||||
available in user space via
|
||||
<function>clock_gettime(2)</function> using clock IDs
|
||||
<constant>CLOCK_MONOTONIC</constant> and
|
||||
<constant>CLOCK_REALTIME</constant>, respectively.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><constant>V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC</constant></entry>
|
||||
<entry>0x2000</entry>
|
||||
<entry>The buffer timestamp has been taken from the
|
||||
<constant>CLOCK_MONOTONIC</constant> clock. To access the
|
||||
same clock outside V4L2, use
|
||||
<function>clock_gettime(2)</function> .</entry>
|
||||
</row>
|
||||
</tbody>
|
||||
</tgroup>
|
||||
</table>
|
||||
|
@ -6,7 +6,7 @@
|
||||
<refnamediv>
|
||||
<refname id="V4L2-PIX-FMT-NV12M"><constant>V4L2_PIX_FMT_NV12M</constant></refname>
|
||||
<refname id="V4L2-PIX-FMT-NV21M"><constant>V4L2_PIX_FMT_NV21M</constant></refname>
|
||||
<refname id="V4L2-PIX-FMT-NV12MT_16X16"><constant>V4L2_PIX_FMT_NV12MT_16X16</constant></refname>
|
||||
<refname id="V4L2-PIX-FMT-NV12MT-16X16"><constant>V4L2_PIX_FMT_NV12MT_16X16</constant></refname>
|
||||
<refpurpose>Variation of <constant>V4L2_PIX_FMT_NV12</constant> and <constant>V4L2_PIX_FMT_NV21</constant> with planes
|
||||
non contiguous in memory. </refpurpose>
|
||||
</refnamediv>
|
||||
|
34
Documentation/DocBook/media/v4l/pixfmt-srggb10alaw8.xml
Normal file
34
Documentation/DocBook/media/v4l/pixfmt-srggb10alaw8.xml
Normal file
@ -0,0 +1,34 @@
|
||||
<refentry>
|
||||
<refmeta>
|
||||
<refentrytitle>
|
||||
V4L2_PIX_FMT_SBGGR10ALAW8 ('aBA8'),
|
||||
V4L2_PIX_FMT_SGBRG10ALAW8 ('aGA8'),
|
||||
V4L2_PIX_FMT_SGRBG10ALAW8 ('agA8'),
|
||||
V4L2_PIX_FMT_SRGGB10ALAW8 ('aRA8'),
|
||||
</refentrytitle>
|
||||
&manvol;
|
||||
</refmeta>
|
||||
<refnamediv>
|
||||
<refname id="V4L2-PIX-FMT-SBGGR10ALAW8">
|
||||
<constant>V4L2_PIX_FMT_SBGGR10ALAW8</constant>
|
||||
</refname>
|
||||
<refname id="V4L2-PIX-FMT-SGBRG10ALAW8">
|
||||
<constant>V4L2_PIX_FMT_SGBRG10ALAW8</constant>
|
||||
</refname>
|
||||
<refname id="V4L2-PIX-FMT-SGRBG10ALAW8">
|
||||
<constant>V4L2_PIX_FMT_SGRBG10ALAW8</constant>
|
||||
</refname>
|
||||
<refname id="V4L2-PIX-FMT-SRGGB10ALAW8">
|
||||
<constant>V4L2_PIX_FMT_SRGGB10ALAW8</constant>
|
||||
</refname>
|
||||
<refpurpose>10-bit Bayer formats compressed to 8 bits</refpurpose>
|
||||
</refnamediv>
|
||||
<refsect1>
|
||||
<title>Description</title>
|
||||
<para>The following four pixel formats are raw sRGB / Bayer
|
||||
formats with 10 bits per color compressed to 8 bits each,
|
||||
using the A-LAW algorithm. Each color component consumes 8
|
||||
bits of memory. In other respects this format is similar to
|
||||
<xref linkend="V4L2-PIX-FMT-SRGGB8"></xref>.</para>
|
||||
</refsect1>
|
||||
</refentry>
|
62
Documentation/DocBook/media/v4l/pixfmt-uv8.xml
Normal file
62
Documentation/DocBook/media/v4l/pixfmt-uv8.xml
Normal file
@ -0,0 +1,62 @@
|
||||
<refentry id="V4L2-PIX-FMT-UV8">
|
||||
<refmeta>
|
||||
<refentrytitle>V4L2_PIX_FMT_UV8 ('UV8')</refentrytitle>
|
||||
&manvol;
|
||||
</refmeta>
|
||||
<refnamediv>
|
||||
<refname><constant>V4L2_PIX_FMT_UV8</constant></refname>
|
||||
<refpurpose>UV plane interleaved</refpurpose>
|
||||
</refnamediv>
|
||||
<refsect1>
|
||||
<title>Description</title>
|
||||
<para>In this format there is no Y plane, Only CbCr plane. ie
|
||||
(UV interleaved)</para>
|
||||
<example>
|
||||
<title>
|
||||
<constant>V4L2_PIX_FMT_UV8</constant>
|
||||
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>start + 0:</entry>
|
||||
<entry>Cb<subscript>00</subscript></entry>
|
||||
<entry>Cr<subscript>00</subscript></entry>
|
||||
<entry>Cb<subscript>01</subscript></entry>
|
||||
<entry>Cr<subscript>01</subscript></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>start + 4:</entry>
|
||||
<entry>Cb<subscript>10</subscript></entry>
|
||||
<entry>Cr<subscript>10</subscript></entry>
|
||||
<entry>Cb<subscript>11</subscript></entry>
|
||||
<entry>Cr<subscript>11</subscript></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>start + 8:</entry>
|
||||
<entry>Cb<subscript>20</subscript></entry>
|
||||
<entry>Cr<subscript>20</subscript></entry>
|
||||
<entry>Cb<subscript>21</subscript></entry>
|
||||
<entry>Cr<subscript>21</subscript></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>start + 12:</entry>
|
||||
<entry>Cb<subscript>30</subscript></entry>
|
||||
<entry>Cr<subscript>30</subscript></entry>
|
||||
<entry>Cb<subscript>31</subscript></entry>
|
||||
<entry>Cr<subscript>31</subscript></entry>
|
||||
</row>
|
||||
</tbody>
|
||||
</tgroup>
|
||||
</informaltable>
|
||||
</para>
|
||||
</formalpara>
|
||||
</example>
|
||||
</refsect1>
|
||||
</refentry>
|
@ -673,6 +673,7 @@ access the palette, this must be done with ioctls of the Linux framebuffer API.<
|
||||
&sub-srggb8;
|
||||
&sub-sbggr16;
|
||||
&sub-srggb10;
|
||||
&sub-srggb10alaw8;
|
||||
&sub-srggb10dpcm8;
|
||||
&sub-srggb12;
|
||||
</section>
|
||||
@ -701,6 +702,7 @@ information.</para>
|
||||
&sub-y12;
|
||||
&sub-y10b;
|
||||
&sub-y16;
|
||||
&sub-uv8;
|
||||
&sub-yuyv;
|
||||
&sub-uyvy;
|
||||
&sub-yvyu;
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -139,6 +139,16 @@ structs, ioctls) must be noted in more detail in the history chapter
|
||||
(compat.xml), along with the possible impact on existing drivers and
|
||||
applications. -->
|
||||
|
||||
<revision>
|
||||
<revnumber>3.9</revnumber>
|
||||
<date>2012-12-03</date>
|
||||
<authorinitials>sa, sn</authorinitials>
|
||||
<revremark>Added timestamp types to v4l2_buffer.
|
||||
Added <constant>V4L2_EVENT_CTRL_CH_RANGE</constant> control
|
||||
event changes flag, see <xref linkend="changes-flags"/>.
|
||||
</revremark>
|
||||
</revision>
|
||||
|
||||
<revision>
|
||||
<revnumber>3.6</revnumber>
|
||||
<date>2012-07-02</date>
|
||||
@ -472,7 +482,7 @@ and discussions on the V4L mailing list.</revremark>
|
||||
</partinfo>
|
||||
|
||||
<title>Video for Linux Two API Specification</title>
|
||||
<subtitle>Revision 3.6</subtitle>
|
||||
<subtitle>Revision 3.9</subtitle>
|
||||
|
||||
<chapter id="common">
|
||||
&sub-common;
|
||||
|
@ -261,6 +261,12 @@
|
||||
<entry>This control event was triggered because the control flags
|
||||
changed.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><constant>V4L2_EVENT_CTRL_CH_RANGE</constant></entry>
|
||||
<entry>0x0004</entry>
|
||||
<entry>This control event was triggered because the minimum,
|
||||
maximum, step or the default value of the control changed.</entry>
|
||||
</row>
|
||||
</tbody>
|
||||
</tgroup>
|
||||
</table>
|
||||
|
@ -83,15 +83,14 @@ descriptor. The application may pass it to other DMABUF-aware devices. Refer to
|
||||
<link linkend="dmabuf">DMABUF importing</link> for details about importing
|
||||
DMABUF files into V4L2 nodes. It is recommended to close a DMABUF file when it
|
||||
is no longer used to allow the associated memory to be reclaimed. </para>
|
||||
|
||||
</refsect1>
|
||||
<refsect1>
|
||||
<section>
|
||||
<title>Examples</title>
|
||||
|
||||
<example>
|
||||
<title>Exporting a buffer.</title>
|
||||
<programlisting>
|
||||
<refsect1>
|
||||
<title>Examples</title>
|
||||
|
||||
<example>
|
||||
<title>Exporting a buffer.</title>
|
||||
<programlisting>
|
||||
int buffer_export(int v4lfd, &v4l2-buf-type; bt, int index, int *dmafd)
|
||||
{
|
||||
&v4l2-exportbuffer; expbuf;
|
||||
@ -108,12 +107,12 @@ int buffer_export(int v4lfd, &v4l2-buf-type; bt, int index, int *dmafd)
|
||||
|
||||
return 0;
|
||||
}
|
||||
</programlisting>
|
||||
</example>
|
||||
</programlisting>
|
||||
</example>
|
||||
|
||||
<example>
|
||||
<title>Exporting a buffer using the multi-planar API.</title>
|
||||
<programlisting>
|
||||
<example>
|
||||
<title>Exporting a buffer using the multi-planar API.</title>
|
||||
<programlisting>
|
||||
int buffer_export_mp(int v4lfd, &v4l2-buf-type; bt, int index,
|
||||
int dmafd[], int n_planes)
|
||||
{
|
||||
@ -137,12 +136,9 @@ int buffer_export_mp(int v4lfd, &v4l2-buf-type; bt, int index,
|
||||
|
||||
return 0;
|
||||
}
|
||||
</programlisting>
|
||||
</example>
|
||||
</section>
|
||||
</refsect1>
|
||||
</programlisting>
|
||||
</example>
|
||||
|
||||
<refsect1>
|
||||
<table pgwide="1" frame="none" id="v4l2-exportbuffer">
|
||||
<title>struct <structname>v4l2_exportbuffer</structname></title>
|
||||
<tgroup cols="3">
|
||||
|
@ -64,7 +64,9 @@ return an &EINVAL;. When the <structfield>value</structfield> is out
|
||||
of bounds drivers can choose to take the closest valid value or return
|
||||
an &ERANGE;, whatever seems more appropriate. However,
|
||||
<constant>VIDIOC_S_CTRL</constant> is a write-only ioctl, it does not
|
||||
return the actual new value.</para>
|
||||
return the actual new value. If the <structfield>value</structfield>
|
||||
is inappropriate for the control (e.g. if it refers to an unsupported
|
||||
menu index of a menu control), then &EINVAL; is returned as well.</para>
|
||||
|
||||
<para>These ioctls work only with user controls. For other
|
||||
control classes the &VIDIOC-G-EXT-CTRLS;, &VIDIOC-S-EXT-CTRLS; or
|
||||
@ -99,7 +101,9 @@ application.</entry>
|
||||
<term><errorcode>EINVAL</errorcode></term>
|
||||
<listitem>
|
||||
<para>The &v4l2-control; <structfield>id</structfield> is
|
||||
invalid.</para>
|
||||
invalid or the <structfield>value</structfield> is inappropriate for
|
||||
the given control (i.e. if a menu item is selected that is not supported
|
||||
by the driver according to &VIDIOC-QUERYMENU;).</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
|
@ -106,7 +106,9 @@ value or if an error is returned.</para>
|
||||
&EINVAL;. When the value is out of bounds drivers can choose to take
|
||||
the closest valid value or return an &ERANGE;, whatever seems more
|
||||
appropriate. In the first case the new value is set in
|
||||
&v4l2-ext-control;.</para>
|
||||
&v4l2-ext-control;. If the new control value is inappropriate (e.g. the
|
||||
given menu index is not supported by the menu control), then this will
|
||||
also result in an &EINVAL; error.</para>
|
||||
|
||||
<para>The driver will only set/get these controls if all control
|
||||
values are correct. This prevents the situation where only some of the
|
||||
@ -199,13 +201,46 @@ also be zero.</entry>
|
||||
<row>
|
||||
<entry>__u32</entry>
|
||||
<entry><structfield>error_idx</structfield></entry>
|
||||
<entry>Set by the driver in case of an error. If it is equal
|
||||
to <structfield>count</structfield>, then no actual changes were made to
|
||||
controls. In other words, the error was not associated with setting a particular
|
||||
control. If it is another value, then only the controls up to <structfield>error_idx-1</structfield>
|
||||
were modified and control <structfield>error_idx</structfield> is the one that
|
||||
caused the error. The <structfield>error_idx</structfield> value is undefined
|
||||
if the ioctl returned 0 (success).</entry>
|
||||
<entry><para>Set by the driver in case of an error. If the error is
|
||||
associated with a particular control, then <structfield>error_idx</structfield>
|
||||
is set to the index of that control. If the error is not related to a specific
|
||||
control, or the validation step failed (see below), then
|
||||
<structfield>error_idx</structfield> is set to <structfield>count</structfield>.
|
||||
The value is undefined if the ioctl returned 0 (success).</para>
|
||||
|
||||
<para>Before controls are read from/written to hardware a validation step
|
||||
takes place: this checks if all controls in the list are valid controls,
|
||||
if no attempt is made to write to a read-only control or read from a write-only
|
||||
control, and any other up-front checks that can be done without accessing the
|
||||
hardware. The exact validations done during this step are driver dependent
|
||||
since some checks might require hardware access for some devices, thus making
|
||||
it impossible to do those checks up-front. However, drivers should make a
|
||||
best-effort to do as many up-front checks as possible.</para>
|
||||
|
||||
<para>This check is done to avoid leaving the hardware in an inconsistent state due
|
||||
to easy-to-avoid problems. But it leads to another problem: the application needs to
|
||||
know whether an error came from the validation step (meaning that the hardware
|
||||
was not touched) or from an error during the actual reading from/writing to hardware.</para>
|
||||
|
||||
<para>The, in hindsight quite poor, solution for that is to set <structfield>error_idx</structfield>
|
||||
to <structfield>count</structfield> if the validation failed. This has the
|
||||
unfortunate side-effect that it is not possible to see which control failed the
|
||||
validation. If the validation was successful and the error happened while
|
||||
accessing the hardware, then <structfield>error_idx</structfield> is less than
|
||||
<structfield>count</structfield> and only the controls up to
|
||||
<structfield>error_idx-1</structfield> were read or written correctly, and the
|
||||
state of the remaining controls is undefined.</para>
|
||||
|
||||
<para>Since <constant>VIDIOC_TRY_EXT_CTRLS</constant> does not access hardware
|
||||
there is also no need to handle the validation step in this special way,
|
||||
so <structfield>error_idx</structfield> will just be set to the control that
|
||||
failed the validation step instead of to <structfield>count</structfield>.
|
||||
This means that if <constant>VIDIOC_S_EXT_CTRLS</constant> fails with
|
||||
<structfield>error_idx</structfield> set to <structfield>count</structfield>,
|
||||
then you can call <constant>VIDIOC_TRY_EXT_CTRLS</constant> to try to discover
|
||||
the actual control that failed the validation step. Unfortunately, there
|
||||
is no <constant>TRY</constant> equivalent for <constant>VIDIOC_G_EXT_CTRLS</constant>.
|
||||
</para></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>__u32</entry>
|
||||
@ -298,8 +333,10 @@ These controls are described in <xref
|
||||
<term><errorcode>EINVAL</errorcode></term>
|
||||
<listitem>
|
||||
<para>The &v4l2-ext-control; <structfield>id</structfield>
|
||||
is invalid or the &v4l2-ext-controls;
|
||||
<structfield>ctrl_class</structfield> is invalid. This error code is
|
||||
is invalid, the &v4l2-ext-controls;
|
||||
<structfield>ctrl_class</structfield> is invalid, or the &v4l2-ext-control;
|
||||
<structfield>value</structfield> was inappropriate (e.g. the given menu
|
||||
index is not supported by the driver). This error code is
|
||||
also returned by the <constant>VIDIOC_S_EXT_CTRLS</constant> and
|
||||
<constant>VIDIOC_TRY_EXT_CTRLS</constant> ioctls if two or more
|
||||
control values are in conflict.</para>
|
||||
|
@ -76,7 +76,7 @@ make sure the strings are properly NUL-terminated.</para></entry>
|
||||
<row>
|
||||
<entry>__u8</entry>
|
||||
<entry><structfield>card</structfield>[32]</entry>
|
||||
<entry>Name of the device, a NUL-terminated ASCII string.
|
||||
<entry>Name of the device, a NUL-terminated UTF-8 string.
|
||||
For example: "Yoyodyne TV/FM". One driver may support different brands
|
||||
or models of video hardware. This information is intended for users,
|
||||
for example in a menu of available devices. Since multiple TV cards of
|
||||
|
@ -22,6 +22,7 @@
|
||||
|
||||
<!-- LinuxTV v4l-dvb repository. -->
|
||||
<!ENTITY v4l-dvb "<ulink url='http://linuxtv.org/repo/'>http://linuxtv.org/repo/</ulink>">
|
||||
<!ENTITY dash-ent-10 "<entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry>">
|
||||
]>
|
||||
|
||||
<book id="media_api">
|
||||
|
16
Documentation/devicetree/bindings/media/gpio-ir-receiver.txt
Normal file
16
Documentation/devicetree/bindings/media/gpio-ir-receiver.txt
Normal file
@ -0,0 +1,16 @@
|
||||
Device-Tree bindings for GPIO IR receiver
|
||||
|
||||
Required properties:
|
||||
- compatible: should be "gpio-ir-receiver".
|
||||
- gpios: specifies GPIO used for IR signal reception.
|
||||
|
||||
Optional properties:
|
||||
- linux,rc-map-name: Linux specific remote control map name.
|
||||
|
||||
Example node:
|
||||
|
||||
ir: ir-receiver {
|
||||
compatible = "gpio-ir-receiver";
|
||||
gpios = <&gpio0 19 1>;
|
||||
linux,rc-map-name = "rc-rc6-mce";
|
||||
};
|
@ -23,7 +23,7 @@ use IO::Handle;
|
||||
|
||||
@components = ( "sp8870", "sp887x", "tda10045", "tda10046",
|
||||
"tda10046lifeview", "av7110", "dec2000t", "dec2540t",
|
||||
"dec3000s", "vp7041", "dibusb", "nxt2002", "nxt2004",
|
||||
"dec3000s", "vp7041", "vp7049", "dibusb", "nxt2002", "nxt2004",
|
||||
"or51211", "or51132_qam", "or51132_vsb", "bluebird",
|
||||
"opera1", "cx231xx", "cx18", "cx23885", "pvrusb2", "mpc718",
|
||||
"af9015", "ngene", "az6027", "lme2510_lg", "lme2510c_s7395",
|
||||
@ -289,6 +289,19 @@ sub vp7041 {
|
||||
$outfile;
|
||||
}
|
||||
|
||||
sub vp7049 {
|
||||
my $fwfile = "dvb-usb-vp7049-0.95.fw";
|
||||
my $url = "http://ao2.it/sites/default/files/blog/2012/11/06/linux-support-digicom-digitune-s-vp7049-udtt7049/$fwfile";
|
||||
my $hash = "5609fd295168aea88b25ff43a6f79c36";
|
||||
|
||||
checkstandard();
|
||||
|
||||
wgetfile($fwfile, $url);
|
||||
verify($fwfile, $hash);
|
||||
|
||||
$fwfile;
|
||||
}
|
||||
|
||||
sub dibusb {
|
||||
my $url = "http://www.linuxtv.org/downloads/firmware/dvb-usb-dibusb-5.0.0.11.fw";
|
||||
my $outfile = "dvb-dibusb-5.0.0.11.fw";
|
||||
@ -677,7 +690,7 @@ sub drxk_terratec_h5 {
|
||||
}
|
||||
|
||||
sub drxk_terratec_htc_stick {
|
||||
my $url = "http://ftp.terratec.de/Receiver/Cinergy_HTC_Stick/Updates/";
|
||||
my $url = "http://ftp.terratec.de/Receiver/Cinergy_HTC_Stick/Updates/History/";
|
||||
my $zipfile = "Cinergy_HTC_Stick_Drv_5.09.1202.00_XP_Vista_7.exe";
|
||||
my $hash = "6722a2442a05423b781721fbc069ed5e";
|
||||
my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 0);
|
||||
|
@ -336,7 +336,7 @@ Calls to media_entity_pipeline_start() can be nested. The pipeline pointer must
|
||||
be identical for all nested calls to the function.
|
||||
|
||||
media_entity_pipeline_start() may return an error. In that case, it will
|
||||
clean up any the changes it did by itself.
|
||||
clean up any of the changes it did by itself.
|
||||
|
||||
When stopping the stream, drivers must notify the entities with
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
0 -> Unknown board (au0828)
|
||||
1 -> Hauppauge HVR950Q (au0828) [2040:7200,2040:7210,2040:7217,2040:721b,2040:721e,2040:721f,2040:7280,0fd9:0008,2040:7260,2040:7213]
|
||||
1 -> Hauppauge HVR950Q (au0828) [2040:7200,2040:7210,2040:7217,2040:721b,2040:721e,2040:721f,2040:7280,0fd9:0008,2040:7260,2040:7213,2040:7270]
|
||||
2 -> Hauppauge HVR850 (au0828) [2040:7240]
|
||||
3 -> DViCO FusionHDTV USB (au0828) [0fe9:d620]
|
||||
4 -> Hauppauge HVR950Q rev xxF8 (au0828) [2040:7201,2040:7211,2040:7281]
|
||||
|
@ -36,3 +36,5 @@
|
||||
35 -> TeVii S471 [d471:9022]
|
||||
36 -> Hauppauge WinTV-HVR1255 [0070:2259]
|
||||
37 -> Prof Revolution DVB-S2 8000 [8000:3034]
|
||||
38 -> Hauppauge WinTV-HVR4400 [0070:c108,0070:c138,0070:c12a,0070:c1f8]
|
||||
39 -> AVerTV Hybrid Express Slim HC81R [1461:d939]
|
||||
|
@ -76,7 +76,7 @@
|
||||
76 -> KWorld PlusTV 340U or UB435-Q (ATSC) (em2870) [1b80:a340]
|
||||
77 -> EM2874 Leadership ISDBT (em2874)
|
||||
78 -> PCTV nanoStick T2 290e (em28174)
|
||||
79 -> Terratec Cinergy H5 (em2884) [0ccd:008e,0ccd:00ac,0ccd:10a2,0ccd:10ad]
|
||||
79 -> Terratec Cinergy H5 (em2884) [0ccd:10a2,0ccd:10ad]
|
||||
80 -> PCTV DVB-S2 Stick (460e) (em28174)
|
||||
81 -> Hauppauge WinTV HVR 930C (em2884) [2040:1605]
|
||||
82 -> Terratec Cinergy HTC Stick (em2884) [0ccd:00b2]
|
||||
@ -84,3 +84,4 @@
|
||||
84 -> MaxMedia UB425-TC (em2874) [1b80:e425]
|
||||
85 -> PCTV QuatroStick (510e) (em2884) [2304:0242]
|
||||
86 -> PCTV QuatroStick nano (520e) (em2884) [2013:0251]
|
||||
87 -> Terratec Cinergy HTC USB XS (em2884) [0ccd:008e,0ccd:00ac]
|
||||
|
@ -189,3 +189,4 @@
|
||||
188 -> Sensoray 811/911 [6000:0811,6000:0911]
|
||||
189 -> Kworld PC150-U [17de:a134]
|
||||
190 -> Asus My Cinema PS3-100 [1043:48cd]
|
||||
191 -> Hawell HW-9004V1
|
||||
|
@ -1,315 +0,0 @@
|
||||
|
||||
ET61X[12]51 PC Camera Controllers
|
||||
Driver for Linux
|
||||
=================================
|
||||
|
||||
- Documentation -
|
||||
|
||||
|
||||
Index
|
||||
=====
|
||||
1. Copyright
|
||||
2. Disclaimer
|
||||
3. License
|
||||
4. Overview and features
|
||||
5. Module dependencies
|
||||
6. Module loading
|
||||
7. Module parameters
|
||||
8. Optional device control through "sysfs"
|
||||
9. Supported devices
|
||||
10. Notes for V4L2 application developers
|
||||
11. Contact information
|
||||
|
||||
|
||||
1. Copyright
|
||||
============
|
||||
Copyright (C) 2006-2007 by Luca Risolia <luca.risolia@studio.unibo.it>
|
||||
|
||||
|
||||
2. Disclaimer
|
||||
=============
|
||||
Etoms is a trademark of Etoms Electronics Corp.
|
||||
This software is not developed or sponsored by Etoms Electronics.
|
||||
|
||||
|
||||
3. License
|
||||
==========
|
||||
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.
|
||||
|
||||
|
||||
4. Overview and features
|
||||
========================
|
||||
This driver supports the video interface of the devices mounting the ET61X151
|
||||
or ET61X251 PC Camera Controllers.
|
||||
|
||||
It's worth to note that Etoms Electronics has never collaborated with the
|
||||
author during the development of this project; despite several requests,
|
||||
Etoms Electronics also refused to release enough detailed specifications of
|
||||
the video compression engine.
|
||||
|
||||
The driver relies on the Video4Linux2 and USB core modules. It has been
|
||||
designed to run properly on SMP systems as well.
|
||||
|
||||
The latest version of the ET61X[12]51 driver can be found at the following URL:
|
||||
http://www.linux-projects.org/
|
||||
|
||||
Some of the features of the driver are:
|
||||
|
||||
- full compliance with the Video4Linux2 API (see also "Notes for V4L2
|
||||
application developers" paragraph);
|
||||
- available mmap or read/poll methods for video streaming through isochronous
|
||||
data transfers;
|
||||
- automatic detection of image sensor;
|
||||
- support for any window resolutions and optional panning within the maximum
|
||||
pixel area of image sensor;
|
||||
- image downscaling with arbitrary scaling factors from 1 and 2 in both
|
||||
directions (see "Notes for V4L2 application developers" paragraph);
|
||||
- two different video formats for uncompressed or compressed data in low or
|
||||
high compression quality (see also "Notes for V4L2 application developers"
|
||||
paragraph);
|
||||
- full support for the capabilities of every possible image sensors that can
|
||||
be connected to the ET61X[12]51 bridges, including, for instance, red, green,
|
||||
blue and global gain adjustments and exposure control (see "Supported
|
||||
devices" paragraph for details);
|
||||
- use of default color settings for sunlight conditions;
|
||||
- dynamic I/O interface for both ET61X[12]51 and image sensor control (see
|
||||
"Optional device control through 'sysfs'" paragraph);
|
||||
- dynamic driver control thanks to various module parameters (see "Module
|
||||
parameters" paragraph);
|
||||
- up to 64 cameras can be handled at the same time; they can be connected and
|
||||
disconnected from the host many times without turning off the computer, if
|
||||
the system supports hotplugging;
|
||||
- no known bugs.
|
||||
|
||||
|
||||
5. Module dependencies
|
||||
======================
|
||||
For it to work properly, the driver needs kernel support for Video4Linux and
|
||||
USB.
|
||||
|
||||
The following options of the kernel configuration file must be enabled and
|
||||
corresponding modules must be compiled:
|
||||
|
||||
# Multimedia devices
|
||||
#
|
||||
CONFIG_VIDEO_DEV=m
|
||||
|
||||
To enable advanced debugging functionality on the device through /sysfs:
|
||||
|
||||
# Multimedia devices
|
||||
#
|
||||
CONFIG_VIDEO_ADV_DEBUG=y
|
||||
|
||||
# USB support
|
||||
#
|
||||
CONFIG_USB=m
|
||||
|
||||
In addition, depending on the hardware being used, the modules below are
|
||||
necessary:
|
||||
|
||||
# USB Host Controller Drivers
|
||||
#
|
||||
CONFIG_USB_EHCI_HCD=m
|
||||
CONFIG_USB_UHCI_HCD=m
|
||||
CONFIG_USB_OHCI_HCD=m
|
||||
|
||||
And finally:
|
||||
|
||||
# USB Multimedia devices
|
||||
#
|
||||
CONFIG_USB_ET61X251=m
|
||||
|
||||
|
||||
6. Module loading
|
||||
=================
|
||||
To use the driver, it is necessary to load the "et61x251" module into memory
|
||||
after every other module required: "videodev", "v4l2_common", "compat_ioctl32",
|
||||
"usbcore" and, depending on the USB host controller you have, "ehci-hcd",
|
||||
"uhci-hcd" or "ohci-hcd".
|
||||
|
||||
Loading can be done as shown below:
|
||||
|
||||
[root@localhost home]# modprobe et61x251
|
||||
|
||||
At this point the devices should be recognized. You can invoke "dmesg" to
|
||||
analyze kernel messages and verify that the loading process has gone well:
|
||||
|
||||
[user@localhost home]$ dmesg
|
||||
|
||||
|
||||
7. Module parameters
|
||||
====================
|
||||
Module parameters are listed below:
|
||||
-------------------------------------------------------------------------------
|
||||
Name: video_nr
|
||||
Type: short array (min = 0, max = 64)
|
||||
Syntax: <-1|n[,...]>
|
||||
Description: Specify V4L2 minor mode number:
|
||||
-1 = use next available
|
||||
n = use minor number n
|
||||
You can specify up to 64 cameras this way.
|
||||
For example:
|
||||
video_nr=-1,2,-1 would assign minor number 2 to the second
|
||||
registered camera and use auto for the first one and for every
|
||||
other camera.
|
||||
Default: -1
|
||||
-------------------------------------------------------------------------------
|
||||
Name: force_munmap
|
||||
Type: bool array (min = 0, max = 64)
|
||||
Syntax: <0|1[,...]>
|
||||
Description: Force the application to unmap previously mapped buffer memory
|
||||
before calling any VIDIOC_S_CROP or VIDIOC_S_FMT ioctl's. Not
|
||||
all the applications support this feature. This parameter is
|
||||
specific for each detected camera.
|
||||
0 = do not force memory unmapping
|
||||
1 = force memory unmapping (save memory)
|
||||
Default: 0
|
||||
-------------------------------------------------------------------------------
|
||||
Name: frame_timeout
|
||||
Type: uint array (min = 0, max = 64)
|
||||
Syntax: <n[,...]>
|
||||
Description: Timeout for a video frame in seconds. This parameter is
|
||||
specific for each detected camera. This parameter can be
|
||||
changed at runtime thanks to the /sys filesystem interface.
|
||||
Default: 2
|
||||
-------------------------------------------------------------------------------
|
||||
Name: debug
|
||||
Type: ushort
|
||||
Syntax: <n>
|
||||
Description: Debugging information level, from 0 to 3:
|
||||
0 = none (use carefully)
|
||||
1 = critical errors
|
||||
2 = significant information
|
||||
3 = more verbose messages
|
||||
Level 3 is useful for testing only, when only one device
|
||||
is used at the same time. It also shows some more information
|
||||
about the hardware being detected. This module parameter can be
|
||||
changed at runtime thanks to the /sys filesystem interface.
|
||||
Default: 2
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
|
||||
8. Optional device control through "sysfs"
|
||||
==========================================
|
||||
If the kernel has been compiled with the CONFIG_VIDEO_ADV_DEBUG option enabled,
|
||||
it is possible to read and write both the ET61X[12]51 and the image sensor
|
||||
registers by using the "sysfs" filesystem interface.
|
||||
|
||||
There are four files in the /sys/class/video4linux/videoX directory for each
|
||||
registered camera: "reg", "val", "i2c_reg" and "i2c_val". The first two files
|
||||
control the ET61X[12]51 bridge, while the other two control the sensor chip.
|
||||
"reg" and "i2c_reg" hold the values of the current register index where the
|
||||
following reading/writing operations are addressed at through "val" and
|
||||
"i2c_val". Their use is not intended for end-users, unless you know what you
|
||||
are doing. Remember that you must be logged in as root before writing to them.
|
||||
|
||||
As an example, suppose we were to want to read the value contained in the
|
||||
register number 1 of the sensor register table - which is usually the product
|
||||
identifier - of the camera registered as "/dev/video0":
|
||||
|
||||
[root@localhost #] cd /sys/class/video4linux/video0
|
||||
[root@localhost #] echo 1 > i2c_reg
|
||||
[root@localhost #] cat i2c_val
|
||||
|
||||
Note that if the sensor registers cannot be read, "cat" will fail.
|
||||
To avoid race conditions, all the I/O accesses to the files are serialized.
|
||||
|
||||
|
||||
9. Supported devices
|
||||
====================
|
||||
None of the names of the companies as well as their products will be mentioned
|
||||
here. They have never collaborated with the author, so no advertising.
|
||||
|
||||
From the point of view of a driver, what unambiguously identify a device are
|
||||
its vendor and product USB identifiers. Below is a list of known identifiers of
|
||||
devices mounting the ET61X[12]51 PC camera controllers:
|
||||
|
||||
Vendor ID Product ID
|
||||
--------- ----------
|
||||
0x102c 0x6151
|
||||
0x102c 0x6251
|
||||
0x102c 0x6253
|
||||
0x102c 0x6254
|
||||
0x102c 0x6255
|
||||
0x102c 0x6256
|
||||
0x102c 0x6257
|
||||
0x102c 0x6258
|
||||
0x102c 0x6259
|
||||
0x102c 0x625a
|
||||
0x102c 0x625b
|
||||
0x102c 0x625c
|
||||
0x102c 0x625d
|
||||
0x102c 0x625e
|
||||
0x102c 0x625f
|
||||
0x102c 0x6260
|
||||
0x102c 0x6261
|
||||
0x102c 0x6262
|
||||
0x102c 0x6263
|
||||
0x102c 0x6264
|
||||
0x102c 0x6265
|
||||
0x102c 0x6266
|
||||
0x102c 0x6267
|
||||
0x102c 0x6268
|
||||
0x102c 0x6269
|
||||
|
||||
The following image sensors are supported:
|
||||
|
||||
Model Manufacturer
|
||||
----- ------------
|
||||
TAS5130D1B Taiwan Advanced Sensor Corporation
|
||||
|
||||
All the available control settings of each image sensor are supported through
|
||||
the V4L2 interface.
|
||||
|
||||
|
||||
10. Notes for V4L2 application developers
|
||||
=========================================
|
||||
This driver follows the V4L2 API specifications. In particular, it enforces two
|
||||
rules:
|
||||
|
||||
- exactly one I/O method, either "mmap" or "read", is associated with each
|
||||
file descriptor. Once it is selected, the application must close and reopen the
|
||||
device to switch to the other I/O method;
|
||||
|
||||
- although it is not mandatory, previously mapped buffer memory should always
|
||||
be unmapped before calling any "VIDIOC_S_CROP" or "VIDIOC_S_FMT" ioctl's.
|
||||
The same number of buffers as before will be allocated again to match the size
|
||||
of the new video frames, so you have to map the buffers again before any I/O
|
||||
attempts on them.
|
||||
|
||||
Consistently with the hardware limits, this driver also supports image
|
||||
downscaling with arbitrary scaling factors from 1 and 2 in both directions.
|
||||
However, the V4L2 API specifications don't correctly define how the scaling
|
||||
factor can be chosen arbitrarily by the "negotiation" of the "source" and
|
||||
"target" rectangles. To work around this flaw, we have added the convention
|
||||
that, during the negotiation, whenever the "VIDIOC_S_CROP" ioctl is issued, the
|
||||
scaling factor is restored to 1.
|
||||
|
||||
This driver supports two different video formats: the first one is the "8-bit
|
||||
Sequential Bayer" format and can be used to obtain uncompressed video data
|
||||
from the device through the current I/O method, while the second one provides
|
||||
"raw" compressed video data (without frame headers not related to the
|
||||
compressed data). The current compression quality may vary from 0 to 1 and can
|
||||
be selected or queried thanks to the VIDIOC_S_JPEGCOMP and VIDIOC_G_JPEGCOMP
|
||||
V4L2 ioctl's.
|
||||
|
||||
|
||||
11. Contact information
|
||||
=======================
|
||||
The author may be contacted by e-mail at <luca.risolia@studio.unibo.it>.
|
||||
|
||||
GPG/PGP encrypted e-mail's are accepted. The GPG key ID of the author is
|
||||
'FCE635A4'; the public 1024-bit key should be available at any keyserver;
|
||||
the fingerprint is: '88E8 F32F 7244 68BA 3958 5D40 99DA 5D2A FCE6 35A4'.
|
0
Documentation/video4linux/extract_xc3028.pl
Normal file → Executable file
0
Documentation/video4linux/extract_xc3028.pl
Normal file → Executable file
@ -58,7 +58,7 @@ Not currently supported:
|
||||
4.1. Media device interface
|
||||
|
||||
The driver supports Media Controller API as defined at
|
||||
http://http://linuxtv.org/downloads/v4l-dvb-apis/media_common.html
|
||||
http://linuxtv.org/downloads/v4l-dvb-apis/media_common.html
|
||||
The media device driver name is "SAMSUNG S5P FIMC".
|
||||
|
||||
The purpose of this interface is to allow changing assignment of FIMC instances
|
||||
|
@ -1,323 +0,0 @@
|
||||
README for Linux device driver for the IBM "C-It" USB video camera
|
||||
|
||||
INTRODUCTION:
|
||||
|
||||
This driver does not use all features known to exist in
|
||||
the IBM camera. However most of needed features work well.
|
||||
|
||||
This driver was developed using logs of observed USB traffic
|
||||
which was produced by standard Windows driver (c-it98.sys).
|
||||
I did not have data sheets from Xirlink.
|
||||
|
||||
Video formats:
|
||||
128x96 [model 1]
|
||||
176x144
|
||||
320x240 [model 2]
|
||||
352x240 [model 2]
|
||||
352x288
|
||||
Frame rate: 3 - 30 frames per second (FPS)
|
||||
External interface: USB
|
||||
Internal interface: Video For Linux (V4L)
|
||||
Supported controls:
|
||||
- by V4L: Contrast, Brightness, Color, Hue
|
||||
- by driver options: frame rate, lighting conditions, video format,
|
||||
default picture settings, sharpness.
|
||||
|
||||
SUPPORTED CAMERAS:
|
||||
|
||||
Xirlink "C-It" camera, also known as "IBM PC Camera".
|
||||
The device uses proprietary ASIC (and compression method);
|
||||
it is manufactured by Xirlink. See http://xirlinkwebcam.sourceforge.net,
|
||||
http://www.ibmpccamera.com, or http://www.c-itnow.com/ for details and pictures.
|
||||
|
||||
This very chipset ("X Chip", as marked at the factory)
|
||||
is used in several other cameras, and they are supported
|
||||
as well:
|
||||
|
||||
- IBM NetCamera
|
||||
- Veo Stingray
|
||||
|
||||
The Linux driver was developed with camera with following
|
||||
model number (or FCC ID): KSX-XVP510. This camera has three
|
||||
interfaces, each with one endpoint (control, iso, iso). This
|
||||
type of cameras is referred to as "model 1". These cameras are
|
||||
no longer manufactured.
|
||||
|
||||
Xirlink now manufactures new cameras which are somewhat different.
|
||||
In particular, following models [FCC ID] belong to that category:
|
||||
|
||||
XVP300 [KSX-X9903]
|
||||
XVP600 [KSX-X9902]
|
||||
XVP610 [KSX-X9902]
|
||||
|
||||
(see http://www.xirlink.com/ibmpccamera/ for updates, they refer
|
||||
to these new cameras by Windows driver dated 12-27-99, v3005 BETA)
|
||||
These cameras have two interfaces, one endpoint in each (iso, bulk).
|
||||
Such type of cameras is referred to as "model 2". They are supported
|
||||
(with exception of 352x288 native mode).
|
||||
|
||||
Some IBM NetCameras (Model 4) are made to generate only compressed
|
||||
video streams. This is great for performance, but unfortunately
|
||||
nobody knows how to decompress the stream :-( Therefore, these
|
||||
cameras are *unsupported* and if you try to use one of those, all
|
||||
you get is random colored horizontal streaks, not the image!
|
||||
If you have one of those cameras, you probably should return it
|
||||
to the store and get something that is supported.
|
||||
|
||||
Tell me more about all that "model" business
|
||||
--------------------------------------------
|
||||
|
||||
I just invented model numbers to uniquely identify flavors of the
|
||||
hardware/firmware that were sold. It was very confusing to use
|
||||
brand names or some other internal numbering schemes. So I found
|
||||
by experimentation that all Xirlink chipsets fall into four big
|
||||
classes, and I called them "models". Each model is programmed in
|
||||
its own way, and each model sends back the video in its own way.
|
||||
|
||||
Quirks of Model 2 cameras:
|
||||
-------------------------
|
||||
|
||||
Model 2 does not have hardware contrast control. Corresponding V4L
|
||||
control is implemented in software, which is not very nice to your
|
||||
CPU, but at least it works.
|
||||
|
||||
This driver provides 352x288 mode by switching the camera into
|
||||
quasi-352x288 RGB mode (800 Kbits per frame) essentially limiting
|
||||
this mode to 10 frames per second or less, in ideal conditions on
|
||||
the bus (USB is shared, after all). The frame rate
|
||||
has to be programmed very conservatively. Additional concern is that
|
||||
frame rate depends on brightness setting; therefore the picture can
|
||||
be good at one brightness and broken at another! I did not want to fix
|
||||
the frame rate at slowest setting, but I had to move it pretty much down
|
||||
the scale (so that framerate option barely matters). I also noticed that
|
||||
camera after first powering up produces frames slightly faster than during
|
||||
consecutive uses. All this means that if you use 352x288 (which is
|
||||
default), be warned - you may encounter broken picture on first connect;
|
||||
try to adjust brightness - brighter image is slower, so USB will be able
|
||||
to send all data. However if you regularly use Model 2 cameras you may
|
||||
prefer 176x144 which makes perfectly good I420, with no scaling and
|
||||
lesser demands on USB (300 Kbits per second, or 26 frames per second).
|
||||
|
||||
Another strange effect of 352x288 mode is the fine vertical grid visible
|
||||
on some colored surfaces. I am sure it is caused by me not understanding
|
||||
what the camera is trying to say. Blame trade secrets for that.
|
||||
|
||||
The camera that I had also has a hardware quirk: if disconnected,
|
||||
it needs few minutes to "relax" before it can be plugged in again
|
||||
(poorly designed USB processor reset circuit?)
|
||||
|
||||
[Veo Stingray with Product ID 0x800C is also Model 2, but I haven't
|
||||
observed this particular flaw in it.]
|
||||
|
||||
Model 2 camera can be programmed for very high sensitivity (even starlight
|
||||
may be enough), this makes it convenient for tinkering with. The driver
|
||||
code has enough comments to help a programmer to tweak the camera
|
||||
as s/he feels necessary.
|
||||
|
||||
WHAT YOU NEED:
|
||||
|
||||
- A supported IBM PC (C-it) camera (model 1 or 2)
|
||||
|
||||
- A Linux box with USB support (2.3/2.4; 2.2 w/backport may work)
|
||||
|
||||
- A Video4Linux compatible frame grabber program such as xawtv.
|
||||
|
||||
HOW TO COMPILE THE DRIVER:
|
||||
|
||||
You need to compile the driver only if you are a developer
|
||||
or if you want to make changes to the code. Most distributions
|
||||
precompile all modules, so you can go directly to the next
|
||||
section "HOW TO USE THE DRIVER".
|
||||
|
||||
The ibmcam driver uses usbvideo helper library (module),
|
||||
so if you are studying the ibmcam code you will be led there.
|
||||
|
||||
The driver itself consists of only one file in usb/ directory:
|
||||
ibmcam.c. This file is included into the Linux kernel build
|
||||
process if you configure the kernel for CONFIG_USB_IBMCAM.
|
||||
Run "make xconfig" and in USB section you will find the IBM
|
||||
camera driver. Select it, save the configuration and recompile.
|
||||
|
||||
HOW TO USE THE DRIVER:
|
||||
|
||||
I recommend to compile driver as a module. This gives you an
|
||||
easier access to its configuration. The camera has many more
|
||||
settings than V4L can operate, so some settings are done using
|
||||
module options.
|
||||
|
||||
To begin with, on most modern Linux distributions the driver
|
||||
will be automatically loaded whenever you plug the supported
|
||||
camera in. Therefore, you don't need to do anything. However
|
||||
if you want to experiment with some module parameters then
|
||||
you can load and unload the driver manually, with camera
|
||||
plugged in or unplugged.
|
||||
|
||||
Typically module is installed with command 'modprobe', like this:
|
||||
|
||||
# modprobe ibmcam framerate=1
|
||||
|
||||
Alternatively you can use 'insmod' in similar fashion:
|
||||
|
||||
# insmod /lib/modules/2.x.y/usb/ibmcam.o framerate=1
|
||||
|
||||
Module can be inserted with camera connected or disconnected.
|
||||
|
||||
The driver can have options, though some defaults are provided.
|
||||
|
||||
Driver options: (* indicates that option is model-dependent)
|
||||
|
||||
Name Type Range [default] Example
|
||||
-------------- -------------- -------------- ------------------
|
||||
debug Integer 0-9 [0] debug=1
|
||||
flags Integer 0-0xFF [0] flags=0x0d
|
||||
framerate Integer 0-6 [2] framerate=1
|
||||
hue_correction Integer 0-255 [128] hue_correction=115
|
||||
init_brightness Integer 0-255 [128] init_brightness=100
|
||||
init_contrast Integer 0-255 [192] init_contrast=200
|
||||
init_color Integer 0-255 [128] init_color=130
|
||||
init_hue Integer 0-255 [128] init_hue=115
|
||||
lighting Integer 0-2* [1] lighting=2
|
||||
sharpness Integer 0-6* [4] sharpness=3
|
||||
size Integer 0-2* [2] size=1
|
||||
|
||||
Options for Model 2 only:
|
||||
|
||||
Name Type Range [default] Example
|
||||
-------------- -------------- -------------- ------------------
|
||||
init_model2_rg Integer 0..255 [0x70] init_model2_rg=128
|
||||
init_model2_rg2 Integer 0..255 [0x2f] init_model2_rg2=50
|
||||
init_model2_sat Integer 0..255 [0x34] init_model2_sat=65
|
||||
init_model2_yb Integer 0..255 [0xa0] init_model2_yb=200
|
||||
|
||||
debug You don't need this option unless you are a developer.
|
||||
If you are a developer then you will see in the code
|
||||
what values do what. 0=off.
|
||||
|
||||
flags This is a bit mask, and you can combine any number of
|
||||
bits to produce what you want. Usually you don't want
|
||||
any of extra features this option provides:
|
||||
|
||||
FLAGS_RETRY_VIDIOCSYNC 1 This bit allows to retry failed
|
||||
VIDIOCSYNC ioctls without failing.
|
||||
Will work with xawtv, will not
|
||||
with xrealproducer. Default is
|
||||
not set.
|
||||
FLAGS_MONOCHROME 2 Activates monochrome (b/w) mode.
|
||||
FLAGS_DISPLAY_HINTS 4 Shows colored pixels which have
|
||||
magic meaning to developers.
|
||||
FLAGS_OVERLAY_STATS 8 Shows tiny numbers on screen,
|
||||
useful only for debugging.
|
||||
FLAGS_FORCE_TESTPATTERN 16 Shows blue screen with numbers.
|
||||
FLAGS_SEPARATE_FRAMES 32 Shows each frame separately, as
|
||||
it was received from the camera.
|
||||
Default (not set) is to mix the
|
||||
preceding frame in to compensate
|
||||
for occasional loss of Isoc data
|
||||
on high frame rates.
|
||||
FLAGS_CLEAN_FRAMES 64 Forces "cleanup" of each frame
|
||||
prior to use; relevant only if
|
||||
FLAGS_SEPARATE_FRAMES is set.
|
||||
Default is not to clean frames,
|
||||
this is a little faster but may
|
||||
produce flicker if frame rate is
|
||||
too high and Isoc data gets lost.
|
||||
FLAGS_NO_DECODING 128 This flag turns the video stream
|
||||
decoder off, and dumps the raw
|
||||
Isoc data from the camera into
|
||||
the reading process. Useful to
|
||||
developers, but not to users.
|
||||
|
||||
framerate This setting controls frame rate of the camera. This is
|
||||
an approximate setting (in terms of "worst" ... "best")
|
||||
because camera changes frame rate depending on amount
|
||||
of light available. Setting 0 is slowest, 6 is fastest.
|
||||
Beware - fast settings are very demanding and may not
|
||||
work well with all video sizes. Be conservative.
|
||||
|
||||
hue_correction This highly optional setting allows to adjust the
|
||||
hue of the image in a way slightly different from
|
||||
what usual "hue" control does. Both controls affect
|
||||
YUV colorspace: regular "hue" control adjusts only
|
||||
U component, and this "hue_correction" option similarly
|
||||
adjusts only V component. However usually it is enough
|
||||
to tweak only U or V to compensate for colored light or
|
||||
color temperature; this option simply allows more
|
||||
complicated correction when and if it is necessary.
|
||||
|
||||
init_brightness These settings specify _initial_ values which will be
|
||||
init_contrast used to set up the camera. If your V4L application has
|
||||
init_color its own controls to adjust the picture then these
|
||||
init_hue controls will be used too. These options allow you to
|
||||
preconfigure the camera when it gets connected, before
|
||||
any V4L application connects to it. Good for webcams.
|
||||
|
||||
init_model2_rg These initial settings alter color balance of the
|
||||
init_model2_rg2 camera on hardware level. All four settings may be used
|
||||
init_model2_sat to tune the camera to specific lighting conditions. These
|
||||
init_model2_yb settings only apply to Model 2 cameras.
|
||||
|
||||
lighting This option selects one of three hardware-defined
|
||||
photosensitivity settings of the camera. 0=bright light,
|
||||
1=Medium (default), 2=Low light. This setting affects
|
||||
frame rate: the dimmer the lighting the lower the frame
|
||||
rate (because longer exposition time is needed). The
|
||||
Model 2 cameras allow values more than 2 for this option,
|
||||
thus enabling extremely high sensitivity at cost of frame
|
||||
rate, color saturation and imaging sensor noise.
|
||||
|
||||
sharpness This option controls smoothing (noise reduction)
|
||||
made by camera. Setting 0 is most smooth, setting 6
|
||||
is most sharp. Be aware that CMOS sensor used in the
|
||||
camera is pretty noisy, so if you choose 6 you will
|
||||
be greeted with "snowy" image. Default is 4. Model 2
|
||||
cameras do not support this feature.
|
||||
|
||||
size This setting chooses one of several image sizes that are
|
||||
supported by this driver. Cameras may support more, but
|
||||
it's difficult to reverse-engineer all formats.
|
||||
Following video sizes are supported:
|
||||
|
||||
size=0 128x96 (Model 1 only)
|
||||
size=1 160x120
|
||||
size=2 176x144
|
||||
size=3 320x240 (Model 2 only)
|
||||
size=4 352x240 (Model 2 only)
|
||||
size=5 352x288
|
||||
size=6 640x480 (Model 3 only)
|
||||
|
||||
The 352x288 is the native size of the Model 1 sensor
|
||||
array, so it's the best resolution the camera can
|
||||
yield. The best resolution of Model 2 is 176x144, and
|
||||
larger images are produced by stretching the bitmap.
|
||||
Model 3 has sensor with 640x480 grid, and it works too,
|
||||
but the frame rate will be exceptionally low (1-2 FPS);
|
||||
it may be still OK for some applications, like security.
|
||||
Choose the image size you need. The smaller image can
|
||||
support faster frame rate. Default is 352x288.
|
||||
|
||||
For more information and the Troubleshooting FAQ visit this URL:
|
||||
|
||||
http://www.linux-usb.org/ibmcam/
|
||||
|
||||
WHAT NEEDS TO BE DONE:
|
||||
|
||||
- The button on the camera is not used. I don't know how to get to it.
|
||||
I know now how to read button on Model 2, but what to do with it?
|
||||
|
||||
- Camera reports its status back to the driver; however I don't know
|
||||
what returned data means. If camera fails at some initialization
|
||||
stage then something should be done, and I don't do that because
|
||||
I don't even know that some command failed. This is mostly Model 1
|
||||
concern because Model 2 uses different commands which do not return
|
||||
status (and seem to complete successfully every time).
|
||||
|
||||
- Some flavors of Model 4 NetCameras produce only compressed video
|
||||
streams, and I don't know how to decode them.
|
||||
|
||||
CREDITS:
|
||||
|
||||
The code is based in no small part on the CPiA driver by Johannes Erdfelt,
|
||||
Randy Dunlap, and others. Big thanks to them for their pioneering work on that
|
||||
and the USB stack.
|
||||
|
||||
I also thank John Lightsey for his donation of the Veo Stingray camera.
|
@ -1,12 +0,0 @@
|
||||
This document describes the ALi m5602 bridge connected
|
||||
to the following supported sensors:
|
||||
OmniVision OV9650,
|
||||
Samsung s5k83a,
|
||||
Samsung s5k4aa,
|
||||
Micron mt9m111,
|
||||
Pixel plus PO1030
|
||||
|
||||
This driver mimics the windows drivers, which have a braindead implementation sending bayer-encoded frames at VGA resolution.
|
||||
In a perfect world we should be able to reprogram the m5602 and the connected sensor in hardware instead, supporting a range of resolutions and pixelformats
|
||||
|
||||
Anyway, have fun and please report any bugs to m560x-driver-devel@lists.sourceforge.net
|
@ -1,288 +0,0 @@
|
||||
-------------------------------------------------------------------------------
|
||||
Readme for Linux device driver for the OmniVision OV511 USB to camera bridge IC
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
Author: Mark McClelland
|
||||
Homepage: http://alpha.dyndns.org/ov511
|
||||
|
||||
INTRODUCTION:
|
||||
|
||||
This is a driver for the OV511, a USB-only chip used in many "webcam" devices.
|
||||
Any camera using the OV511/OV511+ and the OV6620/OV7610/20/20AE should work.
|
||||
Video capture devices that use the Philips SAA7111A decoder also work. It
|
||||
supports streaming and capture of color or monochrome video via the Video4Linux
|
||||
API. Most V4L apps are compatible with it. Most resolutions with a width and
|
||||
height that are a multiple of 8 are supported.
|
||||
|
||||
If you need more information, please visit the OV511 homepage at the above URL.
|
||||
|
||||
WHAT YOU NEED:
|
||||
|
||||
- If you want to help with the development, get the chip's specification docs at
|
||||
http://www.ovt.com/omniusbp.html
|
||||
|
||||
- A Video4Linux compatible frame grabber program (I recommend vidcat and xawtv)
|
||||
vidcat is part of the w3cam package: http://mpx.freeshell.net/
|
||||
xawtv is available at: http://linux.bytesex.org/xawtv/
|
||||
|
||||
HOW TO USE IT:
|
||||
|
||||
Note: These are simplified instructions. For complete instructions see:
|
||||
http://alpha.dyndns.org/ov511/install.html
|
||||
|
||||
You must have first compiled USB support, support for your specific USB host
|
||||
controller (UHCI or OHCI), and Video4Linux support for your kernel (I recommend
|
||||
making them modules.) Make sure "Enforce bandwidth allocation" is NOT enabled.
|
||||
|
||||
Next, (as root):
|
||||
|
||||
modprobe usbcore
|
||||
modprobe usb-uhci <OR> modprobe usb-ohci
|
||||
modprobe videodev
|
||||
modprobe ov511
|
||||
|
||||
If it is not already there (it usually is), create the video device:
|
||||
|
||||
mknod /dev/video0 c 81 0
|
||||
|
||||
Optionally, symlink /dev/video to /dev/video0
|
||||
|
||||
You will have to set permissions on this device to allow you to read/write
|
||||
from it:
|
||||
|
||||
chmod 666 /dev/video
|
||||
chmod 666 /dev/video0 (if necessary)
|
||||
|
||||
Now you are ready to run a video app! Both vidcat and xawtv work well for me
|
||||
at 640x480.
|
||||
|
||||
[Using vidcat:]
|
||||
|
||||
vidcat -s 640x480 -p c > test.jpg
|
||||
xview test.jpg
|
||||
|
||||
[Using xawtv:]
|
||||
|
||||
From the main xawtv directory:
|
||||
|
||||
make clean
|
||||
./configure
|
||||
make
|
||||
make install
|
||||
|
||||
Now you should be able to run xawtv. Right click for the options dialog.
|
||||
|
||||
MODULE PARAMETERS:
|
||||
|
||||
You can set these with: insmod ov511 NAME=VALUE
|
||||
There is currently no way to set these on a per-camera basis.
|
||||
|
||||
NAME: autobright
|
||||
TYPE: integer (Boolean)
|
||||
DEFAULT: 1
|
||||
DESC: Brightness is normally under automatic control and can't be set
|
||||
manually by the video app. Set to 0 for manual control.
|
||||
|
||||
NAME: autogain
|
||||
TYPE: integer (Boolean)
|
||||
DEFAULT: 1
|
||||
DESC: Auto Gain Control enable. This feature is not yet implemented.
|
||||
|
||||
NAME: autoexp
|
||||
TYPE: integer (Boolean)
|
||||
DEFAULT: 1
|
||||
DESC: Auto Exposure Control enable. This feature is not yet implemented.
|
||||
|
||||
NAME: debug
|
||||
TYPE: integer (0-6)
|
||||
DEFAULT: 3
|
||||
DESC: Sets the threshold for printing debug messages. The higher the value,
|
||||
the more is printed. The levels are cumulative, and are as follows:
|
||||
0=no debug messages
|
||||
1=init/detection/unload and other significant messages
|
||||
2=some warning messages
|
||||
3=config/control function calls
|
||||
4=most function calls and data parsing messages
|
||||
5=highly repetitive mesgs
|
||||
|
||||
NAME: snapshot
|
||||
TYPE: integer (Boolean)
|
||||
DEFAULT: 0
|
||||
DESC: Set to 1 to enable snapshot mode. read()/VIDIOCSYNC will block until
|
||||
the snapshot button is pressed. Note: enabling this mode disables
|
||||
/proc/video/ov511/<minor#>/button
|
||||
|
||||
NAME: cams
|
||||
TYPE: integer (1-4 for OV511, 1-31 for OV511+)
|
||||
DEFAULT: 1
|
||||
DESC: Number of cameras allowed to stream simultaneously on a single bus.
|
||||
Values higher than 1 reduce the data rate of each camera, allowing two
|
||||
or more to be used at once. If you have a complicated setup involving
|
||||
both OV511 and OV511+ cameras, trial-and-error may be necessary for
|
||||
finding the optimum setting.
|
||||
|
||||
NAME: compress
|
||||
TYPE: integer (Boolean)
|
||||
DEFAULT: 0
|
||||
DESC: Set this to 1 to turn on the camera's compression engine. This can
|
||||
potentially increase the frame rate at the expense of quality, if you
|
||||
have a fast CPU. You must load the proper compression module for your
|
||||
camera before starting your application (ov511_decomp or ov518_decomp).
|
||||
|
||||
NAME: testpat
|
||||
TYPE: integer (Boolean)
|
||||
DEFAULT: 0
|
||||
DESC: This configures the camera's sensor to transmit a colored test-pattern
|
||||
instead of an image. This does not work correctly yet.
|
||||
|
||||
NAME: dumppix
|
||||
TYPE: integer (0-2)
|
||||
DEFAULT: 0
|
||||
DESC: Dumps raw pixel data and skips post-processing and format conversion.
|
||||
It is for debugging purposes only. Options are:
|
||||
0: Disable (default)
|
||||
1: Dump raw data from camera, excluding headers and trailers
|
||||
2: Dumps data exactly as received from camera
|
||||
|
||||
NAME: led
|
||||
TYPE: integer (0-2)
|
||||
DEFAULT: 1 (Always on)
|
||||
DESC: Controls whether the LED (the little light) on the front of the camera
|
||||
is always off (0), always on (1), or only on when driver is open (2).
|
||||
This is not supported with the OV511, and might only work with certain
|
||||
cameras (ones that actually have the LED wired to the control pin, and
|
||||
not just hard-wired to be on all the time).
|
||||
|
||||
NAME: dump_bridge
|
||||
TYPE: integer (Boolean)
|
||||
DEFAULT: 0
|
||||
DESC: Dumps the bridge (OV511[+] or OV518[+]) register values to the system
|
||||
log. Only useful for serious debugging/development purposes.
|
||||
|
||||
NAME: dump_sensor
|
||||
TYPE: integer (Boolean)
|
||||
DEFAULT: 0
|
||||
DESC: Dumps the sensor register values to the system log. Only useful for
|
||||
serious debugging/development purposes.
|
||||
|
||||
NAME: printph
|
||||
TYPE: integer (Boolean)
|
||||
DEFAULT: 0
|
||||
DESC: Setting this to 1 will dump the first 12 bytes of each isoc frame. This
|
||||
is only useful if you are trying to debug problems with the isoc data
|
||||
stream (i.e.: camera initializes, but vidcat hangs until Ctrl-C). Be
|
||||
warned that this dumps a large number of messages to your kernel log.
|
||||
|
||||
NAME: phy, phuv, pvy, pvuv, qhy, qhuv, qvy, qvuv
|
||||
TYPE: integer (0-63 for phy and phuv, 0-255 for rest)
|
||||
DEFAULT: OV511 default values
|
||||
DESC: These are registers 70h - 77h of the OV511, which control the
|
||||
prediction ranges and quantization thresholds of the compressor, for
|
||||
the Y and UV channels in the horizontal and vertical directions. See
|
||||
the OV511 or OV511+ data sheet for more detailed descriptions. These
|
||||
normally do not need to be changed.
|
||||
|
||||
NAME: lightfreq
|
||||
TYPE: integer (0, 50, or 60)
|
||||
DEFAULT: 0 (use sensor default)
|
||||
DESC: Sets the sensor to match your lighting frequency. This can reduce the
|
||||
appearance of "banding", i.e. horizontal lines or waves of light and
|
||||
dark that are often caused by artificial lighting. Valid values are:
|
||||
0 - Use default (depends on sensor, most likely 60 Hz)
|
||||
50 - For European and Asian 50 Hz power
|
||||
60 - For American 60 Hz power
|
||||
|
||||
NAME: bandingfilter
|
||||
TYPE: integer (Boolean)
|
||||
DEFAULT: 0 (off)
|
||||
DESC: Enables the sensor´s banding filter exposure algorithm. This reduces
|
||||
or stabilizes the "banding" caused by some artificial light sources
|
||||
(especially fluorescent). You might have to set lightfreq correctly for
|
||||
this to work right. As an added bonus, this sometimes makes it
|
||||
possible to capture your monitor´s output.
|
||||
|
||||
NAME: fastset
|
||||
TYPE: integer (Boolean)
|
||||
DEFAULT: 0 (off)
|
||||
DESC: Allows picture settings (brightness, contrast, color, and hue) to take
|
||||
effect immediately, even in the middle of a frame. This reduces the
|
||||
time to change settings, but can ruin frames during the change. Only
|
||||
affects OmniVision sensors.
|
||||
|
||||
NAME: force_palette
|
||||
TYPE: integer (Boolean)
|
||||
DEFAULT: 0 (off)
|
||||
DESC: Forces the palette (color format) to a specific value. If an
|
||||
application requests a different palette, it will be rejected, thereby
|
||||
forcing it to try others until it succeeds. This is useful for forcing
|
||||
greyscale mode with a color camera, for example. Supported modes are:
|
||||
0 (Allows all the following formats)
|
||||
1 VIDEO_PALETTE_GREY (Linear greyscale)
|
||||
10 VIDEO_PALETTE_YUV420 (YUV 4:2:0 Planar)
|
||||
15 VIDEO_PALETTE_YUV420P (YUV 4:2:0 Planar, same as 10)
|
||||
|
||||
NAME: backlight
|
||||
TYPE: integer (Boolean)
|
||||
DEFAULT: 0 (off)
|
||||
DESC: Setting this flag changes the exposure algorithm for OmniVision sensors
|
||||
such that objects in the camera's view (i.e. your head) can be clearly
|
||||
seen when they are illuminated from behind. It reduces or eliminates
|
||||
the sensor's auto-exposure function, so it should only be used when
|
||||
needed. Additionally, it is only supported with the OV6620 and OV7620.
|
||||
|
||||
NAME: unit_video
|
||||
TYPE: Up to 16 comma-separated integers
|
||||
DEFAULT: 0,0,0... (automatically assign the next available minor(s))
|
||||
DESC: You can specify up to 16 minor numbers to be assigned to ov511 devices.
|
||||
For example, "unit_video=1,3" will make the driver use /dev/video1 and
|
||||
/dev/video3 for the first two devices it detects. Additional devices
|
||||
will be assigned automatically starting at the first available device
|
||||
node (/dev/video0 in this case). Note that you cannot specify 0 as a
|
||||
minor number. This feature requires kernel version 2.4.5 or higher.
|
||||
|
||||
NAME: remove_zeros
|
||||
TYPE: integer (Boolean)
|
||||
DEFAULT: 0 (do not skip any incoming data)
|
||||
DESC: Setting this to 1 will remove zero-padding from incoming data. This
|
||||
will compensate for the blocks of corruption that can appear when the
|
||||
camera cannot keep up with the speed of the USB bus (eg. at low frame
|
||||
resolutions). This feature is always enabled when compression is on.
|
||||
|
||||
NAME: mirror
|
||||
TYPE: integer (Boolean)
|
||||
DEFAULT: 0 (off)
|
||||
DESC: Setting this to 1 will reverse ("mirror") the image horizontally. This
|
||||
might be necessary if your camera has a custom lens assembly. This has
|
||||
no effect with video capture devices.
|
||||
|
||||
NAME: ov518_color
|
||||
TYPE: integer (Boolean)
|
||||
DEFAULT: 0 (off)
|
||||
DESC: Enable OV518 color support. This is off by default since it doesn't
|
||||
work most of the time. If you want to try it, you must also load
|
||||
ov518_decomp with the "nouv=0" parameter. If you get improper colors or
|
||||
diagonal lines through the image, restart your video app and try again.
|
||||
Repeat as necessary.
|
||||
|
||||
WORKING FEATURES:
|
||||
o Color streaming/capture at most widths and heights that are multiples of 8.
|
||||
o Monochrome (use force_palette=1 to enable)
|
||||
o Setting/getting of saturation, contrast, brightness, and hue (only some of
|
||||
them work the OV7620 and OV7620AE)
|
||||
o /proc status reporting
|
||||
o SAA7111A video capture support at 320x240 and 640x480
|
||||
o Compression support
|
||||
o SMP compatibility
|
||||
|
||||
HOW TO CONTACT ME:
|
||||
|
||||
You can email me at mark@alpha.dyndns.org . Please prefix the subject line
|
||||
with "OV511: " so that I am certain to notice your message.
|
||||
|
||||
CREDITS:
|
||||
|
||||
The code is based in no small part on the CPiA driver by Johannes Erdfelt,
|
||||
Randy Dunlap, and others. Big thanks to them for their pioneering work on that
|
||||
and the USB stack. Thanks to Bret Wallach for getting camera reg IO, ISOC, and
|
||||
image capture working. Thanks to Orion Sky Lawlor, Kevin Moore, and Claudio
|
||||
Matsuoka for their work as well.
|
@ -1,54 +0,0 @@
|
||||
Linux driver for SE401 based USB cameras
|
||||
|
||||
Copyright, 2001, Jeroen Vreeken
|
||||
|
||||
|
||||
INTRODUCTION:
|
||||
|
||||
The SE401 chip is the used in low-cost usb webcams.
|
||||
It is produced by Endpoints Inc. (www.endpoints.com).
|
||||
It interfaces directly to a cmos image sensor and USB. The only other major
|
||||
part in a se401 based camera is a dram chip.
|
||||
|
||||
The following cameras are known to work with this driver:
|
||||
|
||||
Aox se401 (non-branded) cameras
|
||||
Philips PVCV665 USB VGA webcam 'Vesta Fun'
|
||||
Kensington VideoCAM PC Camera Model 67014
|
||||
Kensington VideoCAM PC Camera Model 67015
|
||||
Kensington VideoCAM PC Camera Model 67016
|
||||
Kensington VideoCAM PC Camera Model 67017
|
||||
|
||||
|
||||
WHAT YOU NEED:
|
||||
|
||||
- USB support
|
||||
- VIDEO4LINUX support
|
||||
|
||||
More information about USB support for linux can be found at:
|
||||
http://www.linux-usb.org
|
||||
|
||||
|
||||
MODULE OPTIONS:
|
||||
|
||||
When the driver is compiled as a module you can also use the 'flickerless'
|
||||
option. With it exposure is limited to values that do not interfere with the
|
||||
net frequency. Valid options for this option are 0, 50 and 60. (0=disable,
|
||||
50=50hz, 60=60hz)
|
||||
|
||||
|
||||
KNOWN PROBLEMS:
|
||||
|
||||
The driver works fine with the usb-ohci and uhci host controller drivers,
|
||||
the default settings also work with usb-uhci. But sending more than one bulk
|
||||
transfer at a time with usb-uhci doesn't work yet.
|
||||
Users of usb-ohci and uhci can safely enlarge SE401_NUMSBUF in se401.h in
|
||||
order to increase the throughput (and thus framerate).
|
||||
|
||||
|
||||
HELP:
|
||||
|
||||
The latest info on this driver can be found at:
|
||||
http://members.chello.nl/~j.vreeken/se401/
|
||||
And questions to me can be send to:
|
||||
pe1rxq@amsat.org
|
@ -53,6 +53,9 @@ Testing is usually done with most application under Debian/testing:
|
||||
- kradio - Comfortable Radio Application for KDE
|
||||
- radio - ncurses-based radio application
|
||||
- mplayer - The Ultimate Movie Player For Linux
|
||||
- v4l2-ctl - Collection of command line video4linux utilities
|
||||
For example, you can use:
|
||||
v4l2-ctl -d /dev/radio0 --set-ctrl=volume=10,mute=0 --set-freq=95.21 --all
|
||||
|
||||
There is also a library libv4l, which can be used. It's going to have a function
|
||||
for frequency seeking, either by using hardware functionality as in radio-si470x
|
||||
@ -75,8 +78,10 @@ commands. Please adjust the audio devices to your needs (/dev/dsp* and hw:x,x).
|
||||
If you just want to test audio (very poor quality):
|
||||
cat /dev/dsp1 > /dev/dsp
|
||||
|
||||
If you use OSS try:
|
||||
If you use sox + OSS try:
|
||||
sox -2 --endian little -r 96000 -t oss /dev/dsp1 -t oss /dev/dsp
|
||||
or using sox + alsa:
|
||||
sox --endian little -c 2 -S -r 96000 -t alsa hw:1 -t alsa -r 96000 hw:0
|
||||
|
||||
If you use arts try:
|
||||
arecord -D hw:1,0 -r96000 -c2 -f S16_LE | artsdsp aplay -B -
|
||||
|
@ -9,32 +9,36 @@ The following terms are used in this document:
|
||||
of connecting to a variety of systems and interfaces, typically uses i2c for
|
||||
control and configuration, and a parallel or a serial bus for data.
|
||||
- camera host - an interface, to which a camera is connected. Typically a
|
||||
specialised interface, present on many SoCs, e.g., PXA27x and PXA3xx, SuperH,
|
||||
specialised interface, present on many SoCs, e.g. PXA27x and PXA3xx, SuperH,
|
||||
AVR32, i.MX27, i.MX31.
|
||||
- camera host bus - a connection between a camera host and a camera. Can be
|
||||
parallel or serial, consists of data and control lines, e.g., clock, vertical
|
||||
parallel or serial, consists of data and control lines, e.g. clock, vertical
|
||||
and horizontal synchronization signals.
|
||||
|
||||
Purpose of the soc-camera subsystem
|
||||
-----------------------------------
|
||||
|
||||
The soc-camera subsystem provides a unified API between camera host drivers and
|
||||
camera sensor drivers. It implements a V4L2 interface to the user, currently
|
||||
only the mmap method is supported.
|
||||
The soc-camera subsystem initially provided a unified API between camera host
|
||||
drivers and camera sensor drivers. Later the soc-camera sensor API has been
|
||||
replaced with the V4L2 standard subdev API. This also made camera driver re-use
|
||||
with non-soc-camera hosts possible. The camera host API to the soc-camera core
|
||||
has been preserved.
|
||||
|
||||
This subsystem has been written to connect drivers for System-on-Chip (SoC)
|
||||
video capture interfaces with drivers for CMOS camera sensor chips to enable
|
||||
the reuse of sensor drivers with various hosts. The subsystem has been designed
|
||||
to support multiple camera host interfaces and multiple cameras per interface,
|
||||
although most applications have only one camera sensor.
|
||||
Soc-camera implements a V4L2 interface to the user, currently only the "mmap"
|
||||
method is supported by host drivers. However, the soc-camera core also provides
|
||||
support for the "read" method.
|
||||
|
||||
The subsystem has been designed to support multiple camera host interfaces and
|
||||
multiple cameras per interface, although most applications have only one camera
|
||||
sensor.
|
||||
|
||||
Existing drivers
|
||||
----------------
|
||||
|
||||
As of 2.6.27-rc4 there are two host drivers in the mainline: pxa_camera.c for
|
||||
PXA27x SoCs and sh_mobile_ceu_camera.c for SuperH SoCs, and four sensor drivers:
|
||||
mt9m001.c, mt9m111.c, mt9v022.c and a generic soc_camera_platform.c driver. This
|
||||
list is not supposed to be updated, look for more examples in your tree.
|
||||
As of 3.7 there are seven host drivers in the mainline: atmel-isi.c,
|
||||
mx1_camera.c (broken, scheduled for removal), mx2_camera.c, mx3_camera.c,
|
||||
omap1_camera.c, pxa_camera.c, sh_mobile_ceu_camera.c, and multiple sensor
|
||||
drivers under drivers/media/i2c/soc_camera/.
|
||||
|
||||
Camera host API
|
||||
---------------
|
||||
@ -45,38 +49,37 @@ soc_camera_host_register(struct soc_camera_host *);
|
||||
|
||||
function. The host object can be initialized as follows:
|
||||
|
||||
static struct soc_camera_host pxa_soc_camera_host = {
|
||||
.drv_name = PXA_CAM_DRV_NAME,
|
||||
.ops = &pxa_soc_camera_host_ops,
|
||||
};
|
||||
struct soc_camera_host *ici;
|
||||
ici->drv_name = DRV_NAME;
|
||||
ici->ops = &camera_host_ops;
|
||||
ici->priv = pcdev;
|
||||
ici->v4l2_dev.dev = &pdev->dev;
|
||||
ici->nr = pdev->id;
|
||||
|
||||
All camera host methods are passed in a struct soc_camera_host_ops:
|
||||
|
||||
static struct soc_camera_host_ops pxa_soc_camera_host_ops = {
|
||||
static struct soc_camera_host_ops camera_host_ops = {
|
||||
.owner = THIS_MODULE,
|
||||
.add = pxa_camera_add_device,
|
||||
.remove = pxa_camera_remove_device,
|
||||
.suspend = pxa_camera_suspend,
|
||||
.resume = pxa_camera_resume,
|
||||
.set_fmt_cap = pxa_camera_set_fmt_cap,
|
||||
.try_fmt_cap = pxa_camera_try_fmt_cap,
|
||||
.init_videobuf = pxa_camera_init_videobuf,
|
||||
.reqbufs = pxa_camera_reqbufs,
|
||||
.poll = pxa_camera_poll,
|
||||
.querycap = pxa_camera_querycap,
|
||||
.try_bus_param = pxa_camera_try_bus_param,
|
||||
.set_bus_param = pxa_camera_set_bus_param,
|
||||
.add = camera_add_device,
|
||||
.remove = camera_remove_device,
|
||||
.set_fmt = camera_set_fmt_cap,
|
||||
.try_fmt = camera_try_fmt_cap,
|
||||
.init_videobuf2 = camera_init_videobuf2,
|
||||
.poll = camera_poll,
|
||||
.querycap = camera_querycap,
|
||||
.set_bus_param = camera_set_bus_param,
|
||||
/* The rest of host operations are optional */
|
||||
};
|
||||
|
||||
.add and .remove methods are called when a sensor is attached to or detached
|
||||
from the host, apart from performing host-internal tasks they shall also call
|
||||
sensor driver's .init and .release methods respectively. .suspend and .resume
|
||||
methods implement host's power-management functionality and its their
|
||||
responsibility to call respective sensor's methods. .try_bus_param and
|
||||
.set_bus_param are used to negotiate physical connection parameters between the
|
||||
host and the sensor. .init_videobuf is called by soc-camera core when a
|
||||
video-device is opened, further video-buffer management is implemented completely
|
||||
by the specific camera host driver. The rest of the methods are called from
|
||||
from the host. .set_bus_param is used to configure physical connection
|
||||
parameters between the host and the sensor. .init_videobuf2 is called by
|
||||
soc-camera core when a video-device is opened, the host driver would typically
|
||||
call vb2_queue_init() in this method. Further video-buffer management is
|
||||
implemented completely by the specific camera host driver. If the host driver
|
||||
supports non-standard pixel format conversion, it should implement a
|
||||
.get_formats and, possibly, a .put_formats operations. See below for more
|
||||
details about format conversion. The rest of the methods are called from
|
||||
respective V4L2 operations.
|
||||
|
||||
Camera API
|
||||
@ -84,37 +87,21 @@ Camera API
|
||||
|
||||
Sensor drivers can use struct soc_camera_link, typically provided by the
|
||||
platform, and used to specify to which camera host bus the sensor is connected,
|
||||
and arbitrarily provide platform .power and .reset methods for the camera.
|
||||
soc_camera_device_register() and soc_camera_device_unregister() functions are
|
||||
used to add a sensor driver to or remove one from the system. The registration
|
||||
function takes a pointer to struct soc_camera_device as the only parameter.
|
||||
This struct can be initialized as follows:
|
||||
|
||||
/* link to driver operations */
|
||||
icd->ops = &mt9m001_ops;
|
||||
/* link to the underlying physical (e.g., i2c) device */
|
||||
icd->control = &client->dev;
|
||||
/* window geometry */
|
||||
icd->x_min = 20;
|
||||
icd->y_min = 12;
|
||||
icd->x_current = 20;
|
||||
icd->y_current = 12;
|
||||
icd->width_min = 48;
|
||||
icd->width_max = 1280;
|
||||
icd->height_min = 32;
|
||||
icd->height_max = 1024;
|
||||
icd->y_skip_top = 1;
|
||||
/* camera bus ID, typically obtained from platform data */
|
||||
icd->iface = icl->bus_id;
|
||||
|
||||
struct soc_camera_ops provides .probe and .remove methods, which are called by
|
||||
the soc-camera core, when a camera is matched against or removed from a camera
|
||||
host bus, .init, .release, .suspend, and .resume are called from the camera host
|
||||
driver as discussed above. Other members of this struct provide respective V4L2
|
||||
functionality.
|
||||
|
||||
struct soc_camera_device also links to an array of struct soc_camera_data_format,
|
||||
listing pixel formats, supported by the camera.
|
||||
and optionally provide platform .power and .reset methods for the camera. This
|
||||
struct is provided to the camera driver via the I2C client device platform data
|
||||
and can be obtained, using the soc_camera_i2c_to_link() macro. Care should be
|
||||
taken, when using soc_camera_vdev_to_subdev() and when accessing struct
|
||||
soc_camera_device, using v4l2_get_subdev_hostdata(): both only work, when
|
||||
running on an soc-camera host. The actual camera driver operation is implemented
|
||||
using the V4L2 subdev API. Additionally soc-camera camera drivers can use
|
||||
auxiliary soc-camera helper functions like soc_camera_power_on() and
|
||||
soc_camera_power_off(), which switch regulators, provided by the platform and call
|
||||
board-specific power switching methods. soc_camera_apply_board_flags() takes
|
||||
camera bus configuration capability flags and applies any board transformations,
|
||||
e.g. signal polarity inversion. soc_mbus_get_fmtdesc() can be used to obtain a
|
||||
pixel format descriptor, corresponding to a certain media-bus pixel format code.
|
||||
soc_camera_limit_side() can be used to restrict beginning and length of a frame
|
||||
side, based on camera capabilities.
|
||||
|
||||
VIDIOC_S_CROP and VIDIOC_S_FMT behaviour
|
||||
----------------------------------------
|
||||
@ -153,8 +140,25 @@ implemented.
|
||||
User window geometry is kept in .user_width and .user_height fields in struct
|
||||
soc_camera_device and used by the soc-camera core and host drivers. The core
|
||||
updates these fields upon successful completion of a .s_fmt() call, but if these
|
||||
fields change elsewhere, e.g., during .s_crop() processing, the host driver is
|
||||
fields change elsewhere, e.g. during .s_crop() processing, the host driver is
|
||||
responsible for updating them.
|
||||
|
||||
Format conversion
|
||||
-----------------
|
||||
|
||||
V4L2 distinguishes between pixel formats, as they are stored in memory, and as
|
||||
they are transferred over a media bus. Soc-camera provides support to
|
||||
conveniently manage these formats. A table of standard transformations is
|
||||
maintained by soc-camera core, which describes, what FOURCC pixel format will
|
||||
be obtained, if a media-bus pixel format is stored in memory according to
|
||||
certain rules. E.g. if V4L2_MBUS_FMT_YUYV8_2X8 data is sampled with 8 bits per
|
||||
sample and stored in memory in the little-endian order with no gaps between
|
||||
bytes, data in memory will represent the V4L2_PIX_FMT_YUYV FOURCC format. These
|
||||
standard transformations will be used by soc-camera or by camera host drivers to
|
||||
configure camera drivers to produce the FOURCC format, requested by the user,
|
||||
using the VIDIOC_S_FMT ioctl(). Apart from those standard format conversions,
|
||||
host drivers can also provide their own conversion rules by implementing a
|
||||
.get_formats and, if required, a .put_formats methods.
|
||||
|
||||
--
|
||||
Author: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
|
||||
|
@ -1,53 +0,0 @@
|
||||
Linux driver for STV0680 based USB cameras
|
||||
|
||||
Copyright, 2001, Kevin Sisson
|
||||
|
||||
|
||||
INTRODUCTION:
|
||||
|
||||
STMicroelectronics produces the STV0680B chip, which comes in two
|
||||
types, -001 and -003. The -003 version allows the recording and downloading
|
||||
of sound clips from the camera, and allows a flash attachment. Otherwise,
|
||||
it uses the same commands as the -001 version. Both versions support a
|
||||
variety of SDRAM sizes and sensors, allowing for a maximum of 26 VGA or 20
|
||||
CIF pictures. The STV0680 supports either a serial or a usb interface, and
|
||||
video is possible through the usb interface.
|
||||
|
||||
The following cameras are known to work with this driver, although any
|
||||
camera with Vendor/Product codes of 0553/0202 should work:
|
||||
|
||||
Aiptek Pencam (various models)
|
||||
Nisis QuickPix 2
|
||||
Radio Shack 'Kid's digital camera' (#60-1207)
|
||||
At least one Trust Spycam model
|
||||
Several other European brand models
|
||||
|
||||
WHAT YOU NEED:
|
||||
|
||||
- USB support
|
||||
- VIDEO4LINUX support
|
||||
|
||||
More information about USB support for linux can be found at:
|
||||
http://www.linux-usb.org
|
||||
|
||||
|
||||
MODULE OPTIONS:
|
||||
|
||||
When the driver is compiled as a module, you can set a "swapRGB=1"
|
||||
option, if necessary, for those applications that require it
|
||||
(such as xawtv). However, the driver should detect and set this
|
||||
automatically, so this option should not normally be used.
|
||||
|
||||
|
||||
KNOWN PROBLEMS:
|
||||
|
||||
The driver seems to work better with the usb-ohci than the usb-uhci host
|
||||
controller driver.
|
||||
|
||||
HELP:
|
||||
|
||||
The latest info on this driver can be found at:
|
||||
http://personal.clt.bellsouth.net/~kjsisson or at
|
||||
http://stv0680-usb.sourceforge.net
|
||||
|
||||
Any questions to me can be send to: kjsisson@bellsouth.net
|
@ -715,14 +715,20 @@ a control of this type whenever the first control belonging to a new control
|
||||
class is added.
|
||||
|
||||
|
||||
Proposals for Extensions
|
||||
========================
|
||||
Adding Notify Callbacks
|
||||
=======================
|
||||
|
||||
Some ideas for future extensions to the spec:
|
||||
Sometimes the platform or bridge driver needs to be notified when a control
|
||||
from a sub-device driver changes. You can set a notify callback by calling
|
||||
this function:
|
||||
|
||||
1) Add a V4L2_CTRL_FLAG_HEX to have values shown as hexadecimal instead of
|
||||
decimal. Useful for e.g. video_mute_yuv.
|
||||
void v4l2_ctrl_notify(struct v4l2_ctrl *ctrl,
|
||||
void (*notify)(struct v4l2_ctrl *ctrl, void *priv), void *priv);
|
||||
|
||||
2) It is possible to mark in the controls array which controls have been
|
||||
successfully written and which failed by for example adding a bit to the
|
||||
control ID. Not sure if it is worth the effort, though.
|
||||
Whenever the give control changes value the notify callback will be called
|
||||
with a pointer to the control and the priv pointer that was passed with
|
||||
v4l2_ctrl_notify. Note that the control's handler lock is held when the
|
||||
notify function is called.
|
||||
|
||||
There can be only one notify function per control handler. Any attempt
|
||||
to set another notify function will cause a WARN_ON.
|
||||
|
@ -68,8 +68,7 @@ Structure of the framework
|
||||
The framework closely resembles the driver structure: it has a v4l2_device
|
||||
struct for the device instance data, a v4l2_subdev struct to refer to
|
||||
sub-device instances, the video_device struct stores V4L2 device node data
|
||||
and in the future a v4l2_fh struct will keep track of filehandle instances
|
||||
(this is not yet implemented).
|
||||
and the v4l2_fh struct keeps track of filehandle instances.
|
||||
|
||||
The V4L2 framework also optionally integrates with the media framework. If a
|
||||
driver sets the struct v4l2_device mdev field, sub-devices and video nodes
|
||||
|
@ -1,458 +0,0 @@
|
||||
|
||||
W996[87]CF JPEG USB Dual Mode Camera Chip
|
||||
Driver for Linux 2.6 (basic version)
|
||||
=========================================
|
||||
|
||||
- Documentation -
|
||||
|
||||
|
||||
Index
|
||||
=====
|
||||
1. Copyright
|
||||
2. Disclaimer
|
||||
3. License
|
||||
4. Overview
|
||||
5. Supported devices
|
||||
6. Module dependencies
|
||||
7. Module loading
|
||||
8. Module parameters
|
||||
9. Contact information
|
||||
10. Credits
|
||||
|
||||
|
||||
1. Copyright
|
||||
============
|
||||
Copyright (C) 2002-2004 by Luca Risolia <luca.risolia@studio.unibo.it>
|
||||
|
||||
|
||||
2. Disclaimer
|
||||
=============
|
||||
Winbond is a trademark of Winbond Electronics Corporation.
|
||||
This software is not sponsored or developed by Winbond.
|
||||
|
||||
|
||||
3. License
|
||||
==========
|
||||
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.
|
||||
|
||||
|
||||
4. Overview
|
||||
===========
|
||||
This driver supports the video streaming capabilities of the devices mounting
|
||||
Winbond W9967CF and Winbond W9968CF JPEG USB Dual Mode Camera Chips. OV681
|
||||
based cameras should be supported as well.
|
||||
|
||||
The driver is divided into two modules: the basic one, "w9968cf", is needed for
|
||||
the supported devices to work; the second one, "w9968cf-vpp", is an optional
|
||||
module, which provides some useful video post-processing functions like video
|
||||
decoding, up-scaling and colour conversions.
|
||||
|
||||
Note that the official kernels do neither include nor support the second
|
||||
module for performance purposes. Therefore, it is always recommended to
|
||||
download and install the latest and complete release of the driver,
|
||||
replacing the existing one, if present.
|
||||
|
||||
The latest and full-featured version of the W996[87]CF driver can be found at:
|
||||
http://www.linux-projects.org. Please refer to the documentation included in
|
||||
that package, if you are going to use it.
|
||||
|
||||
Up to 32 cameras can be handled at the same time. They can be connected and
|
||||
disconnected from the host many times without turning off the computer, if
|
||||
your system supports the hotplug facility.
|
||||
|
||||
To change the default settings for each camera, many parameters can be passed
|
||||
through command line when the module is loaded into memory.
|
||||
|
||||
The driver relies on the Video4Linux, USB and I2C core modules. It has been
|
||||
designed to run properly on SMP systems as well. An additional module,
|
||||
"ovcamchip", is mandatory; it provides support for some OmniVision image
|
||||
sensors connected to the W996[87]CF chips; if found in the system, the module
|
||||
will be automatically loaded by default (provided that the kernel has been
|
||||
compiled with the automatic module loading option).
|
||||
|
||||
|
||||
5. Supported devices
|
||||
====================
|
||||
At the moment, known W996[87]CF and OV681 based devices are:
|
||||
- Aroma Digi Pen VGA Dual Mode ADG-5000 (unknown image sensor)
|
||||
- AVerMedia AVerTV USB (SAA7111A, Philips FI1216Mk2 tuner, PT2313L audio chip)
|
||||
- Creative Labs Video Blaster WebCam Go (OmniVision OV7610 sensor)
|
||||
- Creative Labs Video Blaster WebCam Go Plus (OmniVision OV7620 sensor)
|
||||
- Lebon LDC-035A (unknown image sensor)
|
||||
- Ezonics EZ-802 EZMega Cam (OmniVision OV8610C sensor)
|
||||
- OmniVision OV8610-EDE (OmniVision OV8610 sensor)
|
||||
- OPCOM Digi Pen VGA Dual Mode Pen Camera (unknown image sensor)
|
||||
- Pretec Digi Pen-II (OmniVision OV7620 sensor)
|
||||
- Pretec DigiPen-480 (OmniVision OV8610 sensor)
|
||||
|
||||
If you know any other W996[87]CF or OV681 based cameras, please contact me.
|
||||
|
||||
The list above does not imply that all those devices work with this driver: up
|
||||
until now only webcams that have an image sensor supported by the "ovcamchip"
|
||||
module work. Kernel messages will always tell you whether this is case.
|
||||
|
||||
Possible external microcontrollers of those webcams are not supported: this
|
||||
means that still images cannot be downloaded from the device memory.
|
||||
|
||||
Furthermore, it's worth to note that I was only able to run tests on my
|
||||
"Creative Labs Video Blaster WebCam Go". Donations of other models, for
|
||||
additional testing and full support, would be much appreciated.
|
||||
|
||||
|
||||
6. Module dependencies
|
||||
======================
|
||||
For it to work properly, the driver needs kernel support for Video4Linux, USB
|
||||
and I2C, and the "ovcamchip" module for the image sensor. Make sure you are not
|
||||
actually using any external "ovcamchip" module, given that the W996[87]CF
|
||||
driver depends on the version of the module present in the official kernels.
|
||||
|
||||
The following options of the kernel configuration file must be enabled and
|
||||
corresponding modules must be compiled:
|
||||
|
||||
# Multimedia devices
|
||||
#
|
||||
CONFIG_VIDEO_DEV=m
|
||||
|
||||
# I2C support
|
||||
#
|
||||
CONFIG_I2C=m
|
||||
|
||||
The I2C core module can be compiled statically in the kernel as well.
|
||||
|
||||
# OmniVision Camera Chip support
|
||||
#
|
||||
CONFIG_VIDEO_OVCAMCHIP=m
|
||||
|
||||
# USB support
|
||||
#
|
||||
CONFIG_USB=m
|
||||
|
||||
In addition, depending on the hardware being used, only one of the modules
|
||||
below is necessary:
|
||||
|
||||
# USB Host Controller Drivers
|
||||
#
|
||||
CONFIG_USB_EHCI_HCD=m
|
||||
CONFIG_USB_UHCI_HCD=m
|
||||
CONFIG_USB_OHCI_HCD=m
|
||||
|
||||
And finally:
|
||||
|
||||
# USB Multimedia devices
|
||||
#
|
||||
CONFIG_USB_W9968CF=m
|
||||
|
||||
|
||||
7. Module loading
|
||||
=================
|
||||
To use the driver, it is necessary to load the "w9968cf" module into memory
|
||||
after every other module required.
|
||||
|
||||
Loading can be done this way, from root:
|
||||
|
||||
[root@localhost home]# modprobe usbcore
|
||||
[root@localhost home]# modprobe i2c-core
|
||||
[root@localhost home]# modprobe videodev
|
||||
[root@localhost home]# modprobe w9968cf
|
||||
|
||||
At this point the pertinent devices should be recognized: "dmesg" can be used
|
||||
to analyze kernel messages:
|
||||
|
||||
[user@localhost home]$ dmesg
|
||||
|
||||
There are a lot of parameters the module can use to change the default
|
||||
settings for each device. To list every possible parameter with a brief
|
||||
explanation about them and which syntax to use, it is recommended to run the
|
||||
"modinfo" command:
|
||||
|
||||
[root@locahost home]# modinfo w9968cf
|
||||
|
||||
|
||||
8. Module parameters
|
||||
====================
|
||||
Module parameters are listed below:
|
||||
-------------------------------------------------------------------------------
|
||||
Name: ovmod_load
|
||||
Type: bool
|
||||
Syntax: <0|1>
|
||||
Description: Automatic 'ovcamchip' module loading: 0 disabled, 1 enabled.
|
||||
If enabled, 'insmod' searches for the required 'ovcamchip'
|
||||
module in the system, according to its configuration, and
|
||||
loads that module automatically. This action is performed as
|
||||
once soon as the 'w9968cf' module is loaded into memory.
|
||||
Default: 1
|
||||
-------------------------------------------------------------------------------
|
||||
Name: simcams
|
||||
Type: int
|
||||
Syntax: <n>
|
||||
Description: Number of cameras allowed to stream simultaneously.
|
||||
n may vary from 0 to 32.
|
||||
Default: 32
|
||||
-------------------------------------------------------------------------------
|
||||
Name: video_nr
|
||||
Type: int array (min = 0, max = 32)
|
||||
Syntax: <-1|n[,...]>
|
||||
Description: Specify V4L minor mode number.
|
||||
-1 = use next available
|
||||
n = use minor number n
|
||||
You can specify up to 32 cameras this way.
|
||||
For example:
|
||||
video_nr=-1,2,-1 would assign minor number 2 to the second
|
||||
recognized camera and use auto for the first one and for every
|
||||
other camera.
|
||||
Default: -1
|
||||
-------------------------------------------------------------------------------
|
||||
Name: packet_size
|
||||
Type: int array (min = 0, max = 32)
|
||||
Syntax: <n[,...]>
|
||||
Description: Specify the maximum data payload size in bytes for alternate
|
||||
settings, for each device. n is scaled between 63 and 1023.
|
||||
Default: 1023
|
||||
-------------------------------------------------------------------------------
|
||||
Name: max_buffers
|
||||
Type: int array (min = 0, max = 32)
|
||||
Syntax: <n[,...]>
|
||||
Description: For advanced users.
|
||||
Specify the maximum number of video frame buffers to allocate
|
||||
for each device, from 2 to 32.
|
||||
Default: 2
|
||||
-------------------------------------------------------------------------------
|
||||
Name: double_buffer
|
||||
Type: bool array (min = 0, max = 32)
|
||||
Syntax: <0|1[,...]>
|
||||
Description: Hardware double buffering: 0 disabled, 1 enabled.
|
||||
It should be enabled if you want smooth video output: if you
|
||||
obtain out of sync. video, disable it, or try to
|
||||
decrease the 'clockdiv' module parameter value.
|
||||
Default: 1 for every device.
|
||||
-------------------------------------------------------------------------------
|
||||
Name: clamping
|
||||
Type: bool array (min = 0, max = 32)
|
||||
Syntax: <0|1[,...]>
|
||||
Description: Video data clamping: 0 disabled, 1 enabled.
|
||||
Default: 0 for every device.
|
||||
-------------------------------------------------------------------------------
|
||||
Name: filter_type
|
||||
Type: int array (min = 0, max = 32)
|
||||
Syntax: <0|1|2[,...]>
|
||||
Description: Video filter type.
|
||||
0 none, 1 (1-2-1) 3-tap filter, 2 (2-3-6-3-2) 5-tap filter.
|
||||
The filter is used to reduce noise and aliasing artifacts
|
||||
produced by the CCD or CMOS image sensor.
|
||||
Default: 0 for every device.
|
||||
-------------------------------------------------------------------------------
|
||||
Name: largeview
|
||||
Type: bool array (min = 0, max = 32)
|
||||
Syntax: <0|1[,...]>
|
||||
Description: Large view: 0 disabled, 1 enabled.
|
||||
Default: 1 for every device.
|
||||
-------------------------------------------------------------------------------
|
||||
Name: upscaling
|
||||
Type: bool array (min = 0, max = 32)
|
||||
Syntax: <0|1[,...]>
|
||||
Description: Software scaling (for non-compressed video only):
|
||||
0 disabled, 1 enabled.
|
||||
Disable it if you have a slow CPU or you don't have enough
|
||||
memory.
|
||||
Default: 0 for every device.
|
||||
Note: If 'w9968cf-vpp' is not present, this parameter is set to 0.
|
||||
-------------------------------------------------------------------------------
|
||||
Name: decompression
|
||||
Type: int array (min = 0, max = 32)
|
||||
Syntax: <0|1|2[,...]>
|
||||
Description: Software video decompression:
|
||||
0 = disables decompression
|
||||
(doesn't allow formats needing decompression).
|
||||
1 = forces decompression
|
||||
(allows formats needing decompression only).
|
||||
2 = allows any permitted formats.
|
||||
Formats supporting (de)compressed video are YUV422P and
|
||||
YUV420P/YUV420 in any resolutions where width and height are
|
||||
multiples of 16.
|
||||
Default: 2 for every device.
|
||||
Note: If 'w9968cf-vpp' is not present, forcing decompression is not
|
||||
allowed; in this case this parameter is set to 2.
|
||||
-------------------------------------------------------------------------------
|
||||
Name: force_palette
|
||||
Type: int array (min = 0, max = 32)
|
||||
Syntax: <0|9|10|13|15|8|7|1|6|3|4|5[,...]>
|
||||
Description: Force picture palette.
|
||||
In order:
|
||||
0 = Off - allows any of the following formats:
|
||||
9 = UYVY 16 bpp - Original video, compression disabled
|
||||
10 = YUV420 12 bpp - Original video, compression enabled
|
||||
13 = YUV422P 16 bpp - Original video, compression enabled
|
||||
15 = YUV420P 12 bpp - Original video, compression enabled
|
||||
8 = YUVY 16 bpp - Software conversion from UYVY
|
||||
7 = YUV422 16 bpp - Software conversion from UYVY
|
||||
1 = GREY 8 bpp - Software conversion from UYVY
|
||||
6 = RGB555 16 bpp - Software conversion from UYVY
|
||||
3 = RGB565 16 bpp - Software conversion from UYVY
|
||||
4 = RGB24 24 bpp - Software conversion from UYVY
|
||||
5 = RGB32 32 bpp - Software conversion from UYVY
|
||||
When not 0, this parameter will override 'decompression'.
|
||||
Default: 0 for every device. Initial palette is 9 (UYVY).
|
||||
Note: If 'w9968cf-vpp' is not present, this parameter is set to 9.
|
||||
-------------------------------------------------------------------------------
|
||||
Name: force_rgb
|
||||
Type: bool array (min = 0, max = 32)
|
||||
Syntax: <0|1[,...]>
|
||||
Description: Read RGB video data instead of BGR:
|
||||
1 = use RGB component ordering.
|
||||
0 = use BGR component ordering.
|
||||
This parameter has effect when using RGBX palettes only.
|
||||
Default: 0 for every device.
|
||||
-------------------------------------------------------------------------------
|
||||
Name: autobright
|
||||
Type: bool array (min = 0, max = 32)
|
||||
Syntax: <0|1[,...]>
|
||||
Description: Image sensor automatically changes brightness:
|
||||
0 = no, 1 = yes
|
||||
Default: 0 for every device.
|
||||
-------------------------------------------------------------------------------
|
||||
Name: autoexp
|
||||
Type: bool array (min = 0, max = 32)
|
||||
Syntax: <0|1[,...]>
|
||||
Description: Image sensor automatically changes exposure:
|
||||
0 = no, 1 = yes
|
||||
Default: 1 for every device.
|
||||
-------------------------------------------------------------------------------
|
||||
Name: lightfreq
|
||||
Type: int array (min = 0, max = 32)
|
||||
Syntax: <50|60[,...]>
|
||||
Description: Light frequency in Hz:
|
||||
50 for European and Asian lighting, 60 for American lighting.
|
||||
Default: 50 for every device.
|
||||
-------------------------------------------------------------------------------
|
||||
Name: bandingfilter
|
||||
Type: bool array (min = 0, max = 32)
|
||||
Syntax: <0|1[,...]>
|
||||
Description: Banding filter to reduce effects of fluorescent
|
||||
lighting:
|
||||
0 disabled, 1 enabled.
|
||||
This filter tries to reduce the pattern of horizontal
|
||||
light/dark bands caused by some (usually fluorescent) lighting.
|
||||
Default: 0 for every device.
|
||||
-------------------------------------------------------------------------------
|
||||
Name: clockdiv
|
||||
Type: int array (min = 0, max = 32)
|
||||
Syntax: <-1|n[,...]>
|
||||
Description: Force pixel clock divisor to a specific value (for experts):
|
||||
n may vary from 0 to 127.
|
||||
-1 for automatic value.
|
||||
See also the 'double_buffer' module parameter.
|
||||
Default: -1 for every device.
|
||||
-------------------------------------------------------------------------------
|
||||
Name: backlight
|
||||
Type: bool array (min = 0, max = 32)
|
||||
Syntax: <0|1[,...]>
|
||||
Description: Objects are lit from behind:
|
||||
0 = no, 1 = yes
|
||||
Default: 0 for every device.
|
||||
-------------------------------------------------------------------------------
|
||||
Name: mirror
|
||||
Type: bool array (min = 0, max = 32)
|
||||
Syntax: <0|1[,...]>
|
||||
Description: Reverse image horizontally:
|
||||
0 = no, 1 = yes
|
||||
Default: 0 for every device.
|
||||
-------------------------------------------------------------------------------
|
||||
Name: monochrome
|
||||
Type: bool array (min = 0, max = 32)
|
||||
Syntax: <0|1[,...]>
|
||||
Description: The image sensor is monochrome:
|
||||
0 = no, 1 = yes
|
||||
Default: 0 for every device.
|
||||
-------------------------------------------------------------------------------
|
||||
Name: brightness
|
||||
Type: long array (min = 0, max = 32)
|
||||
Syntax: <n[,...]>
|
||||
Description: Set picture brightness (0-65535).
|
||||
This parameter has no effect if 'autobright' is enabled.
|
||||
Default: 31000 for every device.
|
||||
-------------------------------------------------------------------------------
|
||||
Name: hue
|
||||
Type: long array (min = 0, max = 32)
|
||||
Syntax: <n[,...]>
|
||||
Description: Set picture hue (0-65535).
|
||||
Default: 32768 for every device.
|
||||
-------------------------------------------------------------------------------
|
||||
Name: colour
|
||||
Type: long array (min = 0, max = 32)
|
||||
Syntax: <n[,...]>
|
||||
Description: Set picture saturation (0-65535).
|
||||
Default: 32768 for every device.
|
||||
-------------------------------------------------------------------------------
|
||||
Name: contrast
|
||||
Type: long array (min = 0, max = 32)
|
||||
Syntax: <n[,...]>
|
||||
Description: Set picture contrast (0-65535).
|
||||
Default: 50000 for every device.
|
||||
-------------------------------------------------------------------------------
|
||||
Name: whiteness
|
||||
Type: long array (min = 0, max = 32)
|
||||
Syntax: <n[,...]>
|
||||
Description: Set picture whiteness (0-65535).
|
||||
Default: 32768 for every device.
|
||||
-------------------------------------------------------------------------------
|
||||
Name: debug
|
||||
Type: int
|
||||
Syntax: <n>
|
||||
Description: Debugging information level, from 0 to 6:
|
||||
0 = none (use carefully)
|
||||
1 = critical errors
|
||||
2 = significant information
|
||||
3 = configuration or general messages
|
||||
4 = warnings
|
||||
5 = called functions
|
||||
6 = function internals
|
||||
Level 5 and 6 are useful for testing only, when only one
|
||||
device is used.
|
||||
Default: 2
|
||||
-------------------------------------------------------------------------------
|
||||
Name: specific_debug
|
||||
Type: bool
|
||||
Syntax: <0|1>
|
||||
Description: Enable or disable specific debugging messages:
|
||||
0 = print messages concerning every level <= 'debug' level.
|
||||
1 = print messages concerning the level indicated by 'debug'.
|
||||
Default: 0
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
|
||||
9. Contact information
|
||||
======================
|
||||
I may be contacted by e-mail at <luca.risolia@studio.unibo.it>.
|
||||
|
||||
I can accept GPG/PGP encrypted e-mail. My GPG key ID is 'FCE635A4'.
|
||||
My public 1024-bit key should be available at your keyserver; the fingerprint
|
||||
is: '88E8 F32F 7244 68BA 3958 5D40 99DA 5D2A FCE6 35A4'.
|
||||
|
||||
|
||||
10. Credits
|
||||
==========
|
||||
The development would not have proceed much further without having looked at
|
||||
the source code of other drivers and without the help of several persons; in
|
||||
particular:
|
||||
|
||||
- the I2C interface to kernel and high-level image sensor control routines have
|
||||
been taken from the OV511 driver by Mark McClelland;
|
||||
|
||||
- memory management code has been copied from the bttv driver by Ralph Metzler,
|
||||
Marcus Metzler and Gerd Knorr;
|
||||
|
||||
- the low-level I2C read function has been written by Frederic Jouault;
|
||||
|
||||
- the low-level I2C fast write function has been written by Piotr Czerczak.
|
@ -1,270 +0,0 @@
|
||||
|
||||
ZC0301 and ZC0301P Image Processor and Control Chip
|
||||
Driver for Linux
|
||||
===================================================
|
||||
|
||||
- Documentation -
|
||||
|
||||
|
||||
Index
|
||||
=====
|
||||
1. Copyright
|
||||
2. Disclaimer
|
||||
3. License
|
||||
4. Overview and features
|
||||
5. Module dependencies
|
||||
6. Module loading
|
||||
7. Module parameters
|
||||
8. Supported devices
|
||||
9. Notes for V4L2 application developers
|
||||
10. Contact information
|
||||
11. Credits
|
||||
|
||||
|
||||
1. Copyright
|
||||
============
|
||||
Copyright (C) 2006-2007 by Luca Risolia <luca.risolia@studio.unibo.it>
|
||||
|
||||
|
||||
2. Disclaimer
|
||||
=============
|
||||
This software is not developed or sponsored by Z-Star Microelectronics Corp.
|
||||
Trademarks are property of their respective owner.
|
||||
|
||||
|
||||
3. License
|
||||
==========
|
||||
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.
|
||||
|
||||
|
||||
4. Overview and features
|
||||
========================
|
||||
This driver supports the video interface of the devices mounting the ZC0301 or
|
||||
ZC0301P Image Processors and Control Chips.
|
||||
|
||||
The driver relies on the Video4Linux2 and USB core modules. It has been
|
||||
designed to run properly on SMP systems as well.
|
||||
|
||||
The latest version of the ZC0301[P] driver can be found at the following URL:
|
||||
http://www.linux-projects.org/
|
||||
|
||||
Some of the features of the driver are:
|
||||
|
||||
- full compliance with the Video4Linux2 API (see also "Notes for V4L2
|
||||
application developers" paragraph);
|
||||
- available mmap or read/poll methods for video streaming through isochronous
|
||||
data transfers;
|
||||
- automatic detection of image sensor;
|
||||
- video format is standard JPEG;
|
||||
- dynamic driver control thanks to various module parameters (see "Module
|
||||
parameters" paragraph);
|
||||
- up to 64 cameras can be handled at the same time; they can be connected and
|
||||
disconnected from the host many times without turning off the computer, if
|
||||
the system supports hotplugging;
|
||||
|
||||
|
||||
5. Module dependencies
|
||||
======================
|
||||
For it to work properly, the driver needs kernel support for Video4Linux and
|
||||
USB.
|
||||
|
||||
The following options of the kernel configuration file must be enabled and
|
||||
corresponding modules must be compiled:
|
||||
|
||||
# Multimedia devices
|
||||
#
|
||||
CONFIG_VIDEO_DEV=m
|
||||
|
||||
# USB support
|
||||
#
|
||||
CONFIG_USB=m
|
||||
|
||||
In addition, depending on the hardware being used, the modules below are
|
||||
necessary:
|
||||
|
||||
# USB Host Controller Drivers
|
||||
#
|
||||
CONFIG_USB_EHCI_HCD=m
|
||||
CONFIG_USB_UHCI_HCD=m
|
||||
CONFIG_USB_OHCI_HCD=m
|
||||
|
||||
The ZC0301 controller also provides a built-in microphone interface. It is
|
||||
supported by the USB Audio driver thanks to the ALSA API:
|
||||
|
||||
# Sound
|
||||
#
|
||||
CONFIG_SOUND=y
|
||||
|
||||
# Advanced Linux Sound Architecture
|
||||
#
|
||||
CONFIG_SND=m
|
||||
|
||||
# USB devices
|
||||
#
|
||||
CONFIG_SND_USB_AUDIO=m
|
||||
|
||||
And finally:
|
||||
|
||||
# V4L USB devices
|
||||
#
|
||||
CONFIG_USB_ZC0301=m
|
||||
|
||||
|
||||
6. Module loading
|
||||
=================
|
||||
To use the driver, it is necessary to load the "zc0301" module into memory
|
||||
after every other module required: "videodev", "v4l2_common", "compat_ioctl32",
|
||||
"usbcore" and, depending on the USB host controller you have, "ehci-hcd",
|
||||
"uhci-hcd" or "ohci-hcd".
|
||||
|
||||
Loading can be done as shown below:
|
||||
|
||||
[root@localhost home]# modprobe zc0301
|
||||
|
||||
At this point the devices should be recognized. You can invoke "dmesg" to
|
||||
analyze kernel messages and verify that the loading process has gone well:
|
||||
|
||||
[user@localhost home]$ dmesg
|
||||
|
||||
|
||||
7. Module parameters
|
||||
====================
|
||||
Module parameters are listed below:
|
||||
-------------------------------------------------------------------------------
|
||||
Name: video_nr
|
||||
Type: short array (min = 0, max = 64)
|
||||
Syntax: <-1|n[,...]>
|
||||
Description: Specify V4L2 minor mode number:
|
||||
-1 = use next available
|
||||
n = use minor number n
|
||||
You can specify up to 64 cameras this way.
|
||||
For example:
|
||||
video_nr=-1,2,-1 would assign minor number 2 to the second
|
||||
registered camera and use auto for the first one and for every
|
||||
other camera.
|
||||
Default: -1
|
||||
-------------------------------------------------------------------------------
|
||||
Name: force_munmap
|
||||
Type: bool array (min = 0, max = 64)
|
||||
Syntax: <0|1[,...]>
|
||||
Description: Force the application to unmap previously mapped buffer memory
|
||||
before calling any VIDIOC_S_CROP or VIDIOC_S_FMT ioctl's. Not
|
||||
all the applications support this feature. This parameter is
|
||||
specific for each detected camera.
|
||||
0 = do not force memory unmapping
|
||||
1 = force memory unmapping (save memory)
|
||||
Default: 0
|
||||
-------------------------------------------------------------------------------
|
||||
Name: frame_timeout
|
||||
Type: uint array (min = 0, max = 64)
|
||||
Syntax: <n[,...]>
|
||||
Description: Timeout for a video frame in seconds. This parameter is
|
||||
specific for each detected camera. This parameter can be
|
||||
changed at runtime thanks to the /sys filesystem interface.
|
||||
Default: 2
|
||||
-------------------------------------------------------------------------------
|
||||
Name: debug
|
||||
Type: ushort
|
||||
Syntax: <n>
|
||||
Description: Debugging information level, from 0 to 3:
|
||||
0 = none (use carefully)
|
||||
1 = critical errors
|
||||
2 = significant information
|
||||
3 = more verbose messages
|
||||
Level 3 is useful for testing only, when only one device
|
||||
is used at the same time. It also shows some information
|
||||
about the hardware being detected. This module parameter can be
|
||||
changed at runtime thanks to the /sys filesystem interface.
|
||||
Default: 2
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
|
||||
8. Supported devices
|
||||
====================
|
||||
None of the names of the companies as well as their products will be mentioned
|
||||
here. They have never collaborated with the author, so no advertising.
|
||||
|
||||
From the point of view of a driver, what unambiguously identify a device are
|
||||
its vendor and product USB identifiers. Below is a list of known identifiers of
|
||||
devices mounting the ZC0301 Image Processor and Control Chips:
|
||||
|
||||
Vendor ID Product ID
|
||||
--------- ----------
|
||||
0x041e 0x4017
|
||||
0x041e 0x401c
|
||||
0x041e 0x401e
|
||||
0x041e 0x401f
|
||||
0x041e 0x4022
|
||||
0x041e 0x4034
|
||||
0x041e 0x4035
|
||||
0x041e 0x4036
|
||||
0x041e 0x403a
|
||||
0x0458 0x7007
|
||||
0x0458 0x700c
|
||||
0x0458 0x700f
|
||||
0x046d 0x08ae
|
||||
0x055f 0xd003
|
||||
0x055f 0xd004
|
||||
0x0ac8 0x0301
|
||||
0x0ac8 0x301b
|
||||
0x0ac8 0x303b
|
||||
0x10fd 0x0128
|
||||
0x10fd 0x8050
|
||||
0x10fd 0x804e
|
||||
|
||||
The list above does not imply that all those devices work with this driver: up
|
||||
until now only the ones that mount the following image sensors are supported;
|
||||
kernel messages will always tell you whether this is the case:
|
||||
|
||||
Model Manufacturer
|
||||
----- ------------
|
||||
PAS202BCB PixArt Imaging, Inc.
|
||||
PB-0330 Photobit Corporation
|
||||
|
||||
|
||||
9. Notes for V4L2 application developers
|
||||
========================================
|
||||
This driver follows the V4L2 API specifications. In particular, it enforces two
|
||||
rules:
|
||||
|
||||
- exactly one I/O method, either "mmap" or "read", is associated with each
|
||||
file descriptor. Once it is selected, the application must close and reopen the
|
||||
device to switch to the other I/O method;
|
||||
|
||||
- although it is not mandatory, previously mapped buffer memory should always
|
||||
be unmapped before calling any "VIDIOC_S_CROP" or "VIDIOC_S_FMT" ioctl's.
|
||||
The same number of buffers as before will be allocated again to match the size
|
||||
of the new video frames, so you have to map the buffers again before any I/O
|
||||
attempts on them.
|
||||
|
||||
|
||||
10. Contact information
|
||||
=======================
|
||||
The author may be contacted by e-mail at <luca.risolia@studio.unibo.it>.
|
||||
|
||||
GPG/PGP encrypted e-mail's are accepted. The GPG key ID of the author is
|
||||
'FCE635A4'; the public 1024-bit key should be available at any keyserver;
|
||||
the fingerprint is: '88E8 F32F 7244 68BA 3958 5D40 99DA 5D2A FCE6 35A4'.
|
||||
|
||||
|
||||
11. Credits
|
||||
===========
|
||||
- Information about the chip internals needed to enable the I2C protocol have
|
||||
been taken from the documentation of the ZC030x Video4Linux1 driver written
|
||||
by Andrew Birkett <andy@nobugs.org>;
|
||||
- The initialization values of the ZC0301 controller connected to the PAS202BCB
|
||||
and PB-0330 image sensors have been taken from the SPCA5XX driver maintained
|
||||
by Michel Xhaard <mxhaard@magic.fr>;
|
||||
- Stanislav Lechev donated one camera.
|
262
MAINTAINERS
262
MAINTAINERS
@ -465,6 +465,14 @@ S: Maintained
|
||||
F: drivers/scsi/aic7xxx/
|
||||
F: drivers/scsi/aic7xxx_old/
|
||||
|
||||
AIMSLAB FM RADIO RECEIVER DRIVER
|
||||
M: Hans Verkuil <hverkuil@xs4all.nl>
|
||||
L: linux-media@vger.kernel.org
|
||||
T: git git://linuxtv.org/media_tree.git
|
||||
W: http://linuxtv.org
|
||||
S: Maintained
|
||||
F: drivers/media/radio/radio-aimslab*
|
||||
|
||||
AIO
|
||||
M: Benjamin LaHaise <bcrl@kvack.org>
|
||||
L: linux-aio@kvack.org
|
||||
@ -559,6 +567,18 @@ L: linux-rdma@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/infiniband/hw/amso1100/
|
||||
|
||||
ANALOG DEVICES INC AD9389B DRIVER
|
||||
M: Hans Verkuil <hans.verkuil@cisco.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/media/i2c/ad9389b*
|
||||
|
||||
ANALOG DEVICES INC ADV7604 DRIVER
|
||||
M: Hans Verkuil <hans.verkuil@cisco.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/media/i2c/adv7604*
|
||||
|
||||
ANALOG DEVICES INC ASOC CODEC DRIVERS
|
||||
M: Lars-Peter Clausen <lars@metafoo.de>
|
||||
L: device-drivers-devel@blackfin.uclinux.org
|
||||
@ -1126,6 +1146,14 @@ F: arch/arm/mach-s5pv210/mach-goni.c
|
||||
F: arch/arm/mach-exynos/mach-universal_c210.c
|
||||
F: arch/arm/mach-exynos/mach-nuri.c
|
||||
|
||||
ARM/SAMSUNG S5P SERIES 2D GRAPHICS ACCELERATION (G2D) SUPPORT
|
||||
M: Kyungmin Park <kyungmin.park@samsung.com>
|
||||
M: Kamil Debski <k.debski@samsung.com>
|
||||
L: linux-arm-kernel@lists.infradead.org
|
||||
L: linux-media@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/media/platform/s5p-g2d/
|
||||
|
||||
ARM/SAMSUNG S5P SERIES FIMC SUPPORT
|
||||
M: Kyungmin Park <kyungmin.park@samsung.com>
|
||||
M: Sylwester Nawrocki <s.nawrocki@samsung.com>
|
||||
@ -1291,6 +1319,14 @@ S: Maintained
|
||||
F: arch/arm64/
|
||||
F: Documentation/arm64/
|
||||
|
||||
AS3645A LED FLASH CONTROLLER DRIVER
|
||||
M: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
T: git git://linuxtv.org/media_tree.git
|
||||
S: Maintained
|
||||
F: drivers/media/i2c/as3645a.c
|
||||
F: include/media/as3645a.h
|
||||
|
||||
ASC7621 HARDWARE MONITOR DRIVER
|
||||
M: George Joseph <george.joseph@fairview5.com>
|
||||
L: lm-sensors@lm-sensors.org
|
||||
@ -1538,6 +1574,14 @@ T: git git://linuxtv.org/media_tree.git
|
||||
S: Maintained
|
||||
F: drivers/media/usb/dvb-usb-v2/az6007.c
|
||||
|
||||
AZTECH FM RADIO RECEIVER DRIVER
|
||||
M: Hans Verkuil <hverkuil@xs4all.nl>
|
||||
L: linux-media@vger.kernel.org
|
||||
T: git git://linuxtv.org/media_tree.git
|
||||
W: http://linuxtv.org
|
||||
S: Maintained
|
||||
F: drivers/media/radio/radio-aztech*
|
||||
|
||||
B43 WIRELESS DRIVER
|
||||
M: Stefano Brivio <stefano.brivio@polimi.it>
|
||||
L: linux-wireless@vger.kernel.org
|
||||
@ -1637,6 +1681,15 @@ W: http://blackfin.uclinux.org/
|
||||
S: Supported
|
||||
F: drivers/i2c/busses/i2c-bfin-twi.c
|
||||
|
||||
BLACKFIN MEDIA DRIVER
|
||||
M: Scott Jiang <scott.jiang.linux@gmail.com>
|
||||
L: uclinux-dist-devel@blackfin.uclinux.org
|
||||
W: http://blackfin.uclinux.org/
|
||||
S: Supported
|
||||
F: drivers/media/platform/blackfin/
|
||||
F: drivers/media/i2c/adv7183*
|
||||
F: drivers/media/i2c/vs6624*
|
||||
|
||||
BLINKM RGB LED DRIVER
|
||||
M: Jan-Simon Moeller <jansimon.moeller@gmx.de>
|
||||
S: Maintained
|
||||
@ -1820,6 +1873,14 @@ S: Supported
|
||||
F: Documentation/filesystems/caching/cachefiles.txt
|
||||
F: fs/cachefiles/
|
||||
|
||||
CADET FM/AM RADIO RECEIVER DRIVER
|
||||
M: Hans Verkuil <hverkuil@xs4all.nl>
|
||||
L: linux-media@vger.kernel.org
|
||||
T: git git://linuxtv.org/media_tree.git
|
||||
W: http://linuxtv.org
|
||||
S: Maintained
|
||||
F: drivers/media/radio/radio-cadet*
|
||||
|
||||
CAFE CMOS INTEGRATED CAMERA CONTROLLER DRIVER
|
||||
M: Jonathan Corbet <corbet@lwn.net>
|
||||
L: linux-media@vger.kernel.org
|
||||
@ -2221,6 +2282,15 @@ F: Documentation/video4linux/cx18.txt
|
||||
F: drivers/media/pci/cx18/
|
||||
F: include/uapi/linux/ivtv*
|
||||
|
||||
CX2341X MPEG ENCODER HELPER MODULE
|
||||
M: Hans Verkuil <hverkuil@xs4all.nl>
|
||||
L: linux-media@vger.kernel.org
|
||||
T: git git://linuxtv.org/media_tree.git
|
||||
W: http://linuxtv.org
|
||||
S: Maintained
|
||||
F: drivers/media/i2c/cx2341x*
|
||||
F: include/media/cx2341x*
|
||||
|
||||
CX88 VIDEO4LINUX DRIVER
|
||||
M: Mauro Carvalho Chehab <mchehab@redhat.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
@ -2598,6 +2668,13 @@ S: Maintained
|
||||
F: drivers/gpu/drm/tegra/
|
||||
F: Documentation/devicetree/bindings/gpu/nvidia,tegra20-host1x.txt
|
||||
|
||||
DSBR100 USB FM RADIO DRIVER
|
||||
M: Alexey Klimov <klimov.linux@gmail.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
T: git git://linuxtv.org/media_tree.git
|
||||
S: Maintained
|
||||
F: drivers/media/radio/dsbr100.c
|
||||
|
||||
DSCC4 DRIVER
|
||||
M: Francois Romieu <romieu@fr.zoreil.com>
|
||||
L: netdev@vger.kernel.org
|
||||
@ -3364,6 +3441,14 @@ W: http://www.icp-vortex.com/
|
||||
S: Supported
|
||||
F: drivers/scsi/gdt*
|
||||
|
||||
GEMTEK FM RADIO RECEIVER DRIVER
|
||||
M: Hans Verkuil <hverkuil@xs4all.nl>
|
||||
L: linux-media@vger.kernel.org
|
||||
T: git git://linuxtv.org/media_tree.git
|
||||
W: http://linuxtv.org
|
||||
S: Maintained
|
||||
F: drivers/media/radio/radio-gemtek*
|
||||
|
||||
GENERIC GPIO I2C DRIVER
|
||||
M: Haavard Skinnemoen <hskinnemoen@gmail.com>
|
||||
S: Supported
|
||||
@ -4250,6 +4335,14 @@ F: Documentation/isapnp.txt
|
||||
F: drivers/pnp/isapnp/
|
||||
F: include/linux/isapnp.h
|
||||
|
||||
ISA RADIO MODULE
|
||||
M: Hans Verkuil <hverkuil@xs4all.nl>
|
||||
L: linux-media@vger.kernel.org
|
||||
T: git git://linuxtv.org/media_tree.git
|
||||
W: http://linuxtv.org
|
||||
S: Maintained
|
||||
F: drivers/media/radio/radio-isa*
|
||||
|
||||
iSCSI BOOT FIRMWARE TABLE (iBFT) DRIVER
|
||||
M: Peter Jones <pjones@redhat.com>
|
||||
M: Konrad Rzeszutek Wilk <konrad@kernel.org>
|
||||
@ -4408,6 +4501,14 @@ W: http://lse.sourceforge.net/kdump/
|
||||
S: Maintained
|
||||
F: Documentation/kdump/
|
||||
|
||||
KEENE FM RADIO TRANSMITTER DRIVER
|
||||
M: Hans Verkuil <hverkuil@xs4all.nl>
|
||||
L: linux-media@vger.kernel.org
|
||||
T: git git://linuxtv.org/media_tree.git
|
||||
W: http://linuxtv.org
|
||||
S: Maintained
|
||||
F: drivers/media/radio/radio-keene*
|
||||
|
||||
KERNEL AUTOMOUNTER v4 (AUTOFS4)
|
||||
M: Ian Kent <raven@themaw.net>
|
||||
L: autofs@vger.kernel.org
|
||||
@ -4895,6 +4996,13 @@ Q: http://patchwork.linuxtv.org/project/linux-media/list/
|
||||
S: Maintained
|
||||
F: drivers/media/dvb-frontends/m88rs2000*
|
||||
|
||||
MA901 MASTERKIT USB FM RADIO DRIVER
|
||||
M: Alexey Klimov <klimov.linux@gmail.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
T: git git://linuxtv.org/media_tree.git
|
||||
S: Maintained
|
||||
F: drivers/media/radio/radio-ma901.c
|
||||
|
||||
MAC80211
|
||||
M: Johannes Berg <johannes@sipsolutions.net>
|
||||
L: linux-wireless@vger.kernel.org
|
||||
@ -4992,6 +5100,14 @@ S: Maintained
|
||||
F: Documentation/hwmon/max6650
|
||||
F: drivers/hwmon/max6650.c
|
||||
|
||||
MAXIRADIO FM RADIO RECEIVER DRIVER
|
||||
M: Hans Verkuil <hverkuil@xs4all.nl>
|
||||
L: linux-media@vger.kernel.org
|
||||
T: git git://linuxtv.org/media_tree.git
|
||||
W: http://linuxtv.org
|
||||
S: Maintained
|
||||
F: drivers/media/radio/radio-maxiradio*
|
||||
|
||||
MEDIA INPUT INFRASTRUCTURE (V4L/DVB)
|
||||
M: Mauro Carvalho Chehab <mchehab@redhat.com>
|
||||
P: LinuxTV.org Project
|
||||
@ -5014,6 +5130,14 @@ F: include/uapi/linux/meye.h
|
||||
F: include/uapi/linux/ivtv*
|
||||
F: include/uapi/linux/uvcvideo.h
|
||||
|
||||
MEDIAVISION PRO MOVIE STUDIO DRIVER
|
||||
M: Hans Verkuil <hverkuil@xs4all.nl>
|
||||
L: linux-media@vger.kernel.org
|
||||
T: git git://linuxtv.org/media_tree.git
|
||||
W: http://linuxtv.org
|
||||
S: Odd Fixes
|
||||
F: drivers/media/parport/pms*
|
||||
|
||||
MEGARAID SCSI DRIVERS
|
||||
M: Neela Syam Kolli <megaraidlinux@lsi.com>
|
||||
L: linux-scsi@vger.kernel.org
|
||||
@ -5087,6 +5211,14 @@ S: Supported
|
||||
F: Documentation/mips/
|
||||
F: arch/mips/
|
||||
|
||||
MIROSOUND PCM20 FM RADIO RECEIVER DRIVER
|
||||
M: Hans Verkuil <hverkuil@xs4all.nl>
|
||||
L: linux-media@vger.kernel.org
|
||||
T: git git://linuxtv.org/media_tree.git
|
||||
W: http://linuxtv.org
|
||||
S: Odd Fixes
|
||||
F: drivers/media/radio/radio-miropcm20*
|
||||
|
||||
MODULE SUPPORT
|
||||
M: Rusty Russell <rusty@rustcorp.com.au>
|
||||
S: Maintained
|
||||
@ -5125,6 +5257,38 @@ L: platform-driver-x86@vger.kernel.org
|
||||
S: Supported
|
||||
F: drivers/platform/x86/msi-wmi.c
|
||||
|
||||
MT9M032 SENSOR DRIVER
|
||||
M: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
T: git git://linuxtv.org/media_tree.git
|
||||
S: Maintained
|
||||
F: drivers/media/i2c/mt9m032.c
|
||||
F: include/media/mt9m032.h
|
||||
|
||||
MT9P031 SENSOR DRIVER
|
||||
M: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
T: git git://linuxtv.org/media_tree.git
|
||||
S: Maintained
|
||||
F: drivers/media/i2c/mt9p031.c
|
||||
F: include/media/mt9p031.h
|
||||
|
||||
MT9T001 SENSOR DRIVER
|
||||
M: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
T: git git://linuxtv.org/media_tree.git
|
||||
S: Maintained
|
||||
F: drivers/media/i2c/mt9t001.c
|
||||
F: include/media/mt9t001.h
|
||||
|
||||
MT9V032 SENSOR DRIVER
|
||||
M: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
T: git git://linuxtv.org/media_tree.git
|
||||
S: Maintained
|
||||
F: drivers/media/i2c/mt9v032.c
|
||||
F: include/media/mt9v032.h
|
||||
|
||||
MULTIFUNCTION DEVICES (MFD)
|
||||
M: Samuel Ortiz <sameo@linux.intel.com>
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/sameo/mfd-2.6.git
|
||||
@ -6276,6 +6440,14 @@ L: linux-hexagon@vger.kernel.org
|
||||
S: Supported
|
||||
F: arch/hexagon/
|
||||
|
||||
QUICKCAM PARALLEL PORT WEBCAMS
|
||||
M: Hans Verkuil <hverkuil@xs4all.nl>
|
||||
L: linux-media@vger.kernel.org
|
||||
T: git git://linuxtv.org/media_tree.git
|
||||
W: http://linuxtv.org
|
||||
S: Odd Fixes
|
||||
F: drivers/media/parport/*-qcam*
|
||||
|
||||
RADOS BLOCK DEVICE (RBD)
|
||||
M: Yehuda Sadeh <yehuda@inktank.com>
|
||||
M: Sage Weil <sage@inktank.com>
|
||||
@ -6550,6 +6722,14 @@ L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||
S: Supported
|
||||
F: drivers/mmc/host/s3cmci.*
|
||||
|
||||
SAA6588 RDS RECEIVER DRIVER
|
||||
M: Hans Verkuil <hverkuil@xs4all.nl>
|
||||
L: linux-media@vger.kernel.org
|
||||
T: git git://linuxtv.org/media_tree.git
|
||||
W: http://linuxtv.org
|
||||
S: Odd Fixes
|
||||
F: drivers/media/i2c/saa6588*
|
||||
|
||||
SAA7134 VIDEO4LINUX DRIVER
|
||||
M: Mauro Carvalho Chehab <mchehab@redhat.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
@ -6560,10 +6740,9 @@ F: Documentation/video4linux/saa7134/
|
||||
F: drivers/media/pci/saa7134/
|
||||
|
||||
SAA7146 VIDEO4LINUX-2 DRIVER
|
||||
M: Michael Hunold <michael@mihu.de>
|
||||
M: Hans Verkuil <hverkuil@xs4all.nl>
|
||||
L: linux-media@vger.kernel.org
|
||||
T: git git://linuxtv.org/media_tree.git
|
||||
W: http://www.mihu.de/linux/saa7146
|
||||
S: Maintained
|
||||
F: drivers/media/common/saa7146/
|
||||
F: drivers/media/pci/saa7146/
|
||||
@ -6605,6 +6784,13 @@ S: Maintained
|
||||
F: drivers/media/platform/s3c-camif/
|
||||
F: include/media/s3c_camif.h
|
||||
|
||||
SAMSUNG S5C73M3 CAMERA DRIVER
|
||||
M: Kyungmin Park <kyungmin.park@samsung.com>
|
||||
M: Andrzej Hajda <a.hajda@samsung.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
S: Supported
|
||||
F: drivers/media/i2c/s5c73m3/*
|
||||
|
||||
SERIAL DRIVERS
|
||||
M: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
L: linux-serial@vger.kernel.org
|
||||
@ -6866,6 +7052,38 @@ M: Robin Holt <holt@sgi.com>
|
||||
S: Maintained
|
||||
F: drivers/misc/sgi-xp/
|
||||
|
||||
SI470X FM RADIO RECEIVER I2C DRIVER
|
||||
M: Hans Verkuil <hverkuil@xs4all.nl>
|
||||
L: linux-media@vger.kernel.org
|
||||
T: git git://linuxtv.org/media_tree.git
|
||||
W: http://linuxtv.org
|
||||
S: Odd Fixes
|
||||
F: drivers/media/radio/si470x/radio-si470x-i2c.c
|
||||
|
||||
SI470X FM RADIO RECEIVER USB DRIVER
|
||||
M: Hans Verkuil <hverkuil@xs4all.nl>
|
||||
L: linux-media@vger.kernel.org
|
||||
T: git git://linuxtv.org/media_tree.git
|
||||
W: http://linuxtv.org
|
||||
S: Maintained
|
||||
F: drivers/media/radio/si470x/radio-si470x-common.c
|
||||
F: drivers/media/radio/si470x/radio-si470x.h
|
||||
F: drivers/media/radio/si470x/radio-si470x-usb.c
|
||||
|
||||
SH_VEU V4L2 MEM2MEM DRIVER
|
||||
M: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
|
||||
L: linux-media@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/media/platform/sh_veu.c
|
||||
F: include/media/sh_veu.h
|
||||
|
||||
SH_VOU V4L2 OUTPUT DRIVER
|
||||
M: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
|
||||
L: linux-media@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/media/platform/sh_vou.c
|
||||
F: include/media/sh_vou.h
|
||||
|
||||
SIMPLE FIRMWARE INTERFACE (SFI)
|
||||
M: Len Brown <lenb@kernel.org>
|
||||
L: sfi-devel@simplefirmware.org
|
||||
@ -7533,6 +7751,14 @@ T: git git://linuxtv.org/mkrufky/tuners.git
|
||||
S: Maintained
|
||||
F: drivers/media/tuners/tda8290.*
|
||||
|
||||
TDA9840 MEDIA DRIVER
|
||||
M: Hans Verkuil <hverkuil@xs4all.nl>
|
||||
L: linux-media@vger.kernel.org
|
||||
T: git git://linuxtv.org/media_tree.git
|
||||
W: http://linuxtv.org
|
||||
S: Maintained
|
||||
F: drivers/media/i2c/tda9840*
|
||||
|
||||
TEA5761 TUNER DRIVER
|
||||
M: Mauro Carvalho Chehab <mchehab@redhat.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
@ -7549,6 +7775,22 @@ T: git git://linuxtv.org/media_tree.git
|
||||
S: Maintained
|
||||
F: drivers/media/tuners/tea5767.*
|
||||
|
||||
TEA6415C MEDIA DRIVER
|
||||
M: Hans Verkuil <hverkuil@xs4all.nl>
|
||||
L: linux-media@vger.kernel.org
|
||||
T: git git://linuxtv.org/media_tree.git
|
||||
W: http://linuxtv.org
|
||||
S: Maintained
|
||||
F: drivers/media/i2c/tea6415c*
|
||||
|
||||
TEA6420 MEDIA DRIVER
|
||||
M: Hans Verkuil <hverkuil@xs4all.nl>
|
||||
L: linux-media@vger.kernel.org
|
||||
T: git git://linuxtv.org/media_tree.git
|
||||
W: http://linuxtv.org
|
||||
S: Maintained
|
||||
F: drivers/media/i2c/tea6420*
|
||||
|
||||
TEAM DRIVER
|
||||
M: Jiri Pirko <jiri@resnulli.us>
|
||||
L: netdev@vger.kernel.org
|
||||
@ -8198,6 +8440,14 @@ S: Maintained
|
||||
F: drivers/media/usb/uvc/
|
||||
F: include/uapi/linux/uvcvideo.h
|
||||
|
||||
USB VISION DRIVER
|
||||
M: Hans Verkuil <hverkuil@xs4all.nl>
|
||||
L: linux-media@vger.kernel.org
|
||||
T: git git://linuxtv.org/media_tree.git
|
||||
W: http://linuxtv.org
|
||||
S: Odd Fixes
|
||||
F: drivers/media/usb/usbvision/
|
||||
|
||||
USB WEBCAM GADGET
|
||||
M: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
|
||||
L: linux-usb@vger.kernel.org
|
||||
@ -8347,6 +8597,14 @@ L: netdev@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/net/ethernet/via/via-velocity.*
|
||||
|
||||
VIVI VIRTUAL VIDEO DRIVER
|
||||
M: Hans Verkuil <hverkuil@xs4all.nl>
|
||||
L: linux-media@vger.kernel.org
|
||||
T: git git://linuxtv.org/media_tree.git
|
||||
W: http://linuxtv.org
|
||||
S: Maintained
|
||||
F: drivers/media/platform/vivi*
|
||||
|
||||
VLAN (802.1Q)
|
||||
M: Patrick McHardy <kaber@trash.net>
|
||||
L: netdev@vger.kernel.org
|
||||
|
@ -1253,11 +1253,24 @@ static struct vpif_capture_config da850_vpif_capture_config = {
|
||||
};
|
||||
|
||||
/* VPIF display configuration */
|
||||
|
||||
static struct adv7343_platform_data adv7343_pdata = {
|
||||
.mode_config = {
|
||||
.dac_3 = 1,
|
||||
.dac_2 = 1,
|
||||
.dac_1 = 1,
|
||||
},
|
||||
.sd_config = {
|
||||
.sd_dac_out1 = 1,
|
||||
},
|
||||
};
|
||||
|
||||
static struct vpif_subdev_info da850_vpif_subdev[] = {
|
||||
{
|
||||
.name = "adv7343",
|
||||
.board_info = {
|
||||
I2C_BOARD_INFO("adv7343", 0x2a),
|
||||
.platform_data = &adv7343_pdata,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
@ -690,7 +690,7 @@ static struct vpbe_output dm644xevm_vpbe_outputs[] = {
|
||||
.std = VENC_STD_ALL,
|
||||
.capabilities = V4L2_OUT_CAP_STD,
|
||||
},
|
||||
.subdev_name = VPBE_VENC_SUBDEV_NAME,
|
||||
.subdev_name = DM644X_VPBE_VENC_SUBDEV_NAME,
|
||||
.default_mode = "ntsc",
|
||||
.num_modes = ARRAY_SIZE(dm644xevm_enc_std_timing),
|
||||
.modes = dm644xevm_enc_std_timing,
|
||||
@ -702,7 +702,7 @@ static struct vpbe_output dm644xevm_vpbe_outputs[] = {
|
||||
.type = V4L2_OUTPUT_TYPE_ANALOG,
|
||||
.capabilities = V4L2_OUT_CAP_DV_TIMINGS,
|
||||
},
|
||||
.subdev_name = VPBE_VENC_SUBDEV_NAME,
|
||||
.subdev_name = DM644X_VPBE_VENC_SUBDEV_NAME,
|
||||
.default_mode = "480p59_94",
|
||||
.num_modes = ARRAY_SIZE(dm644xevm_enc_preset_timing),
|
||||
.modes = dm644xevm_enc_preset_timing,
|
||||
@ -713,10 +713,10 @@ static struct vpbe_config dm644xevm_display_cfg = {
|
||||
.module_name = "dm644x-vpbe-display",
|
||||
.i2c_adapter_id = 1,
|
||||
.osd = {
|
||||
.module_name = VPBE_OSD_SUBDEV_NAME,
|
||||
.module_name = DM644X_VPBE_OSD_SUBDEV_NAME,
|
||||
},
|
||||
.venc = {
|
||||
.module_name = VPBE_VENC_SUBDEV_NAME,
|
||||
.module_name = DM644X_VPBE_VENC_SUBDEV_NAME,
|
||||
},
|
||||
.num_outputs = ARRAY_SIZE(dm644xevm_vpbe_outputs),
|
||||
.outputs = dm644xevm_vpbe_outputs,
|
||||
|
@ -669,19 +669,14 @@ static struct resource dm644x_osd_resources[] = {
|
||||
},
|
||||
};
|
||||
|
||||
static struct osd_platform_data dm644x_osd_data = {
|
||||
.vpbe_type = VPBE_VERSION_1,
|
||||
};
|
||||
|
||||
static struct platform_device dm644x_osd_dev = {
|
||||
.name = VPBE_OSD_SUBDEV_NAME,
|
||||
.name = DM644X_VPBE_OSD_SUBDEV_NAME,
|
||||
.id = -1,
|
||||
.num_resources = ARRAY_SIZE(dm644x_osd_resources),
|
||||
.resource = dm644x_osd_resources,
|
||||
.dev = {
|
||||
.dma_mask = &dm644x_video_dma_mask,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
.platform_data = &dm644x_osd_data,
|
||||
},
|
||||
};
|
||||
|
||||
@ -751,12 +746,11 @@ static struct platform_device dm644x_vpbe_display = {
|
||||
};
|
||||
|
||||
static struct venc_platform_data dm644x_venc_pdata = {
|
||||
.venc_type = VPBE_VERSION_1,
|
||||
.setup_clock = dm644x_venc_setup_clock,
|
||||
};
|
||||
|
||||
static struct platform_device dm644x_venc_dev = {
|
||||
.name = VPBE_VENC_SUBDEV_NAME,
|
||||
.name = DM644X_VPBE_VENC_SUBDEV_NAME,
|
||||
.id = -1,
|
||||
.num_resources = ARRAY_SIZE(dm644x_venc_resources),
|
||||
.resource = dm644x_venc_resources,
|
||||
|
@ -1208,25 +1208,25 @@ static struct i2c_board_info m5mols_board_info = {
|
||||
.platform_data = &m5mols_platdata,
|
||||
};
|
||||
|
||||
static struct s5p_fimc_isp_info nuri_camera_sensors[] = {
|
||||
static struct fimc_source_info nuri_camera_sensors[] = {
|
||||
{
|
||||
.flags = V4L2_MBUS_PCLK_SAMPLE_RISING |
|
||||
V4L2_MBUS_VSYNC_ACTIVE_LOW,
|
||||
.bus_type = FIMC_ITU_601,
|
||||
.fimc_bus_type = FIMC_BUS_TYPE_ITU_601,
|
||||
.board_info = &s5k6aa_board_info,
|
||||
.clk_frequency = 24000000UL,
|
||||
.i2c_bus_num = 6,
|
||||
}, {
|
||||
.flags = V4L2_MBUS_PCLK_SAMPLE_FALLING |
|
||||
V4L2_MBUS_VSYNC_ACTIVE_LOW,
|
||||
.bus_type = FIMC_MIPI_CSI2,
|
||||
.fimc_bus_type = FIMC_BUS_TYPE_MIPI_CSI2,
|
||||
.board_info = &m5mols_board_info,
|
||||
.clk_frequency = 24000000UL,
|
||||
},
|
||||
};
|
||||
|
||||
static struct s5p_platform_fimc fimc_md_platdata = {
|
||||
.isp_info = nuri_camera_sensors,
|
||||
.source_info = nuri_camera_sensors,
|
||||
.num_clients = ARRAY_SIZE(nuri_camera_sensors),
|
||||
};
|
||||
|
||||
|
@ -987,12 +987,12 @@ static struct i2c_board_info m5mols_board_info = {
|
||||
.platform_data = &m5mols_platdata,
|
||||
};
|
||||
|
||||
static struct s5p_fimc_isp_info universal_camera_sensors[] = {
|
||||
static struct fimc_source_info universal_camera_sensors[] = {
|
||||
{
|
||||
.mux_id = 0,
|
||||
.flags = V4L2_MBUS_PCLK_SAMPLE_FALLING |
|
||||
V4L2_MBUS_VSYNC_ACTIVE_LOW,
|
||||
.bus_type = FIMC_ITU_601,
|
||||
.fimc_bus_type = FIMC_BUS_TYPE_ITU_601,
|
||||
.board_info = &s5k6aa_board_info,
|
||||
.i2c_bus_num = 0,
|
||||
.clk_frequency = 24000000UL,
|
||||
@ -1000,7 +1000,7 @@ static struct s5p_fimc_isp_info universal_camera_sensors[] = {
|
||||
.mux_id = 0,
|
||||
.flags = V4L2_MBUS_PCLK_SAMPLE_FALLING |
|
||||
V4L2_MBUS_VSYNC_ACTIVE_LOW,
|
||||
.bus_type = FIMC_MIPI_CSI2,
|
||||
.fimc_bus_type = FIMC_BUS_TYPE_MIPI_CSI2,
|
||||
.board_info = &m5mols_board_info,
|
||||
.i2c_bus_num = 0,
|
||||
.clk_frequency = 24000000UL,
|
||||
@ -1008,7 +1008,7 @@ static struct s5p_fimc_isp_info universal_camera_sensors[] = {
|
||||
};
|
||||
|
||||
static struct s5p_platform_fimc fimc_md_platdata = {
|
||||
.isp_info = universal_camera_sensors,
|
||||
.source_info = universal_camera_sensors,
|
||||
.num_clients = ARRAY_SIZE(universal_camera_sensors),
|
||||
};
|
||||
|
||||
|
@ -840,12 +840,12 @@ static struct i2c_board_info noon010pc30_board_info = {
|
||||
.platform_data = &noon010pc30_pldata,
|
||||
};
|
||||
|
||||
static struct s5p_fimc_isp_info goni_camera_sensors[] = {
|
||||
static struct fimc_source_info goni_camera_sensors[] = {
|
||||
{
|
||||
.mux_id = 0,
|
||||
.flags = V4L2_MBUS_PCLK_SAMPLE_FALLING |
|
||||
V4L2_MBUS_VSYNC_ACTIVE_LOW,
|
||||
.bus_type = FIMC_ITU_601,
|
||||
.bus_type = FIMC_BUS_TYPE_ITU_601,
|
||||
.board_info = &noon010pc30_board_info,
|
||||
.i2c_bus_num = 0,
|
||||
.clk_frequency = 16000000UL,
|
||||
@ -853,7 +853,7 @@ static struct s5p_fimc_isp_info goni_camera_sensors[] = {
|
||||
};
|
||||
|
||||
static struct s5p_platform_fimc goni_fimc_md_platdata __initdata = {
|
||||
.isp_info = goni_camera_sensors,
|
||||
.source_info = goni_camera_sensors,
|
||||
.num_clients = ARRAY_SIZE(goni_camera_sensors),
|
||||
};
|
||||
|
||||
|
@ -2077,6 +2077,7 @@ static const struct hid_device_id hid_ignore_list[] = {
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_HYBRID) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_HEATCONTROL) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_MADCATZ, USB_DEVICE_ID_MADCATZ_BEATPAD) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_MASTERKIT, USB_DEVICE_ID_MASTERKIT_MA901RADIO) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_MCC, USB_DEVICE_ID_MCC_PMD1024LS) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_MCC, USB_DEVICE_ID_MCC_PMD1208LS) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_MICROCHIP, USB_DEVICE_ID_PICKIT1) },
|
||||
|
@ -557,6 +557,9 @@
|
||||
#define USB_VENDOR_ID_MADCATZ 0x0738
|
||||
#define USB_DEVICE_ID_MADCATZ_BEATPAD 0x4540
|
||||
|
||||
#define USB_VENDOR_ID_MASTERKIT 0x16c0
|
||||
#define USB_DEVICE_ID_MASTERKIT_MA901RADIO 0x05df
|
||||
|
||||
#define USB_VENDOR_ID_MCC 0x09db
|
||||
#define USB_DEVICE_ID_MCC_PMD1024LS 0x0076
|
||||
#define USB_DEVICE_ID_MCC_PMD1208LS 0x007a
|
||||
|
@ -134,6 +134,12 @@ config DVB_NET
|
||||
You may want to disable the network support on embedded devices. If
|
||||
unsure say Y.
|
||||
|
||||
# This Kconfig option is used by both PCI and USB drivers
|
||||
config TTPCI_EEPROM
|
||||
tristate
|
||||
depends on I2C
|
||||
default n
|
||||
|
||||
source "drivers/media/dvb-core/Kconfig"
|
||||
|
||||
comment "Media drivers"
|
||||
@ -157,17 +163,20 @@ source "drivers/media/firewire/Kconfig"
|
||||
# Common driver options
|
||||
source "drivers/media/common/Kconfig"
|
||||
|
||||
comment "Media ancillary drivers (tuners, sensors, i2c, frontends)"
|
||||
|
||||
#
|
||||
# Ancillary drivers (tuners, i2c, frontends)
|
||||
#
|
||||
|
||||
config MEDIA_SUBDRV_AUTOSELECT
|
||||
bool "Autoselect tuners and i2c modules to build"
|
||||
bool "Autoselect ancillary drivers (tuners, sensors, i2c, frontends)"
|
||||
depends on MEDIA_ANALOG_TV_SUPPORT || MEDIA_DIGITAL_TV_SUPPORT || MEDIA_CAMERA_SUPPORT
|
||||
default y
|
||||
help
|
||||
By default, a media driver auto-selects all possible i2c
|
||||
devices that are used by any of the supported devices.
|
||||
By default, a media driver auto-selects all possible ancillary
|
||||
devices such as tuners, sensors, video encoders/decoders and
|
||||
frontends, that are used by any of the supported devices.
|
||||
|
||||
This is generally the right thing to do, except when there
|
||||
are strict constraints with regards to the kernel size,
|
||||
@ -176,12 +185,10 @@ config MEDIA_SUBDRV_AUTOSELECT
|
||||
Use this option with care, as deselecting ancillary drivers which
|
||||
are, in fact, necessary will result in the lack of the needed
|
||||
functionality for your device (it may not tune or may not have
|
||||
the need demodulers).
|
||||
the needed demodulators).
|
||||
|
||||
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"
|
||||
|
@ -5,6 +5,17 @@ config MEDIA_COMMON_OPTIONS
|
||||
comment "common driver options"
|
||||
depends on MEDIA_COMMON_OPTIONS
|
||||
|
||||
config VIDEO_CX2341X
|
||||
tristate
|
||||
|
||||
config VIDEO_BTCX
|
||||
depends on PCI
|
||||
tristate
|
||||
|
||||
config VIDEO_TVEEPROM
|
||||
tristate
|
||||
depends on I2C
|
||||
|
||||
source "drivers/media/common/b2c2/Kconfig"
|
||||
source "drivers/media/common/saa7146/Kconfig"
|
||||
source "drivers/media/common/siano/Kconfig"
|
||||
|
@ -1 +1,4 @@
|
||||
obj-y += b2c2/ saa7146/ siano/
|
||||
obj-$(CONFIG_VIDEO_CX2341X) += cx2341x.o
|
||||
obj-$(CONFIG_VIDEO_BTCX) += btcx-risc.o
|
||||
obj-$(CONFIG_VIDEO_TVEEPROM) += tveeprom.o
|
||||
|
@ -105,7 +105,7 @@ void saa7146_buffer_finish(struct saa7146_dev *dev,
|
||||
}
|
||||
|
||||
q->curr->vb.state = state;
|
||||
do_gettimeofday(&q->curr->vb.ts);
|
||||
v4l2_get_timestamp(&q->curr->vb.ts);
|
||||
wake_up(&q->curr->vb.done);
|
||||
|
||||
q->curr = NULL;
|
||||
@ -265,8 +265,7 @@ static int fops_release(struct file *file)
|
||||
|
||||
DEB_EE("file:%p\n", file);
|
||||
|
||||
if (mutex_lock_interruptible(vdev->lock))
|
||||
return -ERESTARTSYS;
|
||||
mutex_lock(vdev->lock);
|
||||
|
||||
if (vdev->vfl_type == VFL_TYPE_VBI) {
|
||||
if (dev->ext_vv_data->capabilities & V4L2_CAP_VBI_CAPTURE)
|
||||
|
@ -96,170 +96,170 @@ static struct HAUPPAUGE_TUNER
|
||||
hauppauge_tuner[] =
|
||||
{
|
||||
/* 0-9 */
|
||||
{ TUNER_ABSENT, "None" },
|
||||
{ TUNER_ABSENT, "External" },
|
||||
{ TUNER_ABSENT, "Unspecified" },
|
||||
{ TUNER_PHILIPS_PAL, "Philips FI1216" },
|
||||
{ TUNER_PHILIPS_SECAM, "Philips FI1216MF" },
|
||||
{ TUNER_PHILIPS_NTSC, "Philips FI1236" },
|
||||
{ TUNER_PHILIPS_PAL_I, "Philips FI1246" },
|
||||
{ TUNER_ABSENT, "None" },
|
||||
{ TUNER_ABSENT, "External" },
|
||||
{ TUNER_ABSENT, "Unspecified" },
|
||||
{ TUNER_PHILIPS_PAL, "Philips FI1216" },
|
||||
{ TUNER_PHILIPS_SECAM, "Philips FI1216MF" },
|
||||
{ TUNER_PHILIPS_NTSC, "Philips FI1236" },
|
||||
{ TUNER_PHILIPS_PAL_I, "Philips FI1246" },
|
||||
{ TUNER_PHILIPS_PAL_DK, "Philips FI1256" },
|
||||
{ TUNER_PHILIPS_PAL, "Philips FI1216 MK2" },
|
||||
{ TUNER_PHILIPS_SECAM, "Philips FI1216MF MK2" },
|
||||
{ TUNER_PHILIPS_PAL, "Philips FI1216 MK2" },
|
||||
{ TUNER_PHILIPS_SECAM, "Philips FI1216MF MK2" },
|
||||
/* 10-19 */
|
||||
{ TUNER_PHILIPS_NTSC, "Philips FI1236 MK2" },
|
||||
{ TUNER_PHILIPS_PAL_I, "Philips FI1246 MK2" },
|
||||
{ TUNER_PHILIPS_NTSC, "Philips FI1236 MK2" },
|
||||
{ TUNER_PHILIPS_PAL_I, "Philips FI1246 MK2" },
|
||||
{ TUNER_PHILIPS_PAL_DK, "Philips FI1256 MK2" },
|
||||
{ TUNER_TEMIC_NTSC, "Temic 4032FY5" },
|
||||
{ TUNER_TEMIC_PAL, "Temic 4002FH5" },
|
||||
{ TUNER_TEMIC_PAL_I, "Temic 4062FY5" },
|
||||
{ TUNER_PHILIPS_PAL, "Philips FR1216 MK2" },
|
||||
{ TUNER_PHILIPS_SECAM, "Philips FR1216MF MK2" },
|
||||
{ TUNER_PHILIPS_NTSC, "Philips FR1236 MK2" },
|
||||
{ TUNER_PHILIPS_PAL_I, "Philips FR1246 MK2" },
|
||||
{ TUNER_TEMIC_NTSC, "Temic 4032FY5" },
|
||||
{ TUNER_TEMIC_PAL, "Temic 4002FH5" },
|
||||
{ TUNER_TEMIC_PAL_I, "Temic 4062FY5" },
|
||||
{ TUNER_PHILIPS_PAL, "Philips FR1216 MK2" },
|
||||
{ TUNER_PHILIPS_SECAM, "Philips FR1216MF MK2" },
|
||||
{ TUNER_PHILIPS_NTSC, "Philips FR1236 MK2" },
|
||||
{ TUNER_PHILIPS_PAL_I, "Philips FR1246 MK2" },
|
||||
/* 20-29 */
|
||||
{ TUNER_PHILIPS_PAL_DK, "Philips FR1256 MK2" },
|
||||
{ TUNER_PHILIPS_PAL, "Philips FM1216" },
|
||||
{ TUNER_PHILIPS_SECAM, "Philips FM1216MF" },
|
||||
{ TUNER_PHILIPS_NTSC, "Philips FM1236" },
|
||||
{ TUNER_PHILIPS_PAL_I, "Philips FM1246" },
|
||||
{ TUNER_PHILIPS_PAL, "Philips FM1216" },
|
||||
{ TUNER_PHILIPS_SECAM, "Philips FM1216MF" },
|
||||
{ TUNER_PHILIPS_NTSC, "Philips FM1236" },
|
||||
{ TUNER_PHILIPS_PAL_I, "Philips FM1246" },
|
||||
{ TUNER_PHILIPS_PAL_DK, "Philips FM1256" },
|
||||
{ TUNER_TEMIC_4036FY5_NTSC, "Temic 4036FY5" },
|
||||
{ TUNER_ABSENT, "Samsung TCPN9082D" },
|
||||
{ TUNER_ABSENT, "Samsung TCPM9092P" },
|
||||
{ TUNER_TEMIC_4006FH5_PAL, "Temic 4006FH5" },
|
||||
{ TUNER_TEMIC_4036FY5_NTSC, "Temic 4036FY5" },
|
||||
{ TUNER_ABSENT, "Samsung TCPN9082D" },
|
||||
{ TUNER_ABSENT, "Samsung TCPM9092P" },
|
||||
{ TUNER_TEMIC_4006FH5_PAL, "Temic 4006FH5" },
|
||||
/* 30-39 */
|
||||
{ TUNER_ABSENT, "Samsung TCPN9085D" },
|
||||
{ TUNER_ABSENT, "Samsung TCPB9085P" },
|
||||
{ TUNER_ABSENT, "Samsung TCPL9091P" },
|
||||
{ TUNER_TEMIC_4039FR5_NTSC, "Temic 4039FR5" },
|
||||
{ TUNER_PHILIPS_FQ1216ME, "Philips FQ1216 ME" },
|
||||
{ TUNER_TEMIC_4066FY5_PAL_I, "Temic 4066FY5" },
|
||||
{ TUNER_PHILIPS_NTSC, "Philips TD1536" },
|
||||
{ TUNER_PHILIPS_NTSC, "Philips TD1536D" },
|
||||
{ TUNER_PHILIPS_NTSC, "Philips FMR1236" }, /* mono radio */
|
||||
{ TUNER_ABSENT, "Philips FI1256MP" },
|
||||
{ TUNER_ABSENT, "Samsung TCPN9085D" },
|
||||
{ TUNER_ABSENT, "Samsung TCPB9085P" },
|
||||
{ TUNER_ABSENT, "Samsung TCPL9091P" },
|
||||
{ TUNER_TEMIC_4039FR5_NTSC, "Temic 4039FR5" },
|
||||
{ TUNER_PHILIPS_FQ1216ME, "Philips FQ1216 ME" },
|
||||
{ TUNER_TEMIC_4066FY5_PAL_I, "Temic 4066FY5" },
|
||||
{ TUNER_PHILIPS_NTSC, "Philips TD1536" },
|
||||
{ TUNER_PHILIPS_NTSC, "Philips TD1536D" },
|
||||
{ TUNER_PHILIPS_NTSC, "Philips FMR1236" }, /* mono radio */
|
||||
{ TUNER_ABSENT, "Philips FI1256MP" },
|
||||
/* 40-49 */
|
||||
{ TUNER_ABSENT, "Samsung TCPQ9091P" },
|
||||
{ TUNER_TEMIC_4006FN5_MULTI_PAL, "Temic 4006FN5" },
|
||||
{ TUNER_TEMIC_4009FR5_PAL, "Temic 4009FR5" },
|
||||
{ TUNER_TEMIC_4046FM5, "Temic 4046FM5" },
|
||||
{ TUNER_ABSENT, "Samsung TCPQ9091P" },
|
||||
{ TUNER_TEMIC_4006FN5_MULTI_PAL,"Temic 4006FN5" },
|
||||
{ TUNER_TEMIC_4009FR5_PAL, "Temic 4009FR5" },
|
||||
{ TUNER_TEMIC_4046FM5, "Temic 4046FM5" },
|
||||
{ TUNER_TEMIC_4009FN5_MULTI_PAL_FM, "Temic 4009FN5" },
|
||||
{ TUNER_ABSENT, "Philips TD1536D FH 44"},
|
||||
{ TUNER_LG_NTSC_FM, "LG TP18NSR01F"},
|
||||
{ TUNER_LG_PAL_FM, "LG TP18PSB01D"},
|
||||
{ TUNER_LG_PAL, "LG TP18PSB11D"},
|
||||
{ TUNER_LG_PAL_I_FM, "LG TAPC-I001D"},
|
||||
{ TUNER_ABSENT, "Philips TD1536D FH 44"},
|
||||
{ TUNER_LG_NTSC_FM, "LG TP18NSR01F"},
|
||||
{ TUNER_LG_PAL_FM, "LG TP18PSB01D"},
|
||||
{ TUNER_LG_PAL, "LG TP18PSB11D"},
|
||||
{ TUNER_LG_PAL_I_FM, "LG TAPC-I001D"},
|
||||
/* 50-59 */
|
||||
{ TUNER_LG_PAL_I, "LG TAPC-I701D"},
|
||||
{ TUNER_ABSENT, "Temic 4042FI5"},
|
||||
{ TUNER_MICROTUNE_4049FM5, "Microtune 4049 FM5"},
|
||||
{ TUNER_ABSENT, "LG TPI8NSR11F"},
|
||||
{ TUNER_ABSENT, "Microtune 4049 FM5 Alt I2C"},
|
||||
{ TUNER_PHILIPS_FM1216ME_MK3, "Philips FQ1216ME MK3"},
|
||||
{ TUNER_ABSENT, "Philips FI1236 MK3"},
|
||||
{ TUNER_PHILIPS_FM1216ME_MK3, "Philips FM1216 ME MK3"},
|
||||
{ TUNER_PHILIPS_FM1236_MK3, "Philips FM1236 MK3"},
|
||||
{ TUNER_ABSENT, "Philips FM1216MP MK3"},
|
||||
{ TUNER_LG_PAL_I, "LG TAPC-I701D"},
|
||||
{ TUNER_ABSENT, "Temic 4042FI5"},
|
||||
{ TUNER_MICROTUNE_4049FM5, "Microtune 4049 FM5"},
|
||||
{ TUNER_ABSENT, "LG TPI8NSR11F"},
|
||||
{ TUNER_ABSENT, "Microtune 4049 FM5 Alt I2C"},
|
||||
{ TUNER_PHILIPS_FM1216ME_MK3, "Philips FQ1216ME MK3"},
|
||||
{ TUNER_ABSENT, "Philips FI1236 MK3"},
|
||||
{ TUNER_PHILIPS_FM1216ME_MK3, "Philips FM1216 ME MK3"},
|
||||
{ TUNER_PHILIPS_FM1236_MK3, "Philips FM1236 MK3"},
|
||||
{ TUNER_ABSENT, "Philips FM1216MP MK3"},
|
||||
/* 60-69 */
|
||||
{ TUNER_PHILIPS_FM1216ME_MK3, "LG S001D MK3"},
|
||||
{ TUNER_ABSENT, "LG M001D MK3"},
|
||||
{ TUNER_PHILIPS_FM1216ME_MK3, "LG S701D MK3"},
|
||||
{ TUNER_ABSENT, "LG M701D MK3"},
|
||||
{ TUNER_ABSENT, "Temic 4146FM5"},
|
||||
{ TUNER_ABSENT, "Temic 4136FY5"},
|
||||
{ TUNER_ABSENT, "Temic 4106FH5"},
|
||||
{ TUNER_ABSENT, "Philips FQ1216LMP MK3"},
|
||||
{ TUNER_LG_NTSC_TAPE, "LG TAPE H001F MK3"},
|
||||
{ TUNER_LG_NTSC_TAPE, "LG TAPE H701F MK3"},
|
||||
{ TUNER_PHILIPS_FM1216ME_MK3, "LG S001D MK3"},
|
||||
{ TUNER_ABSENT, "LG M001D MK3"},
|
||||
{ TUNER_PHILIPS_FM1216ME_MK3, "LG S701D MK3"},
|
||||
{ TUNER_ABSENT, "LG M701D MK3"},
|
||||
{ TUNER_ABSENT, "Temic 4146FM5"},
|
||||
{ TUNER_ABSENT, "Temic 4136FY5"},
|
||||
{ TUNER_ABSENT, "Temic 4106FH5"},
|
||||
{ TUNER_ABSENT, "Philips FQ1216LMP MK3"},
|
||||
{ TUNER_LG_NTSC_TAPE, "LG TAPE H001F MK3"},
|
||||
{ TUNER_LG_NTSC_TAPE, "LG TAPE H701F MK3"},
|
||||
/* 70-79 */
|
||||
{ TUNER_ABSENT, "LG TALN H200T"},
|
||||
{ TUNER_ABSENT, "LG TALN H250T"},
|
||||
{ TUNER_ABSENT, "LG TALN M200T"},
|
||||
{ TUNER_ABSENT, "LG TALN Z200T"},
|
||||
{ TUNER_ABSENT, "LG TALN S200T"},
|
||||
{ TUNER_ABSENT, "Thompson DTT7595"},
|
||||
{ TUNER_ABSENT, "Thompson DTT7592"},
|
||||
{ TUNER_ABSENT, "Silicon TDA8275C1 8290"},
|
||||
{ TUNER_ABSENT, "Silicon TDA8275C1 8290 FM"},
|
||||
{ TUNER_ABSENT, "Thompson DTT757"},
|
||||
{ TUNER_ABSENT, "LG TALN H200T"},
|
||||
{ TUNER_ABSENT, "LG TALN H250T"},
|
||||
{ TUNER_ABSENT, "LG TALN M200T"},
|
||||
{ TUNER_ABSENT, "LG TALN Z200T"},
|
||||
{ TUNER_ABSENT, "LG TALN S200T"},
|
||||
{ TUNER_ABSENT, "Thompson DTT7595"},
|
||||
{ TUNER_ABSENT, "Thompson DTT7592"},
|
||||
{ TUNER_ABSENT, "Silicon TDA8275C1 8290"},
|
||||
{ TUNER_ABSENT, "Silicon TDA8275C1 8290 FM"},
|
||||
{ TUNER_ABSENT, "Thompson DTT757"},
|
||||
/* 80-89 */
|
||||
{ TUNER_PHILIPS_FQ1216LME_MK3, "Philips FQ1216LME MK3"},
|
||||
{ TUNER_LG_PAL_NEW_TAPC, "LG TAPC G701D"},
|
||||
{ TUNER_LG_NTSC_NEW_TAPC, "LG TAPC H791F"},
|
||||
{ TUNER_LG_PAL_NEW_TAPC, "TCL 2002MB 3"},
|
||||
{ TUNER_LG_PAL_NEW_TAPC, "TCL 2002MI 3"},
|
||||
{ TUNER_TCL_2002N, "TCL 2002N 6A"},
|
||||
{ TUNER_PHILIPS_FM1236_MK3, "Philips FQ1236 MK3"},
|
||||
{ TUNER_SAMSUNG_TCPN_2121P30A, "Samsung TCPN 2121P30A"},
|
||||
{ TUNER_ABSENT, "Samsung TCPE 4121P30A"},
|
||||
{ TUNER_PHILIPS_FM1216ME_MK3, "TCL MFPE05 2"},
|
||||
{ TUNER_PHILIPS_FQ1216LME_MK3, "Philips FQ1216LME MK3"},
|
||||
{ TUNER_LG_PAL_NEW_TAPC, "LG TAPC G701D"},
|
||||
{ TUNER_LG_NTSC_NEW_TAPC, "LG TAPC H791F"},
|
||||
{ TUNER_LG_PAL_NEW_TAPC, "TCL 2002MB 3"},
|
||||
{ TUNER_LG_PAL_NEW_TAPC, "TCL 2002MI 3"},
|
||||
{ TUNER_TCL_2002N, "TCL 2002N 6A"},
|
||||
{ TUNER_PHILIPS_FM1236_MK3, "Philips FQ1236 MK3"},
|
||||
{ TUNER_SAMSUNG_TCPN_2121P30A, "Samsung TCPN 2121P30A"},
|
||||
{ TUNER_ABSENT, "Samsung TCPE 4121P30A"},
|
||||
{ TUNER_PHILIPS_FM1216ME_MK3, "TCL MFPE05 2"},
|
||||
/* 90-99 */
|
||||
{ TUNER_ABSENT, "LG TALN H202T"},
|
||||
{ TUNER_PHILIPS_FQ1216AME_MK4, "Philips FQ1216AME MK4"},
|
||||
{ TUNER_PHILIPS_FQ1236A_MK4, "Philips FQ1236A MK4"},
|
||||
{ TUNER_ABSENT, "Philips FQ1286A MK4"},
|
||||
{ TUNER_ABSENT, "Philips FQ1216ME MK5"},
|
||||
{ TUNER_ABSENT, "Philips FQ1236 MK5"},
|
||||
{ TUNER_SAMSUNG_TCPG_6121P30A, "Samsung TCPG 6121P30A"},
|
||||
{ TUNER_TCL_2002MB, "TCL 2002MB_3H"},
|
||||
{ TUNER_ABSENT, "TCL 2002MI_3H"},
|
||||
{ TUNER_TCL_2002N, "TCL 2002N 5H"},
|
||||
{ TUNER_ABSENT, "LG TALN H202T"},
|
||||
{ TUNER_PHILIPS_FQ1216AME_MK4, "Philips FQ1216AME MK4"},
|
||||
{ TUNER_PHILIPS_FQ1236A_MK4, "Philips FQ1236A MK4"},
|
||||
{ TUNER_ABSENT, "Philips FQ1286A MK4"},
|
||||
{ TUNER_ABSENT, "Philips FQ1216ME MK5"},
|
||||
{ TUNER_ABSENT, "Philips FQ1236 MK5"},
|
||||
{ TUNER_SAMSUNG_TCPG_6121P30A, "Samsung TCPG 6121P30A"},
|
||||
{ TUNER_TCL_2002MB, "TCL 2002MB_3H"},
|
||||
{ TUNER_ABSENT, "TCL 2002MI_3H"},
|
||||
{ TUNER_TCL_2002N, "TCL 2002N 5H"},
|
||||
/* 100-109 */
|
||||
{ TUNER_PHILIPS_FMD1216ME_MK3, "Philips FMD1216ME"},
|
||||
{ TUNER_TEA5767, "Philips TEA5768HL FM Radio"},
|
||||
{ TUNER_ABSENT, "Panasonic ENV57H12D5"},
|
||||
{ TUNER_PHILIPS_FM1236_MK3, "TCL MFNM05-4"},
|
||||
{ TUNER_PHILIPS_FMD1216ME_MK3, "Philips FMD1216ME"},
|
||||
{ TUNER_TEA5767, "Philips TEA5768HL FM Radio"},
|
||||
{ TUNER_ABSENT, "Panasonic ENV57H12D5"},
|
||||
{ TUNER_PHILIPS_FM1236_MK3, "TCL MFNM05-4"},
|
||||
{ TUNER_PHILIPS_FM1236_MK3, "TCL MNM05-4"},
|
||||
{ TUNER_PHILIPS_FM1216ME_MK3, "TCL MPE05-2"},
|
||||
{ TUNER_ABSENT, "TCL MQNM05-4"},
|
||||
{ TUNER_ABSENT, "LG TAPC-W701D"},
|
||||
{ TUNER_ABSENT, "TCL 9886P-WM"},
|
||||
{ TUNER_ABSENT, "TCL 1676NM-WM"},
|
||||
{ TUNER_PHILIPS_FM1216ME_MK3, "TCL MPE05-2"},
|
||||
{ TUNER_ABSENT, "TCL MQNM05-4"},
|
||||
{ TUNER_ABSENT, "LG TAPC-W701D"},
|
||||
{ TUNER_ABSENT, "TCL 9886P-WM"},
|
||||
{ TUNER_ABSENT, "TCL 1676NM-WM"},
|
||||
/* 110-119 */
|
||||
{ TUNER_ABSENT, "Thompson DTT75105"},
|
||||
{ TUNER_ABSENT, "Conexant_CX24109"},
|
||||
{ TUNER_TCL_2002N, "TCL M2523_5N_E"},
|
||||
{ TUNER_TCL_2002MB, "TCL M2523_3DB_E"},
|
||||
{ TUNER_ABSENT, "Philips 8275A"},
|
||||
{ TUNER_ABSENT, "Microtune MT2060"},
|
||||
{ TUNER_PHILIPS_FM1236_MK3, "Philips FM1236 MK5"},
|
||||
{ TUNER_PHILIPS_FM1216ME_MK3, "Philips FM1216ME MK5"},
|
||||
{ TUNER_ABSENT, "TCL M2523_3DI_E"},
|
||||
{ TUNER_ABSENT, "Samsung THPD5222FG30A"},
|
||||
{ TUNER_ABSENT, "Thompson DTT75105"},
|
||||
{ TUNER_ABSENT, "Conexant_CX24109"},
|
||||
{ TUNER_TCL_2002N, "TCL M2523_5N_E"},
|
||||
{ TUNER_TCL_2002MB, "TCL M2523_3DB_E"},
|
||||
{ TUNER_ABSENT, "Philips 8275A"},
|
||||
{ TUNER_ABSENT, "Microtune MT2060"},
|
||||
{ TUNER_PHILIPS_FM1236_MK3, "Philips FM1236 MK5"},
|
||||
{ TUNER_PHILIPS_FM1216ME_MK3, "Philips FM1216ME MK5"},
|
||||
{ TUNER_ABSENT, "TCL M2523_3DI_E"},
|
||||
{ TUNER_ABSENT, "Samsung THPD5222FG30A"},
|
||||
/* 120-129 */
|
||||
{ TUNER_XC2028, "Xceive XC3028"},
|
||||
{ TUNER_XC2028, "Xceive XC3028"},
|
||||
{ TUNER_PHILIPS_FQ1216LME_MK3, "Philips FQ1216LME MK5"},
|
||||
{ TUNER_ABSENT, "Philips FQD1216LME"},
|
||||
{ TUNER_ABSENT, "Conexant CX24118A"},
|
||||
{ TUNER_ABSENT, "TCL DMF11WIP"},
|
||||
{ TUNER_ABSENT, "TCL MFNM05_4H_E"},
|
||||
{ TUNER_ABSENT, "TCL MNM05_4H_E"},
|
||||
{ TUNER_ABSENT, "TCL MPE05_2H_E"},
|
||||
{ TUNER_ABSENT, "TCL MQNM05_4_U"},
|
||||
{ TUNER_ABSENT, "TCL M2523_5NH_E"},
|
||||
{ TUNER_ABSENT, "Philips FQD1216LME"},
|
||||
{ TUNER_ABSENT, "Conexant CX24118A"},
|
||||
{ TUNER_ABSENT, "TCL DMF11WIP"},
|
||||
{ TUNER_ABSENT, "TCL MFNM05_4H_E"},
|
||||
{ TUNER_ABSENT, "TCL MNM05_4H_E"},
|
||||
{ TUNER_ABSENT, "TCL MPE05_2H_E"},
|
||||
{ TUNER_ABSENT, "TCL MQNM05_4_U"},
|
||||
{ TUNER_ABSENT, "TCL M2523_5NH_E"},
|
||||
/* 130-139 */
|
||||
{ TUNER_ABSENT, "TCL M2523_3DBH_E"},
|
||||
{ TUNER_ABSENT, "TCL M2523_3DIH_E"},
|
||||
{ TUNER_ABSENT, "TCL MFPE05_2_U"},
|
||||
{ TUNER_ABSENT, "TCL M2523_3DBH_E"},
|
||||
{ TUNER_ABSENT, "TCL M2523_3DIH_E"},
|
||||
{ TUNER_ABSENT, "TCL MFPE05_2_U"},
|
||||
{ TUNER_PHILIPS_FMD1216MEX_MK3, "Philips FMD1216MEX"},
|
||||
{ TUNER_ABSENT, "Philips FRH2036B"},
|
||||
{ TUNER_ABSENT, "Panasonic ENGF75_01GF"},
|
||||
{ TUNER_ABSENT, "MaxLinear MXL5005"},
|
||||
{ TUNER_ABSENT, "MaxLinear MXL5003"},
|
||||
{ TUNER_ABSENT, "Xceive XC2028"},
|
||||
{ TUNER_ABSENT, "Microtune MT2131"},
|
||||
{ TUNER_ABSENT, "Philips FRH2036B"},
|
||||
{ TUNER_ABSENT, "Panasonic ENGF75_01GF"},
|
||||
{ TUNER_ABSENT, "MaxLinear MXL5005"},
|
||||
{ TUNER_ABSENT, "MaxLinear MXL5003"},
|
||||
{ TUNER_ABSENT, "Xceive XC2028"},
|
||||
{ TUNER_ABSENT, "Microtune MT2131"},
|
||||
/* 140-149 */
|
||||
{ TUNER_ABSENT, "Philips 8275A_8295"},
|
||||
{ TUNER_ABSENT, "TCL MF02GIP_5N_E"},
|
||||
{ TUNER_ABSENT, "TCL MF02GIP_3DB_E"},
|
||||
{ TUNER_ABSENT, "TCL MF02GIP_3DI_E"},
|
||||
{ TUNER_ABSENT, "Microtune MT2266"},
|
||||
{ TUNER_ABSENT, "TCL MF10WPP_4N_E"},
|
||||
{ TUNER_ABSENT, "LG TAPQ_H702F"},
|
||||
{ TUNER_ABSENT, "TCL M09WPP_4N_E"},
|
||||
{ TUNER_ABSENT, "MaxLinear MXL5005_v2"},
|
||||
{ TUNER_PHILIPS_TDA8290, "Philips 18271_8295"},
|
||||
{ TUNER_ABSENT, "Philips 8275A_8295"},
|
||||
{ TUNER_ABSENT, "TCL MF02GIP_5N_E"},
|
||||
{ TUNER_ABSENT, "TCL MF02GIP_3DB_E"},
|
||||
{ TUNER_ABSENT, "TCL MF02GIP_3DI_E"},
|
||||
{ TUNER_ABSENT, "Microtune MT2266"},
|
||||
{ TUNER_ABSENT, "TCL MF10WPP_4N_E"},
|
||||
{ TUNER_ABSENT, "LG TAPQ_H702F"},
|
||||
{ TUNER_ABSENT, "TCL M09WPP_4N_E"},
|
||||
{ TUNER_ABSENT, "MaxLinear MXL5005_v2"},
|
||||
{ TUNER_PHILIPS_TDA8290, "Philips 18271_8295"},
|
||||
/* 150-159 */
|
||||
{ TUNER_XC5000, "Xceive XC5000"},
|
||||
{ TUNER_ABSENT, "Xceive XC3028L"},
|
||||
@ -784,9 +784,3 @@ int tveeprom_read(struct i2c_client *c, unsigned char *eedata, int len)
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(tveeprom_read);
|
||||
|
||||
/*
|
||||
* Local variables:
|
||||
* c-basic-offset: 8
|
||||
* End:
|
||||
*/
|
@ -172,6 +172,7 @@
|
||||
#define USB_PID_TWINHAN_VP7045_WARM 0x3206
|
||||
#define USB_PID_TWINHAN_VP7021_COLD 0x3207
|
||||
#define USB_PID_TWINHAN_VP7021_WARM 0x3208
|
||||
#define USB_PID_TWINHAN_VP7049 0x3219
|
||||
#define USB_PID_TINYTWIN 0x3226
|
||||
#define USB_PID_TINYTWIN_2 0xe402
|
||||
#define USB_PID_TINYTWIN_3 0x9016
|
||||
@ -233,10 +234,15 @@
|
||||
#define USB_PID_AVERMEDIA_A815M 0x815a
|
||||
#define USB_PID_AVERMEDIA_A835 0xa835
|
||||
#define USB_PID_AVERMEDIA_B835 0xb835
|
||||
#define USB_PID_AVERMEDIA_A835B_1835 0x1835
|
||||
#define USB_PID_AVERMEDIA_A835B_2835 0x2835
|
||||
#define USB_PID_AVERMEDIA_A835B_3835 0x3835
|
||||
#define USB_PID_AVERMEDIA_A835B_4835 0x4835
|
||||
#define USB_PID_AVERMEDIA_1867 0x1867
|
||||
#define USB_PID_AVERMEDIA_A867 0xa867
|
||||
#define USB_PID_AVERMEDIA_TWINSTAR 0x0825
|
||||
#define USB_PID_TECHNOTREND_CONNECT_S2400 0x3006
|
||||
#define USB_PID_TECHNOTREND_CONNECT_S2400_8KEEPROM 0x3009
|
||||
#define USB_PID_TECHNOTREND_CONNECT_CT3650 0x300d
|
||||
#define USB_PID_TERRATEC_CINERGY_DT_XS_DIVERSITY 0x005a
|
||||
#define USB_PID_TERRATEC_CINERGY_DT_XS_DIVERSITY_2 0x0081
|
||||
|
@ -156,6 +156,9 @@ struct dvb_ca_private {
|
||||
|
||||
/* Slot to start looking for data to read from in the next user-space read operation */
|
||||
int next_read_slot;
|
||||
|
||||
/* mutex serializing ioctls */
|
||||
struct mutex ioctl_mutex;
|
||||
};
|
||||
|
||||
static void dvb_ca_en50221_thread_wakeup(struct dvb_ca_private *ca);
|
||||
@ -1191,6 +1194,9 @@ static int dvb_ca_en50221_io_do_ioctl(struct file *file,
|
||||
|
||||
dprintk("%s\n", __func__);
|
||||
|
||||
if (mutex_lock_interruptible(&ca->ioctl_mutex))
|
||||
return -ERESTARTSYS;
|
||||
|
||||
switch (cmd) {
|
||||
case CA_RESET:
|
||||
for (slot = 0; slot < ca->slot_count; slot++) {
|
||||
@ -1221,8 +1227,10 @@ static int dvb_ca_en50221_io_do_ioctl(struct file *file,
|
||||
case CA_GET_SLOT_INFO: {
|
||||
struct ca_slot_info *info = parg;
|
||||
|
||||
if ((info->num > ca->slot_count) || (info->num < 0))
|
||||
return -EINVAL;
|
||||
if ((info->num > ca->slot_count) || (info->num < 0)) {
|
||||
err = -EINVAL;
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
info->type = CA_CI_LINK;
|
||||
info->flags = 0;
|
||||
@ -1241,6 +1249,8 @@ static int dvb_ca_en50221_io_do_ioctl(struct file *file,
|
||||
break;
|
||||
}
|
||||
|
||||
out_unlock:
|
||||
mutex_unlock(&ca->ioctl_mutex);
|
||||
return err;
|
||||
}
|
||||
|
||||
@ -1695,6 +1705,8 @@ int dvb_ca_en50221_init(struct dvb_adapter *dvb_adapter,
|
||||
mutex_init(&ca->slot_info[i].slot_lock);
|
||||
}
|
||||
|
||||
mutex_init(&ca->ioctl_mutex);
|
||||
|
||||
if (signal_pending(current)) {
|
||||
ret = -EINTR;
|
||||
goto error;
|
||||
|
@ -603,6 +603,7 @@ static int dvb_frontend_thread(void *data)
|
||||
enum dvbfe_algo algo;
|
||||
|
||||
bool re_tune = false;
|
||||
bool semheld = false;
|
||||
|
||||
dev_dbg(fe->dvb->device, "%s:\n", __func__);
|
||||
|
||||
@ -626,6 +627,8 @@ restart:
|
||||
|
||||
if (kthread_should_stop() || dvb_frontend_is_exiting(fe)) {
|
||||
/* got signal or quitting */
|
||||
if (!down_interruptible(&fepriv->sem))
|
||||
semheld = true;
|
||||
fepriv->exit = DVB_FE_NORMAL_EXIT;
|
||||
break;
|
||||
}
|
||||
@ -741,6 +744,8 @@ restart:
|
||||
fepriv->exit = DVB_FE_NO_EXIT;
|
||||
mb();
|
||||
|
||||
if (semheld)
|
||||
up(&fepriv->sem);
|
||||
dvb_frontend_wakeup(fe);
|
||||
return 0;
|
||||
}
|
||||
@ -1048,6 +1053,16 @@ static struct dtv_cmds_h dtv_cmds[DTV_MAX_COMMAND + 1] = {
|
||||
_DTV_CMD(DTV_ATSCMH_SCCC_CODE_MODE_B, 0, 0),
|
||||
_DTV_CMD(DTV_ATSCMH_SCCC_CODE_MODE_C, 0, 0),
|
||||
_DTV_CMD(DTV_ATSCMH_SCCC_CODE_MODE_D, 0, 0),
|
||||
|
||||
/* Statistics API */
|
||||
_DTV_CMD(DTV_STAT_SIGNAL_STRENGTH, 0, 0),
|
||||
_DTV_CMD(DTV_STAT_CNR, 0, 0),
|
||||
_DTV_CMD(DTV_STAT_PRE_ERROR_BIT_COUNT, 0, 0),
|
||||
_DTV_CMD(DTV_STAT_PRE_TOTAL_BIT_COUNT, 0, 0),
|
||||
_DTV_CMD(DTV_STAT_POST_ERROR_BIT_COUNT, 0, 0),
|
||||
_DTV_CMD(DTV_STAT_POST_TOTAL_BIT_COUNT, 0, 0),
|
||||
_DTV_CMD(DTV_STAT_ERROR_BLOCK_COUNT, 0, 0),
|
||||
_DTV_CMD(DTV_STAT_TOTAL_BLOCK_COUNT, 0, 0),
|
||||
};
|
||||
|
||||
static void dtv_property_dump(struct dvb_frontend *fe, struct dtv_property *tvp)
|
||||
@ -1438,7 +1453,35 @@ static int dtv_property_process_get(struct dvb_frontend *fe,
|
||||
tvp->u.data = c->lna;
|
||||
break;
|
||||
|
||||
/* Fill quality measures */
|
||||
case DTV_STAT_SIGNAL_STRENGTH:
|
||||
tvp->u.st = c->strength;
|
||||
break;
|
||||
case DTV_STAT_CNR:
|
||||
tvp->u.st = c->cnr;
|
||||
break;
|
||||
case DTV_STAT_PRE_ERROR_BIT_COUNT:
|
||||
tvp->u.st = c->pre_bit_error;
|
||||
break;
|
||||
case DTV_STAT_PRE_TOTAL_BIT_COUNT:
|
||||
tvp->u.st = c->pre_bit_count;
|
||||
break;
|
||||
case DTV_STAT_POST_ERROR_BIT_COUNT:
|
||||
tvp->u.st = c->post_bit_error;
|
||||
break;
|
||||
case DTV_STAT_POST_TOTAL_BIT_COUNT:
|
||||
tvp->u.st = c->post_bit_count;
|
||||
break;
|
||||
case DTV_STAT_ERROR_BLOCK_COUNT:
|
||||
tvp->u.st = c->block_error;
|
||||
break;
|
||||
case DTV_STAT_TOTAL_BLOCK_COUNT:
|
||||
tvp->u.st = c->block_count;
|
||||
break;
|
||||
default:
|
||||
dev_dbg(fe->dvb->device,
|
||||
"%s: FE property %d doesn't exist\n",
|
||||
__func__, tvp->cmd);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@ -1823,16 +1866,20 @@ static int dvb_frontend_ioctl(struct file *file,
|
||||
int err = -EOPNOTSUPP;
|
||||
|
||||
dev_dbg(fe->dvb->device, "%s: (%d)\n", __func__, _IOC_NR(cmd));
|
||||
if (fepriv->exit != DVB_FE_NO_EXIT)
|
||||
if (down_interruptible(&fepriv->sem))
|
||||
return -ERESTARTSYS;
|
||||
|
||||
if (fepriv->exit != DVB_FE_NO_EXIT) {
|
||||
up(&fepriv->sem);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
if ((file->f_flags & O_ACCMODE) == O_RDONLY &&
|
||||
(_IOC_DIR(cmd) != _IOC_READ || cmd == FE_GET_EVENT ||
|
||||
cmd == FE_DISEQC_RECV_SLAVE_REPLY))
|
||||
cmd == FE_DISEQC_RECV_SLAVE_REPLY)) {
|
||||
up(&fepriv->sem);
|
||||
return -EPERM;
|
||||
|
||||
if (down_interruptible (&fepriv->sem))
|
||||
return -ERESTARTSYS;
|
||||
}
|
||||
|
||||
if ((cmd == FE_SET_PROPERTY) || (cmd == FE_GET_PROPERTY))
|
||||
err = dvb_frontend_ioctl_properties(file, cmd, parg);
|
||||
@ -2246,7 +2293,7 @@ static int dvb_frontend_ioctl_legacy(struct file *file,
|
||||
printk("%s switch command: 0x%04lx\n", __func__, swcmd);
|
||||
do_gettimeofday(&nexttime);
|
||||
if (dvb_frontend_debug)
|
||||
memcpy(&tv[0], &nexttime, sizeof(struct timeval));
|
||||
tv[0] = nexttime;
|
||||
/* before sending a command, initialize by sending
|
||||
* a 32ms 18V to the switch
|
||||
*/
|
||||
|
@ -393,6 +393,16 @@ struct dtv_frontend_properties {
|
||||
u8 atscmh_sccc_code_mode_d;
|
||||
|
||||
u32 lna;
|
||||
|
||||
/* statistics data */
|
||||
struct dtv_fe_stats strength;
|
||||
struct dtv_fe_stats cnr;
|
||||
struct dtv_fe_stats pre_bit_error;
|
||||
struct dtv_fe_stats pre_bit_count;
|
||||
struct dtv_fe_stats post_bit_error;
|
||||
struct dtv_fe_stats post_bit_count;
|
||||
struct dtv_fe_stats block_error;
|
||||
struct dtv_fe_stats block_count;
|
||||
};
|
||||
|
||||
struct dvb_frontend {
|
||||
|
@ -1345,26 +1345,35 @@ static int dvb_net_do_ioctl(struct file *file,
|
||||
{
|
||||
struct dvb_device *dvbdev = file->private_data;
|
||||
struct dvb_net *dvbnet = dvbdev->priv;
|
||||
int ret = 0;
|
||||
|
||||
if (((file->f_flags&O_ACCMODE)==O_RDONLY))
|
||||
return -EPERM;
|
||||
|
||||
if (mutex_lock_interruptible(&dvbnet->ioctl_mutex))
|
||||
return -ERESTARTSYS;
|
||||
|
||||
switch (cmd) {
|
||||
case NET_ADD_IF:
|
||||
{
|
||||
struct dvb_net_if *dvbnetif = parg;
|
||||
int result;
|
||||
|
||||
if (!capable(CAP_SYS_ADMIN))
|
||||
return -EPERM;
|
||||
if (!capable(CAP_SYS_ADMIN)) {
|
||||
ret = -EPERM;
|
||||
goto ioctl_error;
|
||||
}
|
||||
|
||||
if (!try_module_get(dvbdev->adapter->module))
|
||||
return -EPERM;
|
||||
if (!try_module_get(dvbdev->adapter->module)) {
|
||||
ret = -EPERM;
|
||||
goto ioctl_error;
|
||||
}
|
||||
|
||||
result=dvb_net_add_if(dvbnet, dvbnetif->pid, dvbnetif->feedtype);
|
||||
if (result<0) {
|
||||
module_put(dvbdev->adapter->module);
|
||||
return result;
|
||||
ret = result;
|
||||
goto ioctl_error;
|
||||
}
|
||||
dvbnetif->if_num=result;
|
||||
break;
|
||||
@ -1376,8 +1385,10 @@ static int dvb_net_do_ioctl(struct file *file,
|
||||
struct dvb_net_if *dvbnetif = parg;
|
||||
|
||||
if (dvbnetif->if_num >= DVB_NET_DEVICES_MAX ||
|
||||
!dvbnet->state[dvbnetif->if_num])
|
||||
return -EINVAL;
|
||||
!dvbnet->state[dvbnetif->if_num]) {
|
||||
ret = -EINVAL;
|
||||
goto ioctl_error;
|
||||
}
|
||||
|
||||
netdev = dvbnet->device[dvbnetif->if_num];
|
||||
|
||||
@ -1388,16 +1399,18 @@ static int dvb_net_do_ioctl(struct file *file,
|
||||
}
|
||||
case NET_REMOVE_IF:
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (!capable(CAP_SYS_ADMIN))
|
||||
return -EPERM;
|
||||
if ((unsigned long) parg >= DVB_NET_DEVICES_MAX)
|
||||
return -EINVAL;
|
||||
if (!capable(CAP_SYS_ADMIN)) {
|
||||
ret = -EPERM;
|
||||
goto ioctl_error;
|
||||
}
|
||||
if ((unsigned long) parg >= DVB_NET_DEVICES_MAX) {
|
||||
ret = -EINVAL;
|
||||
goto ioctl_error;
|
||||
}
|
||||
ret = dvb_net_remove_if(dvbnet, (unsigned long) parg);
|
||||
if (!ret)
|
||||
module_put(dvbdev->adapter->module);
|
||||
return ret;
|
||||
break;
|
||||
}
|
||||
|
||||
/* binary compatibility cruft */
|
||||
@ -1406,16 +1419,21 @@ static int dvb_net_do_ioctl(struct file *file,
|
||||
struct __dvb_net_if_old *dvbnetif = parg;
|
||||
int result;
|
||||
|
||||
if (!capable(CAP_SYS_ADMIN))
|
||||
return -EPERM;
|
||||
if (!capable(CAP_SYS_ADMIN)) {
|
||||
ret = -EPERM;
|
||||
goto ioctl_error;
|
||||
}
|
||||
|
||||
if (!try_module_get(dvbdev->adapter->module))
|
||||
return -EPERM;
|
||||
if (!try_module_get(dvbdev->adapter->module)) {
|
||||
ret = -EPERM;
|
||||
goto ioctl_error;
|
||||
}
|
||||
|
||||
result=dvb_net_add_if(dvbnet, dvbnetif->pid, DVB_NET_FEEDTYPE_MPE);
|
||||
if (result<0) {
|
||||
module_put(dvbdev->adapter->module);
|
||||
return result;
|
||||
ret = result;
|
||||
goto ioctl_error;
|
||||
}
|
||||
dvbnetif->if_num=result;
|
||||
break;
|
||||
@ -1427,8 +1445,10 @@ static int dvb_net_do_ioctl(struct file *file,
|
||||
struct __dvb_net_if_old *dvbnetif = parg;
|
||||
|
||||
if (dvbnetif->if_num >= DVB_NET_DEVICES_MAX ||
|
||||
!dvbnet->state[dvbnetif->if_num])
|
||||
return -EINVAL;
|
||||
!dvbnet->state[dvbnetif->if_num]) {
|
||||
ret = -EINVAL;
|
||||
goto ioctl_error;
|
||||
}
|
||||
|
||||
netdev = dvbnet->device[dvbnetif->if_num];
|
||||
|
||||
@ -1437,9 +1457,13 @@ static int dvb_net_do_ioctl(struct file *file,
|
||||
break;
|
||||
}
|
||||
default:
|
||||
return -ENOTTY;
|
||||
ret = -ENOTTY;
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
|
||||
ioctl_error:
|
||||
mutex_unlock(&dvbnet->ioctl_mutex);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static long dvb_net_ioctl(struct file *file,
|
||||
@ -1505,6 +1529,7 @@ int dvb_net_init (struct dvb_adapter *adap, struct dvb_net *dvbnet,
|
||||
{
|
||||
int i;
|
||||
|
||||
mutex_init(&dvbnet->ioctl_mutex);
|
||||
dvbnet->demux = dmx;
|
||||
|
||||
for (i=0; i<DVB_NET_DEVICES_MAX; i++)
|
||||
|
@ -40,6 +40,7 @@ struct dvb_net {
|
||||
int state[DVB_NET_DEVICES_MAX];
|
||||
unsigned int exit:1;
|
||||
struct dmx_demux *demux;
|
||||
struct mutex ioctl_mutex;
|
||||
};
|
||||
|
||||
void dvb_net_release(struct dvb_net *);
|
||||
|
@ -418,10 +418,8 @@ int dvb_usercopy(struct file *file,
|
||||
}
|
||||
|
||||
/* call driver */
|
||||
mutex_lock(&dvbdev_mutex);
|
||||
if ((err = func(file, cmd, parg)) == -ENOIOCTLCMD)
|
||||
err = -ENOTTY;
|
||||
mutex_unlock(&dvbdev_mutex);
|
||||
|
||||
if (err < 0)
|
||||
goto out;
|
||||
|
@ -207,6 +207,13 @@ config DVB_SI21XX
|
||||
help
|
||||
A DVB-S tuner module. Say Y when you want to support this frontend.
|
||||
|
||||
config DVB_TS2020
|
||||
tristate "Montage Tehnology TS2020 based tuners"
|
||||
depends on DVB_CORE && I2C
|
||||
default m if DVB_FE_CUSTOMISE
|
||||
help
|
||||
A DVB-S/S2 silicon tuner. Say Y when you want to support this tuner.
|
||||
|
||||
config DVB_DS3000
|
||||
tristate "Montage Tehnology DS3000 based"
|
||||
depends on DVB_CORE && I2C
|
||||
|
@ -88,6 +88,7 @@ obj-$(CONFIG_DVB_ISL6423) += isl6423.o
|
||||
obj-$(CONFIG_DVB_EC100) += ec100.o
|
||||
obj-$(CONFIG_DVB_HD29L2) += hd29l2.o
|
||||
obj-$(CONFIG_DVB_DS3000) += ds3000.o
|
||||
obj-$(CONFIG_DVB_TS2020) += ts2020.o
|
||||
obj-$(CONFIG_DVB_MB86A16) += mb86a16.o
|
||||
obj-$(CONFIG_DVB_MB86A20S) += mb86a20s.o
|
||||
obj-$(CONFIG_DVB_IX2505V) += ix2505v.o
|
||||
|
@ -318,6 +318,10 @@ static int af9033_init(struct dvb_frontend *fe)
|
||||
len = ARRAY_SIZE(tuner_init_fc2580);
|
||||
init = tuner_init_fc2580;
|
||||
break;
|
||||
case AF9033_TUNER_FC0012:
|
||||
len = ARRAY_SIZE(tuner_init_fc0012);
|
||||
init = tuner_init_fc0012;
|
||||
break;
|
||||
default:
|
||||
dev_dbg(&state->i2c->dev, "%s: unsupported tuner ID=%d\n",
|
||||
__func__, state->cfg.tuner);
|
||||
@ -331,6 +335,20 @@ static int af9033_init(struct dvb_frontend *fe)
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (state->cfg.ts_mode == AF9033_TS_MODE_SERIAL) {
|
||||
ret = af9033_wr_reg_mask(state, 0x00d91c, 0x01, 0x01);
|
||||
if (ret < 0)
|
||||
goto err;
|
||||
|
||||
ret = af9033_wr_reg_mask(state, 0x00d917, 0x00, 0x01);
|
||||
if (ret < 0)
|
||||
goto err;
|
||||
|
||||
ret = af9033_wr_reg_mask(state, 0x00d916, 0x00, 0x01);
|
||||
if (ret < 0)
|
||||
goto err;
|
||||
}
|
||||
|
||||
state->bandwidth_hz = 0; /* force to program all parameters */
|
||||
|
||||
return 0;
|
||||
|
@ -40,6 +40,7 @@ struct af9033_config {
|
||||
*/
|
||||
#define AF9033_TUNER_TUA9001 0x27 /* Infineon TUA 9001 */
|
||||
#define AF9033_TUNER_FC0011 0x28 /* Fitipower FC0011 */
|
||||
#define AF9033_TUNER_FC0012 0x2e /* Fitipower FC0012 */
|
||||
#define AF9033_TUNER_MXL5007T 0xa0 /* MaxLinear MxL5007T */
|
||||
#define AF9033_TUNER_TDA18218 0xa1 /* NXP TDA 18218HN */
|
||||
#define AF9033_TUNER_FC2580 0x32 /* FCI FC2580 */
|
||||
|
@ -199,10 +199,9 @@ static const struct reg_val ofsm_init[] = {
|
||||
{ 0x8000a6, 0x01 },
|
||||
{ 0x8000a9, 0x00 },
|
||||
{ 0x8000aa, 0x01 },
|
||||
{ 0x8000ab, 0x01 },
|
||||
{ 0x8000b0, 0x01 },
|
||||
{ 0x8000c0, 0x05 },
|
||||
{ 0x8000c4, 0x19 },
|
||||
{ 0x8000c4, 0x05 },
|
||||
{ 0x8000c8, 0x19 },
|
||||
{ 0x80f000, 0x0f },
|
||||
{ 0x80f016, 0x10 },
|
||||
{ 0x80f017, 0x04 },
|
||||
@ -322,8 +321,9 @@ static const struct reg_val tuner_init_tua9001[] = {
|
||||
{ 0x80009b, 0x05 },
|
||||
{ 0x80009c, 0x80 },
|
||||
{ 0x8000b3, 0x00 },
|
||||
{ 0x8000c1, 0x01 },
|
||||
{ 0x8000c2, 0x00 },
|
||||
{ 0x8000c5, 0x01 },
|
||||
{ 0x8000c6, 0x00 },
|
||||
{ 0x8000c9, 0x5d },
|
||||
{ 0x80f007, 0x00 },
|
||||
{ 0x80f01f, 0x82 },
|
||||
{ 0x80f020, 0x00 },
|
||||
@ -339,14 +339,14 @@ static const struct reg_val tuner_init_tua9001[] = {
|
||||
/* Fitipower fc0011 tuner init
|
||||
AF9033_TUNER_FC0011 = 0x28 */
|
||||
static const struct reg_val tuner_init_fc0011[] = {
|
||||
{ 0x800046, AF9033_TUNER_FC0011 },
|
||||
{ 0x800046, 0x28 },
|
||||
{ 0x800057, 0x00 },
|
||||
{ 0x800058, 0x01 },
|
||||
{ 0x80005f, 0x00 },
|
||||
{ 0x800060, 0x00 },
|
||||
{ 0x800068, 0xa5 },
|
||||
{ 0x80006e, 0x01 },
|
||||
{ 0x800071, 0x0A },
|
||||
{ 0x800071, 0x0a },
|
||||
{ 0x800072, 0x02 },
|
||||
{ 0x800074, 0x01 },
|
||||
{ 0x800079, 0x01 },
|
||||
@ -354,7 +354,7 @@ static const struct reg_val tuner_init_fc0011[] = {
|
||||
{ 0x800094, 0x00 },
|
||||
{ 0x800095, 0x00 },
|
||||
{ 0x800096, 0x00 },
|
||||
{ 0x80009b, 0x2D },
|
||||
{ 0x80009b, 0x2d },
|
||||
{ 0x80009c, 0x60 },
|
||||
{ 0x80009d, 0x23 },
|
||||
{ 0x8000a4, 0x50 },
|
||||
@ -362,39 +362,82 @@ static const struct reg_val tuner_init_fc0011[] = {
|
||||
{ 0x8000b3, 0x01 },
|
||||
{ 0x8000b7, 0x88 },
|
||||
{ 0x8000b8, 0xa6 },
|
||||
{ 0x8000c3, 0x01 },
|
||||
{ 0x8000c4, 0x01 },
|
||||
{ 0x8000c7, 0x69 },
|
||||
{ 0x80F007, 0x00 },
|
||||
{ 0x80F00A, 0x1B },
|
||||
{ 0x80F00B, 0x1B },
|
||||
{ 0x80F00C, 0x1B },
|
||||
{ 0x80F00D, 0x1B },
|
||||
{ 0x80F00E, 0xFF },
|
||||
{ 0x80F00F, 0x01 },
|
||||
{ 0x80F010, 0x00 },
|
||||
{ 0x80F011, 0x02 },
|
||||
{ 0x80F012, 0xFF },
|
||||
{ 0x80F013, 0x01 },
|
||||
{ 0x80F014, 0x00 },
|
||||
{ 0x80F015, 0x02 },
|
||||
{ 0x80F01B, 0xEF },
|
||||
{ 0x80F01C, 0x01 },
|
||||
{ 0x80F01D, 0x0f },
|
||||
{ 0x80F01E, 0x02 },
|
||||
{ 0x80F01F, 0x6E },
|
||||
{ 0x80F020, 0x00 },
|
||||
{ 0x80F025, 0xDE },
|
||||
{ 0x80F026, 0x00 },
|
||||
{ 0x80F027, 0x0A },
|
||||
{ 0x80F028, 0x03 },
|
||||
{ 0x80F029, 0x6E },
|
||||
{ 0x80F02A, 0x00 },
|
||||
{ 0x80F047, 0x00 },
|
||||
{ 0x80F054, 0x00 },
|
||||
{ 0x80F055, 0x00 },
|
||||
{ 0x80F077, 0x01 },
|
||||
{ 0x80F1E6, 0x00 },
|
||||
{ 0x8000c5, 0x01 },
|
||||
{ 0x8000c6, 0x01 },
|
||||
{ 0x8000c9, 0x69 },
|
||||
{ 0x80f007, 0x00 },
|
||||
{ 0x80f00a, 0x1b },
|
||||
{ 0x80f00b, 0x1b },
|
||||
{ 0x80f00c, 0x1b },
|
||||
{ 0x80f00d, 0x1b },
|
||||
{ 0x80f00e, 0xff },
|
||||
{ 0x80f00f, 0x01 },
|
||||
{ 0x80f010, 0x00 },
|
||||
{ 0x80f011, 0x02 },
|
||||
{ 0x80f012, 0xff },
|
||||
{ 0x80f013, 0x01 },
|
||||
{ 0x80f014, 0x00 },
|
||||
{ 0x80f015, 0x02 },
|
||||
{ 0x80f01b, 0xef },
|
||||
{ 0x80f01c, 0x01 },
|
||||
{ 0x80f01d, 0x0f },
|
||||
{ 0x80f01e, 0x02 },
|
||||
{ 0x80f01f, 0x6e },
|
||||
{ 0x80f020, 0x00 },
|
||||
{ 0x80f025, 0xde },
|
||||
{ 0x80f026, 0x00 },
|
||||
{ 0x80f027, 0x0a },
|
||||
{ 0x80f028, 0x03 },
|
||||
{ 0x80f029, 0x6e },
|
||||
{ 0x80f02a, 0x00 },
|
||||
{ 0x80f047, 0x00 },
|
||||
{ 0x80f054, 0x00 },
|
||||
{ 0x80f055, 0x00 },
|
||||
{ 0x80f077, 0x01 },
|
||||
{ 0x80f1e6, 0x00 },
|
||||
};
|
||||
|
||||
/* Fitipower FC0012 tuner init
|
||||
AF9033_TUNER_FC0012 = 0x2e */
|
||||
static const struct reg_val tuner_init_fc0012[] = {
|
||||
{ 0x800046, 0x2e },
|
||||
{ 0x800057, 0x00 },
|
||||
{ 0x800058, 0x01 },
|
||||
{ 0x800059, 0x01 },
|
||||
{ 0x80005f, 0x00 },
|
||||
{ 0x800060, 0x00 },
|
||||
{ 0x80006d, 0x00 },
|
||||
{ 0x800071, 0x05 },
|
||||
{ 0x800072, 0x02 },
|
||||
{ 0x800074, 0x01 },
|
||||
{ 0x800075, 0x03 },
|
||||
{ 0x800076, 0x02 },
|
||||
{ 0x800077, 0x01 },
|
||||
{ 0x800078, 0x00 },
|
||||
{ 0x800079, 0x00 },
|
||||
{ 0x80007a, 0x90 },
|
||||
{ 0x80007b, 0x90 },
|
||||
{ 0x800093, 0x00 },
|
||||
{ 0x800094, 0x01 },
|
||||
{ 0x800095, 0x02 },
|
||||
{ 0x800096, 0x01 },
|
||||
{ 0x800098, 0x0a },
|
||||
{ 0x80009b, 0x05 },
|
||||
{ 0x80009c, 0x80 },
|
||||
{ 0x8000b3, 0x00 },
|
||||
{ 0x8000c5, 0x01 },
|
||||
{ 0x8000c6, 0x00 },
|
||||
{ 0x8000c9, 0x5d },
|
||||
{ 0x80f007, 0x00 },
|
||||
{ 0x80f01f, 0xa0 },
|
||||
{ 0x80f020, 0x00 },
|
||||
{ 0x80f029, 0x82 },
|
||||
{ 0x80f02a, 0x00 },
|
||||
{ 0x80f047, 0x00 },
|
||||
{ 0x80f054, 0x00 },
|
||||
{ 0x80f055, 0x00 },
|
||||
{ 0x80f077, 0x01 },
|
||||
{ 0x80f1e6, 0x00 },
|
||||
};
|
||||
|
||||
/* MaxLinear MxL5007T tuner init
|
||||
@ -482,11 +525,12 @@ static const struct reg_val tuner_init_fc2580[] = {
|
||||
{ 0x800095, 0x00 },
|
||||
{ 0x800096, 0x05 },
|
||||
{ 0x8000b3, 0x01 },
|
||||
{ 0x8000c3, 0x01 },
|
||||
{ 0x8000c4, 0x00 },
|
||||
{ 0x8000c5, 0x01 },
|
||||
{ 0x8000c6, 0x00 },
|
||||
{ 0x8000d1, 0x01 },
|
||||
{ 0x80f007, 0x00 },
|
||||
{ 0x80f00c, 0x19 },
|
||||
{ 0x80f00d, 0x1A },
|
||||
{ 0x80f00d, 0x1a },
|
||||
{ 0x80f00e, 0x00 },
|
||||
{ 0x80f00f, 0x02 },
|
||||
{ 0x80f010, 0x00 },
|
||||
|
@ -34,7 +34,7 @@ struct bcm3510_config
|
||||
int (*request_firmware)(struct dvb_frontend* fe, const struct firmware **fw, char* name);
|
||||
};
|
||||
|
||||
#if defined(CONFIG_DVB_BCM3510) || (defined(CONFIG_DVB_BCM3510_MODULE) && defined(MODULE))
|
||||
#if IS_ENABLED(CONFIG_DVB_BCM3510)
|
||||
extern struct dvb_frontend* bcm3510_attach(const struct bcm3510_config* config,
|
||||
struct i2c_adapter* i2c);
|
||||
#else
|
||||
|
@ -31,7 +31,7 @@ struct cx22700_config
|
||||
u8 demod_address;
|
||||
};
|
||||
|
||||
#if defined(CONFIG_DVB_CX22700) || (defined(CONFIG_DVB_CX22700_MODULE) && defined(MODULE))
|
||||
#if IS_ENABLED(CONFIG_DVB_CX22700)
|
||||
extern struct dvb_frontend* cx22700_attach(const struct cx22700_config* config,
|
||||
struct i2c_adapter* i2c);
|
||||
#else
|
||||
|
@ -46,7 +46,7 @@ static inline int cx24110_pll_write(struct dvb_frontend *fe, u32 val)
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if defined(CONFIG_DVB_CX24110) || (defined(CONFIG_DVB_CX24110_MODULE) && defined(MODULE))
|
||||
#if IS_ENABLED(CONFIG_DVB_CX24110)
|
||||
extern struct dvb_frontend* cx24110_attach(const struct cx24110_config* config,
|
||||
struct i2c_adapter* i2c);
|
||||
#else
|
||||
|
@ -819,7 +819,7 @@ static int cx24116_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
|
||||
static void cx24116_clone_params(struct dvb_frontend *fe)
|
||||
{
|
||||
struct cx24116_state *state = fe->demodulator_priv;
|
||||
memcpy(&state->dcur, &state->dnxt, sizeof(state->dcur));
|
||||
state->dcur = state->dnxt;
|
||||
}
|
||||
|
||||
/* Wait for LNB */
|
||||
|
@ -48,7 +48,7 @@ struct dib0070_config {
|
||||
u8 vga_filter;
|
||||
};
|
||||
|
||||
#if defined(CONFIG_DVB_TUNER_DIB0070) || (defined(CONFIG_DVB_TUNER_DIB0070_MODULE) && defined(MODULE))
|
||||
#if IS_ENABLED(CONFIG_DVB_TUNER_DIB0070)
|
||||
extern struct dvb_frontend *dib0070_attach(struct dvb_frontend *fe, struct i2c_adapter *i2c, struct dib0070_config *cfg);
|
||||
extern u16 dib0070_wbd_offset(struct dvb_frontend *);
|
||||
extern void dib0070_ctrl_agc_filter(struct dvb_frontend *, u8 open);
|
||||
|
@ -75,7 +75,7 @@ struct dib0090_config {
|
||||
u8 force_crystal_mode;
|
||||
};
|
||||
|
||||
#if defined(CONFIG_DVB_TUNER_DIB0090) || (defined(CONFIG_DVB_TUNER_DIB0090_MODULE) && defined(MODULE))
|
||||
#if IS_ENABLED(CONFIG_DVB_TUNER_DIB0090)
|
||||
extern struct dvb_frontend *dib0090_register(struct dvb_frontend *fe, struct i2c_adapter *i2c, const struct dib0090_config *config);
|
||||
extern struct dvb_frontend *dib0090_fw_register(struct dvb_frontend *fe, struct i2c_adapter *i2c, const struct dib0090_config *config);
|
||||
extern void dib0090_dcc_freq(struct dvb_frontend *fe, u8 fast);
|
||||
|
@ -41,7 +41,7 @@ struct dib_fe_xfer_ops
|
||||
int (*tuner_pass_ctrl)(struct dvb_frontend *fe, int onoff, u8 pll_ctrl);
|
||||
};
|
||||
|
||||
#if defined(CONFIG_DVB_DIB3000MB) || (defined(CONFIG_DVB_DIB3000MB_MODULE) && defined(MODULE))
|
||||
#if IS_ENABLED(CONFIG_DVB_DIB3000MB)
|
||||
extern struct dvb_frontend* dib3000mb_attach(const struct dib3000_config* config,
|
||||
struct i2c_adapter* i2c, struct dib_fe_xfer_ops *xfer_ops);
|
||||
#else
|
||||
|
@ -37,7 +37,7 @@ struct dib8000_config {
|
||||
|
||||
#define DEFAULT_DIB8000_I2C_ADDRESS 18
|
||||
|
||||
#if defined(CONFIG_DVB_DIB8000) || (defined(CONFIG_DVB_DIB8000_MODULE) && defined(MODULE))
|
||||
#if IS_ENABLED(CONFIG_DVB_DIB8000)
|
||||
extern struct dvb_frontend *dib8000_attach(struct i2c_adapter *i2c_adap, u8 i2c_addr, struct dib8000_config *cfg);
|
||||
extern struct i2c_adapter *dib8000_get_i2c_master(struct dvb_frontend *, enum dibx000_i2c_interface, int);
|
||||
|
||||
|
@ -27,7 +27,7 @@ struct dib9000_config {
|
||||
|
||||
#define DEFAULT_DIB9000_I2C_ADDRESS 18
|
||||
|
||||
#if defined(CONFIG_DVB_DIB9000) || (defined(CONFIG_DVB_DIB9000_MODULE) && defined(MODULE))
|
||||
#if IS_ENABLED(CONFIG_DVB_DIB9000)
|
||||
extern struct dvb_frontend *dib9000_attach(struct i2c_adapter *i2c_adap, u8 i2c_addr, const struct dib9000_config *cfg);
|
||||
extern int dib9000_i2c_enumeration(struct i2c_adapter *host, int no_of_demods, u8 default_addr, u8 first_addr);
|
||||
extern struct i2c_adapter *dib9000_get_tuner_interface(struct dvb_frontend *fe);
|
||||
|
@ -2965,7 +2965,7 @@ struct dvb_frontend *drxd_attach(const struct drxd_config *config,
|
||||
return NULL;
|
||||
memset(state, 0, sizeof(*state));
|
||||
|
||||
memcpy(&state->ops, &drxd_ops, sizeof(struct dvb_frontend_ops));
|
||||
state->ops = drxd_ops;
|
||||
state->dev = dev;
|
||||
state->config = *config;
|
||||
state->i2c = i2c;
|
||||
@ -2976,10 +2976,13 @@ struct dvb_frontend *drxd_attach(const struct drxd_config *config,
|
||||
if (Read16(state, 0, 0, 0) < 0)
|
||||
goto error;
|
||||
|
||||
memcpy(&state->frontend.ops, &drxd_ops,
|
||||
sizeof(struct dvb_frontend_ops));
|
||||
state->frontend.ops = drxd_ops;
|
||||
state->frontend.demodulator_priv = state;
|
||||
ConfigureMPEGOutput(state, 0);
|
||||
/* add few initialization to allow gate control */
|
||||
CDRXD(state, state->config.IF ? state->config.IF : 36000000);
|
||||
InitHI(state);
|
||||
|
||||
return &state->frontend;
|
||||
|
||||
error:
|
||||
|
@ -1,8 +1,8 @@
|
||||
/*
|
||||
Montage Technology DS3000/TS2020 - DVBS/S2 Demodulator/Tuner driver
|
||||
Copyright (C) 2009 Konstantin Dimitrov <kosio.dimitrov@gmail.com>
|
||||
Montage Technology DS3000 - DVBS/S2 Demodulator driver
|
||||
Copyright (C) 2009-2012 Konstantin Dimitrov <kosio.dimitrov@gmail.com>
|
||||
|
||||
Copyright (C) 2009 TurboSight.com
|
||||
Copyright (C) 2009-2012 TurboSight.com
|
||||
|
||||
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
|
||||
@ -27,6 +27,7 @@
|
||||
#include <linux/firmware.h>
|
||||
|
||||
#include "dvb_frontend.h"
|
||||
#include "ts2020.h"
|
||||
#include "ds3000.h"
|
||||
|
||||
static int debug;
|
||||
@ -42,7 +43,6 @@ static int debug;
|
||||
#define DS3000_DEFAULT_FIRMWARE "dvb-fe-ds3000.fw"
|
||||
|
||||
#define DS3000_SAMPLE_RATE 96000 /* in kHz */
|
||||
#define DS3000_XTAL_FREQ 27000 /* in kHz */
|
||||
|
||||
/* Register values to initialise the demod in DVB-S mode */
|
||||
static u8 ds3000_dvbs_init_tab[] = {
|
||||
@ -256,22 +256,14 @@ static int ds3000_writereg(struct ds3000_state *state, int reg, int data)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ds3000_tuner_writereg(struct ds3000_state *state, int reg, int data)
|
||||
static int ds3000_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
|
||||
{
|
||||
u8 buf[] = { reg, data };
|
||||
struct i2c_msg msg = { .addr = 0x60,
|
||||
.flags = 0, .buf = buf, .len = 2 };
|
||||
int err;
|
||||
struct ds3000_state *state = fe->demodulator_priv;
|
||||
|
||||
dprintk("%s: write reg 0x%02x, value 0x%02x\n", __func__, reg, data);
|
||||
|
||||
ds3000_writereg(state, 0x03, 0x11);
|
||||
err = i2c_transfer(state->i2c, &msg, 1);
|
||||
if (err != 1) {
|
||||
printk("%s: writereg error(err == %i, reg == 0x%02x,"
|
||||
" value == 0x%02x)\n", __func__, err, reg, data);
|
||||
return -EREMOTEIO;
|
||||
}
|
||||
if (enable)
|
||||
ds3000_writereg(state, 0x03, 0x12);
|
||||
else
|
||||
ds3000_writereg(state, 0x03, 0x02);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -280,15 +272,14 @@ static int ds3000_tuner_writereg(struct ds3000_state *state, int reg, int data)
|
||||
static int ds3000_writeFW(struct ds3000_state *state, int reg,
|
||||
const u8 *data, u16 len)
|
||||
{
|
||||
int i, ret = -EREMOTEIO;
|
||||
int i, ret = 0;
|
||||
struct i2c_msg msg;
|
||||
u8 *buf;
|
||||
|
||||
buf = kmalloc(33, GFP_KERNEL);
|
||||
if (buf == NULL) {
|
||||
printk(KERN_ERR "Unable to kmalloc\n");
|
||||
ret = -ENOMEM;
|
||||
goto error;
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
*(buf) = reg;
|
||||
@ -308,8 +299,10 @@ static int ds3000_writeFW(struct ds3000_state *state, int reg,
|
||||
printk(KERN_ERR "%s: write error(err == %i, "
|
||||
"reg == 0x%02x\n", __func__, ret, reg);
|
||||
ret = -EREMOTEIO;
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
ret = 0;
|
||||
|
||||
error:
|
||||
kfree(buf);
|
||||
@ -348,38 +341,6 @@ static int ds3000_readreg(struct ds3000_state *state, u8 reg)
|
||||
return b1[0];
|
||||
}
|
||||
|
||||
static int ds3000_tuner_readreg(struct ds3000_state *state, u8 reg)
|
||||
{
|
||||
int ret;
|
||||
u8 b0[] = { reg };
|
||||
u8 b1[] = { 0 };
|
||||
struct i2c_msg msg[] = {
|
||||
{
|
||||
.addr = 0x60,
|
||||
.flags = 0,
|
||||
.buf = b0,
|
||||
.len = 1
|
||||
}, {
|
||||
.addr = 0x60,
|
||||
.flags = I2C_M_RD,
|
||||
.buf = b1,
|
||||
.len = 1
|
||||
}
|
||||
};
|
||||
|
||||
ds3000_writereg(state, 0x03, 0x12);
|
||||
ret = i2c_transfer(state->i2c, msg, 2);
|
||||
|
||||
if (ret != 2) {
|
||||
printk(KERN_ERR "%s: reg=0x%x(error=%d)\n", __func__, reg, ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
dprintk("%s: read reg 0x%02x, value 0x%02x\n", __func__, reg, b1[0]);
|
||||
|
||||
return b1[0];
|
||||
}
|
||||
|
||||
static int ds3000_load_firmware(struct dvb_frontend *fe,
|
||||
const struct firmware *fw);
|
||||
|
||||
@ -424,6 +385,7 @@ static int ds3000_load_firmware(struct dvb_frontend *fe,
|
||||
const struct firmware *fw)
|
||||
{
|
||||
struct ds3000_state *state = fe->demodulator_priv;
|
||||
int ret = 0;
|
||||
|
||||
dprintk("%s\n", __func__);
|
||||
dprintk("Firmware is %zu bytes (%02x %02x .. %02x %02x)\n",
|
||||
@ -436,10 +398,10 @@ static int ds3000_load_firmware(struct dvb_frontend *fe,
|
||||
/* Begin the firmware load process */
|
||||
ds3000_writereg(state, 0xb2, 0x01);
|
||||
/* write the entire firmware */
|
||||
ds3000_writeFW(state, 0xb0, fw->data, fw->size);
|
||||
ret = ds3000_writeFW(state, 0xb0, fw->data, fw->size);
|
||||
ds3000_writereg(state, 0xb2, 0x00);
|
||||
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int ds3000_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage)
|
||||
@ -498,6 +460,9 @@ static int ds3000_read_status(struct dvb_frontend *fe, fe_status_t* status)
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (state->config->set_lock_led)
|
||||
state->config->set_lock_led(fe, *status == 0 ? 0 : 1);
|
||||
|
||||
dprintk("%s: status = 0x%02x\n", __func__, lock);
|
||||
|
||||
return 0;
|
||||
@ -568,33 +533,11 @@ static int ds3000_read_ber(struct dvb_frontend *fe, u32* ber)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* read TS2020 signal strength */
|
||||
static int ds3000_read_signal_strength(struct dvb_frontend *fe,
|
||||
u16 *signal_strength)
|
||||
{
|
||||
struct ds3000_state *state = fe->demodulator_priv;
|
||||
u16 sig_reading, sig_strength;
|
||||
u8 rfgain, bbgain;
|
||||
|
||||
dprintk("%s()\n", __func__);
|
||||
|
||||
rfgain = ds3000_tuner_readreg(state, 0x3d) & 0x1f;
|
||||
bbgain = ds3000_tuner_readreg(state, 0x21) & 0x1f;
|
||||
|
||||
if (rfgain > 15)
|
||||
rfgain = 15;
|
||||
if (bbgain > 13)
|
||||
bbgain = 13;
|
||||
|
||||
sig_reading = rfgain * 2 + bbgain * 3;
|
||||
|
||||
sig_strength = 40 + (64 - sig_reading) * 50 / 64 ;
|
||||
|
||||
/* cook the value to be suitable for szap-s2 human readable output */
|
||||
*signal_strength = sig_strength * 1000;
|
||||
|
||||
dprintk("%s: raw / cooked = 0x%04x / 0x%04x\n", __func__,
|
||||
sig_reading, *signal_strength);
|
||||
if (fe->ops.tuner_ops.get_rf_strength)
|
||||
fe->ops.tuner_ops.get_rf_strength(fe, signal_strength);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -878,6 +821,10 @@ static int ds3000_diseqc_send_burst(struct dvb_frontend *fe,
|
||||
static void ds3000_release(struct dvb_frontend *fe)
|
||||
{
|
||||
struct ds3000_state *state = fe->demodulator_priv;
|
||||
|
||||
if (state->config->set_lock_led)
|
||||
state->config->set_lock_led(fe, 0);
|
||||
|
||||
dprintk("%s\n", __func__);
|
||||
kfree(state);
|
||||
}
|
||||
@ -952,133 +899,17 @@ static int ds3000_set_frontend(struct dvb_frontend *fe)
|
||||
|
||||
int i;
|
||||
fe_status_t status;
|
||||
u8 mlpf, mlpf_new, mlpf_max, mlpf_min, nlpf, div4;
|
||||
s32 offset_khz;
|
||||
u16 value, ndiv;
|
||||
u32 f3db;
|
||||
u32 frequency;
|
||||
u16 value;
|
||||
|
||||
dprintk("%s() ", __func__);
|
||||
|
||||
if (state->config->set_ts_params)
|
||||
state->config->set_ts_params(fe, 0);
|
||||
/* Tune */
|
||||
/* unknown */
|
||||
ds3000_tuner_writereg(state, 0x07, 0x02);
|
||||
ds3000_tuner_writereg(state, 0x10, 0x00);
|
||||
ds3000_tuner_writereg(state, 0x60, 0x79);
|
||||
ds3000_tuner_writereg(state, 0x08, 0x01);
|
||||
ds3000_tuner_writereg(state, 0x00, 0x01);
|
||||
div4 = 0;
|
||||
|
||||
/* calculate and set freq divider */
|
||||
if (c->frequency < 1146000) {
|
||||
ds3000_tuner_writereg(state, 0x10, 0x11);
|
||||
div4 = 1;
|
||||
ndiv = ((c->frequency * (6 + 8) * 4) +
|
||||
(DS3000_XTAL_FREQ / 2)) /
|
||||
DS3000_XTAL_FREQ - 1024;
|
||||
} else {
|
||||
ds3000_tuner_writereg(state, 0x10, 0x01);
|
||||
ndiv = ((c->frequency * (6 + 8) * 2) +
|
||||
(DS3000_XTAL_FREQ / 2)) /
|
||||
DS3000_XTAL_FREQ - 1024;
|
||||
}
|
||||
|
||||
ds3000_tuner_writereg(state, 0x01, (ndiv & 0x0f00) >> 8);
|
||||
ds3000_tuner_writereg(state, 0x02, ndiv & 0x00ff);
|
||||
|
||||
/* set pll */
|
||||
ds3000_tuner_writereg(state, 0x03, 0x06);
|
||||
ds3000_tuner_writereg(state, 0x51, 0x0f);
|
||||
ds3000_tuner_writereg(state, 0x51, 0x1f);
|
||||
ds3000_tuner_writereg(state, 0x50, 0x10);
|
||||
ds3000_tuner_writereg(state, 0x50, 0x00);
|
||||
msleep(5);
|
||||
|
||||
/* unknown */
|
||||
ds3000_tuner_writereg(state, 0x51, 0x17);
|
||||
ds3000_tuner_writereg(state, 0x51, 0x1f);
|
||||
ds3000_tuner_writereg(state, 0x50, 0x08);
|
||||
ds3000_tuner_writereg(state, 0x50, 0x00);
|
||||
msleep(5);
|
||||
|
||||
value = ds3000_tuner_readreg(state, 0x3d);
|
||||
value &= 0x0f;
|
||||
if ((value > 4) && (value < 15)) {
|
||||
value -= 3;
|
||||
if (value < 4)
|
||||
value = 4;
|
||||
value = ((value << 3) | 0x01) & 0x79;
|
||||
}
|
||||
|
||||
ds3000_tuner_writereg(state, 0x60, value);
|
||||
ds3000_tuner_writereg(state, 0x51, 0x17);
|
||||
ds3000_tuner_writereg(state, 0x51, 0x1f);
|
||||
ds3000_tuner_writereg(state, 0x50, 0x08);
|
||||
ds3000_tuner_writereg(state, 0x50, 0x00);
|
||||
|
||||
/* set low-pass filter period */
|
||||
ds3000_tuner_writereg(state, 0x04, 0x2e);
|
||||
ds3000_tuner_writereg(state, 0x51, 0x1b);
|
||||
ds3000_tuner_writereg(state, 0x51, 0x1f);
|
||||
ds3000_tuner_writereg(state, 0x50, 0x04);
|
||||
ds3000_tuner_writereg(state, 0x50, 0x00);
|
||||
msleep(5);
|
||||
|
||||
f3db = ((c->symbol_rate / 1000) << 2) / 5 + 2000;
|
||||
if ((c->symbol_rate / 1000) < 5000)
|
||||
f3db += 3000;
|
||||
if (f3db < 7000)
|
||||
f3db = 7000;
|
||||
if (f3db > 40000)
|
||||
f3db = 40000;
|
||||
|
||||
/* set low-pass filter baseband */
|
||||
value = ds3000_tuner_readreg(state, 0x26);
|
||||
mlpf = 0x2e * 207 / ((value << 1) + 151);
|
||||
mlpf_max = mlpf * 135 / 100;
|
||||
mlpf_min = mlpf * 78 / 100;
|
||||
if (mlpf_max > 63)
|
||||
mlpf_max = 63;
|
||||
|
||||
/* rounded to the closest integer */
|
||||
nlpf = ((mlpf * f3db * 1000) + (2766 * DS3000_XTAL_FREQ / 2))
|
||||
/ (2766 * DS3000_XTAL_FREQ);
|
||||
if (nlpf > 23)
|
||||
nlpf = 23;
|
||||
if (nlpf < 1)
|
||||
nlpf = 1;
|
||||
|
||||
/* rounded to the closest integer */
|
||||
mlpf_new = ((DS3000_XTAL_FREQ * nlpf * 2766) +
|
||||
(1000 * f3db / 2)) / (1000 * f3db);
|
||||
|
||||
if (mlpf_new < mlpf_min) {
|
||||
nlpf++;
|
||||
mlpf_new = ((DS3000_XTAL_FREQ * nlpf * 2766) +
|
||||
(1000 * f3db / 2)) / (1000 * f3db);
|
||||
}
|
||||
|
||||
if (mlpf_new > mlpf_max)
|
||||
mlpf_new = mlpf_max;
|
||||
|
||||
ds3000_tuner_writereg(state, 0x04, mlpf_new);
|
||||
ds3000_tuner_writereg(state, 0x06, nlpf);
|
||||
ds3000_tuner_writereg(state, 0x51, 0x1b);
|
||||
ds3000_tuner_writereg(state, 0x51, 0x1f);
|
||||
ds3000_tuner_writereg(state, 0x50, 0x04);
|
||||
ds3000_tuner_writereg(state, 0x50, 0x00);
|
||||
msleep(5);
|
||||
|
||||
/* unknown */
|
||||
ds3000_tuner_writereg(state, 0x51, 0x1e);
|
||||
ds3000_tuner_writereg(state, 0x51, 0x1f);
|
||||
ds3000_tuner_writereg(state, 0x50, 0x01);
|
||||
ds3000_tuner_writereg(state, 0x50, 0x00);
|
||||
msleep(60);
|
||||
|
||||
offset_khz = (ndiv - ndiv % 2 + 1024) * DS3000_XTAL_FREQ
|
||||
/ (6 + 8) / (div4 + 1) / 2 - c->frequency;
|
||||
if (fe->ops.tuner_ops.set_params)
|
||||
fe->ops.tuner_ops.set_params(fe);
|
||||
|
||||
/* ds3000 global reset */
|
||||
ds3000_writereg(state, 0x07, 0x80);
|
||||
@ -1186,7 +1017,11 @@ static int ds3000_set_frontend(struct dvb_frontend *fe)
|
||||
/* start ds3000 build-in uC */
|
||||
ds3000_writereg(state, 0xb2, 0x00);
|
||||
|
||||
ds3000_set_carrier_offset(fe, offset_khz);
|
||||
if (fe->ops.tuner_ops.get_frequency) {
|
||||
fe->ops.tuner_ops.get_frequency(fe, &frequency);
|
||||
offset_khz = frequency - c->frequency;
|
||||
ds3000_set_carrier_offset(fe, offset_khz);
|
||||
}
|
||||
|
||||
for (i = 0; i < 30 ; i++) {
|
||||
ds3000_read_status(fe, &status);
|
||||
@ -1218,6 +1053,11 @@ static int ds3000_tune(struct dvb_frontend *fe,
|
||||
|
||||
static enum dvbfe_algo ds3000_get_algo(struct dvb_frontend *fe)
|
||||
{
|
||||
struct ds3000_state *state = fe->demodulator_priv;
|
||||
|
||||
if (state->config->set_lock_led)
|
||||
state->config->set_lock_led(fe, 0);
|
||||
|
||||
dprintk("%s()\n", __func__);
|
||||
return DVBFE_ALGO_HW;
|
||||
}
|
||||
@ -1237,10 +1077,6 @@ static int ds3000_initfe(struct dvb_frontend *fe)
|
||||
ds3000_writereg(state, 0x08, 0x01 | ds3000_readreg(state, 0x08));
|
||||
msleep(1);
|
||||
|
||||
/* TS2020 init */
|
||||
ds3000_tuner_writereg(state, 0x42, 0x73);
|
||||
ds3000_tuner_writereg(state, 0x05, 0x01);
|
||||
ds3000_tuner_writereg(state, 0x62, 0xf5);
|
||||
/* Load the firmware if required */
|
||||
ret = ds3000_firmware_ondemand(fe);
|
||||
if (ret != 0) {
|
||||
@ -1251,17 +1087,10 @@ static int ds3000_initfe(struct dvb_frontend *fe)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Put device to sleep */
|
||||
static int ds3000_sleep(struct dvb_frontend *fe)
|
||||
{
|
||||
dprintk("%s()\n", __func__);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct dvb_frontend_ops ds3000_ops = {
|
||||
.delsys = { SYS_DVBS, SYS_DVBS2},
|
||||
.delsys = { SYS_DVBS, SYS_DVBS2 },
|
||||
.info = {
|
||||
.name = "Montage Technology DS3000/TS2020",
|
||||
.name = "Montage Technology DS3000",
|
||||
.frequency_min = 950000,
|
||||
.frequency_max = 2150000,
|
||||
.frequency_stepsize = 1011, /* kHz for QPSK frontends */
|
||||
@ -1279,7 +1108,7 @@ static struct dvb_frontend_ops ds3000_ops = {
|
||||
.release = ds3000_release,
|
||||
|
||||
.init = ds3000_initfe,
|
||||
.sleep = ds3000_sleep,
|
||||
.i2c_gate_ctrl = ds3000_i2c_gate_ctrl,
|
||||
.read_status = ds3000_read_status,
|
||||
.read_ber = ds3000_read_ber,
|
||||
.read_signal_strength = ds3000_read_signal_strength,
|
||||
@ -1299,7 +1128,7 @@ module_param(debug, int, 0644);
|
||||
MODULE_PARM_DESC(debug, "Activates frontend debugging (default:0)");
|
||||
|
||||
MODULE_DESCRIPTION("DVB Frontend module for Montage Technology "
|
||||
"DS3000/TS2020 hardware");
|
||||
MODULE_AUTHOR("Konstantin Dimitrov");
|
||||
"DS3000 hardware");
|
||||
MODULE_AUTHOR("Konstantin Dimitrov <kosio.dimitrov@gmail.com>");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_FIRMWARE(DS3000_DEFAULT_FIRMWARE);
|
||||
|
@ -1,8 +1,8 @@
|
||||
/*
|
||||
Montage Technology DS3000/TS2020 - DVBS/S2 Satellite demod/tuner driver
|
||||
Copyright (C) 2009 Konstantin Dimitrov <kosio.dimitrov@gmail.com>
|
||||
Montage Technology DS3000 - DVBS/S2 Demodulator driver
|
||||
Copyright (C) 2009-2012 Konstantin Dimitrov <kosio.dimitrov@gmail.com>
|
||||
|
||||
Copyright (C) 2009 TurboSight.com
|
||||
Copyright (C) 2009-2012 TurboSight.com
|
||||
|
||||
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
|
||||
@ -17,7 +17,7 @@
|
||||
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.
|
||||
*/
|
||||
*/
|
||||
|
||||
#ifndef DS3000_H
|
||||
#define DS3000_H
|
||||
@ -30,6 +30,8 @@ struct ds3000_config {
|
||||
u8 ci_mode;
|
||||
/* Set device param to start dma */
|
||||
int (*set_ts_params)(struct dvb_frontend *fe, int is_punctured);
|
||||
/* Hook for Lock LED */
|
||||
void (*set_lock_led)(struct dvb_frontend *fe, int offon);
|
||||
};
|
||||
|
||||
#if defined(CONFIG_DVB_DS3000) || \
|
||||
|
@ -38,7 +38,7 @@
|
||||
* @param pll_desc_id dvb_pll_desc to use.
|
||||
* @return Frontend pointer on success, NULL on failure
|
||||
*/
|
||||
#if defined(CONFIG_DVB_PLL) || (defined(CONFIG_DVB_PLL_MODULE) && defined(MODULE))
|
||||
#if IS_ENABLED(CONFIG_DVB_PLL)
|
||||
extern struct dvb_frontend *dvb_pll_attach(struct dvb_frontend *fe,
|
||||
int pll_addr,
|
||||
struct i2c_adapter *i2c,
|
||||
|
@ -55,7 +55,7 @@
|
||||
#define ISL6405_ENT2 0x20
|
||||
#define ISL6405_ISEL2 0x40
|
||||
|
||||
#if defined(CONFIG_DVB_ISL6405) || (defined(CONFIG_DVB_ISL6405_MODULE) && defined(MODULE))
|
||||
#if IS_ENABLED(CONFIG_DVB_ISL6405)
|
||||
/* override_set and override_clear control which system register bits (above)
|
||||
* to always set & clear
|
||||
*/
|
||||
|
@ -39,7 +39,7 @@
|
||||
#define ISL6421_ISEL1 0x20
|
||||
#define ISL6421_DCL 0x40
|
||||
|
||||
#if defined(CONFIG_DVB_ISL6421) || (defined(CONFIG_DVB_ISL6421_MODULE) && defined(MODULE))
|
||||
#if IS_ENABLED(CONFIG_DVB_ISL6421)
|
||||
/* override_set and override_clear control which system register bits (above) to always set & clear */
|
||||
extern struct dvb_frontend *isl6421_attach(struct dvb_frontend *fe, struct i2c_adapter *i2c, u8 i2c_addr,
|
||||
u8 override_set, u8 override_clear);
|
||||
|
@ -42,7 +42,7 @@ struct isl6423_config {
|
||||
u8 mod_extern;
|
||||
};
|
||||
|
||||
#if defined(CONFIG_DVB_ISL6423) || (defined(CONFIG_DVB_ISL6423_MODULE) && defined(MODULE))
|
||||
#if IS_ENABLED(CONFIG_DVB_ISL6423)
|
||||
|
||||
|
||||
extern struct dvb_frontend *isl6423_attach(struct dvb_frontend *fe,
|
||||
|
@ -29,7 +29,7 @@ struct itd1000_config {
|
||||
u8 i2c_address;
|
||||
};
|
||||
|
||||
#if defined(CONFIG_DVB_TUNER_ITD1000) || (defined(CONFIG_DVB_TUNER_ITD1000_MODULE) && defined(MODULE))
|
||||
#if IS_ENABLED(CONFIG_DVB_TUNER_ITD1000)
|
||||
extern struct dvb_frontend *itd1000_attach(struct dvb_frontend *fe, struct i2c_adapter *i2c, struct itd1000_config *cfg);
|
||||
#else
|
||||
static inline struct dvb_frontend *itd1000_attach(struct dvb_frontend *fe, struct i2c_adapter *i2c, struct itd1000_config *cfg)
|
||||
|
@ -212,7 +212,7 @@ static int ix2505v_set_params(struct dvb_frontend *fe)
|
||||
lpf = 0xb;
|
||||
|
||||
deb_info("Osc=%x b_w=%x lpf=%x\n", local_osc, b_w, lpf);
|
||||
deb_info("Data 0=[%x%x%x%x]\n", data[0], data[1], data[2], data[3]);
|
||||
deb_info("Data 0=[%4phN]\n", data);
|
||||
|
||||
if (fe->ops.i2c_gate_ctrl)
|
||||
fe->ops.i2c_gate_ctrl(fe, 1);
|
||||
|
@ -31,7 +31,7 @@ struct l64781_config
|
||||
u8 demod_address;
|
||||
};
|
||||
|
||||
#if defined(CONFIG_DVB_L64781) || (defined(CONFIG_DVB_L64781_MODULE) && defined(MODULE))
|
||||
#if IS_ENABLED(CONFIG_DVB_L64781)
|
||||
extern struct dvb_frontend* l64781_attach(const struct l64781_config* config,
|
||||
struct i2c_adapter* i2c);
|
||||
#else
|
||||
|
@ -52,7 +52,7 @@ struct lgdt330x_config
|
||||
int clock_polarity_flip;
|
||||
};
|
||||
|
||||
#if defined(CONFIG_DVB_LGDT330X) || (defined(CONFIG_DVB_LGDT330X_MODULE) && defined(MODULE))
|
||||
#if IS_ENABLED(CONFIG_DVB_LGDT330X)
|
||||
extern struct dvb_frontend* lgdt330x_attach(const struct lgdt330x_config* config,
|
||||
struct i2c_adapter* i2c);
|
||||
#else
|
||||
|
@ -60,15 +60,13 @@ MODULE_PARM_DESC(debug, "set debugging level (1=info (or-able)).");
|
||||
#define info(format, arg...) \
|
||||
printk(KERN_INFO "m88rs2000-fe: " format "\n" , ## arg)
|
||||
|
||||
static int m88rs2000_writereg(struct m88rs2000_state *state, u8 tuner,
|
||||
static int m88rs2000_writereg(struct m88rs2000_state *state,
|
||||
u8 reg, u8 data)
|
||||
{
|
||||
int ret;
|
||||
u8 addr = (tuner == 0) ? state->config->tuner_addr :
|
||||
state->config->demod_addr;
|
||||
u8 buf[] = { reg, data };
|
||||
struct i2c_msg msg = {
|
||||
.addr = addr,
|
||||
.addr = state->config->demod_addr,
|
||||
.flags = 0,
|
||||
.buf = buf,
|
||||
.len = 2
|
||||
@ -83,44 +81,20 @@ static int m88rs2000_writereg(struct m88rs2000_state *state, u8 tuner,
|
||||
return (ret != 1) ? -EREMOTEIO : 0;
|
||||
}
|
||||
|
||||
static int m88rs2000_demod_write(struct m88rs2000_state *state, u8 reg, u8 data)
|
||||
{
|
||||
return m88rs2000_writereg(state, 1, reg, data);
|
||||
}
|
||||
|
||||
static int m88rs2000_tuner_write(struct m88rs2000_state *state, u8 reg, u8 data)
|
||||
{
|
||||
m88rs2000_demod_write(state, 0x81, 0x84);
|
||||
udelay(10);
|
||||
return m88rs2000_writereg(state, 0, reg, data);
|
||||
|
||||
}
|
||||
|
||||
static int m88rs2000_write(struct dvb_frontend *fe, const u8 buf[], int len)
|
||||
{
|
||||
struct m88rs2000_state *state = fe->demodulator_priv;
|
||||
|
||||
if (len != 2)
|
||||
return -EINVAL;
|
||||
|
||||
return m88rs2000_writereg(state, 1, buf[0], buf[1]);
|
||||
}
|
||||
|
||||
static u8 m88rs2000_readreg(struct m88rs2000_state *state, u8 tuner, u8 reg)
|
||||
static u8 m88rs2000_readreg(struct m88rs2000_state *state, u8 reg)
|
||||
{
|
||||
int ret;
|
||||
u8 b0[] = { reg };
|
||||
u8 b1[] = { 0 };
|
||||
u8 addr = (tuner == 0) ? state->config->tuner_addr :
|
||||
state->config->demod_addr;
|
||||
|
||||
struct i2c_msg msg[] = {
|
||||
{
|
||||
.addr = addr,
|
||||
.addr = state->config->demod_addr,
|
||||
.flags = 0,
|
||||
.buf = b0,
|
||||
.len = 1
|
||||
}, {
|
||||
.addr = addr,
|
||||
.addr = state->config->demod_addr,
|
||||
.flags = I2C_M_RD,
|
||||
.buf = b1,
|
||||
.len = 1
|
||||
@ -136,18 +110,6 @@ static u8 m88rs2000_readreg(struct m88rs2000_state *state, u8 tuner, u8 reg)
|
||||
return b1[0];
|
||||
}
|
||||
|
||||
static u8 m88rs2000_demod_read(struct m88rs2000_state *state, u8 reg)
|
||||
{
|
||||
return m88rs2000_readreg(state, 1, reg);
|
||||
}
|
||||
|
||||
static u8 m88rs2000_tuner_read(struct m88rs2000_state *state, u8 reg)
|
||||
{
|
||||
m88rs2000_demod_write(state, 0x81, 0x85);
|
||||
udelay(10);
|
||||
return m88rs2000_readreg(state, 0, reg);
|
||||
}
|
||||
|
||||
static int m88rs2000_set_symbolrate(struct dvb_frontend *fe, u32 srate)
|
||||
{
|
||||
struct m88rs2000_state *state = fe->demodulator_priv;
|
||||
@ -166,9 +128,9 @@ static int m88rs2000_set_symbolrate(struct dvb_frontend *fe, u32 srate)
|
||||
b[0] = (u8) (temp >> 16) & 0xff;
|
||||
b[1] = (u8) (temp >> 8) & 0xff;
|
||||
b[2] = (u8) temp & 0xff;
|
||||
ret = m88rs2000_demod_write(state, 0x93, b[2]);
|
||||
ret |= m88rs2000_demod_write(state, 0x94, b[1]);
|
||||
ret |= m88rs2000_demod_write(state, 0x95, b[0]);
|
||||
ret = m88rs2000_writereg(state, 0x93, b[2]);
|
||||
ret |= m88rs2000_writereg(state, 0x94, b[1]);
|
||||
ret |= m88rs2000_writereg(state, 0x95, b[0]);
|
||||
|
||||
deb_info("m88rs2000: m88rs2000_set_symbolrate\n");
|
||||
return ret;
|
||||
@ -182,37 +144,37 @@ static int m88rs2000_send_diseqc_msg(struct dvb_frontend *fe,
|
||||
int i;
|
||||
u8 reg;
|
||||
deb_info("%s\n", __func__);
|
||||
m88rs2000_demod_write(state, 0x9a, 0x30);
|
||||
reg = m88rs2000_demod_read(state, 0xb2);
|
||||
m88rs2000_writereg(state, 0x9a, 0x30);
|
||||
reg = m88rs2000_readreg(state, 0xb2);
|
||||
reg &= 0x3f;
|
||||
m88rs2000_demod_write(state, 0xb2, reg);
|
||||
m88rs2000_writereg(state, 0xb2, reg);
|
||||
for (i = 0; i < m->msg_len; i++)
|
||||
m88rs2000_demod_write(state, 0xb3 + i, m->msg[i]);
|
||||
m88rs2000_writereg(state, 0xb3 + i, m->msg[i]);
|
||||
|
||||
reg = m88rs2000_demod_read(state, 0xb1);
|
||||
reg = m88rs2000_readreg(state, 0xb1);
|
||||
reg &= 0x87;
|
||||
reg |= ((m->msg_len - 1) << 3) | 0x07;
|
||||
reg &= 0x7f;
|
||||
m88rs2000_demod_write(state, 0xb1, reg);
|
||||
m88rs2000_writereg(state, 0xb1, reg);
|
||||
|
||||
for (i = 0; i < 15; i++) {
|
||||
if ((m88rs2000_demod_read(state, 0xb1) & 0x40) == 0x0)
|
||||
if ((m88rs2000_readreg(state, 0xb1) & 0x40) == 0x0)
|
||||
break;
|
||||
msleep(20);
|
||||
}
|
||||
|
||||
reg = m88rs2000_demod_read(state, 0xb1);
|
||||
reg = m88rs2000_readreg(state, 0xb1);
|
||||
if ((reg & 0x40) > 0x0) {
|
||||
reg &= 0x7f;
|
||||
reg |= 0x40;
|
||||
m88rs2000_demod_write(state, 0xb1, reg);
|
||||
m88rs2000_writereg(state, 0xb1, reg);
|
||||
}
|
||||
|
||||
reg = m88rs2000_demod_read(state, 0xb2);
|
||||
reg = m88rs2000_readreg(state, 0xb2);
|
||||
reg &= 0x3f;
|
||||
reg |= 0x80;
|
||||
m88rs2000_demod_write(state, 0xb2, reg);
|
||||
m88rs2000_demod_write(state, 0x9a, 0xb0);
|
||||
m88rs2000_writereg(state, 0xb2, reg);
|
||||
m88rs2000_writereg(state, 0x9a, 0xb0);
|
||||
|
||||
|
||||
return 0;
|
||||
@ -224,14 +186,14 @@ static int m88rs2000_send_diseqc_burst(struct dvb_frontend *fe,
|
||||
struct m88rs2000_state *state = fe->demodulator_priv;
|
||||
u8 reg0, reg1;
|
||||
deb_info("%s\n", __func__);
|
||||
m88rs2000_demod_write(state, 0x9a, 0x30);
|
||||
m88rs2000_writereg(state, 0x9a, 0x30);
|
||||
msleep(50);
|
||||
reg0 = m88rs2000_demod_read(state, 0xb1);
|
||||
reg1 = m88rs2000_demod_read(state, 0xb2);
|
||||
reg0 = m88rs2000_readreg(state, 0xb1);
|
||||
reg1 = m88rs2000_readreg(state, 0xb2);
|
||||
/* TODO complete this section */
|
||||
m88rs2000_demod_write(state, 0xb2, reg1);
|
||||
m88rs2000_demod_write(state, 0xb1, reg0);
|
||||
m88rs2000_demod_write(state, 0x9a, 0xb0);
|
||||
m88rs2000_writereg(state, 0xb2, reg1);
|
||||
m88rs2000_writereg(state, 0xb1, reg0);
|
||||
m88rs2000_writereg(state, 0x9a, 0xb0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -240,9 +202,9 @@ static int m88rs2000_set_tone(struct dvb_frontend *fe, fe_sec_tone_mode_t tone)
|
||||
{
|
||||
struct m88rs2000_state *state = fe->demodulator_priv;
|
||||
u8 reg0, reg1;
|
||||
m88rs2000_demod_write(state, 0x9a, 0x30);
|
||||
reg0 = m88rs2000_demod_read(state, 0xb1);
|
||||
reg1 = m88rs2000_demod_read(state, 0xb2);
|
||||
m88rs2000_writereg(state, 0x9a, 0x30);
|
||||
reg0 = m88rs2000_readreg(state, 0xb1);
|
||||
reg1 = m88rs2000_readreg(state, 0xb2);
|
||||
|
||||
reg1 &= 0x3f;
|
||||
|
||||
@ -257,9 +219,9 @@ static int m88rs2000_set_tone(struct dvb_frontend *fe, fe_sec_tone_mode_t tone)
|
||||
default:
|
||||
break;
|
||||
}
|
||||
m88rs2000_demod_write(state, 0xb2, reg1);
|
||||
m88rs2000_demod_write(state, 0xb1, reg0);
|
||||
m88rs2000_demod_write(state, 0x9a, 0xb0);
|
||||
m88rs2000_writereg(state, 0xb2, reg1);
|
||||
m88rs2000_writereg(state, 0xb1, reg0);
|
||||
m88rs2000_writereg(state, 0x9a, 0xb0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -276,14 +238,6 @@ struct inittab m88rs2000_setup[] = {
|
||||
{DEMOD_WRITE, 0x00, 0x00},
|
||||
{DEMOD_WRITE, 0x9a, 0xb0},
|
||||
{DEMOD_WRITE, 0x81, 0xc1},
|
||||
{TUNER_WRITE, 0x42, 0x73},
|
||||
{TUNER_WRITE, 0x05, 0x07},
|
||||
{TUNER_WRITE, 0x20, 0x27},
|
||||
{TUNER_WRITE, 0x07, 0x02},
|
||||
{TUNER_WRITE, 0x11, 0xff},
|
||||
{TUNER_WRITE, 0x60, 0xf9},
|
||||
{TUNER_WRITE, 0x08, 0x01},
|
||||
{TUNER_WRITE, 0x00, 0x41},
|
||||
{DEMOD_WRITE, 0x81, 0x81},
|
||||
{DEMOD_WRITE, 0x86, 0xc6},
|
||||
{DEMOD_WRITE, 0x9a, 0x30},
|
||||
@ -301,23 +255,10 @@ struct inittab m88rs2000_shutdown[] = {
|
||||
{DEMOD_WRITE, 0xf1, 0x89},
|
||||
{DEMOD_WRITE, 0x00, 0x01},
|
||||
{DEMOD_WRITE, 0x9a, 0xb0},
|
||||
{TUNER_WRITE, 0x00, 0x40},
|
||||
{DEMOD_WRITE, 0x81, 0x81},
|
||||
{0xff, 0xaa, 0xff}
|
||||
};
|
||||
|
||||
struct inittab tuner_reset[] = {
|
||||
{TUNER_WRITE, 0x42, 0x73},
|
||||
{TUNER_WRITE, 0x05, 0x07},
|
||||
{TUNER_WRITE, 0x20, 0x27},
|
||||
{TUNER_WRITE, 0x07, 0x02},
|
||||
{TUNER_WRITE, 0x11, 0xff},
|
||||
{TUNER_WRITE, 0x60, 0xf9},
|
||||
{TUNER_WRITE, 0x08, 0x01},
|
||||
{TUNER_WRITE, 0x00, 0x41},
|
||||
{0xff, 0xaa, 0xff}
|
||||
};
|
||||
|
||||
struct inittab fe_reset[] = {
|
||||
{DEMOD_WRITE, 0x00, 0x01},
|
||||
{DEMOD_WRITE, 0xf1, 0xbf},
|
||||
@ -389,11 +330,7 @@ static int m88rs2000_tab_set(struct m88rs2000_state *state,
|
||||
for (i = 0; i < 255; i++) {
|
||||
switch (tab[i].cmd) {
|
||||
case 0x01:
|
||||
ret = m88rs2000_demod_write(state, tab[i].reg,
|
||||
tab[i].val);
|
||||
break;
|
||||
case 0x02:
|
||||
ret = m88rs2000_tuner_write(state, tab[i].reg,
|
||||
ret = m88rs2000_writereg(state, tab[i].reg,
|
||||
tab[i].val);
|
||||
break;
|
||||
case 0x10:
|
||||
@ -419,7 +356,7 @@ static int m88rs2000_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t volt)
|
||||
struct m88rs2000_state *state = fe->demodulator_priv;
|
||||
u8 data;
|
||||
|
||||
data = m88rs2000_demod_read(state, 0xb2);
|
||||
data = m88rs2000_readreg(state, 0xb2);
|
||||
data |= 0x03; /* bit0 V/H, bit1 off/on */
|
||||
|
||||
switch (volt) {
|
||||
@ -434,23 +371,11 @@ static int m88rs2000_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t volt)
|
||||
break;
|
||||
}
|
||||
|
||||
m88rs2000_demod_write(state, 0xb2, data);
|
||||
m88rs2000_writereg(state, 0xb2, data);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int m88rs2000_startup(struct m88rs2000_state *state)
|
||||
{
|
||||
int ret = 0;
|
||||
u8 reg;
|
||||
|
||||
reg = m88rs2000_tuner_read(state, 0x00);
|
||||
if ((reg & 0x40) == 0)
|
||||
ret = -ENODEV;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int m88rs2000_init(struct dvb_frontend *fe)
|
||||
{
|
||||
struct m88rs2000_state *state = fe->demodulator_priv;
|
||||
@ -458,7 +383,11 @@ static int m88rs2000_init(struct dvb_frontend *fe)
|
||||
|
||||
deb_info("m88rs2000: init chip\n");
|
||||
/* Setup frontend from shutdown/cold */
|
||||
ret = m88rs2000_tab_set(state, m88rs2000_setup);
|
||||
if (state->config->inittab)
|
||||
ret = m88rs2000_tab_set(state,
|
||||
(struct inittab *)state->config->inittab);
|
||||
else
|
||||
ret = m88rs2000_tab_set(state, m88rs2000_setup);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@ -475,7 +404,7 @@ static int m88rs2000_sleep(struct dvb_frontend *fe)
|
||||
static int m88rs2000_read_status(struct dvb_frontend *fe, fe_status_t *status)
|
||||
{
|
||||
struct m88rs2000_state *state = fe->demodulator_priv;
|
||||
u8 reg = m88rs2000_demod_read(state, 0x8c);
|
||||
u8 reg = m88rs2000_readreg(state, 0x8c);
|
||||
|
||||
*status = 0;
|
||||
|
||||
@ -488,185 +417,66 @@ static int m88rs2000_read_status(struct dvb_frontend *fe, fe_status_t *status)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Extact code for these unknown but lmedm04 driver uses interupt callbacks */
|
||||
|
||||
static int m88rs2000_read_ber(struct dvb_frontend *fe, u32 *ber)
|
||||
{
|
||||
deb_info("m88rs2000_read_ber %d\n", *ber);
|
||||
*ber = 0;
|
||||
struct m88rs2000_state *state = fe->demodulator_priv;
|
||||
u8 tmp0, tmp1;
|
||||
|
||||
m88rs2000_writereg(state, 0x9a, 0x30);
|
||||
tmp0 = m88rs2000_readreg(state, 0xd8);
|
||||
if ((tmp0 & 0x10) != 0) {
|
||||
m88rs2000_writereg(state, 0x9a, 0xb0);
|
||||
*ber = 0xffffffff;
|
||||
return 0;
|
||||
}
|
||||
|
||||
*ber = (m88rs2000_readreg(state, 0xd7) << 8) |
|
||||
m88rs2000_readreg(state, 0xd6);
|
||||
|
||||
tmp1 = m88rs2000_readreg(state, 0xd9);
|
||||
m88rs2000_writereg(state, 0xd9, (tmp1 & ~7) | 4);
|
||||
/* needs twice */
|
||||
m88rs2000_writereg(state, 0xd8, (tmp0 & ~8) | 0x30);
|
||||
m88rs2000_writereg(state, 0xd8, (tmp0 & ~8) | 0x30);
|
||||
m88rs2000_writereg(state, 0x9a, 0xb0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int m88rs2000_read_signal_strength(struct dvb_frontend *fe,
|
||||
u16 *strength)
|
||||
{
|
||||
*strength = 0;
|
||||
if (fe->ops.tuner_ops.get_rf_strength)
|
||||
fe->ops.tuner_ops.get_rf_strength(fe, strength);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int m88rs2000_read_snr(struct dvb_frontend *fe, u16 *snr)
|
||||
{
|
||||
deb_info("m88rs2000_read_snr %d\n", *snr);
|
||||
*snr = 0;
|
||||
struct m88rs2000_state *state = fe->demodulator_priv;
|
||||
|
||||
*snr = 512 * m88rs2000_readreg(state, 0x65);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int m88rs2000_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
|
||||
{
|
||||
deb_info("m88rs2000_read_ber %d\n", *ucblocks);
|
||||
*ucblocks = 0;
|
||||
struct m88rs2000_state *state = fe->demodulator_priv;
|
||||
u8 tmp;
|
||||
|
||||
*ucblocks = (m88rs2000_readreg(state, 0xd5) << 8) |
|
||||
m88rs2000_readreg(state, 0xd4);
|
||||
tmp = m88rs2000_readreg(state, 0xd8);
|
||||
m88rs2000_writereg(state, 0xd8, tmp & ~0x20);
|
||||
/* needs two times */
|
||||
m88rs2000_writereg(state, 0xd8, tmp | 0x20);
|
||||
m88rs2000_writereg(state, 0xd8, tmp | 0x20);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int m88rs2000_tuner_gate_ctrl(struct m88rs2000_state *state, u8 offset)
|
||||
{
|
||||
int ret;
|
||||
ret = m88rs2000_tuner_write(state, 0x51, 0x1f - offset);
|
||||
ret |= m88rs2000_tuner_write(state, 0x51, 0x1f);
|
||||
ret |= m88rs2000_tuner_write(state, 0x50, offset);
|
||||
ret |= m88rs2000_tuner_write(state, 0x50, 0x00);
|
||||
msleep(20);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int m88rs2000_set_tuner_rf(struct dvb_frontend *fe)
|
||||
{
|
||||
struct m88rs2000_state *state = fe->demodulator_priv;
|
||||
int reg;
|
||||
reg = m88rs2000_tuner_read(state, 0x3d);
|
||||
reg &= 0x7f;
|
||||
if (reg < 0x16)
|
||||
reg = 0xa1;
|
||||
else if (reg == 0x16)
|
||||
reg = 0x99;
|
||||
else
|
||||
reg = 0xf9;
|
||||
|
||||
m88rs2000_tuner_write(state, 0x60, reg);
|
||||
reg = m88rs2000_tuner_gate_ctrl(state, 0x08);
|
||||
|
||||
if (fe->ops.i2c_gate_ctrl)
|
||||
fe->ops.i2c_gate_ctrl(fe, 0);
|
||||
return reg;
|
||||
}
|
||||
|
||||
static int m88rs2000_set_tuner(struct dvb_frontend *fe, u16 *offset)
|
||||
{
|
||||
struct dtv_frontend_properties *c = &fe->dtv_property_cache;
|
||||
struct m88rs2000_state *state = fe->demodulator_priv;
|
||||
int ret;
|
||||
u32 frequency = c->frequency;
|
||||
s32 offset_khz;
|
||||
s32 tmp;
|
||||
u32 symbol_rate = (c->symbol_rate / 1000);
|
||||
u32 f3db, gdiv28;
|
||||
u16 value, ndiv, lpf_coeff;
|
||||
u8 lpf_mxdiv, mlpf_max, mlpf_min, nlpf;
|
||||
u8 lo = 0x01, div4 = 0x0;
|
||||
|
||||
/* Reset Tuner */
|
||||
ret = m88rs2000_tab_set(state, tuner_reset);
|
||||
|
||||
/* Calculate frequency divider */
|
||||
if (frequency < 1060000) {
|
||||
lo |= 0x10;
|
||||
div4 = 0x1;
|
||||
ndiv = (frequency * 14 * 4) / FE_CRYSTAL_KHZ;
|
||||
} else
|
||||
ndiv = (frequency * 14 * 2) / FE_CRYSTAL_KHZ;
|
||||
ndiv = ndiv + ndiv % 2;
|
||||
ndiv = ndiv - 1024;
|
||||
|
||||
ret = m88rs2000_tuner_write(state, 0x10, 0x80 | lo);
|
||||
|
||||
/* Set frequency divider */
|
||||
ret |= m88rs2000_tuner_write(state, 0x01, (ndiv >> 8) & 0xf);
|
||||
ret |= m88rs2000_tuner_write(state, 0x02, ndiv & 0xff);
|
||||
|
||||
ret |= m88rs2000_tuner_write(state, 0x03, 0x06);
|
||||
ret |= m88rs2000_tuner_gate_ctrl(state, 0x10);
|
||||
if (ret < 0)
|
||||
return -ENODEV;
|
||||
|
||||
/* Tuner Frequency Range */
|
||||
ret = m88rs2000_tuner_write(state, 0x10, lo);
|
||||
|
||||
ret |= m88rs2000_tuner_gate_ctrl(state, 0x08);
|
||||
|
||||
/* Tuner RF */
|
||||
ret |= m88rs2000_set_tuner_rf(fe);
|
||||
|
||||
gdiv28 = (FE_CRYSTAL_KHZ / 1000 * 1694 + 500) / 1000;
|
||||
ret |= m88rs2000_tuner_write(state, 0x04, gdiv28 & 0xff);
|
||||
ret |= m88rs2000_tuner_gate_ctrl(state, 0x04);
|
||||
if (ret < 0)
|
||||
return -ENODEV;
|
||||
|
||||
value = m88rs2000_tuner_read(state, 0x26);
|
||||
|
||||
f3db = (symbol_rate * 135) / 200 + 2000;
|
||||
f3db += FREQ_OFFSET_LOW_SYM_RATE;
|
||||
if (f3db < 7000)
|
||||
f3db = 7000;
|
||||
if (f3db > 40000)
|
||||
f3db = 40000;
|
||||
|
||||
gdiv28 = gdiv28 * 207 / (value * 2 + 151);
|
||||
mlpf_max = gdiv28 * 135 / 100;
|
||||
mlpf_min = gdiv28 * 78 / 100;
|
||||
if (mlpf_max > 63)
|
||||
mlpf_max = 63;
|
||||
|
||||
lpf_coeff = 2766;
|
||||
|
||||
nlpf = (f3db * gdiv28 * 2 / lpf_coeff /
|
||||
(FE_CRYSTAL_KHZ / 1000) + 1) / 2;
|
||||
if (nlpf > 23)
|
||||
nlpf = 23;
|
||||
if (nlpf < 1)
|
||||
nlpf = 1;
|
||||
|
||||
lpf_mxdiv = (nlpf * (FE_CRYSTAL_KHZ / 1000)
|
||||
* lpf_coeff * 2 / f3db + 1) / 2;
|
||||
|
||||
if (lpf_mxdiv < mlpf_min) {
|
||||
nlpf++;
|
||||
lpf_mxdiv = (nlpf * (FE_CRYSTAL_KHZ / 1000)
|
||||
* lpf_coeff * 2 / f3db + 1) / 2;
|
||||
}
|
||||
|
||||
if (lpf_mxdiv > mlpf_max)
|
||||
lpf_mxdiv = mlpf_max;
|
||||
|
||||
ret = m88rs2000_tuner_write(state, 0x04, lpf_mxdiv);
|
||||
ret |= m88rs2000_tuner_write(state, 0x06, nlpf);
|
||||
|
||||
ret |= m88rs2000_tuner_gate_ctrl(state, 0x04);
|
||||
|
||||
ret |= m88rs2000_tuner_gate_ctrl(state, 0x01);
|
||||
|
||||
msleep(80);
|
||||
/* calculate offset assuming 96000kHz*/
|
||||
offset_khz = (ndiv - ndiv % 2 + 1024) * FE_CRYSTAL_KHZ
|
||||
/ 14 / (div4 + 1) / 2;
|
||||
|
||||
offset_khz -= frequency;
|
||||
|
||||
tmp = offset_khz;
|
||||
tmp *= 65536;
|
||||
|
||||
tmp = (2 * tmp + 96000) / (2 * 96000);
|
||||
if (tmp < 0)
|
||||
tmp += 65536;
|
||||
|
||||
*offset = tmp & 0xffff;
|
||||
|
||||
if (fe->ops.i2c_gate_ctrl)
|
||||
fe->ops.i2c_gate_ctrl(fe, 0);
|
||||
|
||||
return (ret < 0) ? -EINVAL : 0;
|
||||
}
|
||||
|
||||
static int m88rs2000_set_fec(struct m88rs2000_state *state,
|
||||
fe_code_rate_t fec)
|
||||
{
|
||||
@ -692,7 +502,7 @@ static int m88rs2000_set_fec(struct m88rs2000_state *state,
|
||||
default:
|
||||
fec_set = 0x08;
|
||||
}
|
||||
m88rs2000_demod_write(state, 0x76, fec_set);
|
||||
m88rs2000_writereg(state, 0x76, fec_set);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -701,9 +511,9 @@ static int m88rs2000_set_fec(struct m88rs2000_state *state,
|
||||
static fe_code_rate_t m88rs2000_get_fec(struct m88rs2000_state *state)
|
||||
{
|
||||
u8 reg;
|
||||
m88rs2000_demod_write(state, 0x9a, 0x30);
|
||||
reg = m88rs2000_demod_read(state, 0x76);
|
||||
m88rs2000_demod_write(state, 0x9a, 0xb0);
|
||||
m88rs2000_writereg(state, 0x9a, 0x30);
|
||||
reg = m88rs2000_readreg(state, 0x76);
|
||||
m88rs2000_writereg(state, 0x9a, 0xb0);
|
||||
|
||||
switch (reg) {
|
||||
case 0x88:
|
||||
@ -729,7 +539,9 @@ static int m88rs2000_set_frontend(struct dvb_frontend *fe)
|
||||
struct m88rs2000_state *state = fe->demodulator_priv;
|
||||
struct dtv_frontend_properties *c = &fe->dtv_property_cache;
|
||||
fe_status_t status;
|
||||
int i, ret;
|
||||
int i, ret = 0;
|
||||
s32 tmp;
|
||||
u32 tuner_freq;
|
||||
u16 offset = 0;
|
||||
u8 reg;
|
||||
|
||||
@ -743,17 +555,37 @@ static int m88rs2000_set_frontend(struct dvb_frontend *fe)
|
||||
}
|
||||
|
||||
/* Set Tuner */
|
||||
ret = m88rs2000_set_tuner(fe, &offset);
|
||||
if (fe->ops.tuner_ops.set_params)
|
||||
ret = fe->ops.tuner_ops.set_params(fe);
|
||||
|
||||
if (ret < 0)
|
||||
return -ENODEV;
|
||||
|
||||
ret = m88rs2000_demod_write(state, 0x9a, 0x30);
|
||||
if (fe->ops.tuner_ops.get_frequency)
|
||||
ret = fe->ops.tuner_ops.get_frequency(fe, &tuner_freq);
|
||||
|
||||
if (ret < 0)
|
||||
return -ENODEV;
|
||||
|
||||
offset = tuner_freq - c->frequency;
|
||||
|
||||
/* calculate offset assuming 96000kHz*/
|
||||
tmp = offset;
|
||||
tmp *= 65536;
|
||||
|
||||
tmp = (2 * tmp + 96000) / (2 * 96000);
|
||||
if (tmp < 0)
|
||||
tmp += 65536;
|
||||
|
||||
offset = tmp & 0xffff;
|
||||
|
||||
ret = m88rs2000_writereg(state, 0x9a, 0x30);
|
||||
/* Unknown usually 0xc6 sometimes 0xc1 */
|
||||
reg = m88rs2000_demod_read(state, 0x86);
|
||||
ret |= m88rs2000_demod_write(state, 0x86, reg);
|
||||
reg = m88rs2000_readreg(state, 0x86);
|
||||
ret |= m88rs2000_writereg(state, 0x86, reg);
|
||||
/* Offset lower nibble always 0 */
|
||||
ret |= m88rs2000_demod_write(state, 0x9c, (offset >> 8));
|
||||
ret |= m88rs2000_demod_write(state, 0x9d, offset & 0xf0);
|
||||
ret |= m88rs2000_writereg(state, 0x9c, (offset >> 8));
|
||||
ret |= m88rs2000_writereg(state, 0x9d, offset & 0xf0);
|
||||
|
||||
|
||||
/* Reset Demod */
|
||||
@ -762,16 +594,16 @@ static int m88rs2000_set_frontend(struct dvb_frontend *fe)
|
||||
return -ENODEV;
|
||||
|
||||
/* Unknown */
|
||||
reg = m88rs2000_demod_read(state, 0x70);
|
||||
ret = m88rs2000_demod_write(state, 0x70, reg);
|
||||
reg = m88rs2000_readreg(state, 0x70);
|
||||
ret = m88rs2000_writereg(state, 0x70, reg);
|
||||
|
||||
/* Set FEC */
|
||||
ret |= m88rs2000_set_fec(state, c->fec_inner);
|
||||
ret |= m88rs2000_demod_write(state, 0x85, 0x1);
|
||||
ret |= m88rs2000_demod_write(state, 0x8a, 0xbf);
|
||||
ret |= m88rs2000_demod_write(state, 0x8d, 0x1e);
|
||||
ret |= m88rs2000_demod_write(state, 0x90, 0xf1);
|
||||
ret |= m88rs2000_demod_write(state, 0x91, 0x08);
|
||||
ret |= m88rs2000_writereg(state, 0x85, 0x1);
|
||||
ret |= m88rs2000_writereg(state, 0x8a, 0xbf);
|
||||
ret |= m88rs2000_writereg(state, 0x8d, 0x1e);
|
||||
ret |= m88rs2000_writereg(state, 0x90, 0xf1);
|
||||
ret |= m88rs2000_writereg(state, 0x91, 0x08);
|
||||
|
||||
if (ret < 0)
|
||||
return -ENODEV;
|
||||
@ -787,27 +619,25 @@ static int m88rs2000_set_frontend(struct dvb_frontend *fe)
|
||||
return -ENODEV;
|
||||
|
||||
for (i = 0; i < 25; i++) {
|
||||
reg = m88rs2000_demod_read(state, 0x8c);
|
||||
reg = m88rs2000_readreg(state, 0x8c);
|
||||
if ((reg & 0x7) == 0x7) {
|
||||
status = FE_HAS_LOCK;
|
||||
break;
|
||||
}
|
||||
state->no_lock_count++;
|
||||
if (state->no_lock_count == 15) {
|
||||
reg = m88rs2000_demod_read(state, 0x70);
|
||||
reg = m88rs2000_readreg(state, 0x70);
|
||||
reg ^= 0x4;
|
||||
m88rs2000_demod_write(state, 0x70, reg);
|
||||
m88rs2000_writereg(state, 0x70, reg);
|
||||
state->no_lock_count = 0;
|
||||
}
|
||||
if (state->no_lock_count == 20)
|
||||
m88rs2000_set_tuner_rf(fe);
|
||||
msleep(20);
|
||||
}
|
||||
|
||||
if (status & FE_HAS_LOCK) {
|
||||
state->fec_inner = m88rs2000_get_fec(state);
|
||||
/* Uknown suspect SNR level */
|
||||
reg = m88rs2000_demod_read(state, 0x65);
|
||||
reg = m88rs2000_readreg(state, 0x65);
|
||||
}
|
||||
|
||||
state->tuner_frequency = c->frequency;
|
||||
@ -830,9 +660,9 @@ static int m88rs2000_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
|
||||
struct m88rs2000_state *state = fe->demodulator_priv;
|
||||
|
||||
if (enable)
|
||||
m88rs2000_demod_write(state, 0x81, 0x84);
|
||||
m88rs2000_writereg(state, 0x81, 0x84);
|
||||
else
|
||||
m88rs2000_demod_write(state, 0x81, 0x81);
|
||||
m88rs2000_writereg(state, 0x81, 0x81);
|
||||
udelay(10);
|
||||
return 0;
|
||||
}
|
||||
@ -863,7 +693,6 @@ static struct dvb_frontend_ops m88rs2000_ops = {
|
||||
.release = m88rs2000_release,
|
||||
.init = m88rs2000_init,
|
||||
.sleep = m88rs2000_sleep,
|
||||
.write = m88rs2000_write,
|
||||
.i2c_gate_ctrl = m88rs2000_i2c_gate_ctrl,
|
||||
.read_status = m88rs2000_read_status,
|
||||
.read_ber = m88rs2000_read_ber,
|
||||
@ -896,9 +725,6 @@ struct dvb_frontend *m88rs2000_attach(const struct m88rs2000_config *config,
|
||||
state->symbol_rate = 0;
|
||||
state->fec_inner = 0;
|
||||
|
||||
if (m88rs2000_startup(state) < 0)
|
||||
goto error;
|
||||
|
||||
/* create dvb_frontend */
|
||||
memcpy(&state->frontend.ops, &m88rs2000_ops,
|
||||
sizeof(struct dvb_frontend_ops));
|
||||
|
@ -26,8 +26,6 @@
|
||||
struct m88rs2000_config {
|
||||
/* Demodulator i2c address */
|
||||
u8 demod_addr;
|
||||
/* Tuner address */
|
||||
u8 tuner_addr;
|
||||
|
||||
u8 *inittab;
|
||||
|
||||
@ -55,12 +53,8 @@ static inline struct dvb_frontend *m88rs2000_attach(
|
||||
}
|
||||
#endif /* CONFIG_DVB_M88RS2000 */
|
||||
|
||||
#define FE_CRYSTAL_KHZ 27000
|
||||
#define FREQ_OFFSET_LOW_SYM_RATE 3000
|
||||
|
||||
enum {
|
||||
DEMOD_WRITE = 0x1,
|
||||
TUNER_WRITE,
|
||||
WRITE_DELAY = 0x10,
|
||||
};
|
||||
#endif /* M88RS2000_H */
|
||||
|
@ -33,7 +33,7 @@ struct mb86a16_config {
|
||||
|
||||
|
||||
|
||||
#if defined(CONFIG_DVB_MB86A16) || (defined(CONFIG_DVB_MB86A16_MODULE) && defined(MODULE))
|
||||
#if IS_ENABLED(CONFIG_DVB_MB86A16)
|
||||
|
||||
extern struct dvb_frontend *mb86a16_attach(const struct mb86a16_config *config,
|
||||
struct i2c_adapter *i2c_adap);
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -36,7 +36,7 @@ struct mt312_config {
|
||||
unsigned int voltage_inverted:1;
|
||||
};
|
||||
|
||||
#if defined(CONFIG_DVB_MT312) || (defined(CONFIG_DVB_MT312_MODULE) && defined(MODULE))
|
||||
#if IS_ENABLED(CONFIG_DVB_MT312)
|
||||
struct dvb_frontend *mt312_attach(const struct mt312_config *config,
|
||||
struct i2c_adapter *i2c);
|
||||
#else
|
||||
|
@ -51,7 +51,7 @@ struct mt352_config
|
||||
int (*demod_init)(struct dvb_frontend* fe);
|
||||
};
|
||||
|
||||
#if defined(CONFIG_DVB_MT352) || (defined(CONFIG_DVB_MT352_MODULE) && defined(MODULE))
|
||||
#if IS_ENABLED(CONFIG_DVB_MT352)
|
||||
extern struct dvb_frontend* mt352_attach(const struct mt352_config* config,
|
||||
struct i2c_adapter* i2c);
|
||||
#else
|
||||
|
@ -42,7 +42,7 @@ struct nxt200x_config
|
||||
int (*set_ts_params)(struct dvb_frontend* fe, int is_punctured);
|
||||
};
|
||||
|
||||
#if defined(CONFIG_DVB_NXT200X) || (defined(CONFIG_DVB_NXT200X_MODULE) && defined(MODULE))
|
||||
#if IS_ENABLED(CONFIG_DVB_NXT200X)
|
||||
extern struct dvb_frontend* nxt200x_attach(const struct nxt200x_config* config,
|
||||
struct i2c_adapter* i2c);
|
||||
#else
|
||||
|
@ -33,7 +33,7 @@ struct nxt6000_config
|
||||
u8 clock_inversion:1;
|
||||
};
|
||||
|
||||
#if defined(CONFIG_DVB_NXT6000) || (defined(CONFIG_DVB_NXT6000_MODULE) && defined(MODULE))
|
||||
#if IS_ENABLED(CONFIG_DVB_NXT6000)
|
||||
extern struct dvb_frontend* nxt6000_attach(const struct nxt6000_config* config,
|
||||
struct i2c_adapter* i2c);
|
||||
#else
|
||||
|
@ -34,7 +34,7 @@ struct or51132_config
|
||||
int (*set_ts_params)(struct dvb_frontend* fe, int is_punctured);
|
||||
};
|
||||
|
||||
#if defined(CONFIG_DVB_OR51132) || (defined(CONFIG_DVB_OR51132_MODULE) && defined(MODULE))
|
||||
#if IS_ENABLED(CONFIG_DVB_OR51132)
|
||||
extern struct dvb_frontend* or51132_attach(const struct or51132_config* config,
|
||||
struct i2c_adapter* i2c);
|
||||
#else
|
||||
|
@ -22,6 +22,8 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#define pr_fmt(fmt) KBUILD_MODNAME ": %s: " fmt, __func__
|
||||
|
||||
/*
|
||||
* This driver needs external firmware. Please use the command
|
||||
* "<kerneldir>/Documentation/dvb/get_dvb_firmware or51211" to
|
||||
@ -44,9 +46,7 @@
|
||||
|
||||
static int debug;
|
||||
#define dprintk(args...) \
|
||||
do { \
|
||||
if (debug) printk(KERN_DEBUG "or51211: " args); \
|
||||
} while (0)
|
||||
do { if (debug) pr_debug(args); } while (0)
|
||||
|
||||
static u8 run_buf[] = {0x7f,0x01};
|
||||
static u8 cmd_buf[] = {0x04,0x01,0x50,0x80,0x06}; // ATSC
|
||||
@ -80,8 +80,7 @@ static int i2c_writebytes (struct or51211_state* state, u8 reg, const u8 *buf,
|
||||
msg.buf = (u8 *)buf;
|
||||
|
||||
if ((err = i2c_transfer (state->i2c, &msg, 1)) != 1) {
|
||||
printk(KERN_WARNING "or51211: i2c_writebytes error "
|
||||
"(addr %02x, err == %i)\n", reg, err);
|
||||
pr_warn("error (addr %02x, err == %i)\n", reg, err);
|
||||
return -EREMOTEIO;
|
||||
}
|
||||
|
||||
@ -98,8 +97,7 @@ static int i2c_readbytes(struct or51211_state *state, u8 reg, u8 *buf, int len)
|
||||
msg.buf = buf;
|
||||
|
||||
if ((err = i2c_transfer (state->i2c, &msg, 1)) != 1) {
|
||||
printk(KERN_WARNING "or51211: i2c_readbytes error "
|
||||
"(addr %02x, err == %i)\n", reg, err);
|
||||
pr_warn("error (addr %02x, err == %i)\n", reg, err);
|
||||
return -EREMOTEIO;
|
||||
}
|
||||
|
||||
@ -118,11 +116,11 @@ static int or51211_load_firmware (struct dvb_frontend* fe,
|
||||
/* Get eprom data */
|
||||
tudata[0] = 17;
|
||||
if (i2c_writebytes(state,0x50,tudata,1)) {
|
||||
printk(KERN_WARNING "or51211:load_firmware error eprom addr\n");
|
||||
pr_warn("error eprom addr\n");
|
||||
return -1;
|
||||
}
|
||||
if (i2c_readbytes(state,0x50,&tudata[145],192)) {
|
||||
printk(KERN_WARNING "or51211: load_firmware error eprom\n");
|
||||
pr_warn("error eprom\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
@ -136,32 +134,32 @@ static int or51211_load_firmware (struct dvb_frontend* fe,
|
||||
state->config->reset(fe);
|
||||
|
||||
if (i2c_writebytes(state,state->config->demod_address,tudata,585)) {
|
||||
printk(KERN_WARNING "or51211: load_firmware error 1\n");
|
||||
pr_warn("error 1\n");
|
||||
return -1;
|
||||
}
|
||||
msleep(1);
|
||||
|
||||
if (i2c_writebytes(state,state->config->demod_address,
|
||||
&fw->data[393],8125)) {
|
||||
printk(KERN_WARNING "or51211: load_firmware error 2\n");
|
||||
pr_warn("error 2\n");
|
||||
return -1;
|
||||
}
|
||||
msleep(1);
|
||||
|
||||
if (i2c_writebytes(state,state->config->demod_address,run_buf,2)) {
|
||||
printk(KERN_WARNING "or51211: load_firmware error 3\n");
|
||||
pr_warn("error 3\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Wait at least 5 msec */
|
||||
msleep(10);
|
||||
if (i2c_writebytes(state,state->config->demod_address,run_buf,2)) {
|
||||
printk(KERN_WARNING "or51211: load_firmware error 4\n");
|
||||
pr_warn("error 4\n");
|
||||
return -1;
|
||||
}
|
||||
msleep(10);
|
||||
|
||||
printk("or51211: Done.\n");
|
||||
pr_info("Done.\n");
|
||||
return 0;
|
||||
};
|
||||
|
||||
@ -173,14 +171,14 @@ static int or51211_setmode(struct dvb_frontend* fe, int mode)
|
||||
state->config->setmode(fe, mode);
|
||||
|
||||
if (i2c_writebytes(state,state->config->demod_address,run_buf,2)) {
|
||||
printk(KERN_WARNING "or51211: setmode error 1\n");
|
||||
pr_warn("error 1\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Wait at least 5 msec */
|
||||
msleep(10);
|
||||
if (i2c_writebytes(state,state->config->demod_address,run_buf,2)) {
|
||||
printk(KERN_WARNING "or51211: setmode error 2\n");
|
||||
pr_warn("error 2\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
@ -196,7 +194,7 @@ static int or51211_setmode(struct dvb_frontend* fe, int mode)
|
||||
* normal +/-150kHz Carrier acquisition range
|
||||
*/
|
||||
if (i2c_writebytes(state,state->config->demod_address,cmd_buf,3)) {
|
||||
printk(KERN_WARNING "or51211: setmode error 3\n");
|
||||
pr_warn("error 3\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
@ -206,14 +204,14 @@ static int or51211_setmode(struct dvb_frontend* fe, int mode)
|
||||
rec_buf[3] = 0x00;
|
||||
msleep(20);
|
||||
if (i2c_writebytes(state,state->config->demod_address,rec_buf,3)) {
|
||||
printk(KERN_WARNING "or51211: setmode error 5\n");
|
||||
pr_warn("error 5\n");
|
||||
}
|
||||
msleep(3);
|
||||
if (i2c_readbytes(state,state->config->demod_address,&rec_buf[10],2)) {
|
||||
printk(KERN_WARNING "or51211: setmode error 6");
|
||||
pr_warn("error 6\n");
|
||||
return -1;
|
||||
}
|
||||
dprintk("setmode rec status %02x %02x\n",rec_buf[10],rec_buf[11]);
|
||||
dprintk("rec status %02x %02x\n", rec_buf[10], rec_buf[11]);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -248,15 +246,15 @@ static int or51211_read_status(struct dvb_frontend* fe, fe_status_t* status)
|
||||
|
||||
/* Receiver Status */
|
||||
if (i2c_writebytes(state,state->config->demod_address,snd_buf,3)) {
|
||||
printk(KERN_WARNING "or51132: read_status write error\n");
|
||||
pr_warn("write error\n");
|
||||
return -1;
|
||||
}
|
||||
msleep(3);
|
||||
if (i2c_readbytes(state,state->config->demod_address,rec_buf,2)) {
|
||||
printk(KERN_WARNING "or51132: read_status read error\n");
|
||||
pr_warn("read error\n");
|
||||
return -1;
|
||||
}
|
||||
dprintk("read_status %x %x\n",rec_buf[0],rec_buf[1]);
|
||||
dprintk("%x %x\n", rec_buf[0], rec_buf[1]);
|
||||
|
||||
if (rec_buf[0] & 0x01) { /* Receiver Lock */
|
||||
*status |= FE_HAS_SIGNAL;
|
||||
@ -306,20 +304,18 @@ static int or51211_read_snr(struct dvb_frontend* fe, u16* snr)
|
||||
snd_buf[2] = 0x04;
|
||||
|
||||
if (i2c_writebytes(state,state->config->demod_address,snd_buf,3)) {
|
||||
printk(KERN_WARNING "%s: error writing snr reg\n",
|
||||
__func__);
|
||||
pr_warn("error writing snr reg\n");
|
||||
return -1;
|
||||
}
|
||||
if (i2c_readbytes(state,state->config->demod_address,rec_buf,2)) {
|
||||
printk(KERN_WARNING "%s: read_status read error\n",
|
||||
__func__);
|
||||
pr_warn("read_status read error\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
state->snr = calculate_snr(rec_buf[0], 89599047);
|
||||
*snr = (state->snr) >> 16;
|
||||
|
||||
dprintk("%s: noise = 0x%02x, snr = %d.%02d dB\n", __func__, rec_buf[0],
|
||||
dprintk("noise = 0x%02x, snr = %d.%02d dB\n", rec_buf[0],
|
||||
state->snr >> 24, (((state->snr>>8) & 0xffff) * 100) >> 16);
|
||||
|
||||
return 0;
|
||||
@ -375,25 +371,24 @@ static int or51211_init(struct dvb_frontend* fe)
|
||||
|
||||
if (!state->initialized) {
|
||||
/* Request the firmware, this will block until it uploads */
|
||||
printk(KERN_INFO "or51211: Waiting for firmware upload "
|
||||
"(%s)...\n", OR51211_DEFAULT_FIRMWARE);
|
||||
pr_info("Waiting for firmware upload (%s)...\n",
|
||||
OR51211_DEFAULT_FIRMWARE);
|
||||
ret = config->request_firmware(fe, &fw,
|
||||
OR51211_DEFAULT_FIRMWARE);
|
||||
printk(KERN_INFO "or51211:Got Hotplug firmware\n");
|
||||
pr_info("Got Hotplug firmware\n");
|
||||
if (ret) {
|
||||
printk(KERN_WARNING "or51211: No firmware uploaded "
|
||||
"(timeout or file not found?)\n");
|
||||
pr_warn("No firmware uploaded "
|
||||
"(timeout or file not found?)\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = or51211_load_firmware(fe, fw);
|
||||
release_firmware(fw);
|
||||
if (ret) {
|
||||
printk(KERN_WARNING "or51211: Writing firmware to "
|
||||
"device failed!\n");
|
||||
pr_warn("Writing firmware to device failed!\n");
|
||||
return ret;
|
||||
}
|
||||
printk(KERN_INFO "or51211: Firmware upload complete.\n");
|
||||
pr_info("Firmware upload complete.\n");
|
||||
|
||||
/* Set operation mode in Receiver 1 register;
|
||||
* type 1:
|
||||
@ -406,7 +401,7 @@ static int or51211_init(struct dvb_frontend* fe)
|
||||
*/
|
||||
if (i2c_writebytes(state,state->config->demod_address,
|
||||
cmd_buf,3)) {
|
||||
printk(KERN_WARNING "or51211: Load DVR Error 5\n");
|
||||
pr_warn("Load DVR Error 5\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
@ -419,13 +414,13 @@ static int or51211_init(struct dvb_frontend* fe)
|
||||
msleep(30);
|
||||
if (i2c_writebytes(state,state->config->demod_address,
|
||||
rec_buf,3)) {
|
||||
printk(KERN_WARNING "or51211: Load DVR Error A\n");
|
||||
pr_warn("Load DVR Error A\n");
|
||||
return -1;
|
||||
}
|
||||
msleep(3);
|
||||
if (i2c_readbytes(state,state->config->demod_address,
|
||||
&rec_buf[10],2)) {
|
||||
printk(KERN_WARNING "or51211: Load DVR Error B\n");
|
||||
pr_warn("Load DVR Error B\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
@ -436,13 +431,13 @@ static int or51211_init(struct dvb_frontend* fe)
|
||||
msleep(20);
|
||||
if (i2c_writebytes(state,state->config->demod_address,
|
||||
rec_buf,3)) {
|
||||
printk(KERN_WARNING "or51211: Load DVR Error C\n");
|
||||
pr_warn("Load DVR Error C\n");
|
||||
return -1;
|
||||
}
|
||||
msleep(3);
|
||||
if (i2c_readbytes(state,state->config->demod_address,
|
||||
&rec_buf[12],2)) {
|
||||
printk(KERN_WARNING "or51211: Load DVR Error D\n");
|
||||
pr_warn("Load DVR Error D\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
@ -454,16 +449,14 @@ static int or51211_init(struct dvb_frontend* fe)
|
||||
get_ver_buf[4] = i+1;
|
||||
if (i2c_writebytes(state,state->config->demod_address,
|
||||
get_ver_buf,5)) {
|
||||
printk(KERN_WARNING "or51211:Load DVR Error 6"
|
||||
" - %d\n",i);
|
||||
pr_warn("Load DVR Error 6 - %d\n", i);
|
||||
return -1;
|
||||
}
|
||||
msleep(3);
|
||||
|
||||
if (i2c_readbytes(state,state->config->demod_address,
|
||||
&rec_buf[i*2],2)) {
|
||||
printk(KERN_WARNING "or51211:Load DVR Error 7"
|
||||
" - %d\n",i);
|
||||
pr_warn("Load DVR Error 7 - %d\n", i);
|
||||
return -1;
|
||||
}
|
||||
/* If we didn't receive the right index, try again */
|
||||
@ -471,15 +464,11 @@ static int or51211_init(struct dvb_frontend* fe)
|
||||
i--;
|
||||
}
|
||||
}
|
||||
dprintk("read_fwbits %x %x %x %x %x %x %x %x %x %x\n",
|
||||
rec_buf[0], rec_buf[1], rec_buf[2], rec_buf[3],
|
||||
rec_buf[4], rec_buf[5], rec_buf[6], rec_buf[7],
|
||||
rec_buf[8], rec_buf[9]);
|
||||
dprintk("read_fwbits %10ph\n", rec_buf);
|
||||
|
||||
printk(KERN_INFO "or51211: ver TU%02x%02x%02x VSB mode %02x"
|
||||
" Status %02x\n",
|
||||
rec_buf[2], rec_buf[4],rec_buf[6],
|
||||
rec_buf[12],rec_buf[10]);
|
||||
pr_info("ver TU%02x%02x%02x VSB mode %02x Status %02x\n",
|
||||
rec_buf[2], rec_buf[4], rec_buf[6], rec_buf[12],
|
||||
rec_buf[10]);
|
||||
|
||||
rec_buf[0] = 0x04;
|
||||
rec_buf[1] = 0x00;
|
||||
@ -488,13 +477,13 @@ static int or51211_init(struct dvb_frontend* fe)
|
||||
msleep(20);
|
||||
if (i2c_writebytes(state,state->config->demod_address,
|
||||
rec_buf,3)) {
|
||||
printk(KERN_WARNING "or51211: Load DVR Error 8\n");
|
||||
pr_warn("Load DVR Error 8\n");
|
||||
return -1;
|
||||
}
|
||||
msleep(20);
|
||||
if (i2c_readbytes(state,state->config->demod_address,
|
||||
&rec_buf[8],2)) {
|
||||
printk(KERN_WARNING "or51211: Load DVR Error 9\n");
|
||||
pr_warn("Load DVR Error 9\n");
|
||||
return -1;
|
||||
}
|
||||
state->initialized = 1;
|
||||
|
@ -37,7 +37,7 @@ struct or51211_config
|
||||
void (*sleep)(struct dvb_frontend * fe);
|
||||
};
|
||||
|
||||
#if defined(CONFIG_DVB_OR51211) || (defined(CONFIG_DVB_OR51211_MODULE) && defined(MODULE))
|
||||
#if IS_ENABLED(CONFIG_DVB_OR51211)
|
||||
extern struct dvb_frontend* or51211_attach(const struct or51211_config* config,
|
||||
struct i2c_adapter* i2c);
|
||||
#else
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user