diff mbox

XC5000 DVB-T/DMB-TH support

Message ID 15ed362e0903302039g6d9575cnca5d9b62b566db72@mail.gmail.com (mailing list archive)
State RFC
Headers show

Commit Message

David Wong March 31, 2009, 3:39 a.m. UTC
On Tue, Mar 31, 2009 at 10:57 AM, Devin Heitmueller
<devin.heitmueller@gmail.com> wrote:
> On Mon, Mar 30, 2009 at 10:47 PM, David Wong <davidtlwong@gmail.com> wrote:
>> Does anyone know how to get XC5000 working for DVB-T, especially 8MHz bandwidth?
>> Current driver only supports ATSC with 6MHz bandwidth only.
>> It seems there is a trick at setting compensated RF frequency.
>>
>> DVB-T 8MHz support would probably works for DMB-TH, but DMB-TH
>> settings is very welcome.
>>
>> Regards,
>> David
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux-media" in
>> the body of a message to majordomo@vger.kernel.org
>> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>>
>
> All of my xc5000 work has been with ATSC/QAM, so I can't say
> authoritatively what is required to make it work.
>
> Well, at a minimum you will have to modify xc5000_set_params to
> support setting priv->video_standard to DTV8.  Beyond that, I don't
> think you need to do anything specific for DVB-T.
>
> Devin
>
> --
> Devin J. Heitmueller
> http://www.devinheitmueller.com
> AIM: devinheitmueller
>

I have tried followings in xc5000_set_params()

if (fe->ops.info.type == FE_ATSC) {
  ...
} else if (fe->ops.info.type == FE_OFDM) {
		switch (params->u.ofdm.bandwidth) {
		case BANDWIDTH_6_MHZ:
			printk("xc5000 bandwidth 6MHz\n");
			priv->bandwidth = BANDWIDTH_6_MHZ;
			priv->video_standard = DTV6;
			break;
		case BANDWIDTH_7_MHZ:
			printk("xc5000 bandwidth 7MHz\n");
			priv->bandwidth = BANDWIDTH_7_MHZ;
			priv->video_standard = DTV7;
			break;
		case BANDWIDTH_8_MHZ:
			printk("xc5000 bandwidth 8MHz\n");
			priv->bandwidth = BANDWIDTH_8_MHZ;
			priv->video_standard = DTV8;
			break;
		default:
			printk("xc5000 bandwidth not set!\n");
			return -EINVAL;
		}
 		priv->rf_mode = XC_RF_MODE_AIR;
		priv->freq_hz = params->frequency - 1750000;
}


But no success yet.
I am wondering the -1750000 compensation for DTV8.

BTW, The xc_debug_dump() could get more information like firmware
build number and tuner total gain

More majordomo info at  http://vger.kernel.org/majordomo-info.html

Comments

Devin Heitmueller March 31, 2009, 3:46 a.m. UTC | #1
On Mon, Mar 30, 2009 at 11:39 PM, David Wong <davidtlwong@gmail.com> wrote:
> On Tue, Mar 31, 2009 at 10:57 AM, Devin Heitmueller
> <devin.heitmueller@gmail.com> wrote:
>> On Mon, Mar 30, 2009 at 10:47 PM, David Wong <davidtlwong@gmail.com> wrote:
>>> Does anyone know how to get XC5000 working for DVB-T, especially 8MHz bandwidth?
>>> Current driver only supports ATSC with 6MHz bandwidth only.
>>> It seems there is a trick at setting compensated RF frequency.
>>>
>>> DVB-T 8MHz support would probably works for DMB-TH, but DMB-TH
>>> settings is very welcome.
>>>
>>> Regards,
>>> David
>>> --
>>> To unsubscribe from this list: send the line "unsubscribe linux-media" in
>>> the body of a message to majordomo@vger.kernel.org
>>> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>>>
>>
>> All of my xc5000 work has been with ATSC/QAM, so I can't say
>> authoritatively what is required to make it work.
>>
>> Well, at a minimum you will have to modify xc5000_set_params to
>> support setting priv->video_standard to DTV8.  Beyond that, I don't
>> think you need to do anything specific for DVB-T.
>>
>> Devin
>>
>> --
>> Devin J. Heitmueller
>> http://www.devinheitmueller.com
>> AIM: devinheitmueller
>>
>
> I have tried followings in xc5000_set_params()
>
> if (fe->ops.info.type == FE_ATSC) {
>  ...
> } else if (fe->ops.info.type == FE_OFDM) {
>                switch (params->u.ofdm.bandwidth) {
>                case BANDWIDTH_6_MHZ:
>                        printk("xc5000 bandwidth 6MHz\n");
>                        priv->bandwidth = BANDWIDTH_6_MHZ;
>                        priv->video_standard = DTV6;
>                        break;
>                case BANDWIDTH_7_MHZ:
>                        printk("xc5000 bandwidth 7MHz\n");
>                        priv->bandwidth = BANDWIDTH_7_MHZ;
>                        priv->video_standard = DTV7;
>                        break;
>                case BANDWIDTH_8_MHZ:
>                        printk("xc5000 bandwidth 8MHz\n");
>                        priv->bandwidth = BANDWIDTH_8_MHZ;
>                        priv->video_standard = DTV8;
>                        break;
>                default:
>                        printk("xc5000 bandwidth not set!\n");
>                        return -EINVAL;
>                }
>                priv->rf_mode = XC_RF_MODE_AIR;
>                priv->freq_hz = params->frequency - 1750000;
> }
>
>
> But no success yet.
> I am wondering the -1750000 compensation for DTV8.
>
> BTW, The xc_debug_dump() could get more information like firmware
> build number and tuner total gain
>
> diff -r 2276e777f950 linux/drivers/media/common/tuners/xc5000.c
> --- a/linux/drivers/media/common/tuners/xc5000.c        Thu Mar 26 22:17:48 2009 -0300
> +++ b/linux/drivers/media/common/tuners/xc5000.c        Mon Mar 30 16:23:11 2009 +0800
> @@ -84,6 +84,7 @@
>  #define XREG_IF_OUT       0x05
>  #define XREG_SEEK_MODE    0x07
>  #define XREG_POWER_DOWN   0x0A
> +#define XREG_OUTPUT_AMP   0x0B
>  #define XREG_SIGNALSOURCE 0x0D /* 0=Air, 1=Cable */
>  #define XREG_SMOOTHEDCVBS 0x0E
>  #define XREG_XTALFREQ     0x0F
> @@ -100,6 +101,8 @@
>  #define XREG_VERSION      0x07
>  #define XREG_PRODUCT_ID   0x08
>  #define XREG_BUSY         0x09
> +#define XREG_BUILD_NUM    0x0D
> +#define XREG_TOTAL_GAIN   0x0F
>
>  /*
>    Basic firmware description. This will remain with
> @@ -468,7 +485,8 @@
>
>  static int xc_get_version(struct xc5000_priv *priv,
>        u8 *hw_majorversion, u8 *hw_minorversion,
> -       u8 *fw_majorversion, u8 *fw_minorversion)
> +       u8 *fw_majorversion, u8 *fw_minorversion,
> +       u16 *fw_buildnum)
>  {
>        u16 data;
>        int result;
> @@ -481,6 +499,11 @@
>        (*hw_minorversion) = (data >>  8) & 0x0F;
>        (*fw_majorversion) = (data >>  4) & 0x0F;
>        (*fw_minorversion) = data & 0x0F;
> +
> +       result = xc_read_reg(priv, XREG_BUILD_NUM, &data);
> +       if (result)
> +               return result;
> +       *fw_buildnum = data;
>
>        return 0;
>  }
> @@ -506,6 +529,11 @@
>  static int xc_get_quality(struct xc5000_priv *priv, u16 *quality)
>  {
>        return xc_read_reg(priv, XREG_QUALITY, quality);
> +}
> +
> +static int xc_get_total_gain(struct xc5000_priv *priv, u16 *gain)
> +{
> +       return xc_read_reg(priv, XREG_TOTAL_GAIN, gain);
>  }
>
>  static u16 WaitForLock(struct xc5000_priv *priv)
> @@ -626,8 +654,10 @@
>        u32 hsync_freq_hz = 0;
>        u16 frame_lines;
>        u16 quality;
> +       u16 gain;
>        u8 hw_majorversion = 0, hw_minorversion = 0;
>        u8 fw_majorversion = 0, fw_minorversion = 0;
> +       u16 fw_buildnum = 0;
>
>        /* Wait for stats to stabilize.
>         * Frame Lines needs two frame times after initial lock
> @@ -646,10 +676,11 @@
>                lock_status);
>
>        xc_get_version(priv,  &hw_majorversion, &hw_minorversion,
> -               &fw_majorversion, &fw_minorversion);
> -       dprintk(1, "*** HW: V%02x.%02x, FW: V%02x.%02x\n",
> +               &fw_majorversion, &fw_minorversion, &fw_buildnum);
> +       dprintk(1, "*** HW: V%02x.%02x, FW: V%02x.%02x build %d\n",
>                hw_majorversion, hw_minorversion,
> -               fw_majorversion, fw_minorversion);
> +               fw_majorversion, fw_minorversion,
> +               fw_buildnum);
>
>        xc_get_hsync_freq(priv,  &hsync_freq_hz);
>        dprintk(1, "*** Horizontal sync frequency = %d Hz\n", hsync_freq_hz);
> @@ -659,6 +690,9 @@
>
>        xc_get_quality(priv,  &quality);
>        dprintk(1, "*** Quality (0:<8dB, 7:>56dB) = %d\n", quality);
> +
> +       xc_get_total_gain(priv,  &gain);
> +       dprintk(1, "*** Total Gain = %d mdB\n", gain * 1000 / 256);
>  }
>

That compensation offset should be correct for all of the digital standards.

Yeah, without having one to try out, I am not sure.

I already have a patch for the build number and total gain in my queue
(along with a bunch of other bugfixes and performance improvements).
I'm just waiting on Xceive to resolve the firmware licensing issue (I
spoke to them last week about it).

Devin
David Wong March 31, 2009, 4:03 a.m. UTC | #2
On Tue, Mar 31, 2009 at 11:46 AM, Devin Heitmueller
<devin.heitmueller@gmail.com> wrote:
> On Mon, Mar 30, 2009 at 11:39 PM, David Wong <davidtlwong@gmail.com> wrote:
>> On Tue, Mar 31, 2009 at 10:57 AM, Devin Heitmueller
>> <devin.heitmueller@gmail.com> wrote:
>>> On Mon, Mar 30, 2009 at 10:47 PM, David Wong <davidtlwong@gmail.com> wrote:
>>>> Does anyone know how to get XC5000 working for DVB-T, especially 8MHz bandwidth?
>>>> Current driver only supports ATSC with 6MHz bandwidth only.
>>>> It seems there is a trick at setting compensated RF frequency.
>>>>
>>>> DVB-T 8MHz support would probably works for DMB-TH, but DMB-TH
>>>> settings is very welcome.
>>>>
>>>> Regards,
>>>> David
>>>> --
>>>> To unsubscribe from this list: send the line "unsubscribe linux-media" in
>>>> the body of a message to majordomo@vger.kernel.org
>>>> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>>>>
>>>
>>> All of my xc5000 work has been with ATSC/QAM, so I can't say
>>> authoritatively what is required to make it work.
>>>
>>> Well, at a minimum you will have to modify xc5000_set_params to
>>> support setting priv->video_standard to DTV8.  Beyond that, I don't
>>> think you need to do anything specific for DVB-T.
>>>
>>> Devin
>>>
>>> --
>>> Devin J. Heitmueller
>>> http://www.devinheitmueller.com
>>> AIM: devinheitmueller
>>>
>>
>> I have tried followings in xc5000_set_params()
>>
>> if (fe->ops.info.type == FE_ATSC) {
>>  ...
>> } else if (fe->ops.info.type == FE_OFDM) {
>>                switch (params->u.ofdm.bandwidth) {
>>                case BANDWIDTH_6_MHZ:
>>                        printk("xc5000 bandwidth 6MHz\n");
>>                        priv->bandwidth = BANDWIDTH_6_MHZ;
>>                        priv->video_standard = DTV6;
>>                        break;
>>                case BANDWIDTH_7_MHZ:
>>                        printk("xc5000 bandwidth 7MHz\n");
>>                        priv->bandwidth = BANDWIDTH_7_MHZ;
>>                        priv->video_standard = DTV7;
>>                        break;
>>                case BANDWIDTH_8_MHZ:
>>                        printk("xc5000 bandwidth 8MHz\n");
>>                        priv->bandwidth = BANDWIDTH_8_MHZ;
>>                        priv->video_standard = DTV8;
>>                        break;
>>                default:
>>                        printk("xc5000 bandwidth not set!\n");
>>                        return -EINVAL;
>>                }
>>                priv->rf_mode = XC_RF_MODE_AIR;
>>                priv->freq_hz = params->frequency - 1750000;
>> }
>>
>>
>> But no success yet.
>> I am wondering the -1750000 compensation for DTV8.
>>
>> BTW, The xc_debug_dump() could get more information like firmware
>> build number and tuner total gain
>>
>> diff -r 2276e777f950 linux/drivers/media/common/tuners/xc5000.c
>> --- a/linux/drivers/media/common/tuners/xc5000.c        Thu Mar 26 22:17:48 2009 -0300
>> +++ b/linux/drivers/media/common/tuners/xc5000.c        Mon Mar 30 16:23:11 2009 +0800
>> @@ -84,6 +84,7 @@
>>  #define XREG_IF_OUT       0x05
>>  #define XREG_SEEK_MODE    0x07
>>  #define XREG_POWER_DOWN   0x0A
>> +#define XREG_OUTPUT_AMP   0x0B
>>  #define XREG_SIGNALSOURCE 0x0D /* 0=Air, 1=Cable */
>>  #define XREG_SMOOTHEDCVBS 0x0E
>>  #define XREG_XTALFREQ     0x0F
>> @@ -100,6 +101,8 @@
>>  #define XREG_VERSION      0x07
>>  #define XREG_PRODUCT_ID   0x08
>>  #define XREG_BUSY         0x09
>> +#define XREG_BUILD_NUM    0x0D
>> +#define XREG_TOTAL_GAIN   0x0F
>>
>>  /*
>>    Basic firmware description. This will remain with
>> @@ -468,7 +485,8 @@
>>
>>  static int xc_get_version(struct xc5000_priv *priv,
>>        u8 *hw_majorversion, u8 *hw_minorversion,
>> -       u8 *fw_majorversion, u8 *fw_minorversion)
>> +       u8 *fw_majorversion, u8 *fw_minorversion,
>> +       u16 *fw_buildnum)
>>  {
>>        u16 data;
>>        int result;
>> @@ -481,6 +499,11 @@
>>        (*hw_minorversion) = (data >>  8) & 0x0F;
>>        (*fw_majorversion) = (data >>  4) & 0x0F;
>>        (*fw_minorversion) = data & 0x0F;
>> +
>> +       result = xc_read_reg(priv, XREG_BUILD_NUM, &data);
>> +       if (result)
>> +               return result;
>> +       *fw_buildnum = data;
>>
>>        return 0;
>>  }
>> @@ -506,6 +529,11 @@
>>  static int xc_get_quality(struct xc5000_priv *priv, u16 *quality)
>>  {
>>        return xc_read_reg(priv, XREG_QUALITY, quality);
>> +}
>> +
>> +static int xc_get_total_gain(struct xc5000_priv *priv, u16 *gain)
>> +{
>> +       return xc_read_reg(priv, XREG_TOTAL_GAIN, gain);
>>  }
>>
>>  static u16 WaitForLock(struct xc5000_priv *priv)
>> @@ -626,8 +654,10 @@
>>        u32 hsync_freq_hz = 0;
>>        u16 frame_lines;
>>        u16 quality;
>> +       u16 gain;
>>        u8 hw_majorversion = 0, hw_minorversion = 0;
>>        u8 fw_majorversion = 0, fw_minorversion = 0;
>> +       u16 fw_buildnum = 0;
>>
>>        /* Wait for stats to stabilize.
>>         * Frame Lines needs two frame times after initial lock
>> @@ -646,10 +676,11 @@
>>                lock_status);
>>
>>        xc_get_version(priv,  &hw_majorversion, &hw_minorversion,
>> -               &fw_majorversion, &fw_minorversion);
>> -       dprintk(1, "*** HW: V%02x.%02x, FW: V%02x.%02x\n",
>> +               &fw_majorversion, &fw_minorversion, &fw_buildnum);
>> +       dprintk(1, "*** HW: V%02x.%02x, FW: V%02x.%02x build %d\n",
>>                hw_majorversion, hw_minorversion,
>> -               fw_majorversion, fw_minorversion);
>> +               fw_majorversion, fw_minorversion,
>> +               fw_buildnum);
>>
>>        xc_get_hsync_freq(priv,  &hsync_freq_hz);
>>        dprintk(1, "*** Horizontal sync frequency = %d Hz\n", hsync_freq_hz);
>> @@ -659,6 +690,9 @@
>>
>>        xc_get_quality(priv,  &quality);
>>        dprintk(1, "*** Quality (0:<8dB, 7:>56dB) = %d\n", quality);
>> +
>> +       xc_get_total_gain(priv,  &gain);
>> +       dprintk(1, "*** Total Gain = %d mdB\n", gain * 1000 / 256);
>>  }
>>
>
> That compensation offset should be correct for all of the digital standards.
>

Thanks Devin, perhaps there is something that I don't know between the
tuner and the demod (lgs8gl5) on my card, so it doesn't work.
Honestly I have never seen such digital output from a tuner (DDI
interface). I don't know if my card use that, and I have never seen
lgs8xxx with
serial digital input from tuner.
What is the "protocol" of DDI of XC5000? UART-like or I2C-like? it has
only two wires, p and n. I am wonder how it defines clock and data.

David
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Devin Heitmueller March 31, 2009, 4:20 a.m. UTC | #3
On Mon, Mar 30, 2009 at 11:03 PM, David Wong <davidtlwong@gmail.com> wrote:
> On Tue, Mar 31, 2009 at 11:46 AM, Devin Heitmueller
> <devin.heitmueller@gmail.com> wrote:
>> On Mon, Mar 30, 2009 at 11:39 PM, David Wong <davidtlwong@gmail.com> wrote:
>>> On Tue, Mar 31, 2009 at 10:57 AM, Devin Heitmueller
>>> <devin.heitmueller@gmail.com> wrote:
>>>> On Mon, Mar 30, 2009 at 10:47 PM, David Wong <davidtlwong@gmail.com> wrote:
>>>>> Does anyone know how to get XC5000 working for DVB-T, especially 8MHz bandwidth?
>>>>> Current driver only supports ATSC with 6MHz bandwidth only.
>>>>> It seems there is a trick at setting compensated RF frequency.
>>>>>
>>>>> DVB-T 8MHz support would probably works for DMB-TH, but DMB-TH
>>>>> settings is very welcome.
>>>>>
>>>>> Regards,
>>>>> David
>>>>> --
>>>>> To unsubscribe from this list: send the line "unsubscribe linux-media" in
>>>>> the body of a message to majordomo@vger.kernel.org
>>>>> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>>>>>
>>>>
>>>> All of my xc5000 work has been with ATSC/QAM, so I can't say
>>>> authoritatively what is required to make it work.
>>>>
>>>> Well, at a minimum you will have to modify xc5000_set_params to
>>>> support setting priv->video_standard to DTV8.  Beyond that, I don't
>>>> think you need to do anything specific for DVB-T.
>>>>
>>>> Devin
>>>>
>>>> --
>>>> Devin J. Heitmueller
>>>> http://www.devinheitmueller.com
>>>> AIM: devinheitmueller
>>>>
>>>
>>> I have tried followings in xc5000_set_params()
>>>
>>> if (fe->ops.info.type == FE_ATSC) {
>>>  ...
>>> } else if (fe->ops.info.type == FE_OFDM) {
>>>                switch (params->u.ofdm.bandwidth) {
>>>                case BANDWIDTH_6_MHZ:
>>>                        printk("xc5000 bandwidth 6MHz\n");
>>>                        priv->bandwidth = BANDWIDTH_6_MHZ;
>>>                        priv->video_standard = DTV6;
>>>                        break;
>>>                case BANDWIDTH_7_MHZ:
>>>                        printk("xc5000 bandwidth 7MHz\n");
>>>                        priv->bandwidth = BANDWIDTH_7_MHZ;
>>>                        priv->video_standard = DTV7;
>>>                        break;
>>>                case BANDWIDTH_8_MHZ:
>>>                        printk("xc5000 bandwidth 8MHz\n");
>>>                        priv->bandwidth = BANDWIDTH_8_MHZ;
>>>                        priv->video_standard = DTV8;
>>>                        break;
>>>                default:
>>>                        printk("xc5000 bandwidth not set!\n");
>>>                        return -EINVAL;
>>>                }
>>>                priv->rf_mode = XC_RF_MODE_AIR;
>>>                priv->freq_hz = params->frequency - 1750000;
>>> }
>>>
>>>
>>> But no success yet.
>>> I am wondering the -1750000 compensation for DTV8.
>>>
>>> BTW, The xc_debug_dump() could get more information like firmware
>>> build number and tuner total gain
>>>
>>> diff -r 2276e777f950 linux/drivers/media/common/tuners/xc5000.c
>>> --- a/linux/drivers/media/common/tuners/xc5000.c        Thu Mar 26 22:17:48 2009 -0300
>>> +++ b/linux/drivers/media/common/tuners/xc5000.c        Mon Mar 30 16:23:11 2009 +0800
>>> @@ -84,6 +84,7 @@
>>>  #define XREG_IF_OUT       0x05
>>>  #define XREG_SEEK_MODE    0x07
>>>  #define XREG_POWER_DOWN   0x0A
>>> +#define XREG_OUTPUT_AMP   0x0B
>>>  #define XREG_SIGNALSOURCE 0x0D /* 0=Air, 1=Cable */
>>>  #define XREG_SMOOTHEDCVBS 0x0E
>>>  #define XREG_XTALFREQ     0x0F
>>> @@ -100,6 +101,8 @@
>>>  #define XREG_VERSION      0x07
>>>  #define XREG_PRODUCT_ID   0x08
>>>  #define XREG_BUSY         0x09
>>> +#define XREG_BUILD_NUM    0x0D
>>> +#define XREG_TOTAL_GAIN   0x0F
>>>
>>>  /*
>>>    Basic firmware description. This will remain with
>>> @@ -468,7 +485,8 @@
>>>
>>>  static int xc_get_version(struct xc5000_priv *priv,
>>>        u8 *hw_majorversion, u8 *hw_minorversion,
>>> -       u8 *fw_majorversion, u8 *fw_minorversion)
>>> +       u8 *fw_majorversion, u8 *fw_minorversion,
>>> +       u16 *fw_buildnum)
>>>  {
>>>        u16 data;
>>>        int result;
>>> @@ -481,6 +499,11 @@
>>>        (*hw_minorversion) = (data >>  8) & 0x0F;
>>>        (*fw_majorversion) = (data >>  4) & 0x0F;
>>>        (*fw_minorversion) = data & 0x0F;
>>> +
>>> +       result = xc_read_reg(priv, XREG_BUILD_NUM, &data);
>>> +       if (result)
>>> +               return result;
>>> +       *fw_buildnum = data;
>>>
>>>        return 0;
>>>  }
>>> @@ -506,6 +529,11 @@
>>>  static int xc_get_quality(struct xc5000_priv *priv, u16 *quality)
>>>  {
>>>        return xc_read_reg(priv, XREG_QUALITY, quality);
>>> +}
>>> +
>>> +static int xc_get_total_gain(struct xc5000_priv *priv, u16 *gain)
>>> +{
>>> +       return xc_read_reg(priv, XREG_TOTAL_GAIN, gain);
>>>  }
>>>
>>>  static u16 WaitForLock(struct xc5000_priv *priv)
>>> @@ -626,8 +654,10 @@
>>>        u32 hsync_freq_hz = 0;
>>>        u16 frame_lines;
>>>        u16 quality;
>>> +       u16 gain;
>>>        u8 hw_majorversion = 0, hw_minorversion = 0;
>>>        u8 fw_majorversion = 0, fw_minorversion = 0;
>>> +       u16 fw_buildnum = 0;
>>>
>>>        /* Wait for stats to stabilize.
>>>         * Frame Lines needs two frame times after initial lock
>>> @@ -646,10 +676,11 @@
>>>                lock_status);
>>>
>>>        xc_get_version(priv,  &hw_majorversion, &hw_minorversion,
>>> -               &fw_majorversion, &fw_minorversion);
>>> -       dprintk(1, "*** HW: V%02x.%02x, FW: V%02x.%02x\n",
>>> +               &fw_majorversion, &fw_minorversion, &fw_buildnum);
>>> +       dprintk(1, "*** HW: V%02x.%02x, FW: V%02x.%02x build %d\n",
>>>                hw_majorversion, hw_minorversion,
>>> -               fw_majorversion, fw_minorversion);
>>> +               fw_majorversion, fw_minorversion,
>>> +               fw_buildnum);
>>>
>>>        xc_get_hsync_freq(priv,  &hsync_freq_hz);
>>>        dprintk(1, "*** Horizontal sync frequency = %d Hz\n", hsync_freq_hz);
>>> @@ -659,6 +690,9 @@
>>>
>>>        xc_get_quality(priv,  &quality);
>>>        dprintk(1, "*** Quality (0:<8dB, 7:>56dB) = %d\n", quality);
>>> +
>>> +       xc_get_total_gain(priv,  &gain);
>>> +       dprintk(1, "*** Total Gain = %d mdB\n", gain * 1000 / 256);
>>>  }
>>>
>>
>> That compensation offset should be correct for all of the digital standards.
>>
>
> Thanks Devin, perhaps there is something that I don't know between the
> tuner and the demod (lgs8gl5) on my card, so it doesn't work.
> Honestly I have never seen such digital output from a tuner (DDI
> interface). I don't know if my card use that, and I have never seen
> lgs8xxx with
> serial digital input from tuner.
> What is the "protocol" of DDI of XC5000? UART-like or I2C-like? it has
> only two wires, p and n. I am wonder how it defines clock and data.
>
> David
>

Did you make sure the IF was configured properly in your demod to
match the IF of the xc5000?  If it does not match, then you will not
get lock.  That is the very first thing I would check since at least
for me that is usually the problem when making a new device work.

I am assuming that you concluded it isn't working based on the fact
that you didn't get a lock.  Is that correct?

Regarding the protocol, the xc5000 is programmed via i2c.

I'm actually slightly surprised/confused.  How did you know about the
missing AGC and build registers if you are unfamiliar with the xc5000
programming interface?

Devin
Steven Toth March 31, 2009, 2:30 p.m. UTC | #4
Hmm.

> 		priv->freq_hz = params->frequency - 1750000;

Prior to reading this I would of sworn blind that we'd witnessed the XC5000 
working on DVB-T devices, it's been a while and now I'm doubting that belief.

- Steve
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Devin Heitmueller March 31, 2009, 2:34 p.m. UTC | #5
On Tue, Mar 31, 2009 at 10:30 AM, Steven Toth <stoth@linuxtv.org> wrote:
> Hmm.
>
>>                priv->freq_hz = params->frequency - 1750000;
>
> Prior to reading this I would of sworn blind that we'd witnessed the XC5000
> working on DVB-T devices, it's been a while and now I'm doubting that
> belief.

Yeah, the code doesn't currently have DVB-T support.  If you specify
any modulation other than the VSB or QAM modulations, it returns
-EINVAL..

If I had a board and a generator, I could probably bring it up pretty quick.

Also, as I later told David in an off-list email, I believe I was
mistaken about the offset needing to be 1750000.  I think it should
actually be 2570000 for DVB-T.

Devin
David Wong April 1, 2009, 1:38 a.m. UTC | #6
On Tue, Mar 31, 2009 at 10:34 PM, Devin Heitmueller
<devin.heitmueller@gmail.com> wrote:
> On Tue, Mar 31, 2009 at 10:30 AM, Steven Toth <stoth@linuxtv.org> wrote:
>> Hmm.
>>
>>>                priv->freq_hz = params->frequency - 1750000;
>>
>> Prior to reading this I would of sworn blind that we'd witnessed the XC5000
>> working on DVB-T devices, it's been a while and now I'm doubting that
>> belief.
>
> Yeah, the code doesn't currently have DVB-T support.  If you specify
> any modulation other than the VSB or QAM modulations, it returns
> -EINVAL..
>
> If I had a board and a generator, I could probably bring it up pretty quick.
>
> Also, as I later told David in an off-list email, I believe I was
> mistaken about the offset needing to be 1750000.  I think it should
> actually be 2570000 for DVB-T.
>
> Devin
>
> --
> Devin J. Heitmueller
> http://www.devinheitmueller.com
> AIM: devinheitmueller
>

Thanks Devin. The demod locks after using -2750000.

David.
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Devin Heitmueller April 1, 2009, 1:44 a.m. UTC | #7
On Tue, Mar 31, 2009 at 9:38 PM, David Wong <davidtlwong@gmail.com> wrote:
> Thanks Devin. The demod locks after using -2750000.
>
> David.

That's great news.  If you send me a patch (including your SOB), I
will put it into the xc5000 patch series I am putting together this
week.

Regards,

Devin
David Wong April 1, 2009, 2:34 a.m. UTC | #8
On Wed, Apr 1, 2009 at 9:44 AM, Devin Heitmueller
<devin.heitmueller@gmail.com> wrote:
> On Tue, Mar 31, 2009 at 9:38 PM, David Wong <davidtlwong@gmail.com> wrote:
>> Thanks Devin. The demod locks after using -2750000.
>>
>> David.
>
> That's great news.  If you send me a patch (including your SOB), I
> will put it into the xc5000 patch series I am putting together this
> week.
>
> Regards,
>
> Devin
>
> --
> Devin J. Heitmueller
> http://www.devinheitmueller.com
> AIM: devinheitmueller
>

No problem. But how about frequency compensation value for DTV7?
We know DTV6 and DTV8 settings now, just DTV7 is missing for FE_OFDM.

David
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Devin Heitmueller April 1, 2009, 2:47 a.m. UTC | #9
On Tue, Mar 31, 2009 at 10:34 PM, David Wong <davidtlwong@gmail.com> wrote:
> On Wed, Apr 1, 2009 at 9:44 AM, Devin Heitmueller
> <devin.heitmueller@gmail.com> wrote:
>> On Tue, Mar 31, 2009 at 9:38 PM, David Wong <davidtlwong@gmail.com> wrote:
>>> Thanks Devin. The demod locks after using -2750000.
>>>
>>> David.
>>
>> That's great news.  If you send me a patch (including your SOB), I
>> will put it into the xc5000 patch series I am putting together this
>> week.
>>
>> Regards,
>>
>> Devin
>>
>> --
>> Devin J. Heitmueller
>> http://www.devinheitmueller.com
>> AIM: devinheitmueller
>>
>
> No problem. But how about frequency compensation value for DTV7?
> We know DTV6 and DTV8 settings now, just DTV7 is missing for FE_OFDM.

DTV7 is probably also 2750000.  Also, looking at the tuner-xc2028.c
suggests there are some edge cases where it might need to be 2250000.

However, if you are unable to test it, do not include it in the patch.
 I would rather have it not supported explicitly in the driver than
include untested code.

Devin
diff mbox

Patch

diff -r 2276e777f950 linux/drivers/media/common/tuners/xc5000.c
--- a/linux/drivers/media/common/tuners/xc5000.c	Thu Mar 26 22:17:48 2009 -0300
+++ b/linux/drivers/media/common/tuners/xc5000.c	Mon Mar 30 16:23:11 2009 +0800
@@ -84,6 +84,7 @@ 
 #define XREG_IF_OUT       0x05
 #define XREG_SEEK_MODE    0x07
 #define XREG_POWER_DOWN   0x0A
+#define XREG_OUTPUT_AMP   0x0B
 #define XREG_SIGNALSOURCE 0x0D /* 0=Air, 1=Cable */
 #define XREG_SMOOTHEDCVBS 0x0E
 #define XREG_XTALFREQ     0x0F
@@ -100,6 +101,8 @@ 
 #define XREG_VERSION      0x07
 #define XREG_PRODUCT_ID   0x08
 #define XREG_BUSY         0x09
+#define XREG_BUILD_NUM    0x0D
+#define XREG_TOTAL_GAIN   0x0F

 /*
    Basic firmware description. This will remain with
@@ -468,7 +485,8 @@ 

 static int xc_get_version(struct xc5000_priv *priv,
 	u8 *hw_majorversion, u8 *hw_minorversion,
-	u8 *fw_majorversion, u8 *fw_minorversion)
+	u8 *fw_majorversion, u8 *fw_minorversion,
+	u16 *fw_buildnum)
 {
 	u16 data;
 	int result;
@@ -481,6 +499,11 @@ 
 	(*hw_minorversion) = (data >>  8) & 0x0F;
 	(*fw_majorversion) = (data >>  4) & 0x0F;
 	(*fw_minorversion) = data & 0x0F;
+
+	result = xc_read_reg(priv, XREG_BUILD_NUM, &data);
+	if (result)
+		return result;
+	*fw_buildnum = data;

 	return 0;
 }
@@ -506,6 +529,11 @@ 
 static int xc_get_quality(struct xc5000_priv *priv, u16 *quality)
 {
 	return xc_read_reg(priv, XREG_QUALITY, quality);
+}
+
+static int xc_get_total_gain(struct xc5000_priv *priv, u16 *gain)
+{
+	return xc_read_reg(priv, XREG_TOTAL_GAIN, gain);
 }

 static u16 WaitForLock(struct xc5000_priv *priv)
@@ -626,8 +654,10 @@ 
 	u32 hsync_freq_hz = 0;
 	u16 frame_lines;
 	u16 quality;
+	u16 gain;
 	u8 hw_majorversion = 0, hw_minorversion = 0;
 	u8 fw_majorversion = 0, fw_minorversion = 0;
+	u16 fw_buildnum = 0;

 	/* Wait for stats to stabilize.
 	 * Frame Lines needs two frame times after initial lock
@@ -646,10 +676,11 @@ 
 		lock_status);

 	xc_get_version(priv,  &hw_majorversion, &hw_minorversion,
-		&fw_majorversion, &fw_minorversion);
-	dprintk(1, "*** HW: V%02x.%02x, FW: V%02x.%02x\n",
+		&fw_majorversion, &fw_minorversion, &fw_buildnum);
+	dprintk(1, "*** HW: V%02x.%02x, FW: V%02x.%02x build %d\n",
 		hw_majorversion, hw_minorversion,
-		fw_majorversion, fw_minorversion);
+		fw_majorversion, fw_minorversion,
+		fw_buildnum);

 	xc_get_hsync_freq(priv,  &hsync_freq_hz);
 	dprintk(1, "*** Horizontal sync frequency = %d Hz\n", hsync_freq_hz);
@@ -659,6 +690,9 @@ 

 	xc_get_quality(priv,  &quality);
 	dprintk(1, "*** Quality (0:<8dB, 7:>56dB) = %d\n", quality);
+
+	xc_get_total_gain(priv,  &gain);
+	dprintk(1, "*** Total Gain = %d mdB\n", gain * 1000 / 256);
 }
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@vger.kernel.org