]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/commitdiff
V4L/DVB (9044): Add support for Pinnacle PCTV HD Pro 801e (ATSC only)
authorDevin Heitmueller <devin.heitmueller@gmail.com>
Mon, 8 Sep 2008 08:42:42 +0000 (05:42 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Sun, 12 Oct 2008 11:37:09 +0000 (09:37 -0200)
Add digital support for the Pinnacle PCTV HD Pro 801e (usb id 2304:023a)

Thanks to Patrick Boettcher <patrick.boettcher@desy.de> for providing new
firmware fixing the issue with the i2c that prevented the xc5000 from working.

Signed-off-by: Devin Heitmueller <devin.heitmueller@gmail.com>
Signed-off-by: Patrick Boettcher <pb@linuxtv.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/dvb/dvb-usb/dib0700.h
drivers/media/dvb/dvb-usb/dib0700_core.c
drivers/media/dvb/dvb-usb/dib0700_devices.c
drivers/media/dvb/dvb-usb/dvb-usb-ids.h

index cc0c51d82f2c344cf66da25e9aa848771b4085b4..739193943c17ccbabe5c6af9c1b4a1e3d77c4cc8 100644 (file)
@@ -42,6 +42,7 @@ struct dib0700_state {
        u8 rc_counter;
        u8 is_dib7000pc;
        u8 fw_use_new_i2c_api;
+       u8 disable_streaming_master_mode;
 };
 
 extern int dib0700_set_gpio(struct dvb_usb_device *, enum dib07x0_gpios gpio, u8 gpio_dir, u8 gpio_val);
index 4daac8642006c26ba18bf2903a714b28aacb946f..dd53cee3896de0d3857569ce08af9d39bc9d308d 100644 (file)
@@ -350,7 +350,12 @@ int dib0700_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff)
 
        b[0] = REQUEST_ENABLE_VIDEO;
        b[1] = (onoff << 4) | 0x00; /* this bit gives a kind of command, rather than enabling something or not */
-       b[2] = (0x01 << 4); /* Master mode */
+
+       if (st->disable_streaming_master_mode == 1)
+               b[2] = 0x00;
+       else
+               b[2] = (0x01 << 4); /* Master mode */
+
        b[3] = 0x00;
 
        deb_info("modifying (%d) streaming state for %d\n", onoff, adap->id);
index d08cd4562097c30780455722c23bb4583a31d099..7d9efd7021296038bd014967010a23a4f6286c15 100644 (file)
@@ -14,6 +14,8 @@
 #include "mt2060.h"
 #include "mt2266.h"
 #include "tuner-xc2028.h"
+#include "xc5000.h"
+#include "s5h1411.h"
 #include "dib0070.h"
 
 static int force_lna_activation;
@@ -1078,6 +1080,89 @@ static int stk7070pd_frontend_attach1(struct dvb_usb_adapter *adap)
        return adap->fe == NULL ? -ENODEV : 0;
 }
 
+/* S5H1411 */
+static struct s5h1411_config pinnacle_801e_config = {
+       .output_mode   = S5H1411_PARALLEL_OUTPUT,
+       .gpio          = S5H1411_GPIO_OFF,
+       .mpeg_timing   = S5H1411_MPEGTIMING_NONCONTINOUS_NONINVERTING_CLOCK,
+       .qam_if        = S5H1411_IF_44000,
+       .vsb_if        = S5H1411_IF_44000,
+       .inversion     = S5H1411_INVERSION_OFF,
+       .status_mode   = S5H1411_DEMODLOCKING
+};
+
+/* Pinnacle PCTV HD Pro 801e GPIOs map:
+   GPIO0  - currently unknown
+   GPIO1  - xc5000 tuner reset
+   GPIO2  - CX25843 sleep
+   GPIO3  - currently unknown
+   GPIO4  - currently unknown
+   GPIO6  - currently unknown
+   GPIO7  - currently unknown
+   GPIO9  - currently unknown
+   GPIO10 - CX25843 reset
+ */
+static int s5h1411_frontend_attach(struct dvb_usb_adapter *adap)
+{
+       struct dib0700_state *st = adap->dev->priv;
+
+       /* Make use of the new i2c functions from FW 1.20 */
+       st->fw_use_new_i2c_api = 1;
+
+       /* The s5h1411 requires the dib0700 to not be in master mode */
+       st->disable_streaming_master_mode = 1;
+
+       /* All msleep values taken from Windows USB trace */
+       dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 0);
+       dib0700_set_gpio(adap->dev, GPIO3, GPIO_OUT, 0);
+       dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
+       msleep(400);
+       dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
+       msleep(60);
+       dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
+       msleep(30);
+       dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
+       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, GPIO2, GPIO_OUT, 0);
+       msleep(30);
+
+       /* Put the CX25843 to sleep for now since we're in digital mode */
+       dib0700_set_gpio(adap->dev, GPIO2, GPIO_OUT, 1);
+
+       /* GPIOs are initialized, do the attach */
+       adap->fe = dvb_attach(s5h1411_attach, &pinnacle_801e_config,
+                             &adap->dev->i2c_adap);
+       return adap->fe == NULL ? -ENODEV : 0;
+}
+
+int dib0700_xc5000_tuner_callback(void *priv, int command, int arg)
+{
+       struct dvb_usb_adapter *adap = priv;
+
+       /* Reset the tuner */
+       dib0700_set_gpio(adap->dev, GPIO1, GPIO_OUT, 0);
+       msleep(330); /* from Windows USB trace */
+       dib0700_set_gpio(adap->dev, GPIO1, GPIO_OUT, 1);
+       msleep(330); /* from Windows USB trace */
+
+       return 0;
+}
+
+static struct xc5000_config s5h1411_xc5000_tunerconfig = {
+       .i2c_address      = 0x64,
+       .if_khz           = 5380,
+       .tuner_callback   = dib0700_xc5000_tuner_callback
+};
+
+static int xc5000_tuner_attach(struct dvb_usb_adapter *adap)
+{
+       return dvb_attach(xc5000_attach, adap->fe, &adap->dev->i2c_adap,
+                         &s5h1411_xc5000_tunerconfig, adap)
+               == NULL ? -ENODEV : 0;
+}
+
 /* DVB-USB and USB stuff follows */
 struct usb_device_id dib0700_usb_id_table[] = {
 /* 0 */        { USB_DEVICE(USB_VID_DIBCOM,    USB_PID_DIBCOM_STK7700P) },
@@ -1122,6 +1207,7 @@ struct usb_device_id dib0700_usb_id_table[] = {
        { USB_DEVICE(USB_VID_GIGABYTE,  USB_PID_GIGABYTE_U8000) },
        { USB_DEVICE(USB_VID_YUAN,      USB_PID_YUAN_STK7700PH) },
        { USB_DEVICE(USB_VID_ASUS,      USB_PID_ASUS_U3000H) },
+/* 40 */{ USB_DEVICE(USB_VID_PINNACLE,  USB_PID_PINNACLE_PCTV801E) },
        { 0 }           /* Terminating entry */
 };
 MODULE_DEVICE_TABLE(usb, dib0700_usb_id_table);
@@ -1442,6 +1528,31 @@ struct dvb_usb_device_properties dib0700_devices[] = {
                .rc_key_map       = dib0700_rc_keys,
                .rc_key_map_size  = ARRAY_SIZE(dib0700_rc_keys),
                .rc_query         = dib0700_rc_query
+       }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
+               .num_adapters = 1,
+               .adapter = {
+                       {
+                               .frontend_attach  = s5h1411_frontend_attach,
+                               .tuner_attach     = xc5000_tuner_attach,
+
+                               DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
+
+                               .size_of_priv = sizeof(struct
+                                               dib0700_adapter_state),
+                       },
+               },
+
+               .num_device_descs = 1,
+               .devices = {
+                       {   "Pinnacle PCTV HD Pro USB Stick",
+                               { &dib0700_usb_id_table[40], NULL },
+                               { NULL },
+                       },
+               },
+               .rc_interval      = DEFAULT_RC_INTERVAL,
+               .rc_key_map       = dib0700_rc_keys,
+               .rc_key_map_size  = ARRAY_SIZE(dib0700_rc_keys),
+               .rc_query         = dib0700_rc_query
        },
 };
 
index 8926db2fc489b446d09e20885519f22535ac3cbf..38a23be68dbc7c6b0fa17d3f586fd7ed95f3affd 100644 (file)
 #define USB_PID_PINNACLE_PCTV71E                       0x022b
 #define USB_PID_PINNACLE_PCTV72E                       0x0236
 #define USB_PID_PINNACLE_PCTV73E                       0x0237
+#define USB_PID_PINNACLE_PCTV801E                      0x023a
 #define USB_PID_PCTV_200E                              0x020e
 #define USB_PID_PCTV_400E                              0x020f
 #define USB_PID_PCTV_450E                              0x0222