Skip to contentSkip to conversation

DViCO FusionHDTV DVB-T Dual Digital 4 (rev 2)

PATCH In review Anton Blanchard 2 participants 6 messages Aug 4, 2008 – Aug 10, 2008 Media (V4L/DVB)

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 DViCO FusionHDTV DVB-T Dual Digital 4 (rev 2)

Hi,

A number of people in Australia have bought the dual digital 4 only to find revision 2 contains a completely different chipset (DIBCOM DIB7070P).

I took a look at one this weekend. It has two Cypress FX2's hooked up to two DIB7070P's; I guess they took the previous design and bolted on the DIBCOM chips. This means it shares a lot with the cxusb driver as well as the dib0700 driver.

After some reverse engineering I've come up with the patch below which works for me (DVB-T reception and remote control). Right now I've copied bits of the dib0700 driver, I wonder if we need to consolidate that code in a shared dib7070 driver.

While I'm not downloading any firmware to the DIBCOM chips, I wonder if the dvb-usb-dib0700-1.10.fw firmware would be usable in this setup. I'm not even sure how Id go about downloading it yet (the Windows driver doesn't download any firmware).

Anton

linux/drivers/media/dvb/dvb-usb/dvb-usb-ids.h +1 -0
Index: v4l-dvb/linux/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
===================================================================
@@ -172,6 +172,7 @@
 #define USB_PID_DVICO_BLUEBIRD_DUAL_4			0xdb78
 #define USB_PID_DVICO_BLUEBIRD_DVB_T_NANO_2		0xdb70
 #define USB_PID_DVICO_BLUEBIRD_DVB_T_NANO_2_NFW_WARM	0xdb71
+#define USB_PID_DVICO_BLUEBIRD_DUAL_5			0xdb98
 #define USB_PID_DIGITALNOW_BLUEBIRD_DUAL_1_COLD		0xdb54
 #define USB_PID_DIGITALNOW_BLUEBIRD_DUAL_1_WARM		0xdb55
 #define USB_PID_MEDION_MD95700				0x0932
linux/drivers/media/dvb/dvb-usb/cxusb.c +204 -0

240 lines not on this page · raw message

linux/drivers/media/dvb/frontends/dib7000p.c +2 -1
Index: v4l-dvb/linux/drivers/media/dvb/frontends/dib7000p.c
===================================================================
@@ -1359,7 +1359,8 @@
 	/* Ensure the output mode remains at the previous default if it's
 	 * not specifically set by the caller.
 	 */
-	if (st->cfg.output_mode != OUTMODE_MPEG2_SERIAL)
+	if ((st->cfg.output_mode != OUTMODE_MPEG2_SERIAL) &&
+	    (st->cfg.output_mode != OUTMODE_MPEG2_PAR_GATED_CLK))
 		st->cfg.output_mode = OUTMODE_MPEG2_FIFO;
 
 	demod                   = &st->demod;

_______________________________________________
linux-dvb mailing list
[email protected]
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb

#1 lore raw
Quoted 7 lines · Anton Blanchard

A number of people in Australia have bought the dual digital 4 only to find revision 2 contains a completely different chipset (DIBCOM DIB7070P).

I took a look at one this weekend. It has two Cypress FX2's hooked up to two DIB7070P's; I guess they took the previous design and bolted on the DIBCOM chips. This means it shares a lot with the cxusb driver as well as the dib0700 driver.

Not really -- the only thing in common with the dib0700 driver is the fact that there are dib7070 demod / tuner chips.

Quoted 4 lines

After some reverse engineering I've come up with the patch below which works for me (DVB-T reception and remote control). Right now I've copied bits of the dib0700 driver, I wonder if we need to consolidate that code in a shared dib7070 driver.

Consolidating that code is a nice idea, however, it doesn't really pay in this instance. The code that you're talking about is actually the tuner & demod configuration, which is not the same for all devices. In this case, it is more trouble than it is worth to attempt to share this particular code. (it's a very small amount of code anyway, so no big loss there)

If you have patches in the future that centralize common code in a clean way, without breaking any other user of the dibcom drivers, then it can be dealt with separately -- these is no reason why this code can't be merged the way it is now.

Quoted 4 lines

While I'm not downloading any firmware to the DIBCOM chips, I wonder if the dvb-usb-dib0700-1.10.fw firmware would be usable in this setup. I'm not even sure how Id go about downloading it yet (the Windows driver doesn't download any firmware).

No -- the dib0700 firmware is for the dib0700 chip. The FusionHDTV Dual Digital 4 Rev 2 uses two cypress FX2's instead of any dib0700.

Please see some additional small comments inline, below:

linux/drivers/media/dvb/dvb-usb/dvb-usb-ids.h 2008-08-04 18:10:46.000000000 +1000 line 175

Quoted 9 lines

Index: v4l-dvb/linux/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
===================================================================

linux/drivers/media/dvb/dvb-usb/dvb-usb-ids.h 2008-08-04 18:10:46.000000000 +1000 renamed from linux/drivers/media/dvb/dvb-usb/dvb-usb-ids.h 2008-08-04 18:10:30.000000000 +1000 +1 -0
@@ -172,6 +172,7 @@
 #define USB_PID_DVICO_BLUEBIRD_DUAL_4                  0xdb78
 #define USB_PID_DVICO_BLUEBIRD_DVB_T_NANO_2            0xdb70
 #define USB_PID_DVICO_BLUEBIRD_DVB_T_NANO_2_NFW_WARM   0xdb71
+#define USB_PID_DVICO_BLUEBIRD_DUAL_5                  0xdb98

Bluebird Dual 5 is a different device that is not related to the DUAL 4 rev2 -- please rename this to something more appropriate, like "USB_PID_DVICO_BLUEBIRD_DUAL_4_REV_2"

Quoted 52 lines
linux/drivers/media/dvb/dvb-usb/dvb-usb-ids.h 2008-08-04 18:10:46.000000000 +1000 renamed from linux/drivers/media/dvb/dvb-usb/dvb-usb-ids.h 2008-08-04 18:10:30.000000000 +1000 +0 -0
 #define USB_PID_DIGITALNOW_BLUEBIRD_DUAL_1_COLD                0xdb54
 #define USB_PID_DIGITALNOW_BLUEBIRD_DUAL_1_WARM                0xdb55
 #define USB_PID_MEDION_MD95700                         0x0932

Index: v4l-dvb/linux/drivers/media/dvb/dvb-usb/cxusb.c
===================================================================

linux/drivers/media/dvb/dvb-usb/cxusb.c 2008-08-04 21:30:20.000000000 +1000 renamed from linux/drivers/media/dvb/dvb-usb/cxusb.c 2008-08-04 18:10:30.000000000 +1000 +34 -0
@@ -36,6 +36,8 @@
 #include "tuner-xc2028.h"
 #include "tuner-simple.h"
 #include "mxl5005s.h"
+#include "dib7000p.h"
+#include "dib0070.h"
 
 /* debug */
 static int dvb_usb_cxusb_debug;
@@ -725,6 +727,155 @@
       return 0;
 }
 
+/* XXX Copied from dib0700, need to share the original */
+/* DIB7070 generic */
+static struct dibx000_agc_config dib7070_agc_config = {
+       BAND_UHF | BAND_VHF | BAND_LBAND | BAND_SBAND,
+       /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=5, P_agc_inv_pwm1=0, P_agc_inv_pwm2=0,
+        * P_agc_inh_dc_rv_est=0, P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=5, P_agc_write=0 */
+       (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8) | (3 << 5) | (0 << 4) | (5 << 1) | (0 << 0), // setup
+
+       600, // inv_gain
+       10,  // time_stabiliz
+
+       0,  // alpha_level
+       118,  // thlock
+
+       0,     // wbd_inv
+       3530,  // wbd_ref
+       1,     // wbd_sel
+       5,     // wbd_alpha
+
+       65535,  // agc1_max
+               0,  // agc1_min
+
+       65535,  // agc2_max
+       0,      // agc2_min
+
+       0,      // agc1_pt1
+       40,     // agc1_pt2
+       183,    // agc1_pt3
+       206,    // agc1_slope1
+       255,    // agc1_slope2
+       72,     // agc2_pt1
+       152,    // agc2_pt2

linux/drivers/media/dvb/dvb-usb/cxusb.c 2008-08-04 21:30:20.000000000 +1000 line 771

Quoted 10 lines
linux/drivers/media/dvb/dvb-usb/cxusb.c 2008-08-04 21:30:20.000000000 +1000 renamed from linux/drivers/media/dvb/dvb-usb/cxusb.c 2008-08-04 18:10:30.000000000 +1000 +10 -0
+       88,     // agc2_slope1
+       90,     // agc2_slope2
+
+       17,  // alpha_mant
+       27,  // alpha_exp
+       23,  // beta_mant
+       51,  // beta_exp
+
+       0,  // perform_agc_softsplit
+};

Please convert all // comments to /* comments */ according to kernel codingstyle. Yes, I know you copied this code block, but it should be cleaned up before merge.

linux/drivers/media/dvb/dvb-usb/cxusb.c 2008-08-04 21:30:20.000000000 +1000 line 773

Quoted 2 lines
linux/drivers/media/dvb/dvb-usb/cxusb.c 2008-08-04 21:30:20.000000000 +1000 renamed from linux/drivers/media/dvb/dvb-usb/cxusb.c 2008-08-04 18:10:30.000000000 +1000 +2 -0
+
+/* XXX Copied from dib0700, need to share the original */

^^^^^^^^^ this comment is not necessary.

linux/drivers/media/dvb/dvb-usb/cxusb.c 2008-08-04 21:30:20.000000000 +1000 line 781

Quoted 8 lines
linux/drivers/media/dvb/dvb-usb/cxusb.c 2008-08-04 21:30:20.000000000 +1000 renamed from linux/drivers/media/dvb/dvb-usb/cxusb.c 2008-08-04 18:10:30.000000000 +1000 +8 -0
+static struct dibx000_bandwidth_config dib7070_bw_config_12_mhz = {
+       60000, 15000, // internal, sampling
+       1, 20, 3, 1, 0, // pll_cfg: prediv, ratio, range, reset, bypass
+       0, 0, 1, 1, 2, // misc: refdiv, bypclk_div, IO_CLK_en_core, ADClkSrc, modulo
+       (3 << 14) | (1 << 12) | (524 << 0), // sad_cfg: refsel, sel, freq_15k
+       (0 << 25) | 0, // ifreq = 0.000000 MHz
+       20452225, // timf
+       12000000, // xtal_hz

Again, please convert // comments to /* comments */

Quoted 17 lines
linux/drivers/media/dvb/dvb-usb/cxusb.c 2008-08-04 21:30:20.000000000 +1000 renamed from linux/drivers/media/dvb/dvb-usb/cxusb.c 2008-08-04 18:10:30.000000000 +1000 +17 -0
+};
+
+static struct dib7000p_config cxusb_dualdig4_rev2_config = {
+       .output_mode = OUTMODE_MPEG2_PAR_GATED_CLK,
+       .output_mpeg2_in_188_bytes = 1,
+
+       .agc_config_count = 1,
+       .agc = &dib7070_agc_config,
+       .bw  = &dib7070_bw_config_12_mhz,
+       .tuner_is_baseband = 1,
+       .spur_protect = 1,
+
+       .gpio_dir = 0xfcef,
+       .gpio_val = 0x0110,
+
+       .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
+

linux/drivers/media/dvb/dvb-usb/cxusb.c 2008-08-04 21:30:20.000000000 +1000 line 808

Quoted 10 lines
linux/drivers/media/dvb/dvb-usb/cxusb.c 2008-08-04 21:30:20.000000000 +1000 renamed from linux/drivers/media/dvb/dvb-usb/cxusb.c 2008-08-04 18:10:30.000000000 +1000 +10 -0
+       .hostbus_diversity = 1,
+};
+
+static int cxusb_dualdig4_rev2_frontend_attach(struct dvb_usb_adapter *adap)
+{
+       if (usb_set_interface(adap->dev->udev, 0, 1) < 0)
+               err("set interface failed");
+
+       /* XXX Needed? */
+       cxusb_ctrl_msg(adap->dev, CMD_DIGITAL, NULL, 0, NULL, 0);

Yes, you need to set digital mode, otherwise the bluebird firmware will be in an unknown state.

Quoted 27 lines
linux/drivers/media/dvb/dvb-usb/cxusb.c 2008-08-04 21:30:20.000000000 +1000 renamed from linux/drivers/media/dvb/dvb-usb/cxusb.c 2008-08-04 18:10:30.000000000 +1000 +27 -0
+
+       cxusb_bluebird_gpio_pulse(adap->dev, 0x02, 1);
+
+       dib7000p_i2c_enumeration(&adap->dev->i2c_adap, 1, 18,
+                                &cxusb_dualdig4_rev2_config);
+
+       if ((adap->fe = dvb_attach(dib7000p_attach,
+                                  &adap->dev->i2c_adap, 0x80,
+                                  &cxusb_dualdig4_rev2_config)) == NULL)
+               return -EIO;
+
+       return 0;
+}
+
+static int dib7070_tuner_reset(struct dvb_frontend *fe, int onoff)
+{
+       return dib7000p_set_gpio(fe, 8, 0, !onoff);
+}
+
+static int dib7070_tuner_sleep(struct dvb_frontend *fe, int onoff)
+{
+        return 0;
+}
+
+static struct dib0070_config dib7070p_dib0070_config = {
+       .i2c_address = DEFAULT_DIB0070_I2C_ADDRESS,
+       .reset = dib7070_tuner_reset,

linux/drivers/media/dvb/dvb-usb/cxusb.c 2008-08-04 21:30:20.000000000 +1000 line 845

Quoted 10 lines
linux/drivers/media/dvb/dvb-usb/cxusb.c 2008-08-04 21:30:20.000000000 +1000 renamed from linux/drivers/media/dvb/dvb-usb/cxusb.c 2008-08-04 18:10:30.000000000 +1000 +10 -0
+       .sleep = dib7070_tuner_sleep,
+       .clock_khz = 12000,
+       /* .clock_pad_drive = 4 */
+};
+
+struct dib0700_adapter_state {
+        int (*set_param_save) (struct dvb_frontend *, struct dvb_frontend_parameters *);
+};
+
+/* XXX Copied from dib0700, need to share the original */

^^^^^^^^^ this comment is not necessary.

Quoted 122 lines
linux/drivers/media/dvb/dvb-usb/cxusb.c 2008-08-04 21:30:20.000000000 +1000 renamed from linux/drivers/media/dvb/dvb-usb/cxusb.c 2008-08-04 18:10:30.000000000 +1000 +86 -0
+static int dib7070_set_param_override(struct dvb_frontend *fe,
+                                     struct dvb_frontend_parameters *fep)
+{
+       struct dvb_usb_adapter *adap = fe->dvb->priv;
+       struct dib0700_adapter_state *state = adap->priv;
+
+       u16 offset;
+       u8 band = BAND_OF_FREQUENCY(fep->frequency/1000);
+       switch (band) {
+               case BAND_VHF: offset = 950; break;
+               case BAND_UHF:
+               default: offset = 550; break;
+       }
+
+       dib7000p_set_wbd_ref(fe, offset + dib0070_wbd_offset(fe));
+
+       return state->set_param_save(fe, fep);
+}
+
+static int cxusb_dualdig4_tuner_attach(struct dvb_usb_adapter *adap)
+{
+        struct dib0700_adapter_state *st = adap->priv;
+        struct i2c_adapter *tun_i2c = dib7000p_get_i2c_master(adap->fe, DIBX000_I2C_INTERFACE_TUNER, 1);
+
+       if (dvb_attach(dib0070_attach, adap->fe, tun_i2c,
+           &dib7070p_dib0070_config) == NULL)
+               return -ENODEV;
+
+       st->set_param_save = adap->fe->ops.tuner_ops.set_params;
+       adap->fe->ops.tuner_ops.set_params = dib7070_set_param_override;
+       return 0;
+}
+
 static int cxusb_nano2_frontend_attach(struct dvb_usb_adapter *adap)
 {
       if (usb_set_interface(adap->dev->udev, 0, 1) < 0)
@@ -825,6 +976,7 @@
 static struct dvb_usb_device_properties cxusb_bluebird_lgz201_properties;
 static struct dvb_usb_device_properties cxusb_bluebird_dtt7579_properties;
 static struct dvb_usb_device_properties cxusb_bluebird_dualdig4_properties;
+static struct dvb_usb_device_properties cxusb_bluebird_dualdig4_rev2_properties;
 static struct dvb_usb_device_properties cxusb_bluebird_nano2_properties;
 static struct dvb_usb_device_properties cxusb_bluebird_nano2_needsfirmware_properties;
 static struct dvb_usb_device_properties cxusb_aver_a868r_properties;
@@ -844,6 +996,9 @@
                                    THIS_MODULE, NULL, adapter_nr) ||
           0 == dvb_usb_device_init(intf, &cxusb_bluebird_dualdig4_properties,
                                    THIS_MODULE, NULL, adapter_nr) ||
+           0 == dvb_usb_device_init(intf,
+                                    &cxusb_bluebird_dualdig4_rev2_properties,
+                                    THIS_MODULE, NULL, adapter_nr) ||
           0 == dvb_usb_device_init(intf, &cxusb_bluebird_nano2_properties,
                                    THIS_MODULE, NULL, adapter_nr) ||
           0 == dvb_usb_device_init(intf,
@@ -875,6 +1030,7 @@
       { USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_DVB_T_NANO_2) },
       { USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_DVB_T_NANO_2_NFW_WARM) },
       { USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_VOLAR_A868R) },
+       { USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_DUAL_5) },
       {}              /* Terminating entry */
 };
 MODULE_DEVICE_TABLE (usb, cxusb_table);
@@ -1180,6 +1336,54 @@
       }
 };
 
+static struct dvb_usb_device_properties cxusb_bluebird_dualdig4_rev2_properties = {
+       .caps = DVB_USB_IS_AN_I2C_ADAPTER,
+
+       .usb_ctrl         = CYPRESS_FX2,
+
+       .size_of_priv     = sizeof(struct cxusb_state),
+
+       .num_adapters = 1,
+       .adapter = {
+               {
+                       .streaming_ctrl   = cxusb_streaming_ctrl,
+                       .frontend_attach  = cxusb_dualdig4_rev2_frontend_attach,
+                       .tuner_attach     = cxusb_dualdig4_tuner_attach,
+                       .size_of_priv     = sizeof(struct dib0700_adapter_state),
+                       /* parameter for the MPEG2-data transfer */
+                       .stream = {
+                               .type = USB_BULK,
+                               .count = 7,
+                               .endpoint = 0x02,
+                               .u = {
+                                       .bulk = {
+                                               .buffersize = 4096,
+                                       }
+                               }
+                       },
+               },
+       },
+
+       .power_ctrl       = cxusb_bluebird_power_ctrl,
+
+       .i2c_algo         = &cxusb_i2c_algo,
+
+       .generic_bulk_ctrl_endpoint = 0x01,
+
+       .rc_interval      = 100,
+       .rc_key_map       = dvico_mce_rc_keys,
+       .rc_key_map_size  = ARRAY_SIZE(dvico_mce_rc_keys),
+       .rc_query         = cxusb_rc_query,
+
+       .num_device_descs = 1,
+       .devices = {
+               {   "DViCO FusionHDTV DVB-T Dual Digital 4 (rev 2)",
+                       { NULL },
+                       { &cxusb_table[17], NULL },
+               },
+       }
+};
+
 static struct dvb_usb_device_properties cxusb_bluebird_nano2_properties = {
       .caps = DVB_USB_IS_AN_I2C_ADAPTER,
 

Index: v4l-dvb/linux/drivers/media/dvb/frontends/dib7000p.c
===================================================================

linux/drivers/media/dvb/frontends/dib7000p.c 2008-08-04 18:10:46.000000000 +1000 line 1364

Quoted 7 lines
linux/drivers/media/dvb/frontends/dib7000p.c 2008-08-04 18:10:46.000000000 +1000 renamed from linux/drivers/media/dvb/frontends/dib7000p.c 2008-08-04 18:10:30.000000000 +1000 +2 -1
@@ -1359,7 +1359,8 @@
       /* Ensure the output mode remains at the previous default if it's
        * not specifically set by the caller.
        */
-       if (st->cfg.output_mode != OUTMODE_MPEG2_SERIAL)
+       if ((st->cfg.output_mode != OUTMODE_MPEG2_SERIAL) &&
+           (st->cfg.output_mode != OUTMODE_MPEG2_PAR_GATED_CLK))
               st->cfg.output_mode = OUTMODE_MPEG2_FIFO;

There doesnt look to be anything wrong with this, but I don't know very much about this -- why is this needed? Have you tested on other devices that use dib7000p to confirm that it doesn't break anything?

linux/drivers/media/dvb/frontends/dib7000p.c 2008-08-04 18:10:46.000000000 +1000 line 1366

Quoted 3 lines
linux/drivers/media/dvb/frontends/dib7000p.c 2008-08-04 18:10:46.000000000 +1000 renamed from linux/drivers/media/dvb/frontends/dib7000p.c 2008-08-04 18:10:30.000000000 +1000 +0 -0
       demod                   = &st->demod;
 

...and finally, after cleaning the patch up as per my comments above.... Please also provide your developer sign-off, so that your patch can be merged into the master repository.

Good work!

Regards,

Mike Krufky

_______________________________________________
linux-dvb mailing list
[email protected]
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb

#2 lore raw

Hi Mike,

Thanks for the review! I will incorporate your suggestions and get a new patch out in a day or so.

Quoted 10 lines
Quoted 10 lines

Index: v4l-dvb/linux/drivers/media/dvb/frontends/dib7000p.c
===================================================================

linux/drivers/media/dvb/frontends/dib7000p.c 2008-08-04 18:10:46.000000000 +1000 renamed from linux/drivers/media/dvb/frontends/dib7000p.c 2008-08-04 18:10:30.000000000 +1000 +1 -1
@@ -1359,7 +1359,8 @@
       /* Ensure the output mode remains at the previous default if it's
        * not specifically set by the caller.
        */
-       if (st->cfg.output_mode != OUTMODE_MPEG2_SERIAL)
+       if ((st->cfg.output_mode != OUTMODE_MPEG2_SERIAL) &&
Quoted 8 lines

linux/drivers/media/dvb/frontends/dib7000p.c 2008-08-04 18:10:46.000000000 +1000 line 1364

Quoted 2 lines
linux/drivers/media/dvb/frontends/dib7000p.c 2008-08-04 18:10:46.000000000 +1000 renamed from linux/drivers/media/dvb/frontends/dib7000p.c 2008-08-04 18:10:30.000000000 +1000 +1 -0
+           (st->cfg.output_mode != OUTMODE_MPEG2_PAR_GATED_CLK))
               st->cfg.output_mode = OUTMODE_MPEG2_FIFO;

There doesnt look to be anything wrong with this, but I don't know very much about this -- why is this needed? Have you tested on other devices that use dib7000p to confirm that it doesn't break anything?

This got introduced with the patch to allow the output mode to be configured:

http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commitdiff;h=a38d6e37c0bc073bae5eff37c939978974ea9712

It looks to be making sure the patch didnt regress anything at the time. Unfortunately it means we always set it to OUTMODE_MPEG2_FIFO. The patch above just allows both OUTMODE_MPEG2_FIFO and OUTMODE_MPEG2_PAR_GATED_CLK to be set.

We could shuffle the output modes around and make 0 the default (OUTMODE_MPEG2_FIFO), or just go in and add initialise the output_mode field in all dib7000p based drivers.

Anton

_______________________________________________
linux-dvb mailing list
[email protected]
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb

#3 lore raw

PATCH 1/1 DViCO FusionHDTV DVB-T Dual Digital 4 (rev 2)

In reply to Michael Krufky

Add support for revision 2 of the DViCO FusionHDTV DVB-T Dual Digital 4 which has new tuners and demodulators (2 x DIB7070p). With this patch both DVB reception and IR works.

The dib7000p driver currently hardwires the output mode to OUTMODE_MPEG2_SERIAL regardless of what we ask for. Modify it to allow OUTMODE_MPEG2_PAR_GATED_CLK to be set. Longer term we should remove the check completely and set the output mode correctly in all the callers.

Add Kconfig bits to ensure the dib7000p and dib0070 modules are enabled. It would be nice to only do this for the !DVB_FE_CUSTOMISE case, but this is what the other DIB7070 module does (there are a number of module dependencies in the attach code).

---

linux/drivers/media/dvb/dvb-usb/dvb-usb-ids.h +1 -0
Index: v4l-dvb/linux/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
===================================================================
@@ -170,6 +170,7 @@
 #define USB_PID_DVICO_BLUEBIRD_DUAL_2_COLD		0xdb58
 #define USB_PID_DVICO_BLUEBIRD_DUAL_2_WARM		0xdb59
 #define USB_PID_DVICO_BLUEBIRD_DUAL_4			0xdb78
+#define USB_PID_DVICO_BLUEBIRD_DUAL_4_REV_2		0xdb98
 #define USB_PID_DVICO_BLUEBIRD_DVB_T_NANO_2		0xdb70
 #define USB_PID_DVICO_BLUEBIRD_DVB_T_NANO_2_NFW_WARM	0xdb71
 #define USB_PID_DIGITALNOW_BLUEBIRD_DUAL_1_COLD		0xdb54
linux/drivers/media/dvb/dvb-usb/cxusb.c +206 -0

242 lines not on this page · raw message

linux/drivers/media/dvb/frontends/dib7000p.c +2 -1
Index: v4l-dvb/linux/drivers/media/dvb/frontends/dib7000p.c
===================================================================
@@ -1359,7 +1359,8 @@
 	/* Ensure the output mode remains at the previous default if it's
 	 * not specifically set by the caller.
 	 */
-	if (st->cfg.output_mode != OUTMODE_MPEG2_SERIAL)
+	if ((st->cfg.output_mode != OUTMODE_MPEG2_SERIAL) &&
+	    (st->cfg.output_mode != OUTMODE_MPEG2_PAR_GATED_CLK))
 		st->cfg.output_mode = OUTMODE_MPEG2_FIFO;
 
 	demod                   = &st->demod;
linux/drivers/media/dvb/dvb-usb/Kconfig +2 -0
Index: v4l-dvb/linux/drivers/media/dvb/dvb-usb/Kconfig
===================================================================
@@ -108,6 +108,8 @@
 	select MEDIA_TUNER_SIMPLE if !DVB_FE_CUSTOMISE
 	select MEDIA_TUNER_XC2028 if !DVB_FE_CUSTOMISE
 	select MEDIA_TUNER_MXL5005S if !DVB_FE_CUSTOMISE
+	select DVB_DIB7000P
+	select DVB_TUNER_DIB0070
 	help
 	  Say Y here to support the Conexant USB2.0 hybrid reference design.
 	  Currently, only DVB and ATSC modes are supported, analog mode

_______________________________________________
linux-dvb mailing list
[email protected]
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb

#4 lore raw
Quoted 9 lines · Anton Blanchard

Add support for revision 2 of the DViCO FusionHDTV DVB-T Dual Digital 4 which has new tuners and demodulators (2 x DIB7070p). With this patch both DVB reception and IR works.

The dib7000p driver currently hardwires the output mode to OUTMODE_MPEG2_SERIAL regardless of what we ask for. Modify it to allow OUTMODE_MPEG2_PAR_GATED_CLK to be set. Longer term we should remove the check completely and set the output mode correctly in all the callers.

Quoted 6 lines

Add Kconfig bits to ensure the dib7000p and dib0070 modules are enabled. It would be nice to only do this for the !DVB_FE_CUSTOMISE case, but this is what the other DIB7070 module does (there are a number of module dependencies in the attach code).

Anton,

I've applied your patch to my cxusb tree, with slight modifications. Please test the tree and confirm proper operation before I request a merge into the master branch.

http://linuxtv.org/hg/~mkrufky/cxusb

You'll notice that I fixed the dib0070.h and dib7000p.h headers to allow cxusb the option of using DVB_FE_CUSTOMIZE, but when these modules are selected, dvb-usb-cxusb is still static linked to them.

Perhaps we could put all of the dib7070p common setup into a dib7070p module, to centralize the duplicated code between dib0700 and cxusb. This could also help to remove the static links described above.

I started playing around with this idea -- If I make any progress, I'll post the tree and ask for testers.

I don't think that the static links are enough of a reason to hold this patch back from a merge. Hopefully we can find a solution before 2.6.28, but if we don't , it's no real harm done.

If you have any additional fixes / changes to make before this is merged into master, please generate them against this cxusb tree.

Regards,

Mike

_______________________________________________
linux-dvb mailing list
[email protected]
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb

#5 lore raw

Hi Mike,

Quoted 5 lines

I've applied your patch to my cxusb tree, with slight modifications. Please test the tree and confirm proper operation before I request a merge into the master branch.

http://linuxtv.org/hg/~mkrufky/cxusb

I just pulled and built this tree and it tested out OK.

Quoted 6 lines

Perhaps we could put all of the dib7070p common setup into a dib7070p module, to centralize the duplicated code between dib0700 and cxusb. This could also help to remove the static links described above.

I started playing around with this idea -- If I make any progress, I'll post the tree and ask for testers.

Sounds good. Thanks for all your help.

Anton

_______________________________________________
linux-dvb mailing list
[email protected]
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb