mirror of
https://github.com/suyu-emu/horinux.git
synced 2026-09-21 14:15:21 -07:00
Merge branch 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media
* 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media: (57 commits) [media] as3645a: Fix compilation by including slab.h [media] s5p-fimc: Remove linux/version.h include from fimc-mdevice.c [media] s5p-mfc: Remove linux/version.h include from s5p_mfc.c [media] ds3000: using logical && instead of bitwise & [media] v4l2-ctrls: make control names consistent [media] DVB: dib0700, add support for Nova-TD LEDs [media] DVB: dib0700, add corrected Nova-TD frontend_attach [media] DVB: dib0700, separate stk7070pd initialization [media] DVB: dib0700, move Nova-TD Stick to a separate set [media] : add MODULE_FIRMWARE to dib0700 [media] DVB-CORE: remove superfluous DTV_CMDs [media] s5p-jpeg: adapt to recent videobuf2 changes [media] s5p-g2d: fixed a bug in controls setting function [media] s5p-mfc: Fix volatile controls setup [media] drivers/media/video/s5p-mfc/s5p_mfc.c: adjust double test [media] drivers/media/video/s5p-fimc/fimc-capture.c: adjust double test [media] s5p-fimc: Fix incorrect control ID assignment [media] dvb_frontend: Don't call get_frontend() if idle [media] DocBook/dvbproperty.xml: Remove DTV_MODULATION from ISDB-T [media] DocBook/dvbproperty.xml: Fix ISDB-T delivery system parameters ...
This commit is contained in:
@@ -163,14 +163,16 @@ get/set up to 64 properties. The actual meaning of each property is described on
|
||||
<section id="DTV-FREQUENCY">
|
||||
<title><constant>DTV_FREQUENCY</constant></title>
|
||||
|
||||
<para>Central frequency of the channel, in HZ.</para>
|
||||
<para>Central frequency of the channel.</para>
|
||||
|
||||
<para>Notes:</para>
|
||||
<para>1)For ISDB-T, the channels are usually transmitted with an offset of 143kHz.
|
||||
<para>1)For satellital delivery systems, it is measured in kHz.
|
||||
For the other ones, it is measured in Hz.</para>
|
||||
<para>2)For ISDB-T, the channels are usually transmitted with an offset of 143kHz.
|
||||
E.g. a valid frequncy could be 474143 kHz. The stepping is bound to the bandwidth of
|
||||
the channel which is 6MHz.</para>
|
||||
|
||||
<para>2)As in ISDB-Tsb the channel consists of only one or three segments the
|
||||
<para>3)As in ISDB-Tsb the channel consists of only one or three segments the
|
||||
frequency step is 429kHz, 3*429 respectively. As for ISDB-T the
|
||||
central frequency of the channel is expected.</para>
|
||||
</section>
|
||||
@@ -735,14 +737,10 @@ typedef enum fe_hierarchy {
|
||||
<listitem><para><link linkend="DTV-TUNE"><constant>DTV_TUNE</constant></link></para></listitem>
|
||||
<listitem><para><link linkend="DTV-CLEAR"><constant>DTV_CLEAR</constant></link></para></listitem>
|
||||
<listitem><para><link linkend="DTV-FREQUENCY"><constant>DTV_FREQUENCY</constant></link></para></listitem>
|
||||
<listitem><para><link linkend="DTV-MODULATION"><constant>DTV_MODULATION</constant></link></para></listitem>
|
||||
<listitem><para><link linkend="DTV-BANDWIDTH-HZ"><constant>DTV_BANDWIDTH_HZ</constant></link></para></listitem>
|
||||
<listitem><para><link linkend="DTV-INVERSION"><constant>DTV_INVERSION</constant></link></para></listitem>
|
||||
<listitem><para><link linkend="DTV-CODE-RATE-HP"><constant>DTV_CODE_RATE_HP</constant></link></para></listitem>
|
||||
<listitem><para><link linkend="DTV-CODE-RATE-LP"><constant>DTV_CODE_RATE_LP</constant></link></para></listitem>
|
||||
<listitem><para><link linkend="DTV-GUARD-INTERVAL"><constant>DTV_GUARD_INTERVAL</constant></link></para></listitem>
|
||||
<listitem><para><link linkend="DTV-TRANSMISSION-MODE"><constant>DTV_TRANSMISSION_MODE</constant></link></para></listitem>
|
||||
<listitem><para><link linkend="DTV-HIERARCHY"><constant>DTV_HIERARCHY</constant></link></para></listitem>
|
||||
<listitem><para><link linkend="DTV-ISDBT-LAYER-ENABLED"><constant>DTV_ISDBT_LAYER_ENABLED</constant></link></para></listitem>
|
||||
<listitem><para><link linkend="DTV-ISDBT-PARTIAL-RECEPTION"><constant>DTV_ISDBT_PARTIAL_RECEPTION</constant></link></para></listitem>
|
||||
<listitem><para><link linkend="DTV-ISDBT-SOUND-BROADCASTING"><constant>DTV_ISDBT_SOUND_BROADCASTING</constant></link></para></listitem>
|
||||
|
||||
@@ -183,7 +183,12 @@ applications must set the array to zero.</entry>
|
||||
<entry>__u32</entry>
|
||||
<entry><structfield>ctrl_class</structfield></entry>
|
||||
<entry>The control class to which all controls belong, see
|
||||
<xref linkend="ctrl-class" />.</entry>
|
||||
<xref linkend="ctrl-class" />. Drivers that use a kernel framework for handling
|
||||
controls will also accept a value of 0 here, meaning that the controls can
|
||||
belong to any control class. Whether drivers support this can be tested by setting
|
||||
<structfield>ctrl_class</structfield> to 0 and calling <constant>VIDIOC_TRY_EXT_CTRLS</constant>
|
||||
with a <structfield>count</structfield> of 0. If that succeeds, then the driver
|
||||
supports this feature.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>__u32</entry>
|
||||
@@ -194,10 +199,13 @@ also be zero.</entry>
|
||||
<row>
|
||||
<entry>__u32</entry>
|
||||
<entry><structfield>error_idx</structfield></entry>
|
||||
<entry>Set by the driver in case of an error. It is the
|
||||
index of the control causing the error or equal to 'count' when the
|
||||
error is not associated with a particular control. Undefined when the
|
||||
ioctl returns 0 (success).</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>
|
||||
</row>
|
||||
<row>
|
||||
<entry>__u32</entry>
|
||||
|
||||
@@ -364,15 +364,20 @@ capability and it is cleared otherwise.</entry>
|
||||
<row>
|
||||
<entry><constant>V4L2_FBUF_FLAG_OVERLAY</constant></entry>
|
||||
<entry>0x0002</entry>
|
||||
<entry>The frame buffer is an overlay surface the same
|
||||
size as the capture. [?]</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry spanname="hspan">The purpose of
|
||||
<constant>V4L2_FBUF_FLAG_OVERLAY</constant> was never quite clear.
|
||||
Most drivers seem to ignore this flag. For compatibility with the
|
||||
<wordasword>bttv</wordasword> driver applications should set the
|
||||
<constant>V4L2_FBUF_FLAG_OVERLAY</constant> flag.</entry>
|
||||
<entry>If this flag is set for a video capture device, then the
|
||||
driver will set the initial overlay size to cover the full framebuffer size,
|
||||
otherwise the existing overlay size (as set by &VIDIOC-S-FMT;) will be used.
|
||||
|
||||
Only one video capture driver (bttv) supports this flag. The use of this flag
|
||||
for capture devices is deprecated. There is no way to detect which drivers
|
||||
support this flag, so the only reliable method of setting the overlay size is
|
||||
through &VIDIOC-S-FMT;.
|
||||
|
||||
If this flag is set for a video output device, then the video output overlay
|
||||
window is relative to the top-left corner of the framebuffer and restricted
|
||||
to the size of the framebuffer. If it is cleared, then the video output
|
||||
overlay window is relative to the video output display.
|
||||
</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><constant>V4L2_FBUF_FLAG_CHROMAKEY</constant></entry>
|
||||
|
||||
@@ -98,8 +98,11 @@ the &v4l2-output; <structfield>modulator</structfield> field and the
|
||||
<entry>&v4l2-tuner-type;</entry>
|
||||
<entry><structfield>type</structfield></entry>
|
||||
<entry>The tuner type. This is the same value as in the
|
||||
&v4l2-tuner; <structfield>type</structfield> field. The field is not
|
||||
applicable to modulators, &ie; ignored by drivers.</entry>
|
||||
&v4l2-tuner; <structfield>type</structfield> field. The type must be set
|
||||
to <constant>V4L2_TUNER_RADIO</constant> for <filename>/dev/radioX</filename>
|
||||
device nodes, and to <constant>V4L2_TUNER_ANALOG_TV</constant>
|
||||
for all others. The field is not applicable to modulators, &ie; ignored
|
||||
by drivers.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>__u32</entry>
|
||||
|
||||
@@ -61,8 +61,8 @@ desired input in an integer and call the
|
||||
<constant>VIDIOC_S_INPUT</constant> ioctl with a pointer to this
|
||||
integer. Side effects are possible. For example inputs may support
|
||||
different video standards, so the driver may implicitly switch the
|
||||
current standard. It is good practice to select an input before
|
||||
querying or negotiating any other parameters.</para>
|
||||
current standard. Because of these possible side effects applications
|
||||
must select an input before querying or negotiating any other parameters.</para>
|
||||
|
||||
<para>Information about video inputs is available using the
|
||||
&VIDIOC-ENUMINPUT; ioctl.</para>
|
||||
|
||||
@@ -61,8 +61,9 @@ desired output in an integer and call the
|
||||
<constant>VIDIOC_S_OUTPUT</constant> ioctl with a pointer to this integer.
|
||||
Side effects are possible. For example outputs may support different
|
||||
video standards, so the driver may implicitly switch the current
|
||||
standard. It is good practice to select an output before querying or
|
||||
negotiating any other parameters.</para>
|
||||
standard.
|
||||
standard. Because of these possible side effects applications
|
||||
must select an output before querying or negotiating any other parameters.</para>
|
||||
|
||||
<para>Information about video outputs is available using the
|
||||
&VIDIOC-ENUMOUTPUT; ioctl.</para>
|
||||
|
||||
@@ -439,17 +439,6 @@ Who: Jean Delvare <khali@linux-fr.org>
|
||||
|
||||
----------------------------
|
||||
|
||||
What: For VIDIOC_S_FREQUENCY the type field must match the device node's type.
|
||||
If not, return -EINVAL.
|
||||
When: 3.2
|
||||
Why: It makes no sense to switch the tuner to radio mode by calling
|
||||
VIDIOC_S_FREQUENCY on a video node, or to switch the tuner to tv mode by
|
||||
calling VIDIOC_S_FREQUENCY on a radio node. This is the first step of a
|
||||
move to more consistent handling of tv and radio tuners.
|
||||
Who: Hans Verkuil <hans.verkuil@cisco.com>
|
||||
|
||||
----------------------------
|
||||
|
||||
What: Opening a radio device node will no longer automatically switch the
|
||||
tuner mode from tv to radio.
|
||||
When: 3.3
|
||||
|
||||
@@ -666,27 +666,6 @@ a control of this type whenever the first control belonging to a new control
|
||||
class is added.
|
||||
|
||||
|
||||
Differences from the Spec
|
||||
=========================
|
||||
|
||||
There are a few places where the framework acts slightly differently from the
|
||||
V4L2 Specification. Those differences are described in this section. We will
|
||||
have to see whether we need to adjust the spec or not.
|
||||
|
||||
1) It is no longer required to have all controls contained in a
|
||||
v4l2_ext_control array be from the same control class. The framework will be
|
||||
able to handle any type of control in the array. You need to set ctrl_class
|
||||
to 0 in order to enable this. If ctrl_class is non-zero, then it will still
|
||||
check that all controls belong to that control class.
|
||||
|
||||
If you set ctrl_class to 0 and count to 0, then it will only return an error
|
||||
if there are no controls at all.
|
||||
|
||||
2) Clarified the way error_idx works. For get and set it will be equal to
|
||||
count if nothing was done yet. If it is less than count then only the controls
|
||||
up to error_idx-1 were successfully applied.
|
||||
|
||||
|
||||
Proposals for Extensions
|
||||
========================
|
||||
|
||||
|
||||
@@ -24,6 +24,21 @@
|
||||
#include <linux/dvb/frontend.h>
|
||||
#include "dvb_frontend.h"
|
||||
|
||||
/* Registers (Write-only) */
|
||||
#define XREG_INIT 0x00
|
||||
#define XREG_RF_FREQ 0x02
|
||||
#define XREG_POWER_DOWN 0x08
|
||||
|
||||
/* Registers (Read-only) */
|
||||
#define XREG_FREQ_ERROR 0x01
|
||||
#define XREG_LOCK 0x02
|
||||
#define XREG_VERSION 0x04
|
||||
#define XREG_PRODUCT_ID 0x08
|
||||
#define XREG_HSYNC_FREQ 0x10
|
||||
#define XREG_FRAME_LINES 0x20
|
||||
#define XREG_SNR 0x40
|
||||
|
||||
#define XREG_ADC_ENV 0x0100
|
||||
|
||||
static int debug;
|
||||
module_param(debug, int, 0644);
|
||||
@@ -885,7 +900,7 @@ static int xc2028_signal(struct dvb_frontend *fe, u16 *strength)
|
||||
mutex_lock(&priv->lock);
|
||||
|
||||
/* Sync Lock Indicator */
|
||||
rc = xc2028_get_reg(priv, 0x0002, &frq_lock);
|
||||
rc = xc2028_get_reg(priv, XREG_LOCK, &frq_lock);
|
||||
if (rc < 0)
|
||||
goto ret;
|
||||
|
||||
@@ -894,7 +909,7 @@ static int xc2028_signal(struct dvb_frontend *fe, u16 *strength)
|
||||
signal = 1 << 11;
|
||||
|
||||
/* Get SNR of the video signal */
|
||||
rc = xc2028_get_reg(priv, 0x0040, &signal);
|
||||
rc = xc2028_get_reg(priv, XREG_SNR, &signal);
|
||||
if (rc < 0)
|
||||
goto ret;
|
||||
|
||||
@@ -1019,9 +1034,9 @@ static int generic_set_freq(struct dvb_frontend *fe, u32 freq /* in HZ */,
|
||||
|
||||
/* CMD= Set frequency */
|
||||
if (priv->firm_version < 0x0202)
|
||||
rc = send_seq(priv, {0x00, 0x02, 0x00, 0x00});
|
||||
rc = send_seq(priv, {0x00, XREG_RF_FREQ, 0x00, 0x00});
|
||||
else
|
||||
rc = send_seq(priv, {0x80, 0x02, 0x00, 0x00});
|
||||
rc = send_seq(priv, {0x80, XREG_RF_FREQ, 0x00, 0x00});
|
||||
if (rc < 0)
|
||||
goto ret;
|
||||
|
||||
@@ -1201,9 +1216,9 @@ static int xc2028_sleep(struct dvb_frontend *fe)
|
||||
mutex_lock(&priv->lock);
|
||||
|
||||
if (priv->firm_version < 0x0202)
|
||||
rc = send_seq(priv, {0x00, 0x08, 0x00, 0x00});
|
||||
rc = send_seq(priv, {0x00, XREG_POWER_DOWN, 0x00, 0x00});
|
||||
else
|
||||
rc = send_seq(priv, {0x80, 0x08, 0x00, 0x00});
|
||||
rc = send_seq(priv, {0x80, XREG_POWER_DOWN, 0x00, 0x00});
|
||||
|
||||
priv->cur_fw.type = 0; /* need firmware reload */
|
||||
|
||||
|
||||
@@ -154,6 +154,8 @@ struct xc4000_priv {
|
||||
#define XREG_SNR 0x06
|
||||
#define XREG_VERSION 0x07
|
||||
#define XREG_PRODUCT_ID 0x08
|
||||
#define XREG_SIGNAL_LEVEL 0x0A
|
||||
#define XREG_NOISE_LEVEL 0x0B
|
||||
|
||||
/*
|
||||
Basic firmware description. This will remain with
|
||||
@@ -486,6 +488,16 @@ static int xc_get_quality(struct xc4000_priv *priv, u16 *quality)
|
||||
return xc4000_readreg(priv, XREG_QUALITY, quality);
|
||||
}
|
||||
|
||||
static int xc_get_signal_level(struct xc4000_priv *priv, u16 *signal)
|
||||
{
|
||||
return xc4000_readreg(priv, XREG_SIGNAL_LEVEL, signal);
|
||||
}
|
||||
|
||||
static int xc_get_noise_level(struct xc4000_priv *priv, u16 *noise)
|
||||
{
|
||||
return xc4000_readreg(priv, XREG_NOISE_LEVEL, noise);
|
||||
}
|
||||
|
||||
static u16 xc_wait_for_lock(struct xc4000_priv *priv)
|
||||
{
|
||||
u16 lock_state = 0;
|
||||
@@ -1089,6 +1101,8 @@ static void xc_debug_dump(struct xc4000_priv *priv)
|
||||
u32 hsync_freq_hz = 0;
|
||||
u16 frame_lines;
|
||||
u16 quality;
|
||||
u16 signal = 0;
|
||||
u16 noise = 0;
|
||||
u8 hw_majorversion = 0, hw_minorversion = 0;
|
||||
u8 fw_majorversion = 0, fw_minorversion = 0;
|
||||
|
||||
@@ -1119,6 +1133,12 @@ static void xc_debug_dump(struct xc4000_priv *priv)
|
||||
|
||||
xc_get_quality(priv, &quality);
|
||||
dprintk(1, "*** Quality (0:<8dB, 7:>56dB) = %d\n", quality);
|
||||
|
||||
xc_get_signal_level(priv, &signal);
|
||||
dprintk(1, "*** Signal level = -%ddB (%d)\n", signal >> 8, signal);
|
||||
|
||||
xc_get_noise_level(priv, &noise);
|
||||
dprintk(1, "*** Noise level = %ddB (%d)\n", noise >> 8, noise);
|
||||
}
|
||||
|
||||
static int xc4000_set_params(struct dvb_frontend *fe)
|
||||
@@ -1432,6 +1452,71 @@ fail:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int xc4000_get_signal(struct dvb_frontend *fe, u16 *strength)
|
||||
{
|
||||
struct xc4000_priv *priv = fe->tuner_priv;
|
||||
u16 value = 0;
|
||||
int rc;
|
||||
|
||||
mutex_lock(&priv->lock);
|
||||
rc = xc4000_readreg(priv, XREG_SIGNAL_LEVEL, &value);
|
||||
mutex_unlock(&priv->lock);
|
||||
|
||||
if (rc < 0)
|
||||
goto ret;
|
||||
|
||||
/* Informations from real testing of DVB-T and radio part,
|
||||
coeficient for one dB is 0xff.
|
||||
*/
|
||||
tuner_dbg("Signal strength: -%ddB (%05d)\n", value >> 8, value);
|
||||
|
||||
/* all known digital modes */
|
||||
if ((priv->video_standard == XC4000_DTV6) ||
|
||||
(priv->video_standard == XC4000_DTV7) ||
|
||||
(priv->video_standard == XC4000_DTV7_8) ||
|
||||
(priv->video_standard == XC4000_DTV8))
|
||||
goto digital;
|
||||
|
||||
/* Analog mode has NOISE LEVEL important, signal
|
||||
depends only on gain of antenna and amplifiers,
|
||||
but it doesn't tell anything about real quality
|
||||
of reception.
|
||||
*/
|
||||
mutex_lock(&priv->lock);
|
||||
rc = xc4000_readreg(priv, XREG_NOISE_LEVEL, &value);
|
||||
mutex_unlock(&priv->lock);
|
||||
|
||||
tuner_dbg("Noise level: %ddB (%05d)\n", value >> 8, value);
|
||||
|
||||
/* highest noise level: 32dB */
|
||||
if (value >= 0x2000) {
|
||||
value = 0;
|
||||
} else {
|
||||
value = ~value << 3;
|
||||
}
|
||||
|
||||
goto ret;
|
||||
|
||||
/* Digital mode has SIGNAL LEVEL important and real
|
||||
noise level is stored in demodulator registers.
|
||||
*/
|
||||
digital:
|
||||
/* best signal: -50dB */
|
||||
if (value <= 0x3200) {
|
||||
value = 0xffff;
|
||||
/* minimum: -114dB - should be 0x7200 but real zero is 0x713A */
|
||||
} else if (value >= 0x713A) {
|
||||
value = 0;
|
||||
} else {
|
||||
value = ~(value - 0x3200) << 2;
|
||||
}
|
||||
|
||||
ret:
|
||||
*strength = value;
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int xc4000_get_frequency(struct dvb_frontend *fe, u32 *freq)
|
||||
{
|
||||
struct xc4000_priv *priv = fe->tuner_priv;
|
||||
@@ -1559,6 +1644,7 @@ static const struct dvb_tuner_ops xc4000_tuner_ops = {
|
||||
.set_params = xc4000_set_params,
|
||||
.set_analog_params = xc4000_set_analog_params,
|
||||
.get_frequency = xc4000_get_frequency,
|
||||
.get_rf_strength = xc4000_get_signal,
|
||||
.get_bandwidth = xc4000_get_bandwidth,
|
||||
.get_status = xc4000_get_status
|
||||
};
|
||||
|
||||
@@ -904,8 +904,11 @@ static int dvb_frontend_clear_cache(struct dvb_frontend *fe)
|
||||
{
|
||||
struct dtv_frontend_properties *c = &fe->dtv_property_cache;
|
||||
int i;
|
||||
u32 delsys;
|
||||
|
||||
delsys = c->delivery_system;
|
||||
memset(c, 0, sizeof(struct dtv_frontend_properties));
|
||||
c->delivery_system = delsys;
|
||||
|
||||
c->state = DTV_CLEAR;
|
||||
|
||||
@@ -1009,25 +1012,6 @@ static struct dtv_cmds_h dtv_cmds[DTV_MAX_COMMAND + 1] = {
|
||||
_DTV_CMD(DTV_ISDBT_LAYERC_SEGMENT_COUNT, 1, 0),
|
||||
_DTV_CMD(DTV_ISDBT_LAYERC_TIME_INTERLEAVING, 1, 0),
|
||||
|
||||
_DTV_CMD(DTV_ISDBT_PARTIAL_RECEPTION, 0, 0),
|
||||
_DTV_CMD(DTV_ISDBT_SOUND_BROADCASTING, 0, 0),
|
||||
_DTV_CMD(DTV_ISDBT_SB_SUBCHANNEL_ID, 0, 0),
|
||||
_DTV_CMD(DTV_ISDBT_SB_SEGMENT_IDX, 0, 0),
|
||||
_DTV_CMD(DTV_ISDBT_SB_SEGMENT_COUNT, 0, 0),
|
||||
_DTV_CMD(DTV_ISDBT_LAYER_ENABLED, 0, 0),
|
||||
_DTV_CMD(DTV_ISDBT_LAYERA_FEC, 0, 0),
|
||||
_DTV_CMD(DTV_ISDBT_LAYERA_MODULATION, 0, 0),
|
||||
_DTV_CMD(DTV_ISDBT_LAYERA_SEGMENT_COUNT, 0, 0),
|
||||
_DTV_CMD(DTV_ISDBT_LAYERA_TIME_INTERLEAVING, 0, 0),
|
||||
_DTV_CMD(DTV_ISDBT_LAYERB_FEC, 0, 0),
|
||||
_DTV_CMD(DTV_ISDBT_LAYERB_MODULATION, 0, 0),
|
||||
_DTV_CMD(DTV_ISDBT_LAYERB_SEGMENT_COUNT, 0, 0),
|
||||
_DTV_CMD(DTV_ISDBT_LAYERB_TIME_INTERLEAVING, 0, 0),
|
||||
_DTV_CMD(DTV_ISDBT_LAYERC_FEC, 0, 0),
|
||||
_DTV_CMD(DTV_ISDBT_LAYERC_MODULATION, 0, 0),
|
||||
_DTV_CMD(DTV_ISDBT_LAYERC_SEGMENT_COUNT, 0, 0),
|
||||
_DTV_CMD(DTV_ISDBT_LAYERC_TIME_INTERLEAVING, 0, 0),
|
||||
|
||||
_DTV_CMD(DTV_ISDBS_TS_ID, 1, 0),
|
||||
_DTV_CMD(DTV_DVBT2_PLP_ID, 1, 0),
|
||||
|
||||
@@ -1413,6 +1397,15 @@ static int set_delivery_system(struct dvb_frontend *fe, u32 desired_system)
|
||||
struct dtv_frontend_properties *c = &fe->dtv_property_cache;
|
||||
enum dvbv3_emulation_type type;
|
||||
|
||||
/*
|
||||
* It was reported that some old DVBv5 applications were
|
||||
* filling delivery_system with SYS_UNDEFINED. If this happens,
|
||||
* assume that the application wants to use the first supported
|
||||
* delivery system.
|
||||
*/
|
||||
if (c->delivery_system == SYS_UNDEFINED)
|
||||
c->delivery_system = fe->ops.delsys[0];
|
||||
|
||||
if (desired_system == SYS_UNDEFINED) {
|
||||
/*
|
||||
* A DVBv3 call doesn't know what's the desired system.
|
||||
@@ -1732,6 +1725,7 @@ static int dvb_frontend_ioctl_properties(struct file *file,
|
||||
{
|
||||
struct dvb_device *dvbdev = file->private_data;
|
||||
struct dvb_frontend *fe = dvbdev->priv;
|
||||
struct dvb_frontend_private *fepriv = fe->frontend_priv;
|
||||
struct dtv_frontend_properties *c = &fe->dtv_property_cache;
|
||||
int err = 0;
|
||||
|
||||
@@ -1798,9 +1792,14 @@ static int dvb_frontend_ioctl_properties(struct file *file,
|
||||
|
||||
/*
|
||||
* Fills the cache out struct with the cache contents, plus
|
||||
* the data retrieved from get_frontend.
|
||||
* the data retrieved from get_frontend, if the frontend
|
||||
* is not idle. Otherwise, returns the cached content
|
||||
*/
|
||||
dtv_get_frontend(fe, NULL);
|
||||
if (fepriv->state != FESTATE_IDLE) {
|
||||
err = dtv_get_frontend(fe, NULL);
|
||||
if (err < 0)
|
||||
goto out;
|
||||
}
|
||||
for (i = 0; i < tvps->num; i++) {
|
||||
err = dtv_property_process_get(fe, c, tvp + i, file);
|
||||
if (err < 0)
|
||||
|
||||
@@ -877,24 +877,18 @@ static int anysee_frontend_attach(struct dvb_usb_adapter *adap)
|
||||
case ANYSEE_HW_508T2C: /* 20 */
|
||||
/* E7 T2C */
|
||||
|
||||
if (state->fe_id)
|
||||
break;
|
||||
|
||||
/* enable DVB-T/T2/C demod on IOE[5] */
|
||||
ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (1 << 5), 0x20);
|
||||
if (ret)
|
||||
goto error;
|
||||
|
||||
if (state->fe_id == 0) {
|
||||
/* DVB-T/T2 */
|
||||
adap->fe_adap[state->fe_id].fe =
|
||||
dvb_attach(cxd2820r_attach,
|
||||
&anysee_cxd2820r_config,
|
||||
&adap->dev->i2c_adap, NULL);
|
||||
} else {
|
||||
/* DVB-C */
|
||||
adap->fe_adap[state->fe_id].fe =
|
||||
dvb_attach(cxd2820r_attach,
|
||||
&anysee_cxd2820r_config,
|
||||
&adap->dev->i2c_adap, adap->fe_adap[0].fe);
|
||||
}
|
||||
/* attach demod */
|
||||
adap->fe_adap[state->fe_id].fe = dvb_attach(cxd2820r_attach,
|
||||
&anysee_cxd2820r_config, &adap->dev->i2c_adap,
|
||||
NULL);
|
||||
|
||||
state->has_ci = true;
|
||||
|
||||
|
||||
@@ -48,6 +48,8 @@ struct dib0700_state {
|
||||
u8 disable_streaming_master_mode;
|
||||
u32 fw_version;
|
||||
u32 nb_packet_buffer_size;
|
||||
int (*read_status)(struct dvb_frontend *, fe_status_t *);
|
||||
int (*sleep)(struct dvb_frontend* fe);
|
||||
u8 buf[255];
|
||||
};
|
||||
|
||||
|
||||
@@ -834,6 +834,7 @@ static struct usb_driver dib0700_driver = {
|
||||
|
||||
module_usb_driver(dib0700_driver);
|
||||
|
||||
MODULE_FIRMWARE("dvb-usb-dib0700-1.20.fw");
|
||||
MODULE_AUTHOR("Patrick Boettcher <pboettcher@dibcom.fr>");
|
||||
MODULE_DESCRIPTION("Driver for devices based on DiBcom DiB0700 - USB bridge");
|
||||
MODULE_VERSION("1.0");
|
||||
|
||||
@@ -3066,19 +3066,25 @@ static struct dib7000p_config stk7070pd_dib7000p_config[2] = {
|
||||
}
|
||||
};
|
||||
|
||||
static void stk7070pd_init(struct dvb_usb_device *dev)
|
||||
{
|
||||
dib0700_set_gpio(dev, GPIO6, GPIO_OUT, 1);
|
||||
msleep(10);
|
||||
dib0700_set_gpio(dev, GPIO9, GPIO_OUT, 1);
|
||||
dib0700_set_gpio(dev, GPIO4, GPIO_OUT, 1);
|
||||
dib0700_set_gpio(dev, GPIO7, GPIO_OUT, 1);
|
||||
dib0700_set_gpio(dev, GPIO10, GPIO_OUT, 0);
|
||||
|
||||
dib0700_ctrl_clock(dev, 72, 1);
|
||||
|
||||
msleep(10);
|
||||
dib0700_set_gpio(dev, GPIO10, GPIO_OUT, 1);
|
||||
}
|
||||
|
||||
static int stk7070pd_frontend_attach0(struct dvb_usb_adapter *adap)
|
||||
{
|
||||
dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
|
||||
msleep(10);
|
||||
dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
|
||||
dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
|
||||
dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
|
||||
dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
|
||||
stk7070pd_init(adap->dev);
|
||||
|
||||
dib0700_ctrl_clock(adap->dev, 72, 1);
|
||||
|
||||
msleep(10);
|
||||
dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
|
||||
msleep(10);
|
||||
dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
|
||||
|
||||
@@ -3099,6 +3105,77 @@ static int stk7070pd_frontend_attach1(struct dvb_usb_adapter *adap)
|
||||
return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
|
||||
}
|
||||
|
||||
static int novatd_read_status_override(struct dvb_frontend *fe,
|
||||
fe_status_t *stat)
|
||||
{
|
||||
struct dvb_usb_adapter *adap = fe->dvb->priv;
|
||||
struct dvb_usb_device *dev = adap->dev;
|
||||
struct dib0700_state *state = dev->priv;
|
||||
int ret;
|
||||
|
||||
ret = state->read_status(fe, stat);
|
||||
|
||||
if (!ret)
|
||||
dib0700_set_gpio(dev, adap->id == 0 ? GPIO1 : GPIO0, GPIO_OUT,
|
||||
!!(*stat & FE_HAS_LOCK));
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int novatd_sleep_override(struct dvb_frontend* fe)
|
||||
{
|
||||
struct dvb_usb_adapter *adap = fe->dvb->priv;
|
||||
struct dvb_usb_device *dev = adap->dev;
|
||||
struct dib0700_state *state = dev->priv;
|
||||
|
||||
/* turn off LED */
|
||||
dib0700_set_gpio(dev, adap->id == 0 ? GPIO1 : GPIO0, GPIO_OUT, 0);
|
||||
|
||||
return state->sleep(fe);
|
||||
}
|
||||
|
||||
/**
|
||||
* novatd_frontend_attach - Nova-TD specific attach
|
||||
*
|
||||
* Nova-TD has GPIO0, 1 and 2 for LEDs. So do not fiddle with them except for
|
||||
* information purposes.
|
||||
*/
|
||||
static int novatd_frontend_attach(struct dvb_usb_adapter *adap)
|
||||
{
|
||||
struct dvb_usb_device *dev = adap->dev;
|
||||
struct dib0700_state *st = dev->priv;
|
||||
|
||||
if (adap->id == 0) {
|
||||
stk7070pd_init(dev);
|
||||
|
||||
/* turn the power LED on, the other two off (just in case) */
|
||||
dib0700_set_gpio(dev, GPIO0, GPIO_OUT, 0);
|
||||
dib0700_set_gpio(dev, GPIO1, GPIO_OUT, 0);
|
||||
dib0700_set_gpio(dev, GPIO2, GPIO_OUT, 1);
|
||||
|
||||
if (dib7000p_i2c_enumeration(&dev->i2c_adap, 2, 18,
|
||||
stk7070pd_dib7000p_config) != 0) {
|
||||
err("%s: dib7000p_i2c_enumeration failed. Cannot continue\n",
|
||||
__func__);
|
||||
return -ENODEV;
|
||||
}
|
||||
}
|
||||
|
||||
adap->fe_adap[0].fe = dvb_attach(dib7000p_attach, &dev->i2c_adap,
|
||||
adap->id == 0 ? 0x80 : 0x82,
|
||||
&stk7070pd_dib7000p_config[adap->id]);
|
||||
|
||||
if (adap->fe_adap[0].fe == NULL)
|
||||
return -ENODEV;
|
||||
|
||||
st->read_status = adap->fe_adap[0].fe->ops.read_status;
|
||||
adap->fe_adap[0].fe->ops.read_status = novatd_read_status_override;
|
||||
st->sleep = adap->fe_adap[0].fe->ops.sleep;
|
||||
adap->fe_adap[0].fe->ops.sleep = novatd_sleep_override;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* S5H1411 */
|
||||
static struct s5h1411_config pinnacle_801e_config = {
|
||||
.output_mode = S5H1411_PARALLEL_OUTPUT,
|
||||
@@ -3861,6 +3938,57 @@ struct dvb_usb_device_properties dib0700_devices[] = {
|
||||
},
|
||||
}, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
|
||||
|
||||
.num_adapters = 2,
|
||||
.adapter = {
|
||||
{
|
||||
.num_frontends = 1,
|
||||
.fe = {{
|
||||
.caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
|
||||
.pid_filter_count = 32,
|
||||
.pid_filter = stk70x0p_pid_filter,
|
||||
.pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
|
||||
.frontend_attach = novatd_frontend_attach,
|
||||
.tuner_attach = dib7070p_tuner_attach,
|
||||
|
||||
DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
|
||||
}},
|
||||
.size_of_priv = sizeof(struct dib0700_adapter_state),
|
||||
}, {
|
||||
.num_frontends = 1,
|
||||
.fe = {{
|
||||
.caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
|
||||
.pid_filter_count = 32,
|
||||
.pid_filter = stk70x0p_pid_filter,
|
||||
.pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
|
||||
.frontend_attach = novatd_frontend_attach,
|
||||
.tuner_attach = dib7070p_tuner_attach,
|
||||
|
||||
DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
|
||||
}},
|
||||
.size_of_priv = sizeof(struct dib0700_adapter_state),
|
||||
}
|
||||
},
|
||||
|
||||
.num_device_descs = 1,
|
||||
.devices = {
|
||||
{ "Hauppauge Nova-TD Stick (52009)",
|
||||
{ &dib0700_usb_id_table[35], NULL },
|
||||
{ NULL },
|
||||
},
|
||||
},
|
||||
|
||||
.rc.core = {
|
||||
.rc_interval = DEFAULT_RC_INTERVAL,
|
||||
.rc_codes = RC_MAP_DIB0700_RC5_TABLE,
|
||||
.module_name = "dib0700",
|
||||
.rc_query = dib0700_rc_query_old_firmware,
|
||||
.allowed_protos = RC_TYPE_RC5 |
|
||||
RC_TYPE_RC6 |
|
||||
RC_TYPE_NEC,
|
||||
.change_protocol = dib0700_change_protocol,
|
||||
},
|
||||
}, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
|
||||
|
||||
.num_adapters = 2,
|
||||
.adapter = {
|
||||
{
|
||||
@@ -3892,7 +4020,7 @@ struct dvb_usb_device_properties dib0700_devices[] = {
|
||||
}
|
||||
},
|
||||
|
||||
.num_device_descs = 6,
|
||||
.num_device_descs = 5,
|
||||
.devices = {
|
||||
{ "DiBcom STK7070PD reference design",
|
||||
{ &dib0700_usb_id_table[17], NULL },
|
||||
@@ -3902,10 +4030,6 @@ struct dvb_usb_device_properties dib0700_devices[] = {
|
||||
{ &dib0700_usb_id_table[18], NULL },
|
||||
{ NULL },
|
||||
},
|
||||
{ "Hauppauge Nova-TD Stick (52009)",
|
||||
{ &dib0700_usb_id_table[35], NULL },
|
||||
{ NULL },
|
||||
},
|
||||
{ "Hauppauge Nova-TD-500 (84xxx)",
|
||||
{ &dib0700_usb_id_table[36], NULL },
|
||||
{ NULL },
|
||||
|
||||
@@ -309,9 +309,14 @@ static int cxd2820r_read_status(struct dvb_frontend *fe, fe_status_t *status)
|
||||
|
||||
static int cxd2820r_get_frontend(struct dvb_frontend *fe)
|
||||
{
|
||||
struct cxd2820r_priv *priv = fe->demodulator_priv;
|
||||
int ret;
|
||||
|
||||
dbg("%s: delsys=%d", __func__, fe->dtv_property_cache.delivery_system);
|
||||
|
||||
if (priv->delivery_system == SYS_UNDEFINED)
|
||||
return 0;
|
||||
|
||||
switch (fe->dtv_property_cache.delivery_system) {
|
||||
case SYS_DVBT:
|
||||
ret = cxd2820r_get_frontend_t(fe);
|
||||
@@ -476,10 +481,10 @@ static enum dvbfe_search cxd2820r_search(struct dvb_frontend *fe)
|
||||
dbg("%s: delsys=%d", __func__, fe->dtv_property_cache.delivery_system);
|
||||
|
||||
/* switch between DVB-T and DVB-T2 when tune fails */
|
||||
if (priv->last_tune_failed && (priv->delivery_system != SYS_DVBC_ANNEX_A)) {
|
||||
if (priv->last_tune_failed) {
|
||||
if (priv->delivery_system == SYS_DVBT)
|
||||
c->delivery_system = SYS_DVBT2;
|
||||
else
|
||||
else if (priv->delivery_system == SYS_DVBT2)
|
||||
c->delivery_system = SYS_DVBT;
|
||||
}
|
||||
|
||||
@@ -492,6 +497,7 @@ static enum dvbfe_search cxd2820r_search(struct dvb_frontend *fe)
|
||||
/* frontend lock wait loop count */
|
||||
switch (priv->delivery_system) {
|
||||
case SYS_DVBT:
|
||||
case SYS_DVBC_ANNEX_A:
|
||||
i = 20;
|
||||
break;
|
||||
case SYS_DVBT2:
|
||||
|
||||
@@ -1195,7 +1195,7 @@ static int ds3000_set_frontend(struct dvb_frontend *fe)
|
||||
|
||||
for (i = 0; i < 30 ; i++) {
|
||||
ds3000_read_status(fe, &status);
|
||||
if (status && FE_HAS_LOCK)
|
||||
if (status & FE_HAS_LOCK)
|
||||
break;
|
||||
|
||||
msleep(10);
|
||||
|
||||
@@ -402,7 +402,7 @@ static int mb86a20s_get_modulation(struct mb86a20s_state *state,
|
||||
[2] = 0x8e, /* Layer C */
|
||||
};
|
||||
|
||||
if (layer > ARRAY_SIZE(reg))
|
||||
if (layer >= ARRAY_SIZE(reg))
|
||||
return -EINVAL;
|
||||
rc = mb86a20s_writereg(state, 0x6d, reg[layer]);
|
||||
if (rc < 0)
|
||||
@@ -435,7 +435,7 @@ static int mb86a20s_get_fec(struct mb86a20s_state *state,
|
||||
[2] = 0x8f, /* Layer C */
|
||||
};
|
||||
|
||||
if (layer > ARRAY_SIZE(reg))
|
||||
if (layer >= ARRAY_SIZE(reg))
|
||||
return -EINVAL;
|
||||
rc = mb86a20s_writereg(state, 0x6d, reg[layer]);
|
||||
if (rc < 0)
|
||||
@@ -470,7 +470,7 @@ static int mb86a20s_get_interleaving(struct mb86a20s_state *state,
|
||||
[2] = 0x90, /* Layer C */
|
||||
};
|
||||
|
||||
if (layer > ARRAY_SIZE(reg))
|
||||
if (layer >= ARRAY_SIZE(reg))
|
||||
return -EINVAL;
|
||||
rc = mb86a20s_writereg(state, 0x6d, reg[layer]);
|
||||
if (rc < 0)
|
||||
@@ -494,7 +494,7 @@ static int mb86a20s_get_segment_count(struct mb86a20s_state *state,
|
||||
[2] = 0x91, /* Layer C */
|
||||
};
|
||||
|
||||
if (layer > ARRAY_SIZE(reg))
|
||||
if (layer >= ARRAY_SIZE(reg))
|
||||
return -EINVAL;
|
||||
rc = mb86a20s_writereg(state, 0x6d, reg[layer]);
|
||||
if (rc < 0)
|
||||
|
||||
@@ -29,7 +29,6 @@
|
||||
#include <linux/delay.h>
|
||||
#include <linux/firmware.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/version.h>
|
||||
#include <asm/div64.h>
|
||||
|
||||
#include "dvb_frontend.h"
|
||||
|
||||
@@ -29,6 +29,7 @@
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#include <media/as3645a.h>
|
||||
#include <media/v4l2-ctrls.h>
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user