summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--dvb-spec/ISDB-T_and_ISDB-Tsb_with_S2API250
-rw-r--r--linux/drivers/media/dvb/dvb-core/dvb_frontend.c314
-rw-r--r--linux/drivers/media/dvb/dvb-core/dvb_frontend.h26
-rw-r--r--linux/include/linux/dvb/frontend.h77
-rw-r--r--linux/include/linux/dvb/version.h2
5 files changed, 505 insertions, 164 deletions
diff --git a/dvb-spec/ISDB-T_and_ISDB-Tsb_with_S2API b/dvb-spec/ISDB-T_and_ISDB-Tsb_with_S2API
new file mode 100644
index 000000000..2d90df5bb
--- /dev/null
+++ b/dvb-spec/ISDB-T_and_ISDB-Tsb_with_S2API
@@ -0,0 +1,250 @@
+Changelog
+=========
+
+latest:
+v1.3 - 2009-08-05
+- added reference to ARIB TR-B14
+
+v1.2 - 2009-08-04
+- removed DTV_BANDWIDTH from being a necessary parameter - now optional
+
+v1.1 - 2009-08-04
+- added DTV_FREQUENCY as a necessary parameter
+
+v1.0 - 2009-08-03
+- initial draft
+
+Proposal
+========
+
+This document describes shortly what are the possible parameters in the Linux
+DVB-API called "S2API" and now DVB API 5 in order to tune an ISDB-T/ISDB-Tsb
+demodulator:
+
+This ISDB-T/ISDB-Tsb API extension should reflect all information
+needed to tune any ISDB-T/ISDB-Tsb hardware. Of course it is possible
+that some very sophisticated devices won't need certain parameters to
+tune.
+
+The information given here should help application writers to know how
+to handle ISDB-T and ISDB-Tsb hardware using the Linux DVB-API.
+
+The details given here about ISDB-T and ISDB-Tsb are just enough to
+basically show the dependencies between the needed parameter values,
+but surely some information is left out. For more detailed information
+see the following documents:
+
+- ARIB STD-B31 - "Transmission System for Digital Terrestrial
+ Television Broadcasting" and
+- ARIB TR-B14 - "Operational Guidelines for Digital Terrestrial
+ Television Broadcasting".
+
+In order to read this document one has to have some knowledge the
+channel structure in ISDB-T and ISDB-Tsb. I.e. it has to be known to
+the reader that an ISDB-T channel consists of 13 segments, that it can
+have up to 3 layer sharing those segments, and things like that.
+
+Parameters used by ISDB-T and ISDB-Tsb.
+
+Existing parameters
+===================
+
+a) DTV_FREQUENCY
+
+Central frequency of the channel.
+
+For ISDB-T the channels are usally 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.
+
+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.
+
+b) DTV_BANDWIDTH_HZ (optional)
+
+Possible values:
+
+For ISDB-T it should be always 6000000Hz (6MHz)
+For ISDB-Tsb it can vary depending on the number of connected segments
+
+Note: Hardware specific values might be given here, but standard
+applications should not bother to set a value to this field as
+standard demods are ignoring it anyway.
+
+Bandwidth in ISDB-T is fixed (6MHz) or can be easily derived from
+other parameters (DTV_ISDBT_SB_SEGMENT_IDX,
+DTV_ISDBT_SB_SEGMENT_COUNT).
+
+c) DTV_DELIVERY_SYSTEM
+
+Possible values: SYS_ISDBT
+
+d) DTV_TRANSMISSION_MODE
+
+ISDB-T supports three carrier/symbol-size: 8K, 4K, 2K. It is called
+'mode' in the standard: Mode 1 is 2K, mode 2 is 4K, mode 3 is 8K
+
+Possible values: TRANSMISSION_MODE_2K, TRANSMISSION_MODE_8K,
+ TRANSMISSION_MODE_AUTO, TRANSMISSION_MODE_4K
+
+If DTV_TRANSMISSION_MODE is set the TRANSMISSION_MODE_AUTO the
+hardware will try to find the correct FFT-size (if capable) and will
+use TMCC to fill in the missing parameters.
+
+TRANSMISSION_MODE_4K is added at the same time as the other new parameters.
+
+e) DTV_GUARD_INTERVAL
+
+Possible values: GUARD_INTERVAL_1_32, GUARD_INTERVAL_1_16, GUARD_INTERVAL_1_8,
+ GUARD_INTERVAL_1_4, GUARD_INTERVAL_AUTO
+
+If DTV_GUARD_INTERVAL is set the GUARD_INTERVAL_AUTO the hardware will
+try to find the correct guard interval (if capable) and will use TMCC to fill
+in the missing parameters.
+
+New parameters
+==============
+
+1. DTV_ISDBT_PARTIAL_RECEPTION (1b)
+
+If DTV_ISDBT_SOUND_BROADCASTING is '0' this bit-field represents whether
+the channel is in partial reception mode or not.
+
+If '1' DTV_ISDBT_LAYERA_* values are assigned to the center segment and
+DTV_ISDBT_LAYERA_SEGMENT_COUNT has to be '1'.
+
+If in addition DTV_ISDBT_SOUND_BROADCASTING is '1'
+DTV_ISDBT_PARTIAL_RECEPTION represents whether this ISDB-Tsb channel
+is consisting of one segment and layer or three segments and two layers.
+
+Possible values: 0, 1, -1 (AUTO)
+
+2. DTV_ISDBT_SOUND_BROADCASTING (1b)
+
+This field represents whether the other DTV_ISDBT_*-parameters are
+referring to an ISDB-T and an ISDB-Tsb channel. (See also
+DTV_ISDBT_PARTIAL_RECEPTION).
+
+Possible values: 0, 1, -1 (AUTO)
+
+3. DTV_ISDBT_SB_SUBCHANNEL_ID
+
+This field only applies if DTV_ISDBT_SOUND_BROADCASTING is '1'.
+
+(Note of the author: This might not be the correct description of the
+ SUBCHANNEL-ID in all details, but it is my understanding of the technical
+ background needed to program a device)
+
+An ISDB-Tsb channel (1 or 3 segments) can be broadcasted alone or in a
+set of connected ISDB-Tsb channels. In this set of channels every
+channel can be received independently. The number of connected
+ISDB-Tsb segment can vary, e.g. depending on the frequency spectrum
+bandwidth available.
+
+Example: Assume 8 ISDB-Tsb connected segments are broadcasted. The
+broadcaster has several possibilities to put those channels in the
+air: Assuming a normal 13-segment ISDB-T spectrum he can align the 8
+segments from position 1-8 to 5-13 or anything in between.
+
+The underlying layer of segments are subchannels: each segment is
+consisting of several subchannels with a predefined IDs. A sub-channel
+is used to help the demodulator to synchronize on the channel.
+
+An ISDB-T channel is always centered over all sub-channels. As for
+the example above, in ISDB-Tsb it is no longer as simple as that.
+
+The DTV_ISDBT_SB_SUBCHANNEL_ID parameter is used to give the
+sub-channel ID of the segment to be demodulated.
+
+Possible values: 0 .. 41, -1 (AUTO)
+
+4. DTV_ISDBT_SB_SEGMENT_IDX
+
+This field only applies if DTV_ISDBT_SOUND_BROADCASTING is '1'.
+
+DTV_ISDBT_SB_SEGMENT_IDX gives the index of the segment to be
+demodulated for an ISDB-Tsb channel where several of them are
+transmitted in the connected manner.
+
+Possible values: 0 .. DTV_ISDBT_SB_SEGMENT_COUNT-1
+
+Note: This value cannot be determined by an automatic channel search.
+
+5. DTV_ISDBT_SB_SEGMENT_COUNT
+
+This field only applies if DTV_ISDBT_SOUND_BROADCASTING is '1'.
+
+DTV_ISDBT_SB_SEGMENT_COUNT gives the total count of connected ISDB-Tsb
+channels.
+
+Possible values: 1 .. 13
+
+Note: This value cannot be determined by an automatic channel search.
+
+6. Hierarchical layers
+
+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.
+
+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.
+
+6.1 DTV_ISDBT_LAYER_ENABLED (3b)
+
+Hierarchical reception in ISDB-T is achieved by enabling or disabling
+layers in the decoding process. Setting all bits of
+DTV_ISDBT_LAYER_ENABLED to '1' forces all layers (if applicable) to be
+demodulated. This is the default.
+
+If the channel is in the partial reception mode
+(DTV_ISDBT_PARTIAL_RECEPTION=1) the central segment can be decoded
+independently of the other 12 segments. In that mode layer A has to
+have a SEGMENT_COUNT of 1.
+
+In ISDB-Tsb only layer A is used, it can be 1 or 3 in ISDB-Tsb
+according to DTV_ISDBT_PARTIAL_RECEPTION. SEGMENT_COUNT must be filled
+accordingly.
+
+Possible values: 0x1, 0x2, 0x4 (|-able)
+
+DTV_ISDBT_LAYER_ENABLED[0:0] - layer A
+DTV_ISDBT_LAYER_ENABLED[1:1] - layer B
+DTV_ISDBT_LAYER_ENABLED[2:2] - layer C
+DTV_ISDBT_LAYER_ENABLED[31:3] unused
+
+6.2 DTV_ISDBT_LAYER*_FEC
+
+Possible values: FEC_AUTO, FEC_1_2, FEC_2_3, FEC_3_4, FEC_5_6, FEC_7_8,
+
+6.3 DTV_ISDBT_LAYER*_MODULATION
+
+Possible values: QAM_AUTO, QPSK, QAM_16, QAM_64, DQPSK
+
+Note: If layer C is DQPSK layer B has to be DQPSK. If layer B is DQPSK
+and DTV_ISDBT_PARTIAL_RECEPTION=0 layer has to be DQPSK.
+
+6.4 DTV_ISDBT_LAYER*_SEGMENT_COUNT
+
+Possible values: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, -1 (AUTO)
+
+Note: Truth table for DTV_ISDBT_SOUND_BROADCASTING and
+DTV_ISDBT_PARTIAL_RECEPTION and LAYER*_SEGMENT_COUNT
+
+ PR | SB || layer A width | layer B width | layer C width | total
+----+----++---------------+---------------+---------------+-------
+ 0 | 0 || 1 .. 13 | 1 .. 13 | 1..13 | 13
+ 1 | 0 || 1 | 1 .. 13 | 1..13 | 13
+ 0 | 1 || 1 | 0 | 0 | 1
+ 1 | 1 || 1 | 2 | 0 | 3
+
+
+6.5 DTV_ISDBT_LAYER*_TIME_INTERLEAVING
+
+Possible values: 0, 1, 2, 3, -1 (AUTO)
+
+Note: The real inter-leaver depth-names depend on the mode (fft-size); the values
+here are referring to what can be found in the TMCC-structure -
+independent of the mode.
diff --git a/linux/drivers/media/dvb/dvb-core/dvb_frontend.c b/linux/drivers/media/dvb/dvb-core/dvb_frontend.c
index 41166d407..6f3491599 100644
--- a/linux/drivers/media/dvb/dvb-core/dvb_frontend.c
+++ b/linux/drivers/media/dvb/dvb-core/dvb_frontend.c
@@ -837,6 +837,49 @@ static int dvb_frontend_check_parameters(struct dvb_frontend *fe,
return 0;
}
+static int dvb_frontend_clear_cache(struct dvb_frontend *fe)
+{
+ int i;
+
+ memset(&(fe->dtv_property_cache), 0,
+ sizeof(struct dtv_frontend_properties));
+
+ fe->dtv_property_cache.state = DTV_CLEAR;
+ fe->dtv_property_cache.delivery_system = SYS_UNDEFINED;
+ fe->dtv_property_cache.inversion = INVERSION_AUTO;
+ fe->dtv_property_cache.fec_inner = FEC_AUTO;
+ fe->dtv_property_cache.transmission_mode = TRANSMISSION_MODE_AUTO;
+ fe->dtv_property_cache.bandwidth_hz = BANDWIDTH_AUTO;
+ fe->dtv_property_cache.guard_interval = GUARD_INTERVAL_AUTO;
+ fe->dtv_property_cache.hierarchy = HIERARCHY_AUTO;
+ fe->dtv_property_cache.symbol_rate = QAM_AUTO;
+ fe->dtv_property_cache.code_rate_HP = FEC_AUTO;
+ fe->dtv_property_cache.code_rate_LP = FEC_AUTO;
+
+ fe->dtv_property_cache.isdbt_partial_reception = -1;
+ fe->dtv_property_cache.isdbt_sb_mode = -1;
+ fe->dtv_property_cache.isdbt_sb_subchannel = -1;
+ fe->dtv_property_cache.isdbt_sb_segment_idx = -1;
+ fe->dtv_property_cache.isdbt_sb_segment_count = -1;
+ fe->dtv_property_cache.isdbt_layer_enabled = 0x7;
+ for (i = 0; i < 3; i++) {
+ fe->dtv_property_cache.layer[i].fec = FEC_AUTO;
+ fe->dtv_property_cache.layer[i].modulation = QAM_AUTO;
+ fe->dtv_property_cache.layer[i].interleaving = -1;
+ fe->dtv_property_cache.layer[i].segment_count = -1;
+ }
+
+ return 0;
+}
+
+#define _DTV_CMD(n, s, b) \
+[n] = { \
+ .name = #n, \
+ .cmd = n, \
+ .set = s,\
+ .buffer = b \
+}
+
static struct dtv_cmds_h dtv_cmds[] = {
[DTV_TUNE] = {
.name = "DTV_TUNE",
@@ -916,18 +959,6 @@ static struct dtv_cmds_h dtv_cmds[] = {
.cmd = DTV_HIERARCHY,
.set = 1,
},
-#if 0
- [DTV_ISDB_SEGMENT_IDX] = {
- .name = "DTV_ISDB_SEGMENT_IDX",
- .cmd = DTV_ISDB_SEGMENT_IDX,
- .set = 1,
- },
- [DTV_ISDB_SEGMENT_WIDTH] = {
- .name = "DTV_ISDB_SEGMENT_WIDTH",
- .cmd = DTV_ISDB_SEGMENT_WIDTH,
- .set = 1,
- },
-#endif
[DTV_CODE_RATE_HP] = {
.name = "DTV_CODE_RATE_HP",
.cmd = DTV_CODE_RATE_HP,
@@ -948,6 +979,45 @@ static struct dtv_cmds_h dtv_cmds[] = {
.cmd = DTV_TRANSMISSION_MODE,
.set = 1,
},
+
+ _DTV_CMD(DTV_ISDBT_PARTIAL_RECEPTION, 1, 0),
+ _DTV_CMD(DTV_ISDBT_SOUND_BROADCASTING, 1, 0),
+ _DTV_CMD(DTV_ISDBT_SB_SUBCHANNEL_ID, 1, 0),
+ _DTV_CMD(DTV_ISDBT_SB_SEGMENT_IDX, 1, 0),
+ _DTV_CMD(DTV_ISDBT_SB_SEGMENT_COUNT, 1, 0),
+ _DTV_CMD(DTV_ISDBT_LAYER_ENABLED, 1, 0),
+ _DTV_CMD(DTV_ISDBT_LAYERA_FEC, 1, 0),
+ _DTV_CMD(DTV_ISDBT_LAYERA_MODULATION, 1, 0),
+ _DTV_CMD(DTV_ISDBT_LAYERA_SEGMENT_COUNT, 1, 0),
+ _DTV_CMD(DTV_ISDBT_LAYERA_TIME_INTERLEAVING, 1, 0),
+ _DTV_CMD(DTV_ISDBT_LAYERB_FEC, 1, 0),
+ _DTV_CMD(DTV_ISDBT_LAYERB_MODULATION, 1, 0),
+ _DTV_CMD(DTV_ISDBT_LAYERB_SEGMENT_COUNT, 1, 0),
+ _DTV_CMD(DTV_ISDBT_LAYERB_TIME_INTERLEAVING, 1, 0),
+ _DTV_CMD(DTV_ISDBT_LAYERC_FEC, 1, 0),
+ _DTV_CMD(DTV_ISDBT_LAYERC_MODULATION, 1, 0),
+ _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),
+
/* Get */
[DTV_DISEQC_SLAVE_REPLY] = {
.name = "DTV_DISEQC_SLAVE_REPLY",
@@ -955,53 +1025,7 @@ static struct dtv_cmds_h dtv_cmds[] = {
.set = 0,
.buffer = 1,
},
-#if 0
- [DTV_ISDB_LAYERA_FEC] = {
- .name = "DTV_ISDB_LAYERA_FEC",
- .cmd = DTV_ISDB_LAYERA_FEC,
- .set = 0,
- },
- [DTV_ISDB_LAYERA_MODULATION] = {
- .name = "DTV_ISDB_LAYERA_MODULATION",
- .cmd = DTV_ISDB_LAYERA_MODULATION,
- .set = 0,
- },
- [DTV_ISDB_LAYERA_SEGMENT_WIDTH] = {
- .name = "DTV_ISDB_LAYERA_SEGMENT_WIDTH",
- .cmd = DTV_ISDB_LAYERA_SEGMENT_WIDTH,
- .set = 0,
- },
- [DTV_ISDB_LAYERB_FEC] = {
- .name = "DTV_ISDB_LAYERB_FEC",
- .cmd = DTV_ISDB_LAYERB_FEC,
- .set = 0,
- },
- [DTV_ISDB_LAYERB_MODULATION] = {
- .name = "DTV_ISDB_LAYERB_MODULATION",
- .cmd = DTV_ISDB_LAYERB_MODULATION,
- .set = 0,
- },
- [DTV_ISDB_LAYERB_SEGMENT_WIDTH] = {
- .name = "DTV_ISDB_LAYERB_SEGMENT_WIDTH",
- .cmd = DTV_ISDB_LAYERB_SEGMENT_WIDTH,
- .set = 0,
- },
- [DTV_ISDB_LAYERC_FEC] = {
- .name = "DTV_ISDB_LAYERC_FEC",
- .cmd = DTV_ISDB_LAYERC_FEC,
- .set = 0,
- },
- [DTV_ISDB_LAYERC_MODULATION] = {
- .name = "DTV_ISDB_LAYERC_MODULATION",
- .cmd = DTV_ISDB_LAYERC_MODULATION,
- .set = 0,
- },
- [DTV_ISDB_LAYERC_SEGMENT_WIDTH] = {
- .name = "DTV_ISDB_LAYERC_SEGMENT_WIDTH",
- .cmd = DTV_ISDB_LAYERC_SEGMENT_WIDTH,
- .set = 0,
- },
-#endif
+
[DTV_API_VERSION] = {
.name = "DTV_API_VERSION",
.cmd = DTV_API_VERSION,
@@ -1211,14 +1235,21 @@ static void dtv_property_adv_params_sync(struct dvb_frontend *fe)
if(c->delivery_system == SYS_ISDBT) {
/* Fake out a generic DVB-T request so we pass validation in the ioctl */
p->frequency = c->frequency;
- p->inversion = INVERSION_AUTO;
+ p->inversion = c->inversion;
p->u.ofdm.constellation = QAM_AUTO;
p->u.ofdm.code_rate_HP = FEC_AUTO;
p->u.ofdm.code_rate_LP = FEC_AUTO;
- p->u.ofdm.bandwidth = BANDWIDTH_AUTO;
p->u.ofdm.transmission_mode = TRANSMISSION_MODE_AUTO;
p->u.ofdm.guard_interval = GUARD_INTERVAL_AUTO;
p->u.ofdm.hierarchy_information = HIERARCHY_AUTO;
+ if (c->bandwidth_hz == 8000000)
+ p->u.ofdm.bandwidth = BANDWIDTH_8_MHZ;
+ else if (c->bandwidth_hz == 7000000)
+ p->u.ofdm.bandwidth = BANDWIDTH_7_MHZ;
+ else if (c->bandwidth_hz == 6000000)
+ p->u.ofdm.bandwidth = BANDWIDTH_6_MHZ;
+ else
+ p->u.ofdm.bandwidth = BANDWIDTH_AUTO;
}
}
@@ -1296,42 +1327,6 @@ static int dtv_property_process_get(struct dvb_frontend *fe,
case DTV_DELIVERY_SYSTEM:
tvp->u.data = fe->dtv_property_cache.delivery_system;
break;
-#if 0
- /* ISDB-T Support here */
- case DTV_ISDB_SEGMENT_IDX:
- tvp->u.data = fe->dtv_property_cache.isdb_segment_idx;
- break;
- case DTV_ISDB_SEGMENT_WIDTH:
- tvp->u.data = fe->dtv_property_cache.isdb_segment_width;
- break;
- case DTV_ISDB_LAYERA_FEC:
- tvp->u.data = fe->dtv_property_cache.isdb_layera_fec;
- break;
- case DTV_ISDB_LAYERA_MODULATION:
- tvp->u.data = fe->dtv_property_cache.isdb_layera_modulation;
- break;
- case DTV_ISDB_LAYERA_SEGMENT_WIDTH:
- tvp->u.data = fe->dtv_property_cache.isdb_layera_segment_width;
- break;
- case DTV_ISDB_LAYERB_FEC:
- tvp->u.data = fe->dtv_property_cache.isdb_layerb_fec;
- break;
- case DTV_ISDB_LAYERB_MODULATION:
- tvp->u.data = fe->dtv_property_cache.isdb_layerb_modulation;
- break;
- case DTV_ISDB_LAYERB_SEGMENT_WIDTH:
- tvp->u.data = fe->dtv_property_cache.isdb_layerb_segment_width;
- break;
- case DTV_ISDB_LAYERC_FEC:
- tvp->u.data = fe->dtv_property_cache.isdb_layerc_fec;
- break;
- case DTV_ISDB_LAYERC_MODULATION:
- tvp->u.data = fe->dtv_property_cache.isdb_layerc_modulation;
- break;
- case DTV_ISDB_LAYERC_SEGMENT_WIDTH:
- tvp->u.data = fe->dtv_property_cache.isdb_layerc_segment_width;
- break;
-#endif
case DTV_VOLTAGE:
tvp->u.data = fe->dtv_property_cache.voltage;
break;
@@ -1356,6 +1351,62 @@ static int dtv_property_process_get(struct dvb_frontend *fe,
case DTV_HIERARCHY:
tvp->u.data = fe->dtv_property_cache.hierarchy;
break;
+
+ /* ISDB-T Support here */
+ case DTV_ISDBT_PARTIAL_RECEPTION:
+ tvp->u.data = fe->dtv_property_cache.isdbt_partial_reception;
+ break;
+ case DTV_ISDBT_SOUND_BROADCASTING:
+ tvp->u.data = fe->dtv_property_cache.isdbt_sb_mode;
+ break;
+ case DTV_ISDBT_SB_SUBCHANNEL_ID:
+ tvp->u.data = fe->dtv_property_cache.isdbt_sb_subchannel;
+ break;
+ case DTV_ISDBT_SB_SEGMENT_IDX:
+ tvp->u.data = fe->dtv_property_cache.isdbt_sb_segment_idx;
+ break;
+ case DTV_ISDBT_SB_SEGMENT_COUNT:
+ tvp->u.data = fe->dtv_property_cache.isdbt_sb_segment_count;
+ break;
+ case DTV_ISDBT_LAYER_ENABLED:
+ tvp->u.data = fe->dtv_property_cache.isdbt_layer_enabled;
+ break;
+ case DTV_ISDBT_LAYERA_FEC:
+ tvp->u.data = fe->dtv_property_cache.layer[0].fec;
+ break;
+ case DTV_ISDBT_LAYERA_MODULATION:
+ tvp->u.data = fe->dtv_property_cache.layer[0].modulation;
+ break;
+ case DTV_ISDBT_LAYERA_SEGMENT_COUNT:
+ tvp->u.data = fe->dtv_property_cache.layer[0].segment_count;
+ break;
+ case DTV_ISDBT_LAYERA_TIME_INTERLEAVING:
+ tvp->u.data = fe->dtv_property_cache.layer[0].interleaving;
+ break;
+ case DTV_ISDBT_LAYERB_FEC:
+ tvp->u.data = fe->dtv_property_cache.layer[1].fec;
+ break;
+ case DTV_ISDBT_LAYERB_MODULATION:
+ tvp->u.data = fe->dtv_property_cache.layer[1].modulation;
+ break;
+ case DTV_ISDBT_LAYERB_SEGMENT_COUNT:
+ tvp->u.data = fe->dtv_property_cache.layer[1].segment_count;
+ break;
+ case DTV_ISDBT_LAYERB_TIME_INTERLEAVING:
+ tvp->u.data = fe->dtv_property_cache.layer[1].interleaving;
+ break;
+ case DTV_ISDBT_LAYERC_FEC:
+ tvp->u.data = fe->dtv_property_cache.layer[2].fec;
+ break;
+ case DTV_ISDBT_LAYERC_MODULATION:
+ tvp->u.data = fe->dtv_property_cache.layer[2].modulation;
+ break;
+ case DTV_ISDBT_LAYERC_SEGMENT_COUNT:
+ tvp->u.data = fe->dtv_property_cache.layer[2].segment_count;
+ break;
+ case DTV_ISDBT_LAYERC_TIME_INTERLEAVING:
+ tvp->u.data = fe->dtv_property_cache.layer[2].interleaving;
+ break;
default:
r = -1;
}
@@ -1384,10 +1435,8 @@ static int dtv_property_process_set(struct dvb_frontend *fe,
/* Reset a cache of data specific to the frontend here. This does
* not effect hardware.
*/
+ dvb_frontend_clear_cache(fe);
dprintk("%s() Flushing property cache\n", __func__);
- memset(&fe->dtv_property_cache, 0, sizeof(struct dtv_frontend_properties));
- fe->dtv_property_cache.state = tvp->cmd;
- fe->dtv_property_cache.delivery_system = SYS_UNDEFINED;
break;
case DTV_TUNE:
/* interpret the cache of data, build either a traditional frontend
@@ -1428,15 +1477,6 @@ static int dtv_property_process_set(struct dvb_frontend *fe,
case DTV_DELIVERY_SYSTEM:
fe->dtv_property_cache.delivery_system = tvp->u.data;
break;
-#if 0
- /* ISDB-T Support here */
- case DTV_ISDB_SEGMENT_IDX:
- fe->dtv_property_cache.isdb_segment_idx = tvp->u.data;
- break;
- case DTV_ISDB_SEGMENT_WIDTH:
- fe->dtv_property_cache.isdb_segment_width = tvp->u.data;
- break;
-#endif
case DTV_VOLTAGE:
fe->dtv_property_cache.voltage = tvp->u.data;
r = dvb_frontend_ioctl_legacy(inode, file, FE_SET_VOLTAGE,
@@ -1462,6 +1502,62 @@ static int dtv_property_process_set(struct dvb_frontend *fe,
case DTV_HIERARCHY:
fe->dtv_property_cache.hierarchy = tvp->u.data;
break;
+
+ /* ISDB-T Support here */
+ case DTV_ISDBT_PARTIAL_RECEPTION:
+ fe->dtv_property_cache.isdbt_partial_reception = tvp->u.data;
+ break;
+ case DTV_ISDBT_SOUND_BROADCASTING:
+ fe->dtv_property_cache.isdbt_sb_mode = tvp->u.data;
+ break;
+ case DTV_ISDBT_SB_SUBCHANNEL_ID:
+ fe->dtv_property_cache.isdbt_sb_subchannel = tvp->u.data;
+ break;
+ case DTV_ISDBT_SB_SEGMENT_IDX:
+ fe->dtv_property_cache.isdbt_sb_segment_idx = tvp->u.data;
+ break;
+ case DTV_ISDBT_SB_SEGMENT_COUNT:
+ fe->dtv_property_cache.isdbt_sb_segment_count = tvp->u.data;
+ break;
+ case DTV_ISDBT_LAYER_ENABLED:
+ fe->dtv_property_cache.isdbt_layer_enabled = tvp->u.data;
+ break;
+ case DTV_ISDBT_LAYERA_FEC:
+ fe->dtv_property_cache.layer[0].fec = tvp->u.data;
+ break;
+ case DTV_ISDBT_LAYERA_MODULATION:
+ fe->dtv_property_cache.layer[0].modulation = tvp->u.data;
+ break;
+ case DTV_ISDBT_LAYERA_SEGMENT_COUNT:
+ fe->dtv_property_cache.layer[0].segment_count = tvp->u.data;
+ break;
+ case DTV_ISDBT_LAYERA_TIME_INTERLEAVING:
+ fe->dtv_property_cache.layer[0].interleaving = tvp->u.data;
+ break;
+ case DTV_ISDBT_LAYERB_FEC:
+ fe->dtv_property_cache.layer[1].fec = tvp->u.data;
+ break;
+ case DTV_ISDBT_LAYERB_MODULATION:
+ fe->dtv_property_cache.layer[1].modulation = tvp->u.data;
+ break;
+ case DTV_ISDBT_LAYERB_SEGMENT_COUNT:
+ fe->dtv_property_cache.layer[1].segment_count = tvp->u.data;
+ break;
+ case DTV_ISDBT_LAYERB_TIME_INTERLEAVING:
+ fe->dtv_property_cache.layer[1].interleaving = tvp->u.data;
+ break;
+ case DTV_ISDBT_LAYERC_FEC:
+ fe->dtv_property_cache.layer[2].fec = tvp->u.data;
+ break;
+ case DTV_ISDBT_LAYERC_MODULATION:
+ fe->dtv_property_cache.layer[2].modulation = tvp->u.data;
+ break;
+ case DTV_ISDBT_LAYERC_SEGMENT_COUNT:
+ fe->dtv_property_cache.layer[2].segment_count = tvp->u.data;
+ break;
+ case DTV_ISDBT_LAYERC_TIME_INTERLEAVING:
+ fe->dtv_property_cache.layer[2].interleaving = tvp->u.data;
+ break;
default:
r = -1;
}
diff --git a/linux/drivers/media/dvb/dvb-core/dvb_frontend.h b/linux/drivers/media/dvb/dvb-core/dvb_frontend.h
index cff26dd66..9e46f1772 100644
--- a/linux/drivers/media/dvb/dvb-core/dvb_frontend.h
+++ b/linux/drivers/media/dvb/dvb-core/dvb_frontend.h
@@ -341,20 +341,20 @@ struct dtv_frontend_properties {
fe_rolloff_t rolloff;
fe_delivery_system_t delivery_system;
-#if 0
+
/* ISDB-T specifics */
- u32 isdb_segment_idx;
- u32 isdb_segment_width;
- fe_code_rate_t isdb_layera_fec;
- fe_modulation_t isdb_layera_modulation;
- u32 isdb_layera_segment_width;
- fe_code_rate_t isdb_layerb_fec;
- fe_modulation_t isdb_layerb_modulation;
- u32 isdb_layerb_segment_width;
- fe_code_rate_t isdb_layerc_fec;
- fe_modulation_t isdb_layerc_modulation;
- u32 isdb_layerc_segment_width;
-#endif
+ u8 isdbt_partial_reception;
+ u8 isdbt_sb_mode;
+ u8 isdbt_sb_subchannel;
+ u32 isdbt_sb_segment_idx;
+ u32 isdbt_sb_segment_count;
+ u8 isdbt_layer_enabled;
+ struct {
+ u8 segment_count;
+ fe_code_rate_t fec;
+ fe_modulation_t modulation;
+ u8 interleaving;
+ } layer[3];
};
struct dvb_frontend {
diff --git a/linux/include/linux/dvb/frontend.h b/linux/include/linux/dvb/frontend.h
index 6a0405f65..25b01c147 100644
--- a/linux/include/linux/dvb/frontend.h
+++ b/linux/include/linux/dvb/frontend.h
@@ -173,7 +173,8 @@ typedef enum fe_modulation {
typedef enum fe_transmit_mode {
TRANSMISSION_MODE_2K,
TRANSMISSION_MODE_8K,
- TRANSMISSION_MODE_AUTO
+ TRANSMISSION_MODE_AUTO,
+ TRANSMISSION_MODE_4K
} fe_transmit_mode_t;
typedef enum fe_bandwidth {
@@ -268,46 +269,40 @@ struct dvb_frontend_event {
#define DTV_FE_CAPABILITY 16
#define DTV_DELIVERY_SYSTEM 17
-#if 0
-/* ISDB */
-/* maybe a dup of DTV_ISDB_SOUND_BROADCASTING_SUBCHANNEL_ID ??? */
-#define DTV_ISDB_SEGMENT_IDX 18
-/* 1, 3 or 13 ??? */
-#define DTV_ISDB_SEGMENT_WIDTH 19
-
-/* the central segment can be received independently or 1/3 seg in SB-mode */
-#define DTV_ISDB_PARTIAL_RECEPTION 20
-/* sound broadcasting is used 0 = 13segment, 1 = 1 or 3 see DTV_ISDB_PARTIAL_RECEPTION */
-#define DTV_ISDB_SOUND_BROADCASTING 21
-
-/* only used in SB */
-/* determines the initial PRBS of the segment (to match with 13seg channel) */
-#define DTV_ISDB_SOUND_BROADCASTING_SUBCHANNEL_ID 22
-
-#define DTV_ISDB_LAYERA_FEC 23
-#define DTV_ISDB_LAYERA_MODULATION 24
-#define DTV_ISDB_LAYERA_SEGMENT_WIDTH 25
-#define DTV_ISDB_LAYERA_TIME_INTERLEAVER 26
-
-#define DTV_ISDB_LAYERB_FEC 27
-#define DTV_ISDB_LAYERB_MODULATION 28
-#define DTV_ISDB_LAYERB_SEGMENT_WIDTH 29
-#define DTV_ISDB_LAYERB_TIME_INTERLEAVING 30
-
-#define DTV_ISDB_LAYERC_FEC 31
-#define DTV_ISDB_LAYERC_MODULATION 32
-#define DTV_ISDB_LAYERC_SEGMENT_WIDTH 33
-#define DTV_ISDB_LAYERC_TIME_INTERLEAVING 34
-#endif
-#define DTV_API_VERSION 35
-#define DTV_API_VERSION 35
-#define DTV_CODE_RATE_HP 36
-#define DTV_CODE_RATE_LP 37
-#define DTV_GUARD_INTERVAL 38
-#define DTV_TRANSMISSION_MODE 39
-#define DTV_HIERARCHY 40
-
-#define DTV_MAX_COMMAND DTV_HIERARCHY
+/* ISDB-T and ISDB-Tsb */
+#define DTV_ISDBT_PARTIAL_RECEPTION 18
+#define DTV_ISDBT_SOUND_BROADCASTING 19
+
+#define DTV_ISDBT_SB_SUBCHANNEL_ID 20
+#define DTV_ISDBT_SB_SEGMENT_IDX 21
+#define DTV_ISDBT_SB_SEGMENT_COUNT 22
+
+#define DTV_ISDBT_LAYERA_FEC 23
+#define DTV_ISDBT_LAYERA_MODULATION 24
+#define DTV_ISDBT_LAYERA_SEGMENT_COUNT 25
+#define DTV_ISDBT_LAYERA_TIME_INTERLEAVING 26
+
+#define DTV_ISDBT_LAYERB_FEC 27
+#define DTV_ISDBT_LAYERB_MODULATION 28
+#define DTV_ISDBT_LAYERB_SEGMENT_COUNT 29
+#define DTV_ISDBT_LAYERB_TIME_INTERLEAVING 30
+
+#define DTV_ISDBT_LAYERC_FEC 31
+#define DTV_ISDBT_LAYERC_MODULATION 32
+#define DTV_ISDBT_LAYERC_SEGMENT_COUNT 33
+#define DTV_ISDBT_LAYERC_TIME_INTERLEAVING 34
+
+#define DTV_API_VERSION 35
+
+#define DTV_CODE_RATE_HP 36
+#define DTV_CODE_RATE_LP 37
+#define DTV_GUARD_INTERVAL 38
+#define DTV_TRANSMISSION_MODE 39
+#define DTV_HIERARCHY 40
+
+#define DTV_ISDBT_LAYER_ENABLED 41
+
+#define DTV_MAX_COMMAND DTV_ISDBT_LAYER_ENABLED
typedef enum fe_pilot {
PILOT_ON,
diff --git a/linux/include/linux/dvb/version.h b/linux/include/linux/dvb/version.h
index 25b823b81..540b0583d 100644
--- a/linux/include/linux/dvb/version.h
+++ b/linux/include/linux/dvb/version.h
@@ -24,6 +24,6 @@
#define _DVBVERSION_H_
#define DVB_API_VERSION 5
-#define DVB_API_VERSION_MINOR 0
+#define DVB_API_VERSION_MINOR 1
#endif /*_DVBVERSION_H_*/