|
@@ -60,6 +60,17 @@ struct it913x_state {
|
|
u8 id;
|
|
u8 id;
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+struct ite_config {
|
|
|
|
+ u8 chip_ver;
|
|
|
|
+ u16 chip_type;
|
|
|
|
+ u32 firmware;
|
|
|
|
+ u8 tuner_id_0;
|
|
|
|
+ u8 tuner_id_1;
|
|
|
|
+ u8 dual_mode;
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+struct ite_config it913x_config;
|
|
|
|
+
|
|
static int it913x_bulk_write(struct usb_device *dev,
|
|
static int it913x_bulk_write(struct usb_device *dev,
|
|
u8 *snd, int len, u8 pipe)
|
|
u8 *snd, int len, u8 pipe)
|
|
{
|
|
{
|
|
@@ -191,18 +202,23 @@ static int it913x_read_reg(struct usb_device *udev, u32 reg)
|
|
static u32 it913x_query(struct usb_device *udev, u8 pro)
|
|
static u32 it913x_query(struct usb_device *udev, u8 pro)
|
|
{
|
|
{
|
|
int ret;
|
|
int ret;
|
|
- u32 res = 0;
|
|
|
|
u8 data[4];
|
|
u8 data[4];
|
|
ret = it913x_io(udev, READ_LONG, pro, CMD_DEMOD_READ,
|
|
ret = it913x_io(udev, READ_LONG, pro, CMD_DEMOD_READ,
|
|
- 0x1222, 0, &data[0], 1);
|
|
|
|
- if (data[0] == 0x1) {
|
|
|
|
- ret = it913x_io(udev, READ_SHORT, pro,
|
|
|
|
|
|
+ 0x1222, 0, &data[0], 3);
|
|
|
|
+
|
|
|
|
+ it913x_config.chip_ver = data[0];
|
|
|
|
+ it913x_config.chip_type = (u16)(data[2] << 8) + data[1];
|
|
|
|
+
|
|
|
|
+ info("Chip Version=%02x Chip Type=%04x", it913x_config.chip_ver,
|
|
|
|
+ it913x_config.chip_type);
|
|
|
|
+
|
|
|
|
+ ret |= it913x_io(udev, READ_SHORT, pro,
|
|
CMD_QUERYINFO, 0, 0x1, &data[0], 4);
|
|
CMD_QUERYINFO, 0, 0x1, &data[0], 4);
|
|
- res = (data[0] << 24) + (data[1] << 16) +
|
|
|
|
|
|
+
|
|
|
|
+ it913x_config.firmware = (data[0] << 24) + (data[1] << 16) +
|
|
(data[2] << 8) + data[3];
|
|
(data[2] << 8) + data[3];
|
|
- }
|
|
|
|
|
|
|
|
- return (ret < 0) ? 0 : res;
|
|
|
|
|
|
+ return (ret < 0) ? 0 : it913x_config.firmware;
|
|
}
|
|
}
|
|
|
|
|
|
static int it913x_pid_filter_ctrl(struct dvb_usb_adapter *adap, int onoff)
|
|
static int it913x_pid_filter_ctrl(struct dvb_usb_adapter *adap, int onoff)
|
|
@@ -336,26 +352,35 @@ static int it913x_identify_state(struct usb_device *udev,
|
|
int *cold)
|
|
int *cold)
|
|
{
|
|
{
|
|
int ret = 0, firm_no;
|
|
int ret = 0, firm_no;
|
|
- u8 reg, adap, ep, tun0, tun1;
|
|
|
|
|
|
+ u8 reg, remote;
|
|
|
|
|
|
firm_no = it913x_return_status(udev);
|
|
firm_no = it913x_return_status(udev);
|
|
|
|
|
|
- ep = it913x_read_reg(udev, 0x49ac);
|
|
|
|
- adap = it913x_read_reg(udev, 0x49c5);
|
|
|
|
- tun0 = it913x_read_reg(udev, 0x49d0);
|
|
|
|
- info("No. Adapters=%x Endpoints=%x Tuner Type=%x", adap, ep, tun0);
|
|
|
|
|
|
+ /* checnk for dual mode */
|
|
|
|
+ it913x_config.dual_mode = it913x_read_reg(udev, 0x49c5);
|
|
|
|
+
|
|
|
|
+ /* TODO different remotes */
|
|
|
|
+ remote = it913x_read_reg(udev, 0x49ac); /* Remote */
|
|
|
|
+ if (remote == 0)
|
|
|
|
+ props->rc.core.rc_codes = NULL;
|
|
|
|
+
|
|
|
|
+ /* TODO at the moment tuner_id is always assigned to 0x38 */
|
|
|
|
+ it913x_config.tuner_id_0 = it913x_read_reg(udev, 0x49d0);
|
|
|
|
+
|
|
|
|
+ info("Dual mode=%x Remote=%x Tuner Type=%x", it913x_config.dual_mode
|
|
|
|
+ , remote, it913x_config.tuner_id_0);
|
|
|
|
|
|
if (firm_no > 0) {
|
|
if (firm_no > 0) {
|
|
*cold = 0;
|
|
*cold = 0;
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
- if (adap > 2) {
|
|
|
|
- tun1 = it913x_read_reg(udev, 0x49e0);
|
|
|
|
|
|
+ if (it913x_config.dual_mode) {
|
|
|
|
+ it913x_config.tuner_id_1 = it913x_read_reg(udev, 0x49e0);
|
|
ret = it913x_wr_reg(udev, DEV_0, GPIOH1_EN, 0x1);
|
|
ret = it913x_wr_reg(udev, DEV_0, GPIOH1_EN, 0x1);
|
|
ret |= it913x_wr_reg(udev, DEV_0, GPIOH1_ON, 0x1);
|
|
ret |= it913x_wr_reg(udev, DEV_0, GPIOH1_ON, 0x1);
|
|
ret |= it913x_wr_reg(udev, DEV_0, GPIOH1_O, 0x1);
|
|
ret |= it913x_wr_reg(udev, DEV_0, GPIOH1_O, 0x1);
|
|
- msleep(50); /* Delay noticed reset cycle ? */
|
|
|
|
|
|
+ msleep(50);
|
|
ret |= it913x_wr_reg(udev, DEV_0, GPIOH1_O, 0x0);
|
|
ret |= it913x_wr_reg(udev, DEV_0, GPIOH1_O, 0x0);
|
|
msleep(50);
|
|
msleep(50);
|
|
reg = it913x_read_reg(udev, GPIOH1_O);
|
|
reg = it913x_read_reg(udev, GPIOH1_O);
|
|
@@ -366,14 +391,19 @@ static int it913x_identify_state(struct usb_device *udev,
|
|
ret = it913x_wr_reg(udev, DEV_0,
|
|
ret = it913x_wr_reg(udev, DEV_0,
|
|
GPIOH1_O, 0x0);
|
|
GPIOH1_O, 0x0);
|
|
}
|
|
}
|
|
|
|
+ props->num_adapters = 2;
|
|
} else
|
|
} else
|
|
props->num_adapters = 1;
|
|
props->num_adapters = 1;
|
|
|
|
|
|
reg = it913x_read_reg(udev, IO_MUX_POWER_CLK);
|
|
reg = it913x_read_reg(udev, IO_MUX_POWER_CLK);
|
|
|
|
|
|
- ret |= it913x_wr_reg(udev, DEV_0, 0x4bfb, CHIP2_I2C_ADDR);
|
|
|
|
-
|
|
|
|
- ret |= it913x_wr_reg(udev, DEV_0, CLK_O_EN, 0x1);
|
|
|
|
|
|
+ if (it913x_config.dual_mode) {
|
|
|
|
+ ret |= it913x_wr_reg(udev, DEV_0, 0x4bfb, CHIP2_I2C_ADDR);
|
|
|
|
+ ret |= it913x_wr_reg(udev, DEV_0, CLK_O_EN, 0x1);
|
|
|
|
+ } else {
|
|
|
|
+ ret |= it913x_wr_reg(udev, DEV_0, 0x4bfb, 0x0);
|
|
|
|
+ ret |= it913x_wr_reg(udev, DEV_0, CLK_O_EN, 0x0);
|
|
|
|
+ }
|
|
|
|
|
|
*cold = 1;
|
|
*cold = 1;
|
|
|
|
|
|
@@ -403,13 +433,11 @@ static int it913x_download_firmware(struct usb_device *udev,
|
|
const struct firmware *fw)
|
|
const struct firmware *fw)
|
|
{
|
|
{
|
|
int ret = 0, i;
|
|
int ret = 0, i;
|
|
- u8 packet_size, dlen, tun1;
|
|
|
|
|
|
+ u8 packet_size, dlen;
|
|
u8 *fw_data;
|
|
u8 *fw_data;
|
|
|
|
|
|
packet_size = 0x29;
|
|
packet_size = 0x29;
|
|
|
|
|
|
- tun1 = it913x_read_reg(udev, 0x49e0);
|
|
|
|
-
|
|
|
|
ret = it913x_wr_reg(udev, DEV_0, I2C_CLK, I2C_CLK_100);
|
|
ret = it913x_wr_reg(udev, DEV_0, I2C_CLK, I2C_CLK_100);
|
|
|
|
|
|
info("FRM Starting Firmware Download");
|
|
info("FRM Starting Firmware Download");
|
|
@@ -444,11 +472,12 @@ static int it913x_download_firmware(struct usb_device *udev,
|
|
ret |= it913x_wr_reg(udev, DEV_0, I2C_CLK, I2C_CLK_400);
|
|
ret |= it913x_wr_reg(udev, DEV_0, I2C_CLK, I2C_CLK_400);
|
|
|
|
|
|
/* Tuner function */
|
|
/* Tuner function */
|
|
- ret |= it913x_wr_reg(udev, DEV_0_DMOD , 0xec4c, 0xa0);
|
|
|
|
|
|
+ if (it913x_config.dual_mode)
|
|
|
|
+ ret |= it913x_wr_reg(udev, DEV_0_DMOD , 0xec4c, 0xa0);
|
|
|
|
|
|
ret |= it913x_wr_reg(udev, DEV_0, PADODPU, 0x0);
|
|
ret |= it913x_wr_reg(udev, DEV_0, PADODPU, 0x0);
|
|
ret |= it913x_wr_reg(udev, DEV_0, AGC_O_D, 0x0);
|
|
ret |= it913x_wr_reg(udev, DEV_0, AGC_O_D, 0x0);
|
|
- if (tun1 > 0) {
|
|
|
|
|
|
+ if (it913x_config.dual_mode) {
|
|
ret |= it913x_wr_reg(udev, DEV_1, PADODPU, 0x0);
|
|
ret |= it913x_wr_reg(udev, DEV_1, PADODPU, 0x0);
|
|
ret |= it913x_wr_reg(udev, DEV_1, AGC_O_D, 0x0);
|
|
ret |= it913x_wr_reg(udev, DEV_1, AGC_O_D, 0x0);
|
|
}
|
|
}
|
|
@@ -475,9 +504,28 @@ static int it913x_frontend_attach(struct dvb_usb_adapter *adap)
|
|
u8 adf = it913x_read_reg(udev, IO_MUX_POWER_CLK);
|
|
u8 adf = it913x_read_reg(udev, IO_MUX_POWER_CLK);
|
|
u8 adap_addr = I2C_BASE_ADDR + (adap->id << 5);
|
|
u8 adap_addr = I2C_BASE_ADDR + (adap->id << 5);
|
|
u16 ep_size = adap->props.fe[0].stream.u.bulk.buffersize;
|
|
u16 ep_size = adap->props.fe[0].stream.u.bulk.buffersize;
|
|
|
|
+ u8 tuner_id, tuner_type;
|
|
|
|
+
|
|
|
|
+ if (adap->id == 0)
|
|
|
|
+ tuner_id = it913x_config.tuner_id_0;
|
|
|
|
+ else
|
|
|
|
+ tuner_id = it913x_config.tuner_id_1;
|
|
|
|
+
|
|
|
|
+ /* TODO we always use IT9137 possible references here*/
|
|
|
|
+ /* Documentation suggests don't care */
|
|
|
|
+ switch (tuner_id) {
|
|
|
|
+ case 0x51:
|
|
|
|
+ case 0x52:
|
|
|
|
+ case 0x60:
|
|
|
|
+ case 0x61:
|
|
|
|
+ case 0x62:
|
|
|
|
+ default:
|
|
|
|
+ case 0x38:
|
|
|
|
+ tuner_type = IT9137;
|
|
|
|
+ }
|
|
|
|
|
|
adap->fe_adap[0].fe = dvb_attach(it913x_fe_attach,
|
|
adap->fe_adap[0].fe = dvb_attach(it913x_fe_attach,
|
|
- &adap->dev->i2c_adap, adap_addr, adf, IT9137);
|
|
|
|
|
|
+ &adap->dev->i2c_adap, adap_addr, adf, tuner_type);
|
|
|
|
|
|
if (adap->id == 0 && adap->fe_adap[0].fe) {
|
|
if (adap->id == 0 && adap->fe_adap[0].fe) {
|
|
ret = it913x_wr_reg(udev, DEV_0_DMOD, MP2_SW_RST, 0x1);
|
|
ret = it913x_wr_reg(udev, DEV_0_DMOD, MP2_SW_RST, 0x1);
|
|
@@ -533,6 +581,7 @@ static int it913x_probe(struct usb_interface *intf,
|
|
|
|
|
|
static struct usb_device_id it913x_table[] = {
|
|
static struct usb_device_id it913x_table[] = {
|
|
{ USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_UB499_2T_T09) },
|
|
{ USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_UB499_2T_T09) },
|
|
|
|
+ { USB_DEVICE(USB_VID_ITETECH, USB_PID_ITETECH_IT9135) },
|
|
{} /* Terminating entry */
|
|
{} /* Terminating entry */
|
|
};
|
|
};
|
|
|
|
|
|
@@ -608,12 +657,14 @@ static struct dvb_usb_device_properties it913x_properties = {
|
|
.rc_codes = RC_MAP_KWORLD_315U,
|
|
.rc_codes = RC_MAP_KWORLD_315U,
|
|
},
|
|
},
|
|
.i2c_algo = &it913x_i2c_algo,
|
|
.i2c_algo = &it913x_i2c_algo,
|
|
- .num_device_descs = 1,
|
|
|
|
|
|
+ .num_device_descs = 2,
|
|
.devices = {
|
|
.devices = {
|
|
{ "Kworld UB499-2T T09(IT9137)",
|
|
{ "Kworld UB499-2T T09(IT9137)",
|
|
{ &it913x_table[0], NULL },
|
|
{ &it913x_table[0], NULL },
|
|
},
|
|
},
|
|
-
|
|
|
|
|
|
+ { "ITE 9135 Generic",
|
|
|
|
+ { &it913x_table[1], NULL },
|
|
|
|
+ },
|
|
}
|
|
}
|
|
};
|
|
};
|
|
|
|
|
|
@@ -647,5 +698,5 @@ module_exit(it913x_module_exit);
|
|
|
|
|
|
MODULE_AUTHOR("Malcolm Priestley <tvboxspy@gmail.com>");
|
|
MODULE_AUTHOR("Malcolm Priestley <tvboxspy@gmail.com>");
|
|
MODULE_DESCRIPTION("it913x USB 2 Driver");
|
|
MODULE_DESCRIPTION("it913x USB 2 Driver");
|
|
-MODULE_VERSION("1.06");
|
|
|
|
|
|
+MODULE_VERSION("1.07");
|
|
MODULE_LICENSE("GPL");
|
|
MODULE_LICENSE("GPL");
|