mirror of
https://github.com/tbsdtv/linux_media.git
synced 2025-07-23 12:43:29 +02:00
media: dvb-frontends/gx1133: PLS support.
This commit is contained in:
@@ -744,7 +744,6 @@ static int gx1133_i2c_select(struct i2c_adapter *adap,
|
||||
struct gx1133_priv *priv = mux_priv;
|
||||
#endif
|
||||
int ret;
|
||||
u8 temp;
|
||||
u8 buf[3];
|
||||
struct i2c_msg msg_wr = {
|
||||
.addr = priv->cfg->i2c_address,
|
||||
@@ -1115,6 +1114,333 @@ static int gx1133_sleep(struct dvb_frontend *fe)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static u32 root_2_gold(u32 root)
|
||||
{
|
||||
int i;
|
||||
|
||||
for ( i = 0; i < 4096; i++ )
|
||||
{
|
||||
if ( root == 133647 )
|
||||
return 16384 - i;
|
||||
if ( root > 133647 )
|
||||
{
|
||||
if ( root == 187706 )
|
||||
return 77824 - i;
|
||||
if ( root > 187706 )
|
||||
{
|
||||
if ( root == 201999 )
|
||||
return 188416 - i;
|
||||
if ( root > 201999 )
|
||||
{
|
||||
if ( root == 241848 )
|
||||
return 237568 - i;
|
||||
if ( root > 241848 )
|
||||
{
|
||||
if ( root == 250156 )
|
||||
return 143360 - i;
|
||||
if ( root > 250156 )
|
||||
{
|
||||
if ( root == 252451 )
|
||||
return 249856 - i;
|
||||
if ( root == 255652 )
|
||||
return 135168 - i;
|
||||
}
|
||||
else if ( root == 250024 )
|
||||
{
|
||||
return 180224 - i;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
switch ( root )
|
||||
{
|
||||
case 218494:
|
||||
return 4096 - i;
|
||||
case 220394:
|
||||
return 118784 - i;
|
||||
case 204289:
|
||||
return 221184 - i;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( root == 191286 )
|
||||
return 151552 - i;
|
||||
if ( root > 191286 )
|
||||
{
|
||||
switch ( root )
|
||||
{
|
||||
case 200200:
|
||||
return 28672 - i;
|
||||
case 200201:
|
||||
return 73728 - i;
|
||||
case 194133:
|
||||
return 176128 - i;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
switch ( root )
|
||||
{
|
||||
case 190045:
|
||||
return 102400 - i;
|
||||
case 190773:
|
||||
return 122880 - i;
|
||||
case 189090:
|
||||
return 208896 - i;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( root == 160570 )
|
||||
return 8192 - i;
|
||||
if ( root > 160570 )
|
||||
{
|
||||
if ( root == 173108 )
|
||||
return 20480 - i;
|
||||
if ( root > 173108 )
|
||||
{
|
||||
switch ( root )
|
||||
{
|
||||
case 177342:
|
||||
return 192512 - i;
|
||||
case 181283:
|
||||
return 172032 - i;
|
||||
case 176922:
|
||||
return 155648 - i;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
switch ( root )
|
||||
{
|
||||
case 165152:
|
||||
return 53248 - i;
|
||||
case 167995:
|
||||
return 94208 - i;
|
||||
case 164627:
|
||||
return 184320 - i;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( root == 151579 )
|
||||
return 139264 - i;
|
||||
if ( root > 151579 )
|
||||
{
|
||||
switch ( root )
|
||||
{
|
||||
case 153836:
|
||||
return 90112 - i;
|
||||
case 155666:
|
||||
return 81920 - i;
|
||||
case 153128:
|
||||
return 200704 - i;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
switch ( root )
|
||||
{
|
||||
case 141589:
|
||||
return 212992 - i;
|
||||
case 141681:
|
||||
return 233472 - i;
|
||||
case 139537:
|
||||
return 98304 - i;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( root == 52291 )
|
||||
return 12288 - i;
|
||||
if ( root > 52291 )
|
||||
{
|
||||
if ( root == 80798 )
|
||||
return 225280 - i;
|
||||
if ( root > 80798 )
|
||||
{
|
||||
if ( root == 125012 )
|
||||
return 147456 - i;
|
||||
if ( root > 125012 )
|
||||
{
|
||||
switch ( root )
|
||||
{
|
||||
case 127037:
|
||||
return 69632 - i;
|
||||
case 129117:
|
||||
return 86016 - i;
|
||||
case 125013:
|
||||
return 57344 - i;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
switch ( root )
|
||||
{
|
||||
case 100420:
|
||||
return 32768 - i;
|
||||
case 114248:
|
||||
return 61440 - i;
|
||||
case 81022:
|
||||
return 159744 - i;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( root == 70927 )
|
||||
return 217088 - i;
|
||||
if ( root > 70927 )
|
||||
{
|
||||
switch ( root )
|
||||
{
|
||||
case 78346:
|
||||
return 253952 - i;
|
||||
case 78878:
|
||||
return 40960 - i;
|
||||
case 76918:
|
||||
return 204800 - i;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
switch ( root )
|
||||
{
|
||||
case 58674:
|
||||
return 126976 - i;
|
||||
case 66566:
|
||||
return 163840 - i;
|
||||
case 54024:
|
||||
return 110592 - i;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( root == 21219 )
|
||||
return 45056 - i;
|
||||
if ( root > 21219 )
|
||||
{
|
||||
if ( root == 42033 )
|
||||
return 24576 - i;
|
||||
if ( root > 42033 )
|
||||
{
|
||||
switch ( root )
|
||||
{
|
||||
case 49184:
|
||||
return 65536 - i;
|
||||
case 50211:
|
||||
return 114688 - i;
|
||||
case 43526:
|
||||
return 258048 - i;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
switch ( root )
|
||||
{
|
||||
case 31501:
|
||||
return 241664 - i;
|
||||
case 37387:
|
||||
return 245760 - i;
|
||||
case 30990:
|
||||
return 167936 - i;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( root == 4904 )
|
||||
return 36864 - i;
|
||||
if ( root > 4904 )
|
||||
{
|
||||
switch ( root )
|
||||
{
|
||||
case 13327:
|
||||
return 49152 - i;
|
||||
case 13836:
|
||||
return 106496 - i;
|
||||
case 12297:
|
||||
return 229376 - i;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
switch ( root )
|
||||
{
|
||||
case 515:
|
||||
return 196608 - i;
|
||||
case 4104:
|
||||
return 131072 - i;
|
||||
case 1:
|
||||
return (262143 - i) % 262143;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
root = (((((root & 0x80) != 0) + (root & 1)) & 1) << 17) | (root >> 1);
|
||||
}
|
||||
return i;
|
||||
}
|
||||
|
||||
static int gx1133_set_pls_n(struct gx1133_priv *priv, u32 n)
|
||||
{
|
||||
int i, nx, ny;
|
||||
int shift=131072;
|
||||
unsigned int scram_0x=1;
|
||||
unsigned int scram_1x=0x8050;
|
||||
unsigned int scram_1y=0;
|
||||
unsigned int xx_18,xx_7;
|
||||
u8 tmp;
|
||||
|
||||
nx = n+shift;
|
||||
ny = shift;
|
||||
|
||||
gx1133_rd(priv,DVB_S2,GX1133_SCRAM_1X1Y0X_H,&tmp);
|
||||
gx1133_wr(priv,DVB_S2,GX1133_SCRAM_1X1Y0X_H,tmp & 0xbf);
|
||||
|
||||
for ( i=0; i<n; i++ )
|
||||
{
|
||||
scram_0x = scram_0x << 1;
|
||||
xx_18 = (scram_0x & 0x40000) >> 18;
|
||||
xx_7 = (scram_0x & 0x80) ^ (xx_18 << 7);
|
||||
scram_0x = (scram_0x & 0x7ff7f) | xx_18 | xx_7;
|
||||
|
||||
scram_1x = scram_1x<<1;
|
||||
xx_18 = (scram_1x & 0x40000) >> 18;
|
||||
xx_7 = (scram_1x & 0x80) ^ (xx_18 << 7);
|
||||
scram_1x = (scram_1x & 0x7ff7f) | xx_18 | xx_7;
|
||||
}
|
||||
scram_1y = 0xff60;
|
||||
|
||||
gx1133_wr(priv,DVB_S2,GX1133_SCRAM_0X_L,scram_0x&0xff);
|
||||
gx1133_wr(priv,DVB_S2,GX1133_SCRAM_0X_M,(scram_0x>>8)&0xff);
|
||||
|
||||
gx1133_wr(priv,DVB_S2,GX1133_SCRAM_1X_L,scram_1x&0xff);
|
||||
gx1133_wr(priv,DVB_S2,GX1133_SCRAM_1X_M,(scram_1x>>8)&0xff);
|
||||
|
||||
gx1133_wr(priv,DVB_S2,GX1133_SCRAM_1Y_L,scram_1y&0xff);
|
||||
gx1133_wr(priv,DVB_S2,GX1133_SCRAM_1Y_M,(scram_1y>>8)&0xff);
|
||||
|
||||
gx1133_wr(priv,DVB_S2,GX1133_SCRAM_1X1Y0X_H,(((scram_1x>>16)&0x03)<<4)|(((scram_1y>>16)&0x03)<<2)|((scram_0x>>16)&0x03));
|
||||
|
||||
//printk("scrm_0x = %x\n",scram_0x);
|
||||
//printk("scrm_1x = %x\n",scram_1x);
|
||||
//printk("scrm_1y = %x\n",scram_1y);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int gx1133_set_frontend(struct dvb_frontend *fe)
|
||||
{
|
||||
struct gx1133_priv *priv = fe->demodulator_priv;
|
||||
@@ -1144,7 +1470,6 @@ static int gx1133_set_frontend(struct dvb_frontend *fe)
|
||||
|
||||
dev_dbg(&priv->i2c->dev, "%s()\n", __func__);
|
||||
|
||||
printk("set frontends\n");
|
||||
/* do some basic parameter validation */
|
||||
switch (c->delivery_system) {
|
||||
case SYS_DVBS:
|
||||
@@ -1167,6 +1492,15 @@ static int gx1133_set_frontend(struct dvb_frontend *fe)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Set PLS before search */
|
||||
dev_dbg(&priv->i2c->dev, "%s: set pls_mode %d, pls_code %d !\n", __func__, pls_mode, pls_code);
|
||||
gx1133_set_pls_n(priv, pls_mode ? pls_code : root_2_gold(pls_code));
|
||||
|
||||
/* Reset ISI filter */
|
||||
gx1133_rd(priv,DVB_S2,GX1133_LDPC_TSID_CTRL,&temp);
|
||||
temp&=0xfe;
|
||||
gx1133_wr(priv,DVB_S2,GX1133_LDPC_TSID_CTRL,temp);
|
||||
|
||||
gx1133_rd(priv,DVB_S2,GX1133_AUTO_RST,&temp);
|
||||
temp|=0x01;
|
||||
gx1133_wr(priv,DVB_S2,GX1133_AUTO_RST,temp);
|
||||
@@ -1194,6 +1528,7 @@ static int gx1133_set_frontend(struct dvb_frontend *fe)
|
||||
buf[2] = 0;
|
||||
buf[3] = 0;
|
||||
ret = gx1133_wrm(priv, buf, 4);
|
||||
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@@ -1209,7 +1544,6 @@ static int gx1133_set_frontend(struct dvb_frontend *fe)
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
gx1133_rd(priv,DVB_S2,GX1133_RST,&temp);
|
||||
temp|=0x01;
|
||||
gx1133_wr(priv,DVB_S2,GX1133_RST,temp);
|
||||
@@ -1220,7 +1554,7 @@ static int gx1133_set_frontend(struct dvb_frontend *fe)
|
||||
ret = gx1133_read_status(fe, &tunerstat);
|
||||
if (tunerstat & FE_HAS_LOCK)
|
||||
{
|
||||
/* Setup MIS filtering */
|
||||
/* Setup ISI filtering */
|
||||
if (c->delivery_system == SYS_DVBS2)
|
||||
{
|
||||
gx1133_rd(priv,DVB_S2,GX1133_LDPC_TSID_CTRL,&temp);
|
||||
|
Reference in New Issue
Block a user