|
@@ -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
|
|
|
},
|
|
|
};
|
|
|
|