DVB-T2 stick

Message ID CANL0fFQuCDvt3d5qF=hRpHbK3AH2-Ke7tF9LnDaZNOj_4xqtkA@mail.gmail.com
State New
Headers show
Series
  • DVB-T2 stick
Related show

Commit Message

Gonsolo April 3, 2018, 10:25 a.m.
Hi!

The patch in the attachment makes it possible to use the Logilink
VG0022a DVB-T2 USB stick and watch TV (at least in Germany).
After patching and building the kernel it shows up with lsusb and I
used w_scan to scan for channels and vlc for watching.
The original patches were from Andreas Kemnade.

Maybe you want to include it in Ubuntu.

Thanks

Comments

Andreas Kemnade April 3, 2018, 5:14 p.m. | #1
Hi,

On Tue, 3 Apr 2018 12:25:20 +0200
Gonsolo <gonsolo@gmail.com> wrote:

> Hi!
> 
> The patch in the attachment makes it possible to use the Logilink
> VG0022a DVB-T2 USB stick and watch TV (at least in Germany).
> After patching and building the kernel it shows up with lsusb and I
> used w_scan to scan for channels and vlc for watching.
> The original patches were from Andreas Kemnade.
> 
> Maybe you want to include it in Ubuntu.
> 
just for reference: the original patchset:
https://patchwork.linuxtv.org/patch/40089/

I will probably try to update and improve it.

Regards,
Andreas

Patch

diff --git a/drivers/media/tuners/si2157.c b/drivers/media/tuners/si2157.c
index e35b1faf0..9e953a331 100644
--- a/drivers/media/tuners/si2157.c
+++ b/drivers/media/tuners/si2157.c
@@ -84,7 +84,7 @@  static int si2157_init(struct dvb_frontend *fe)
 	struct si2157_cmd cmd;
 	const struct firmware *fw;
 	const char *fw_name;
-	unsigned int uitmp, chip_id;
+        unsigned int uitmp;
 
 	dev_dbg(&client->dev, "\n");
 
@@ -126,7 +126,7 @@  static int si2157_init(struct dvb_frontend *fe)
 		if (ret)
 			goto err;
 	}
-
+#if 0
 	/* query chip revision */
 	memcpy(cmd.args, "\x02", 1);
 	cmd.wlen = 1;
@@ -146,6 +146,8 @@  static int si2157_init(struct dvb_frontend *fe)
 	#define SI2141_A10 ('A' << 24 | 41 << 16 | '1' << 8 | '0' << 0)
 
 	switch (chip_id) {
+#endif
+        switch (dev->chip_id) {
 	case SI2158_A20:
 	case SI2148_A20:
 		fw_name = SI2158_A20_FIRMWARE;
@@ -166,9 +168,9 @@  static int si2157_init(struct dvb_frontend *fe)
 		goto err;
 	}
 
-	dev_info(&client->dev, "found a 'Silicon Labs Si21%d-%c%c%c'\n",
-			cmd.args[2], cmd.args[1], cmd.args[3], cmd.args[4]);
-
+//	dev_info(&client->dev, "found a 'Silicon Labs Si21%d-%c%c%c'\n",
+//			cmd.args[2], cmd.args[1], cmd.args[3], cmd.args[4]);
+//
 	if (fw_name == NULL)
 		goto skip_fw_download;
 
@@ -461,6 +463,38 @@  static int si2157_probe(struct i2c_client *client,
 	memcpy(&fe->ops.tuner_ops, &si2157_ops, sizeof(struct dvb_tuner_ops));
 	fe->tuner_priv = client;
 
+       /* power up */
+       if (dev->chiptype == SI2157_CHIPTYPE_SI2146) {
+               memcpy(cmd.args, "\xc0\x05\x01\x00\x00\x0b\x00\x00\x01", 9);
+               cmd.wlen = 9;
+       } else {
+               memcpy(cmd.args,
+               "\xc0\x00\x0c\x00\x00\x01\x01\x01\x01\x01\x01\x02\x00\x00\x01",
+               15);
+               cmd.wlen = 15;
+       }
+       cmd.rlen = 1;
+       ret = si2157_cmd_execute(client, &cmd);
+       if (ret)
+               goto err;
+       /* query chip revision */
+       /* hack: do it here because after the si2168 gets 0101, commands will
+        * still be executed here but no result
+        */
+       memcpy(cmd.args, "\x02", 1);
+       cmd.wlen = 1;
+       cmd.rlen = 13;
+       ret = si2157_cmd_execute(client, &cmd);
+       if (ret)
+               goto err_kfree;
+       dev->chip_id = cmd.args[1] << 24 |
+                       cmd.args[2] << 16 |
+                       cmd.args[3] << 8 |
+                       cmd.args[4] << 0;
+       dev_info(&client->dev, "found a 'Silicon Labs Si21%d-%c%c%c'\n",
+                       cmd.args[2], cmd.args[1], cmd.args[3], cmd.args[4]);
+ 
+
 #ifdef CONFIG_MEDIA_CONTROLLER
 	if (cfg->mdev) {
 		dev->mdev = cfg->mdev;
diff --git a/drivers/media/tuners/si2157_priv.h b/drivers/media/tuners/si2157_priv.h
index e6436f74a..966f20fec 100644
--- a/drivers/media/tuners/si2157_priv.h
+++ b/drivers/media/tuners/si2157_priv.h
@@ -30,6 +30,7 @@  struct si2157_dev {
 	u8 chiptype;
 	u8 if_port;
 	u32 if_frequency;
+        u32 chip_id;
 	struct delayed_work stat_work;
 
 #if defined(CONFIG_MEDIA_CONTROLLER)
@@ -44,6 +45,13 @@  struct si2157_dev {
 #define SI2157_CHIPTYPE_SI2146 1
 #define SI2157_CHIPTYPE_SI2141 2
 
+#define SI2158_A20 ('A' << 24 | 58 << 16 | '2' << 8 | '0' << 0)
+#define SI2148_A20 ('A' << 24 | 48 << 16 | '2' << 8 | '0' << 0)
+#define SI2157_A30 ('A' << 24 | 57 << 16 | '3' << 8 | '0' << 0)
+#define SI2147_A30 ('A' << 24 | 47 << 16 | '3' << 8 | '0' << 0)
+#define SI2146_A10 ('A' << 24 | 46 << 16 | '1' << 8 | '0' << 0)
+#define SI2141_A10 ('A' << 24 | 41 << 16 | '1' << 8 | '0' << 0)
+
 /* firmware command struct */
 #define SI2157_ARGLEN      30
 struct si2157_cmd {
diff --git a/drivers/media/usb/dvb-usb-v2/af9035.c b/drivers/media/usb/dvb-usb-v2/af9035.c
index 4df9486e1..70ed61f09 100644
--- a/drivers/media/usb/dvb-usb-v2/af9035.c
+++ b/drivers/media/usb/dvb-usb-v2/af9035.c
@@ -1214,8 +1214,51 @@  static int it930x_frontend_attach(struct dvb_usb_adapter *adap)
 	struct si2168_config si2168_config;
 	struct i2c_adapter *adapter;
 
-	dev_dbg(&intf->dev, "adap->id=%d\n", adap->id);
-
+	//dev_dbg(&intf->dev, "adap->id=%d\n", adap->id);
+       dev_dbg(&intf->dev, "%s  adap->id=%d\n", __func__, adap->id);
+
+       /* I2C master bus 2 clock speed 300k */
+       ret = af9035_wr_reg(d, 0x00f6a7, 0x07);
+       if (ret < 0)
+               goto err;
+
+       /* I2C master bus 1,3 clock speed 300k */
+       ret = af9035_wr_reg(d, 0x00f103, 0x07);
+       if (ret < 0)
+               goto err;
+
+       /* set gpio11 low */
+       ret = af9035_wr_reg_mask(d, 0xd8d4, 0x01, 0x01);
+       if (ret < 0)
+               goto err;
+
+       ret = af9035_wr_reg_mask(d, 0xd8d5, 0x01, 0x01);
+       if (ret < 0)
+               goto err;
+
+       ret = af9035_wr_reg_mask(d, 0xd8d3, 0x01, 0x01);
+       if (ret < 0)
+               goto err;
+ 
+       /* Tuner enable using gpiot2_en, gpiot2_on and gpiot2_o (reset) */
+       ret = af9035_wr_reg_mask(d, 0xd8b8, 0x01, 0x01);
+       if (ret < 0)
+               goto err;
+
+       ret = af9035_wr_reg_mask(d, 0xd8b9, 0x01, 0x01);
+       if (ret < 0)
+               goto err;
+
+       ret = af9035_wr_reg_mask(d, 0xd8b7, 0x00, 0x01);
+       if (ret < 0)
+               goto err;
+
+       msleep(200);
+
+       ret = af9035_wr_reg_mask(d, 0xd8b7, 0x01, 0x01);
+       if (ret < 0)
+               goto err;
+ 
 	memset(&si2168_config, 0, sizeof(si2168_config));
 	si2168_config.i2c_adapter = &adapter;
 	si2168_config.fe = &adap->fe[0];
@@ -2124,6 +2167,8 @@  static const struct usb_device_id af9035_id_table[] = {
 	/* IT930x devices */
 	{ DVB_USB_DEVICE(USB_VID_ITETECH, USB_PID_ITETECH_IT9303,
 		&it930x_props, "ITE 9303 Generic", NULL) },
+        { DVB_USB_DEVICE(USB_VID_DEXATEK, 0x0100,
+                &it930x_props, "Logilink VG0022A", NULL) },
 	{ }
 };
 MODULE_DEVICE_TABLE(usb, af9035_id_table);