public inbox for linux-media@vger.kernel.org
 help / color / mirror / Atom feed
* [linux-dvb] Dposh DVB-T USB2.0 seems to not work properly
@ 2008-06-10 21:49 Andrew Websdale
  2008-06-10 22:17 ` Antti Palosaari
  0 siblings, 1 reply; 20+ messages in thread
From: Andrew Websdale @ 2008-06-10 21:49 UTC (permalink / raw)
  To: linux-dvb


[-- Attachment #1.1: Type: text/plain, Size: 913 bytes --]

I've got a Dposh DVB-T USB2.0 (marked ATMT) and I've downloaded some
firmware ( which was v.difficult to find as the page in the wiki is blank)
which put the stick into a "warm" state i.e.

dvb-usb: found a 'Dposh DVB-T USB2.0' in cold state, will try to load a
firmware
dvb-usb: downloading firmware from file 'dvb-usb-dposh-01.fw'
dvb_usb_m920x: probe of 5-1:1.0 failed with error 64
dvb-usb: found a 'Dposh DVB-T USB2.0' in warm state.
dvb-usb: will pass the complete MPEG2 transport stream to the software
demuxer.
dvb-usb: Dposh DVB-T USB2.0 successfully initialized and connected.
usbcore: registered new interface driver dvb_usb_m920x

I've tried Kaffeine and w_scan to no avail, (WinXP gets a signal), I could
do with some advice on a)perhaps new firmware and b)help with how to use
dvbsnoop or similar to divine what is happening with this device as I lack
sufficient knowledge to proceed
Regards Andrew

[-- Attachment #1.2: Type: text/html, Size: 1003 bytes --]

[-- Attachment #2: Type: text/plain, Size: 150 bytes --]

_______________________________________________
linux-dvb mailing list
linux-dvb@linuxtv.org
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [linux-dvb] Dposh DVB-T USB2.0 seems to not work properly
  2008-06-10 21:49 [linux-dvb] Dposh DVB-T USB2.0 seems to not work properly Andrew Websdale
@ 2008-06-10 22:17 ` Antti Palosaari
  0 siblings, 0 replies; 20+ messages in thread
From: Antti Palosaari @ 2008-06-10 22:17 UTC (permalink / raw)
  To: Andrew Websdale; +Cc: linux-dvb

Andrew Websdale wrote:
> I've got a Dposh DVB-T USB2.0 (marked ATMT) and I've downloaded some 
> firmware ( which was v.difficult to find as the page in the wiki is 
> blank) which put the stick into a "warm" state i.e.
> 
> dvb-usb: found a 'Dposh DVB-T USB2.0' in cold state, will try to load a 
> firmware
> dvb-usb: downloading firmware from file 'dvb-usb-dposh-01.fw'
> dvb_usb_m920x: probe of 5-1:1.0 failed with error 64
> dvb-usb: found a 'Dposh DVB-T USB2.0' in warm state.
> dvb-usb: will pass the complete MPEG2 transport stream to the software 
> demuxer.
> dvb-usb: Dposh DVB-T USB2.0 successfully initialized and connected.
> usbcore: registered new interface driver dvb_usb_m920x
> 
> I've tried Kaffeine and w_scan to no avail, (WinXP gets a signal), I 
> could do with some advice on a)perhaps new firmware and b)help with how 
> to use dvbsnoop or similar to divine what is happening with this device 
> as I lack sufficient knowledge to proceed
> Regards Andrew

There was someone asking this same some time ago. I think it could be 
possible that MT352 demodulator is changed to other one and it does not 
work due to that. Could you open the stick and check chips?

Antti
-- 
http://palosaari.fi/

_______________________________________________
linux-dvb mailing list
linux-dvb@linuxtv.org
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [linux-dvb] Dposh DVB-T USB2.0 seems to not work properly
@ 2008-06-11 22:12 Andrew Websdale
  2008-06-11 22:49 ` Antti Palosaari
  0 siblings, 1 reply; 20+ messages in thread
From: Andrew Websdale @ 2008-06-11 22:12 UTC (permalink / raw)
  To: linux-dvb


[-- Attachment #1.1: Type: text/plain, Size: 1651 bytes --]

2008/6/10 Antti Palosaari <crope@iki.fi>:

> Andrew Websdale wrote:
>
>> I've got a Dposh DVB-T USB2.0 (marked ATMT) and I've downloaded some
>> firmware ( which was v.difficult to find as the page in the wiki is blank)
>> which put the stick into a "warm" state i.e.
>>
>> dvb-usb: found a 'Dposh DVB-T USB2.0' in cold state, will try to load a
>> firmware
>> dvb-usb: downloading firmware from file 'dvb-usb-dposh-01.fw'
>> dvb_usb_m920x: probe of 5-1:1.0 failed with error 64
>> dvb-usb: found a 'Dposh DVB-T USB2.0' in warm state.
>> dvb-usb: will pass the complete MPEG2 transport stream to the software
>> demuxer.
>> dvb-usb: Dposh DVB-T USB2.0 successfully initialized and connected.
>> usbcore: registered new interface driver dvb_usb_m920x
>>
>> I've tried Kaffeine and w_scan to no avail, (WinXP gets a signal), I could
>> do with some advice on a)perhaps new firmware and b)help with how to use
>> dvbsnoop or similar to divine what is happening with this device as I lack
>> sufficient knowledge to proceed
>> Regards Andrew
>>
>
> There was someone asking this same some time ago. I think it could be
> possible that MT352 demodulator is changed to other one and it does not work
> due to that. Could you open the stick and check chips?
>
> Antti
> --
> http://palosaari.fi/




I got the front end info from dvbsnoop last night & it says its a Zarlink
MT352, but I should try to open the stick anyway to clear up exactly what
chips it uses, although I think its moulded plastics so I'll have to cut it
open. (@work now, will try later)
Andrew (sorry if I sent an email to you direct, Antii, I'm not sure how
Gmail handles mailing lists

[-- Attachment #1.2: Type: text/html, Size: 2207 bytes --]

[-- Attachment #2: Type: text/plain, Size: 150 bytes --]

_______________________________________________
linux-dvb mailing list
linux-dvb@linuxtv.org
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [linux-dvb] Dposh DVB-T USB2.0 seems to not work properly
  2008-06-11 22:12 Andrew Websdale
@ 2008-06-11 22:49 ` Antti Palosaari
  2008-06-12  8:58   ` Andrew Websdale
  0 siblings, 1 reply; 20+ messages in thread
From: Antti Palosaari @ 2008-06-11 22:49 UTC (permalink / raw)
  To: Andrew Websdale; +Cc: linux-dvb

Andrew Websdale wrote:
> I got the front end info from dvbsnoop last night & it says its a 
> Zarlink MT352, but I should try to open the stick anyway to clear up 
> exactly what chips it uses, although I think its moulded plastics so 
> I'll have to cut it open. (@work now, will try later)
> Andrew (sorry if I sent an email to you direct, Antii, I'm not sure how 
> Gmail handles mailing lists

If dvbsnoop says that there is Zarlink MT352, then there should be.

It should be also seen from the log, try to look your message.log again 
to see if there is mention about Zarlink MT352 demodulator / frontend 
and Quantek QT1010 tuner.

It could be also possible that tuner is not working.

Antti
-- 
http://palosaari.fi/

_______________________________________________
linux-dvb mailing list
linux-dvb@linuxtv.org
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [linux-dvb] Dposh DVB-T USB2.0 seems to not work properly
  2008-06-11 22:49 ` Antti Palosaari
@ 2008-06-12  8:58   ` Andrew Websdale
  2008-06-12 10:08     ` Antti Palosaari
  0 siblings, 1 reply; 20+ messages in thread
From: Andrew Websdale @ 2008-06-12  8:58 UTC (permalink / raw)
  To: linux-dvb


[-- Attachment #1.1: Type: text/plain, Size: 973 bytes --]

2008/6/11 Antti Palosaari <crope@iki.fi>:

> Andrew Websdale wrote:
>
>> I got the front end info from dvbsnoop last night & it says its a Zarlink
>> MT352, but I should try to open the stick anyway to clear up exactly what
>> chips it uses, although I think its moulded plastics so I'll have to cut it
>> open.
>> Andrew
>>
>
> If dvbsnoop says that there is Zarlink MT352, then there should be.
>
> It should be also seen from the log, try to look your message.log again to
> see if there is mention about Zarlink MT352 demodulator / frontend and
> Quantek QT1010 tuner.
>
> It could be also possible that tuner is not working.
>
> Antti
> --
> http://palosaari.fi/




I've examined the logs, & I can find no mention of a Quantek tuner - your
suggestion of a non-working tuner seems likely, as tuning is what doesn't
seem to work when I run e.g. w_scan - can you make any suggestion as to
where I go from here? I'm more than willing to test new code etc.
regards Andrew

[-- Attachment #1.2: Type: text/html, Size: 1510 bytes --]

[-- Attachment #2: Type: text/plain, Size: 150 bytes --]

_______________________________________________
linux-dvb mailing list
linux-dvb@linuxtv.org
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [linux-dvb] Dposh DVB-T USB2.0 seems to not work properly
  2008-06-12  8:58   ` Andrew Websdale
@ 2008-06-12 10:08     ` Antti Palosaari
  2008-06-12 13:19       ` Andrew Websdale
  0 siblings, 1 reply; 20+ messages in thread
From: Antti Palosaari @ 2008-06-12 10:08 UTC (permalink / raw)
  To: Andrew Websdale; +Cc: linux-dvb

Andrew Websdale wrote:
> I've examined the logs, & I can find no mention of a Quantek tuner - 
> your suggestion of a non-working tuner seems likely, as tuning is what 
> doesn't seem to work when I run e.g. w_scan - can you make any 
> suggestion as to where I go from here? I'm more than willing to test new 
> code etc.
> regards Andrew

OK, then the reason might by tuner. Tuner may be changed to other one or 
tuner i2c-address is changed. I doubt whole tuner is changed. Now we 
should identify which tuner is used. There is some ways how to do that.

1) Look from Windows driver files
2) Open stick and look chips
3) Take USB-sniffs and try to identify tuner from there

regards
Antti
-- 
http://palosaari.fi/

_______________________________________________
linux-dvb mailing list
linux-dvb@linuxtv.org
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [linux-dvb] Dposh DVB-T USB2.0 seems to not work properly
  2008-06-12 10:08     ` Antti Palosaari
@ 2008-06-12 13:19       ` Andrew Websdale
  2008-06-17 19:29         ` Andrew Websdale
  0 siblings, 1 reply; 20+ messages in thread
From: Andrew Websdale @ 2008-06-12 13:19 UTC (permalink / raw)
  To: linux-dvb


[-- Attachment #1.1: Type: text/plain, Size: 847 bytes --]

2008/6/12 Antti Palosaari <crope@iki.fi>:

> Andrew Websdale wrote:
>
>> I've examined the logs, & I can find no mention of a Quantek tuner - your
>> suggestion of a non-working tuner seems likely, as tuning is what doesn't
>> seem to work when I run e.g. w_scan - can you make any suggestion as to
>> where I go from here? I'm more than willing to test new code etc.
>> regards Andrew
>>
>
> OK, then the reason might by tuner. Tuner may be changed to other one or
> tuner i2c-address is changed. I doubt whole tuner is changed. Now we should
> identify which tuner is used. There is some ways how to do that.
>
> 1) Look from Windows driver files
> 2) Open stick and look chips
> 3) Take USB-sniffs and try to identify tuner from there
>
> regards
> Antti
> --
> http://palosaari.fi/



I shall try these things tonight - thanks for your advice

[-- Attachment #1.2: Type: text/html, Size: 1370 bytes --]

[-- Attachment #2: Type: text/plain, Size: 150 bytes --]

_______________________________________________
linux-dvb mailing list
linux-dvb@linuxtv.org
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [linux-dvb] Dposh DVB-T USB2.0 seems to not work properly
  2008-06-12 13:19       ` Andrew Websdale
@ 2008-06-17 19:29         ` Andrew Websdale
  2008-06-18 19:16           ` Andrew Websdale
  2008-06-19 18:07           ` Antti Palosaari
  0 siblings, 2 replies; 20+ messages in thread
From: Andrew Websdale @ 2008-06-17 19:29 UTC (permalink / raw)
  To: linux-dvb


[-- Attachment #1.1: Type: text/plain, Size: 907 bytes --]

2008/6/12 Andrew Websdale

>
>
> 2008/6/12 Antti Palosaari <crope@iki.fi>:
> wrote:
>
>> OK, then the reason might by tuner. Tuner may be changed to other one or
>> tuner i2c-address is changed. I doubt whole tuner is changed. Now we should
>> identify which tuner is used. There is some ways how to do that.
>>
>> 1) Look from Windows driver files
>> 2) Open stick and look chips
>> 3) Take USB-sniffs and try to identify tuner from there
>
>
I've opened the stick & there's an MT352 (as expected) but the other chip is
an MT2060 which is the tuner, I think, as I see that there's an 'mt2060'
module in the tuner module directory. Is there some modification I can do to
the code so that it gets picked up by the driver? - I know a bit of C++ app
programming but I'm very new to C driver code, but would like to learn more.
Hopefully I can help some others who have this chipset as well.....
regards Andrew

[-- Attachment #1.2: Type: text/html, Size: 1418 bytes --]

[-- Attachment #2: Type: text/plain, Size: 150 bytes --]

_______________________________________________
linux-dvb mailing list
linux-dvb@linuxtv.org
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [linux-dvb] Dposh DVB-T USB2.0 seems to not work properly
  2008-06-17 19:29         ` Andrew Websdale
@ 2008-06-18 19:16           ` Andrew Websdale
  2008-06-19 18:07           ` Antti Palosaari
  1 sibling, 0 replies; 20+ messages in thread
From: Andrew Websdale @ 2008-06-18 19:16 UTC (permalink / raw)
  To: linux-dvb


[-- Attachment #1.1: Type: text/plain, Size: 1378 bytes --]

2008/6/12 Andrew Websdale

>
>>
>> 2008/6/12 Antti Palosaari <crope@iki.fi>:
>> wrote:
>>
>>> OK, then the reason might by tuner. Tuner may be changed to other one or
>>> tuner i2c-address is changed. I doubt whole tuner is changed. Now we should
>>> identify which tuner is used. There is some ways how to do that.
>>>
>>> 1) Look from Windows driver files
>>> 2) Open stick and look chips
>>> 3) Take USB-sniffs and try to identify tuner from there
>>
>>
> I've opened the stick & there's an MT352 (as expected) but the other chip
> is an MT2060 which is the tuner, I think, as I see that there's an 'mt2060'
> module in the tuner module directory. Is there some modification I can do to
> the code so that it gets picked up by the driver? - I know a bit of C++ app
> programming but I'm very new to C driver code, but would like to learn more.
> Hopefully I can help some others who have this chipset as well.....
>
------x--------

I've had a look at the code & have been attempting to add new code to the
M920x driver to cope with the mt2060 tuner module, although all I've got to
go on is the existing code for the qt1010 tuner. I'm not sure of 1 or 2
magic numbers like the i2c address & so on, and my C abilities are fairly
limited, so I haven't managed to compile my new code without errors yet. I
could do with some help ( or even a patch) to be honest
regards andrew

[-- Attachment #1.2: Type: text/html, Size: 2120 bytes --]

[-- Attachment #2: Type: text/plain, Size: 150 bytes --]

_______________________________________________
linux-dvb mailing list
linux-dvb@linuxtv.org
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [linux-dvb] Dposh DVB-T USB2.0 seems to not work properly
  2008-06-17 19:29         ` Andrew Websdale
  2008-06-18 19:16           ` Andrew Websdale
@ 2008-06-19 18:07           ` Antti Palosaari
  2008-06-19 18:19             ` Andrew Websdale
  1 sibling, 1 reply; 20+ messages in thread
From: Antti Palosaari @ 2008-06-19 18:07 UTC (permalink / raw)
  To: Andrew Websdale; +Cc: linux-dvb

ti 17.6.2008 22:29 Andrew Websdale kirjoitti:
> 2008/6/12 Andrew Websdale
>> 2008/6/12 Antti Palosaari <crope@iki.fi>:
>> wrote:
>>
>>> OK, then the reason might by tuner. Tuner may be changed to other one
>>> or
>>> tuner i2c-address is changed. I doubt whole tuner is changed. Now we
>>> should
>>> identify which tuner is used. There is some ways how to do that.
>>>
>>> 1) Look from Windows driver files
>>> 2) Open stick and look chips
>>> 3) Take USB-sniffs and try to identify tuner from there
>>
>>
> I've opened the stick & there's an MT352 (as expected) but the other chip
> is
> an MT2060 which is the tuner, I think, as I see that there's an 'mt2060'
> module in the tuner module directory. Is there some modification I can do
> to
> the code so that it gets picked up by the driver? - I know a bit of C++
> app
> programming but I'm very new to C driver code, but would like to learn
> more.
> Hopefully I can help some others who have this chipset as well.....
> regards Andrew

Looks like small changes to m9206 driver is needed. MT2060 tuner needs
IF1, i2c-address and output clock bit (0/1 if I remeber correctly..).
Those can be seen from windows sniffs or by guessing / testing. IF1 is
easy to set default one, 1220, wrong IF1 only decreases performance. If
there is eeprom used then value is normally read from there, otherwose
just set default. clock is easy to test. I don´t know how many i2c-address
are supported by chip, but most probably there is not too many. Hopefully
only 4. You can look from specs or from other drivers what i2c-addresses
are used for mt2060. I think it will take 2-10 test to find correct values
by trial and error method.

I am now on holiday trip, but next week - monday or tuesday I can fix that
driver that if anyone else haven´t done already.

regards
Antti


_______________________________________________
linux-dvb mailing list
linux-dvb@linuxtv.org
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [linux-dvb] Dposh DVB-T USB2.0 seems to not work properly
  2008-06-19 18:07           ` Antti Palosaari
@ 2008-06-19 18:19             ` Andrew Websdale
  2008-06-23 11:14               ` Andrew Websdale
  0 siblings, 1 reply; 20+ messages in thread
From: Andrew Websdale @ 2008-06-19 18:19 UTC (permalink / raw)
  To: Antti Palosaari; +Cc: linux-dvb


[-- Attachment #1.1: Type: text/plain, Size: 1086 bytes --]

2008/6/19 Antti Palosaari <crope@iki.fi>:

>
> Looks like small changes to m9206 driver is needed. MT2060 tuner needs
> IF1, i2c-address and output clock bit (0/1 if I remeber correctly..).
> Those can be seen from windows sniffs or by guessing / testing. IF1 is
> easy to set default one, 1220, wrong IF1 only decreases performance. If
> there is eeprom used then value is normally read from there, otherwose
> just set default. clock is easy to test. I don´t know how many i2c-address
> are supported by chip, but most probably there is not too many. Hopefully
> only 4. You can look from specs or from other drivers what i2c-addresses
> are used for mt2060. I think it will take 2-10 test to find correct values
> by trial and error method.
>
> I am now on holiday trip, but next week - monday or tuesday I can fix that
> driver that if anyone else haven´t done already.
>
> regards
> Antti



I'll have a look at it again now you've come up with some hints, but if I
don't get anywhere, it'd be great if you can have a look at it when you
return from holiday.
Thanks mate,
Andrew

[-- Attachment #1.2: Type: text/html, Size: 1424 bytes --]

[-- Attachment #2: Type: text/plain, Size: 150 bytes --]

_______________________________________________
linux-dvb mailing list
linux-dvb@linuxtv.org
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [linux-dvb] Dposh DVB-T USB2.0 seems to not work properly
  2008-06-19 18:19             ` Andrew Websdale
@ 2008-06-23 11:14               ` Andrew Websdale
  2008-06-23 18:58                 ` Andrew Websdale
  0 siblings, 1 reply; 20+ messages in thread
From: Andrew Websdale @ 2008-06-23 11:14 UTC (permalink / raw)
  To: Antti Palosaari; +Cc: linux-dvb


[-- Attachment #1.1: Type: text/plain, Size: 1153 bytes --]

2008/6/19 Andrew Websdale <websdaleandrew@googlemail.com>:

>
>
> 2008/6/19 Antti Palosaari <crope@iki.fi>:
>
>>
>> Looks like small changes to m9206 driver is needed. MT2060 tuner needs
>> IF1, i2c-address and output clock bit (0/1 if I remeber correctly..).
>> Those can be seen from windows sniffs or by guessing / testing. IF1 is
>> easy to set default one, 1220, wrong IF1 only decreases performance. If
>> there is eeprom used then value is normally read from there, otherwose
>> just set default. clock is easy to test. I don´t know how many i2c-address
>> are supported by chip, but most probably there is not too many. Hopefully
>> only 4. You can look from specs or from other drivers what i2c-addresses
>> are used for mt2060. I think it will take 2-10 test to find correct values
>> by trial and error method.
>>
>

I've tried adding the mt2060 code - it compiles OK & does seem to be nearly
right,the tuner is being recognised, but I think loading the module causes
the I2c bit of the kernel to Oops - would an incorrect i2c address cause
this?
When I get back from work I'll post my code changes & dmesg output if it
helps
regards Andrew

[-- Attachment #1.2: Type: text/html, Size: 1722 bytes --]

[-- Attachment #2: Type: text/plain, Size: 150 bytes --]

_______________________________________________
linux-dvb mailing list
linux-dvb@linuxtv.org
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [linux-dvb] Dposh DVB-T USB2.0 seems to not work properly
  2008-06-23 11:14               ` Andrew Websdale
@ 2008-06-23 18:58                 ` Andrew Websdale
  2008-06-24  6:30                   ` Antti Palosaari
  0 siblings, 1 reply; 20+ messages in thread
From: Andrew Websdale @ 2008-06-23 18:58 UTC (permalink / raw)
  To: Antti Palosaari; +Cc: linux-dvb


[-- Attachment #1.1: Type: text/plain, Size: 4730 bytes --]

2008/6/19 Antti Palosaari <crope@iki.fi>:
>
> Looks like small changes to m9206 driver is needed. MT2060 tuner needs
>>
>>> IF1, i2c-address and output clock bit (0/1 if I remeber correctly..).
>>> Those can be seen from windows sniffs or by guessing / testing. IF1 is
>>> easy to set default one, 1220, wrong IF1 only decreases performance. If
>>> there is eeprom used then value is normally read from there, otherwose
>>> just set default. clock is easy to test. I don´t know how many
>>> i2c-address
>>> are supported by chip, but most probably there is not too many. Hopefully
>>> only 4. You can look from specs or from other drivers what i2c-addresses
>>> are used for mt2060. I think it will take 2-10 test to find correct
>>> values
>>> by trial and error method.
>>>
>>
>
> I've tried adding the mt2060 code - it compiles OK & does seem to be nearly
> right,the tuner is being recognised, but I think loading the module causes
> the I2c bit of the kernel to Oops - would an incorrect i2c address cause
> this?
>
Here's my dmesg output:
Probing for m920x device at interface 0
dvb-usb: found a 'Dposh(mt2060 tuner) DVB-T USB2.0' in cold state, will try
to load a firmware
dvb-usb: downloading firmware from file 'dvb-usb-dposh-01.fw'
80 0 b0 0
ff
usb 5-1: USB disconnect, address 2
firmware uploaded!
dvb-usb: found a 'Dposh(qt1010 tuner) DVB-T USB2.0' in cold state, will try
to load a firmware
dvb-usb: downloading firmware from file 'dvb-usb-dposh-01.fw'
m920x_read = error: -19
usb 5-1: new high speed USB device using ehci_hcd and address 3
usb 5-1: configuration #1 chosen from 1 choice
Probing for m920x device at interface 0
dvb-usb: found a 'Dposh(mt2060 tuner) DVB-T USB2.0' in warm state.
dvb-usb: will pass the complete MPEG2 transport stream to the software
demuxer.
DVB: registering new adapter (Dposh(mt2060 tuner) DVB-T USB2.0)
m920x_mt352_frontend_attach
DVB: registering frontend 0 (Zarlink MT352 DVB-T)...
m920x_mt2060_tuner_attach
BUG: unable to handle kernel NULL pointer dereference at virtual address
0000006c
printing eip: e095d10b *pde = 00000000
Oops: 0000 [#1] SMP
Modules linked in: mt2060 mt352 dvb_usb_m920x dvb_usb dvb_core // and all
the other modules

Pid: 4190, comm: modprobe Not tainted (2.6.24-1-686 #1)
EIP: 0060:[<e095d10b>] EFLAGS: 00010286 CPU: 0
EIP is at i2c_transfer+0x13/0x42 [i2c_core]
EAX: 00000060 EBX: ffffffda ECX: 00000002 EDX: c1c13d04
ESI: 000004c4 EDI: 00000060 EBP: 00000002 ESP: c1c13ce4
 DS: 007b ES: 007b FS: 00d8 GS: 0033 SS: 0068
Process modprobe (pid: 4190, ti=c1c12000 task=d3122650 task.ti=c1c12000)
Stack: c1c13d04 c1ce0060 000004c4 e0c4770c 00000060 e14a5177 e14a5934
e0c44200
       00000060 e14a0001 c1c13d00 00010060 00000001 c1c13d37 c1ce6620
e14a54a2
       00000000 d95a2724 04c42760 d30a8004 00141cb5 e14a545c d95a2724
d95a2760
Call Trace:
 [<e14a5177>] mt2060_readreg+0x51/0x70 [mt2060]
 [<e14a54a2>] mt2060_attach+0x46/0x250 [mt2060]
 [<e14a545c>] mt2060_attach+0x0/0x250 [mt2060]
 [<e0c43238>] m920x_mt2060_tuner_attach+0x69/0x93 [dvb_usb_m920x]
 [<e1492e0e>] dvb_usb_adapter_frontend_init+0xc1/0xe4 [dvb_usb]
 [<e1492886>] dvb_usb_device_init+0x43c/0x566 [dvb_usb]
 [<e0c436d7>] m920x_probe+0xcd/0x2e7 [dvb_usb_m920x]
 [<e08d415c>] usb_autopm_do_device+0xc7/0xd1 [usbcore]
 [<e08d3d3a>] usb_match_one_id+0x1c/0x71 [usbcore]
 [<e08d4be1>] usb_probe_interface+0xbf/0x102 [usbcore]
 [<c0241860>] driver_probe_device+0xde/0x15c
 [<c02bbab5>] klist_next+0x63/0x6c
 [<c0241970>] __driver_attach+0x0/0x79
 [<c02419b6>] __driver_attach+0x46/0x79
 [<c0240e3a>] bus_for_each_dev+0x37/0x59
 [<c02416c7>] driver_attach+0x16/0x18
 [<c0241970>] __driver_attach+0x0/0x79
 [<c0241120>] bus_add_driver+0x6d/0x197
 [<e08d47c2>] usb_register_driver+0x6d/0xd4 [usbcore]
 [<e0c36018>] m920x_module_init+0x18/0x34 [dvb_usb_m920x]
 [<c0138f4e>] blocking_notifier_call_chain+0x17/0x1a
 [<c014377d>] sys_init_module+0x15db/0x16f3
 [<c01640ca>] vma_prio_tree_insert+0x17/0x2a
 [<e0c402ac>] mt352_get_parameters+0x88/0x1f5 [mt352]
 [<e0c40644>] mt352_set_parameters+0x116/0x2d6 [mt352]
 [<e0c40554>] mt352_set_parameters+0x26/0x2d6 [mt352]
 [<e0c4066c>] mt352_set_parameters+0x13e/0x2d6 [mt352]
 [<c012c810>] msleep+0x0/0x12
 [<e0c401d4>] mt352_read_status+0x44/0x94 [mt352]
 [<e0c40694>] mt352_set_parameters+0x166/0x2d6 [mt352]
 [<c0103e5e>] sysenter_past_esp+0x6b/0xa1
 =======================
Code: ff ff ff 8b 53 08 0f b7 4b 04 0f b6 c0 e8 90 ff ff ff 5a 5b 0f b6 c0
c3 55 89 cd 57 89 c7 56 53 bb da ff ff ff 83 ec 04 89 14 24 <8b> 40 0c 83 38
00 74 1f 8d 77 20 89 f0 e8 a2 fc 95 df 8b 5f 0c
EIP: [<e095d10b>] i2c_transfer+0x13/0x42 [i2c_core] SS:ESP 0068:c1c13ce4
---[ end trace 769dc0c1be3fb9e2 ]---

I've attached the m920x.c file that I have altered.


>
>
>
>
>

[-- Attachment #1.2: Type: text/html, Size: 6283 bytes --]

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: m920x.c --]
[-- Type: text/x-csrc; name=m920x.c, Size: 24518 bytes --]

/* DVB USB compliant linux driver for MSI Mega Sky 580 DVB-T USB2.0 receiver
 *
 * Copyright (C) 2006 Aapo Tahkola (aet@rasterburn.org)
 *
 *	This program is free software; you can redistribute it and/or modify it
 *	under the terms of the GNU General Public License as published by the
 *	Free Software Foundation, version 2.
 *
 * see Documentation/dvb/README.dvb-usb for more information
 */

#include "m920x.h"
#include "mt2060.h"
#include "mt352.h"
#include "mt352_priv.h"
#include "qt1010.h"
#include "tda1004x.h"
#include "tda827x.h"
#include <asm/unaligned.h>

/* debug */
static int dvb_usb_m920x_debug;
static bool bdposh_warm = false;
module_param_named(debug,dvb_usb_m920x_debug, int, 0644);
MODULE_PARM_DESC(debug, "set debugging level (1=rc (or-able))." DVB_USB_DEBUG_STATUS);

DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);

static int m920x_set_filter(struct dvb_usb_device *d, int type, int idx, int pid);

static inline int m920x_read(struct usb_device *udev, u8 request, u16 value,
			     u16 index, void *data, int size)
{
	int ret;

	ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
			      request, USB_TYPE_VENDOR | USB_DIR_IN,
			      value, index, data, size, 2000);
	if (ret < 0) {
		printk(KERN_INFO "m920x_read = error: %d\n", ret);
		return ret;
	}

	if (ret != size) {
		deb("m920x_read = no data\n");
		return -EIO;
	}

	return 0;
}

static inline int m920x_write(struct usb_device *udev, u8 request,
			      u16 value, u16 index)
{
	int ret;

	ret = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
			      request, USB_TYPE_VENDOR | USB_DIR_OUT,
			      value, index, NULL, 0, 2000);

	return ret;
}

static int m920x_init(struct dvb_usb_device *d, struct m920x_inits *rc_seq)
{
	int ret = 0, i, epi, flags = 0;
	int adap_enabled[M9206_MAX_ADAPTERS] = { 0 };

	/* Remote controller init. */
	if (d->props.rc_query) {
		deb("Initialising remote control\n");
		while (rc_seq->address) {
			if ((ret = m920x_write(d->udev, M9206_CORE,
					       rc_seq->data,
					       rc_seq->address)) != 0) {
				deb("Initialising remote control failed\n");
				return ret;
			}

			rc_seq++;
		}

		deb("Initialising remote control success\n");
	}

	for (i = 0; i < d->props.num_adapters; i++)
		flags |= d->adapter[i].props.caps;

	/* Some devices(Dposh) might crash if we attempt touch at all. */
	if (flags & DVB_USB_ADAP_HAS_PID_FILTER) {
		for (i = 0; i < d->props.num_adapters; i++) {
			epi = d->adapter[i].props.stream.endpoint - 0x81;

			if (epi < 0 || epi >= M9206_MAX_ADAPTERS) {
				printk(KERN_INFO "m920x: Unexpected adapter endpoint!\n");
				return -EINVAL;
			}

			adap_enabled[epi] = 1;
		}

		for (i = 0; i < M9206_MAX_ADAPTERS; i++) {
			if (adap_enabled[i])
				continue;

			if ((ret = m920x_set_filter(d, 0x81 + i, 0, 0x0)) != 0)
				return ret;

			if ((ret = m920x_set_filter(d, 0x81 + i, 0, 0x02f5)) != 0)
				return ret;
		}
	}

	return ret;
}

static int m920x_init_ep(struct usb_interface *intf)
{
	struct usb_device *udev = interface_to_usbdev(intf);
	struct usb_host_interface *alt;

	if ((alt = usb_altnum_to_altsetting(intf, 1)) == NULL) {
		deb("No alt found!\n");
		return -ENODEV;
	}

	return usb_set_interface(udev, alt->desc.bInterfaceNumber,
				 alt->desc.bAlternateSetting);
}

static int m920x_rc_query(struct dvb_usb_device *d, u32 *event, int *state)
{
	struct m920x_state *m = d->priv;
	int i, ret = 0;
	u8 rc_state[2];

	if ((ret = m920x_read(d->udev, M9206_CORE, 0x0, M9206_RC_STATE, rc_state, 1)) != 0)
		goto unlock;

	if ((ret = m920x_read(d->udev, M9206_CORE, 0x0, M9206_RC_KEY, rc_state + 1, 1)) != 0)
		goto unlock;

	for (i = 0; i < d->props.rc_key_map_size; i++)
		if (d->props.rc_key_map[i].data == rc_state[1]) {
			*event = d->props.rc_key_map[i].event;

			switch(rc_state[0]) {
			case 0x80:
				*state = REMOTE_NO_KEY_PRESSED;
				goto unlock;

			case 0x88: /* framing error or "invalid code" */
			case 0x99:
			case 0xc0:
			case 0xd8:
				*state = REMOTE_NO_KEY_PRESSED;
				m->rep_count = 0;
				goto unlock;

			case 0x93:
			case 0x92:
				m->rep_count = 0;
				*state = REMOTE_KEY_PRESSED;
				goto unlock;

			case 0x91:
				/* prevent immediate auto-repeat */
				if (++m->rep_count > 2)
					*state = REMOTE_KEY_REPEAT;
				else
					*state = REMOTE_NO_KEY_PRESSED;
				goto unlock;

			default:
				deb("Unexpected rc state %02x\n", rc_state[0]);
				*state = REMOTE_NO_KEY_PRESSED;
				goto unlock;
			}
		}

	if (rc_state[1] != 0)
		deb("Unknown rc key %02x\n", rc_state[1]);

	*state = REMOTE_NO_KEY_PRESSED;

 unlock:

	return ret;
}

/* I2C */
static int m920x_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[], int num)
{
	struct dvb_usb_device *d = i2c_get_adapdata(adap);
	int i, j;
	int ret = 0;

	if (!num)
		return -EINVAL;

	if (mutex_lock_interruptible(&d->i2c_mutex) < 0)
		return -EAGAIN;

	for (i = 0; i < num; i++) {
		if (msg[i].flags & (I2C_M_NO_RD_ACK | I2C_M_IGNORE_NAK | I2C_M_TEN) || msg[i].len == 0) {
			/* For a 0 byte message, I think sending the address
			 * to index 0x80|0x40 would be the correct thing to
			 * do.  However, zero byte messages are only used for
			 * probing, and since we don't know how to get the
			 * slave's ack, we can't probe. */
			ret = -ENOTSUPP;
			goto unlock;
		}
		/* Send START & address/RW bit */
		if (!(msg[i].flags & I2C_M_NOSTART)) {
			if ((ret = m920x_write(d->udev, M9206_I2C,
					(msg[i].addr << 1) |
					(msg[i].flags & I2C_M_RD ? 0x01 : 0), 0x80)) != 0)
				goto unlock;
			/* Should check for ack here, if we knew how. */
		}
		if (msg[i].flags & I2C_M_RD) {
			for (j = 0; j < msg[i].len; j++) {
				/* Last byte of transaction?
				 * Send STOP, otherwise send ACK. */
				int stop = (i+1 == num && j+1 == msg[i].len) ? 0x40 : 0x01;

				if ((ret = m920x_read(d->udev, M9206_I2C, 0x0,
						      0x20 | stop,
						      &msg[i].buf[j], 1)) != 0)
					goto unlock;
			}
		} else {
			for (j = 0; j < msg[i].len; j++) {
				/* Last byte of transaction? Then send STOP. */
				int stop = (i+1 == num && j+1 == msg[i].len) ? 0x40 : 0x00;

				if ((ret = m920x_write(d->udev, M9206_I2C, msg[i].buf[j], stop)) != 0)
					goto unlock;
				/* Should check for ack here too. */
			}
		}
	}
	ret = num;

 unlock:
	mutex_unlock(&d->i2c_mutex);

	return ret;
}

static u32 m920x_i2c_func(struct i2c_adapter *adapter)
{
	return I2C_FUNC_I2C;
}

static struct i2c_algorithm m920x_i2c_algo = {
	.master_xfer   = m920x_i2c_xfer,
	.functionality = m920x_i2c_func,
};

/* pid filter */
static int m920x_set_filter(struct dvb_usb_device *d, int type, int idx, int pid)
{
	int ret = 0;

	if (pid >= 0x8000)
		return -EINVAL;

	pid |= 0x8000;

	if ((ret = m920x_write(d->udev, M9206_FILTER, pid, (type << 8) | (idx * 4) )) != 0)
		return ret;

	if ((ret = m920x_write(d->udev, M9206_FILTER, 0, (type << 8) | (idx * 4) )) != 0)
		return ret;

	return ret;
}

static int m920x_update_filters(struct dvb_usb_adapter *adap)
{
	struct m920x_state *m = adap->dev->priv;
	int enabled = m->filtering_enabled[adap->id];
	int i, ret = 0, filter = 0;
	int ep = adap->props.stream.endpoint;

	for (i = 0; i < M9206_MAX_FILTERS; i++)
		if (m->filters[adap->id][i] == 8192)
			enabled = 0;

	/* Disable all filters */
	if ((ret = m920x_set_filter(adap->dev, ep, 1, enabled)) != 0)
		return ret;

	for (i = 0; i < M9206_MAX_FILTERS; i++)
		if ((ret = m920x_set_filter(adap->dev, ep, i + 2, 0)) != 0)
			return ret;

	/* Set */
	if (enabled) {
		for (i = 0; i < M9206_MAX_FILTERS; i++) {
			if (m->filters[adap->id][i] == 0)
				continue;

			if ((ret = m920x_set_filter(adap->dev, ep, filter + 2, m->filters[adap->id][i])) != 0)
				return ret;

			filter++;
		}
	}

	return ret;
}

static int m920x_pid_filter_ctrl(struct dvb_usb_adapter *adap, int onoff)
{
	struct m920x_state *m = adap->dev->priv;

	m->filtering_enabled[adap->id] = onoff ? 1 : 0;

	return m920x_update_filters(adap);
}

static int m920x_pid_filter(struct dvb_usb_adapter *adap, int index, u16 pid, int onoff)
{
	struct m920x_state *m = adap->dev->priv;

	m->filters[adap->id][index] = onoff ? pid : 0;

	return m920x_update_filters(adap);
}

static int m920x_firmware_download(struct usb_device *udev, const struct firmware *fw)
{
	u16 value, index, size;
	u8 read[4], *buff;
	int i, pass, ret = 0;

	buff = kmalloc(65536, GFP_KERNEL);

	if ((ret = m920x_read(udev, M9206_FILTER, 0x0, 0x8000, read, 4)) != 0)
		goto done;
	deb("%x %x %x %x\n", read[0], read[1], read[2], read[3]);

	if ((ret = m920x_read(udev, M9206_FW, 0x0, 0x0, read, 1)) != 0)
		goto done;
	deb("%x\n", read[0]);

	for (pass = 0; pass < 2; pass++) {
		for (i = 0; i + (sizeof(u16) * 3) < fw->size;) {
			value = get_unaligned_le16(fw->data + i);
			i += sizeof(u16);

			index = get_unaligned_le16(fw->data + i);
			i += sizeof(u16);

			size = get_unaligned_le16(fw->data + i);
			i += sizeof(u16);

			if (pass == 1) {
				/* Will stall if using fw->data ... */
				memcpy(buff, fw->data + i, size);

				ret = usb_control_msg(udev, usb_sndctrlpipe(udev,0),
						      M9206_FW,
						      USB_TYPE_VENDOR | USB_DIR_OUT,
						      value, index, buff, size, 20);
				if (ret != size) {
					deb("error while uploading fw!\n");
					ret = -EIO;
					goto done;
				}
				msleep(3);
			}
			i += size;
		}
		if (i != fw->size) {
			deb("bad firmware file!\n");
			ret = -EINVAL;
			goto done;
		}
	}

	msleep(36);

	/* m920x will disconnect itself from the bus after this. */
	(void) m920x_write(udev, M9206_CORE, 0x01, M9206_FW_GO);
	deb("firmware uploaded!\n");

 done:
	kfree(buff);

	return ret;
}

/* Callbacks for DVB USB */
static int m920x_identify_state(struct usb_device *udev,
				struct dvb_usb_device_properties *props,
				struct dvb_usb_device_description **desc,
				int *cold)
{
	struct usb_host_interface *alt;

	alt = usb_altnum_to_altsetting(usb_ifnum_to_if(udev, 0), 1);
	*cold = (alt == NULL) ? 1 : 0;

	return 0;
}

/* demod configurations */
static int m920x_mt352_demod_init(struct dvb_frontend *fe)
{
	int ret;
	u8 config[] = { CONFIG, 0x3d };
	u8 clock[] = { CLOCK_CTL, 0x30 };
	u8 reset[] = { RESET, 0x80 };
	u8 adc_ctl[] = { ADC_CTL_1, 0x40 };
	u8 agc[] = { AGC_TARGET, 0x1c, 0x20 };
	u8 sec_agc[] = { 0x69, 0x00, 0xff, 0xff, 0x40, 0xff, 0x00, 0x40, 0x40 };
	u8 unk1[] = { 0x93, 0x1a };
	u8 unk2[] = { 0xb5, 0x7a };

	deb("Demod init!\n");

	if ((ret = mt352_write(fe, config, ARRAY_SIZE(config))) != 0)
		return ret;
	if ((ret = mt352_write(fe, clock, ARRAY_SIZE(clock))) != 0)
		return ret;
	if ((ret = mt352_write(fe, reset, ARRAY_SIZE(reset))) != 0)
		return ret;
	if ((ret = mt352_write(fe, adc_ctl, ARRAY_SIZE(adc_ctl))) != 0)
		return ret;
	if ((ret = mt352_write(fe, agc, ARRAY_SIZE(agc))) != 0)
		return ret;
	if ((ret = mt352_write(fe, sec_agc, ARRAY_SIZE(sec_agc))) != 0)
		return ret;
	if ((ret = mt352_write(fe, unk1, ARRAY_SIZE(unk1))) != 0)
		return ret;
	if ((ret = mt352_write(fe, unk2, ARRAY_SIZE(unk2))) != 0)
		return ret;

	return 0;
}

static struct mt352_config m920x_mt352_config = {
	.demod_address = 0x0f,
	.no_tuner = 1,
	.demod_init = m920x_mt352_demod_init,
};

static struct tda1004x_config m920x_tda10046_08_config = {
	.demod_address = 0x08,
	.invert = 0,
	.invert_oclk = 0,
	.ts_mode = TDA10046_TS_SERIAL,
	.xtal_freq = TDA10046_XTAL_16M,
	.if_freq = TDA10046_FREQ_045,
	.agc_config = TDA10046_AGC_TDA827X,
	.gpio_config = TDA10046_GPTRI,
	.request_firmware = NULL,
};

static struct tda1004x_config m920x_tda10046_0b_config = {
	.demod_address = 0x0b,
	.invert = 0,
	.invert_oclk = 0,
	.ts_mode = TDA10046_TS_SERIAL,
	.xtal_freq = TDA10046_XTAL_16M,
	.if_freq = TDA10046_FREQ_045,
	.agc_config = TDA10046_AGC_TDA827X,
	.gpio_config = TDA10046_GPTRI,
	.request_firmware = NULL, /* uses firmware EEPROM */
};

/* tuner configurations */
static struct qt1010_config m920x_qt1010_config = {
	.i2c_address = 0x62
};

static struct mt2060_config m920x_mt2060_config = {
	.i2c_address = 0x60           //andy todo
};

/* Callbacks for DVB USB */
static int m920x_mt352_frontend_attach(struct dvb_usb_adapter *adap)
{
	deb("%s\n",__func__);

	if ((adap->fe = dvb_attach(mt352_attach,
				   &m920x_mt352_config,
				   &adap->dev->i2c_adap)) == NULL)
		return -EIO;

	return 0;
}

static int m920x_tda10046_08_frontend_attach(struct dvb_usb_adapter *adap)
{
	deb("%s\n",__func__);

	if ((adap->fe = dvb_attach(tda10046_attach,
				   &m920x_tda10046_08_config,
				   &adap->dev->i2c_adap)) == NULL)
		return -EIO;

	return 0;
}

static int m920x_tda10046_0b_frontend_attach(struct dvb_usb_adapter *adap)
{
	deb("%s\n",__func__);

	if ((adap->fe = dvb_attach(tda10046_attach,
				   &m920x_tda10046_0b_config,
				   &adap->dev->i2c_adap)) == NULL)
		return -EIO;

	return 0;
}

static int m920x_qt1010_tuner_attach(struct dvb_usb_adapter *adap)
{
	deb("%s\n",__func__);

	if (dvb_attach(qt1010_attach, adap->fe, &adap->dev->i2c_adap, &m920x_qt1010_config) == NULL)
		return -ENODEV;

	return 0;
}

static int m920x_tda8275_60_tuner_attach(struct dvb_usb_adapter *adap)
{
	deb("%s\n",__func__);

	if (dvb_attach(tda827x_attach, adap->fe, 0x60, &adap->dev->i2c_adap, NULL) == NULL)
		return -ENODEV;

	return 0;
}

static int m920x_tda8275_61_tuner_attach(struct dvb_usb_adapter *adap)
{
	deb("%s\n",__func__);

	if (dvb_attach(tda827x_attach, adap->fe, 0x61, &adap->dev->i2c_adap, NULL) == NULL)
		return -ENODEV;

	return 0;
}

static int m920x_mt2060_tuner_attach(struct dvb_usb_adapter *adap)
{
	u16 if1;
	
	deb("%s\n",__func__);
	
	if1 = 1220;
	
	if (dvb_attach(mt2060_attach, adap->fe, 0x60, &m920x_mt2060_config, if1) == NULL)
		return -ENODEV;

	return 0;
}
/* device-specific initialization */
static struct m920x_inits megasky_rc_init [] = {
	{ M9206_RC_INIT2, 0xa8 },
	{ M9206_RC_INIT1, 0x51 },
	{ } /* terminating entry */
};

static struct m920x_inits tvwalkertwin_rc_init [] = {
	{ M9206_RC_INIT2, 0x00 },
	{ M9206_RC_INIT1, 0xef },
	{ 0xff28,         0x00 },
	{ 0xff23,         0x00 },
	{ 0xff21,         0x30 },
	{ } /* terminating entry */
};

/* ir keymaps */
static struct dvb_usb_rc_key megasky_rc_keys [] = {
	{ 0x0, 0x12, KEY_POWER },
	{ 0x0, 0x1e, KEY_CYCLEWINDOWS }, /* min/max */
	{ 0x0, 0x02, KEY_CHANNELUP },
	{ 0x0, 0x05, KEY_CHANNELDOWN },
	{ 0x0, 0x03, KEY_VOLUMEUP },
	{ 0x0, 0x06, KEY_VOLUMEDOWN },
	{ 0x0, 0x04, KEY_MUTE },
	{ 0x0, 0x07, KEY_OK }, /* TS */
	{ 0x0, 0x08, KEY_STOP },
	{ 0x0, 0x09, KEY_MENU }, /* swap */
	{ 0x0, 0x0a, KEY_REWIND },
	{ 0x0, 0x1b, KEY_PAUSE },
	{ 0x0, 0x1f, KEY_FASTFORWARD },
	{ 0x0, 0x0c, KEY_RECORD },
	{ 0x0, 0x0d, KEY_CAMERA }, /* screenshot */
	{ 0x0, 0x0e, KEY_COFFEE }, /* "MTS" */
};

static struct dvb_usb_rc_key tvwalkertwin_rc_keys [] = {
	{ 0x0, 0x01, KEY_ZOOM }, /* Full Screen */
	{ 0x0, 0x02, KEY_CAMERA }, /* snapshot */
	{ 0x0, 0x03, KEY_MUTE },
	{ 0x0, 0x04, KEY_REWIND },
	{ 0x0, 0x05, KEY_PLAYPAUSE }, /* Play/Pause */
	{ 0x0, 0x06, KEY_FASTFORWARD },
	{ 0x0, 0x07, KEY_RECORD },
	{ 0x0, 0x08, KEY_STOP },
	{ 0x0, 0x09, KEY_TIME }, /* Timeshift */
	{ 0x0, 0x0c, KEY_COFFEE }, /* Recall */
	{ 0x0, 0x0e, KEY_CHANNELUP },
	{ 0x0, 0x12, KEY_POWER },
	{ 0x0, 0x15, KEY_MENU }, /* source */
	{ 0x0, 0x18, KEY_CYCLEWINDOWS }, /* TWIN PIP */
	{ 0x0, 0x1a, KEY_CHANNELDOWN },
	{ 0x0, 0x1b, KEY_VOLUMEDOWN },
	{ 0x0, 0x1e, KEY_VOLUMEUP },
};

/* DVB USB Driver stuff */
static struct dvb_usb_device_properties megasky_properties;
static struct dvb_usb_device_properties digivox_mini_ii_properties;
static struct dvb_usb_device_properties tvwalkertwin_properties;
static struct dvb_usb_device_properties dposh_properties;//qt1010
static struct dvb_usb_device_properties dposh_mt_properties;//for mt2060

static int m920x_probe(struct usb_interface *intf,
		       const struct usb_device_id *id)
{
	struct dvb_usb_device *d = NULL;
	int ret;
	struct m920x_inits *rc_init_seq = NULL;
	int bInterfaceNumber = intf->cur_altsetting->desc.bInterfaceNumber;

	deb("Probing for m920x device at interface %d\n", bInterfaceNumber);

	if (bInterfaceNumber == 0) {
		/* Single-tuner device, or first interface on
		 * multi-tuner device
		 */

		ret = dvb_usb_device_init(intf, &megasky_properties,
					  THIS_MODULE, &d, adapter_nr);
		if (ret == 0) {
			rc_init_seq = megasky_rc_init;
			goto found;
		}

		ret = dvb_usb_device_init(intf, &digivox_mini_ii_properties,
					  THIS_MODULE, &d, adapter_nr);
		if (ret == 0) {
			/* No remote control, so no rc_init_seq */
			goto found;
		}

		/* This configures both tuners on the TV Walker Twin */
		ret = dvb_usb_device_init(intf, &tvwalkertwin_properties,
					  THIS_MODULE, &d, adapter_nr);
		if (ret == 0) {
			rc_init_seq = tvwalkertwin_rc_init;
			goto found;
		}
		
		ret = dvb_usb_device_init(intf, &dposh_mt_properties,
					  THIS_MODULE, &d, adapter_nr);
		if (ret == 0) {
			/* Remote controller not supported yet. */
			bdposh_warm = true;			
			goto found;
		}
		
		if (bdposh_warm != true){ 		
			ret = dvb_usb_device_init(intf, &dposh_properties,
					  THIS_MODULE, &d, adapter_nr);
			if (ret == 0) {
			/* Remote controller not supported yet. */
				goto found;
			}
		}



		return ret;
	} else {
		/* Another interface on a multi-tuner device */

		/* The LifeView TV Walker Twin gets here, but struct
		 * tvwalkertwin_properties already configured both
		 * tuners, so there is nothing for us to do here
		 */
	}

 found:
	if ((ret = m920x_init_ep(intf)) < 0)
		return ret;

	if (d && (ret = m920x_init(d, rc_init_seq)) != 0)
		return ret;

	return ret;
}

static struct usb_device_id m920x_table [] = {
		{ USB_DEVICE(USB_VID_MSI, USB_PID_MSI_MEGASKY580) },
		{ USB_DEVICE(USB_VID_ANUBIS_ELECTRONIC,
			     USB_PID_MSI_DIGI_VOX_MINI_II) },
		{ USB_DEVICE(USB_VID_ANUBIS_ELECTRONIC,
			     USB_PID_LIFEVIEW_TV_WALKER_TWIN_COLD) },
		{ USB_DEVICE(USB_VID_ANUBIS_ELECTRONIC,
			     USB_PID_LIFEVIEW_TV_WALKER_TWIN_WARM) },
		{ USB_DEVICE(USB_VID_DPOSH, USB_PID_DPOSH_M9206_COLD) },
		{ USB_DEVICE(USB_VID_DPOSH, USB_PID_DPOSH_M9206_WARM) },
		{ }		/* Terminating entry */
};
MODULE_DEVICE_TABLE (usb, m920x_table);

static struct dvb_usb_device_properties megasky_properties = {
	.caps = DVB_USB_IS_AN_I2C_ADAPTER,

	.usb_ctrl = DEVICE_SPECIFIC,
	.firmware = "dvb-usb-megasky-02.fw",
	.download_firmware = m920x_firmware_download,

	.rc_interval      = 100,
	.rc_key_map       = megasky_rc_keys,
	.rc_key_map_size  = ARRAY_SIZE(megasky_rc_keys),
	.rc_query         = m920x_rc_query,

	.size_of_priv     = sizeof(struct m920x_state),

	.identify_state   = m920x_identify_state,
	.num_adapters = 1,
	.adapter = {{
		.caps = DVB_USB_ADAP_HAS_PID_FILTER |
			DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,

		.pid_filter_count = 8,
		.pid_filter       = m920x_pid_filter,
		.pid_filter_ctrl  = m920x_pid_filter_ctrl,

		.frontend_attach  = m920x_mt352_frontend_attach,
		.tuner_attach     = m920x_qt1010_tuner_attach,

		.stream = {
			.type = USB_BULK,
			.count = 8,
			.endpoint = 0x81,
			.u = {
				.bulk = {
					.buffersize = 512,
				}
			}
		},
	}},
	.i2c_algo         = &m920x_i2c_algo,

	.num_device_descs = 1,
	.devices = {
		{   "MSI Mega Sky 580 DVB-T USB2.0",
			{ &m920x_table[0], NULL },
			{ NULL },
		}
	}
};

static struct dvb_usb_device_properties digivox_mini_ii_properties = {
	.caps = DVB_USB_IS_AN_I2C_ADAPTER,

	.usb_ctrl = DEVICE_SPECIFIC,
	.firmware = "dvb-usb-digivox-02.fw",
	.download_firmware = m920x_firmware_download,

	.size_of_priv     = sizeof(struct m920x_state),

	.identify_state   = m920x_identify_state,
	.num_adapters = 1,
	.adapter = {{
		.caps = DVB_USB_ADAP_HAS_PID_FILTER |
			DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,

		.pid_filter_count = 8,
		.pid_filter       = m920x_pid_filter,
		.pid_filter_ctrl  = m920x_pid_filter_ctrl,

		.frontend_attach  = m920x_tda10046_08_frontend_attach,
		.tuner_attach     = m920x_tda8275_60_tuner_attach,

		.stream = {
			.type = USB_BULK,
			.count = 8,
			.endpoint = 0x81,
			.u = {
				.bulk = {
					.buffersize = 0x4000,
				}
			}
		},
	}},
	.i2c_algo         = &m920x_i2c_algo,

	.num_device_descs = 1,
	.devices = {
		{   "MSI DIGI VOX mini II DVB-T USB2.0",
			{ &m920x_table[1], NULL },
			{ NULL },
		},
	}
};

/* LifeView TV Walker Twin support by Nick Andrew <nick@nick-andrew.net>
 *
 * LifeView TV Walker Twin has 1 x M9206, 2 x TDA10046, 2 x TDA8275A
 * TDA10046 #0 is located at i2c address 0x08
 * TDA10046 #1 is located at i2c address 0x0b
 * TDA8275A #0 is located at i2c address 0x60
 * TDA8275A #1 is located at i2c address 0x61
 */
static struct dvb_usb_device_properties tvwalkertwin_properties = {
	.caps = DVB_USB_IS_AN_I2C_ADAPTER,

	.usb_ctrl = DEVICE_SPECIFIC,
	.firmware = "dvb-usb-tvwalkert.fw",
	.download_firmware = m920x_firmware_download,

	.rc_interval      = 100,
	.rc_key_map       = tvwalkertwin_rc_keys,
	.rc_key_map_size  = ARRAY_SIZE(tvwalkertwin_rc_keys),
	.rc_query         = m920x_rc_query,

	.size_of_priv     = sizeof(struct m920x_state),

	.identify_state   = m920x_identify_state,
	.num_adapters = 2,
	.adapter = {{
		.caps = DVB_USB_ADAP_HAS_PID_FILTER |
			DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,

		.pid_filter_count = 8,
		.pid_filter       = m920x_pid_filter,
		.pid_filter_ctrl  = m920x_pid_filter_ctrl,

		.frontend_attach  = m920x_tda10046_08_frontend_attach,
		.tuner_attach     = m920x_tda8275_60_tuner_attach,

		.stream = {
			.type = USB_BULK,
			.count = 8,
			.endpoint = 0x81,
			.u = {
				 .bulk = {
					 .buffersize = 512,
				 }
			}
		}},{
		.caps = DVB_USB_ADAP_HAS_PID_FILTER |
			DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,

		.pid_filter_count = 8,
		.pid_filter       = m920x_pid_filter,
		.pid_filter_ctrl  = m920x_pid_filter_ctrl,

		.frontend_attach  = m920x_tda10046_0b_frontend_attach,
		.tuner_attach     = m920x_tda8275_61_tuner_attach,

		.stream = {
			.type = USB_BULK,
			.count = 8,
			.endpoint = 0x82,
			.u = {
				 .bulk = {
					 .buffersize = 512,
				 }
			}
		},
	}},
	.i2c_algo         = &m920x_i2c_algo,

	.num_device_descs = 1,
	.devices = {
		{   .name = "LifeView TV Walker Twin DVB-T USB2.0",
		    .cold_ids = { &m920x_table[2], NULL },
		    .warm_ids = { &m920x_table[3], NULL },
		},
	}
};

static struct dvb_usb_device_properties dposh_properties = {
	.caps = DVB_USB_IS_AN_I2C_ADAPTER,

	.usb_ctrl = DEVICE_SPECIFIC,
	.firmware = "dvb-usb-dposh-01.fw",
	.download_firmware = m920x_firmware_download,

	.size_of_priv     = sizeof(struct m920x_state),

	.identify_state   = m920x_identify_state,
	.num_adapters = 1,
	.adapter = {{
		/* Hardware pid filters don't work with this device/firmware */

		.frontend_attach  = m920x_mt352_frontend_attach,
		.tuner_attach     = m920x_qt1010_tuner_attach,

		.stream = {
			.type = USB_BULK,
			.count = 8,
			.endpoint = 0x81,
			.u = {
				 .bulk = {
					 .buffersize = 512,
				 }
			}
		},
	}},
	.i2c_algo         = &m920x_i2c_algo,

	.num_device_descs = 1,
	.devices = {
		 {   .name = "Dposh(qt1010 tuner) DVB-T USB2.0",
		     .cold_ids = { &m920x_table[4], NULL },
		     .warm_ids = { &m920x_table[5], NULL },
		 },
	 }
};


static struct dvb_usb_device_properties dposh_mt_properties = {
	.caps = DVB_USB_IS_AN_I2C_ADAPTER,

	.usb_ctrl = DEVICE_SPECIFIC,
	.firmware = "dvb-usb-dposh-01.fw",
	.download_firmware = m920x_firmware_download,

	.size_of_priv     = sizeof(struct m920x_state),

	.identify_state   = m920x_identify_state,
	.num_adapters = 1,
	.adapter = {{

		.frontend_attach  = m920x_mt352_frontend_attach,
		.tuner_attach     = m920x_mt2060_tuner_attach,

		.stream = {
			.type = USB_BULK,
			.count = 7,
			.endpoint = 0x81,
			.u = {
				 .bulk = {
					 .buffersize = 512,
				 }
			}
		},
	}},
	.i2c_algo         = &m920x_i2c_algo,

	.num_device_descs = 1,
	.devices = {
		 {   .name = "Dposh(mt2060 tuner) DVB-T USB2.0",
		     .cold_ids = { &m920x_table[4], NULL },
		     .warm_ids = { &m920x_table[5], NULL },
		 },
	 }


};


static struct usb_driver m920x_driver = {
#if LINUX_VERSION_CODE <=  KERNEL_VERSION(2,6,15)
	.owner		= THIS_MODULE,
#endif
	.name		= "dvb_usb_m920x",
	.probe		= m920x_probe,
	.disconnect	= dvb_usb_device_exit,
	.id_table	= m920x_table,
};

/* module stuff */
static int __init m920x_module_init(void)
{
	int ret;

	if ((ret = usb_register(&m920x_driver))) {
		err("usb_register failed. Error number %d", ret);
		return ret;
	}

	return 0;
}

static void __exit m920x_module_exit(void)
{
	/* deregister this driver from the USB subsystem */
	usb_deregister(&m920x_driver);
}

module_init (m920x_module_init);
module_exit (m920x_module_exit);

MODULE_AUTHOR("Aapo Tahkola <aet@rasterburn.org>");
MODULE_DESCRIPTION("DVB Driver for ULI M920x");
MODULE_VERSION("0.1");
MODULE_LICENSE("GPL");

/*
 * Local variables:
 * c-basic-offset: 8
 */

[-- Attachment #3: Type: text/plain, Size: 150 bytes --]

_______________________________________________
linux-dvb mailing list
linux-dvb@linuxtv.org
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [linux-dvb] Dposh DVB-T USB2.0 seems to not work properly
  2008-06-23 18:58                 ` Andrew Websdale
@ 2008-06-24  6:30                   ` Antti Palosaari
  2008-06-24  9:20                     ` Andrew Websdale
  2008-06-24 19:09                     ` Andrew Websdale
  0 siblings, 2 replies; 20+ messages in thread
From: Antti Palosaari @ 2008-06-24  6:30 UTC (permalink / raw)
  To: Andrew Websdale; +Cc: Antti Palosaari, linux-dvb

ma 23.6.2008 21:58 Andrew Websdale kirjoitti:
> 2008/6/19 Antti Palosaari <crope@iki.fi>:
>>
>> Looks like small changes to m9206 driver is needed. MT2060 tuner needs
>>>
>>>> IF1, i2c-address and output clock bit (0/1 if I remeber correctly..).
>>>> Those can be seen from windows sniffs or by guessing / testing. IF1 is
>>>> easy to set default one, 1220, wrong IF1 only decreases performance.
>>>> If
>>>> there is eeprom used then value is normally read from there, otherwose
>>>> just set default. clock is easy to test. I don´t know how many
>>>> i2c-address
>>>> are supported by chip, but most probably there is not too many.
>>>> Hopefully
>>>> only 4. You can look from specs or from other drivers what
>>>> i2c-addresses
>>>> are used for mt2060. I think it will take 2-10 test to find correct
>>>> values
>>>> by trial and error method.
>>>>
>>>
>>
>> I've tried adding the mt2060 code - it compiles OK & does seem to be
>> nearly
>> right,the tuner is being recognised, but I think loading the module
>> causes
>> the I2c bit of the kernel to Oops - would an incorrect i2c address cause
>> this?
>>
> Here's my dmesg output:
> m920x_mt2060_tuner_attach
> BUG: unable to handle kernel NULL pointer dereference at virtual address
> 0000006c

because you have passed tuner i2c-address as parameter to the dvb_attach()

regards
Antti


_______________________________________________
linux-dvb mailing list
linux-dvb@linuxtv.org
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [linux-dvb] Dposh DVB-T USB2.0 seems to not work properly
  2008-06-24  6:30                   ` Antti Palosaari
@ 2008-06-24  9:20                     ` Andrew Websdale
  2008-06-24 19:09                     ` Andrew Websdale
  1 sibling, 0 replies; 20+ messages in thread
From: Andrew Websdale @ 2008-06-24  9:20 UTC (permalink / raw)
  To: Antti Palosaari; +Cc: linux-dvb


[-- Attachment #1.1: Type: text/plain, Size: 1850 bytes --]

2008/6/24 Antti Palosaari <crope@iki.fi>:

> ma 23.6.2008 21:58 Andrew Websdale kirjoitti:
> > 2008/6/19 Antti Palosaari <crope@iki.fi>:
> >>
> >> Looks like small changes to m9206 driver is needed. MT2060 tuner needs
> >>>
> >>>> IF1, i2c-address and output clock bit (0/1 if I remeber correctly..).
> >>>> Those can be seen from windows sniffs or by guessing / testing. IF1 is
> >>>> easy to set default one, 1220, wrong IF1 only decreases performance.
> >>>> If
> >>>> there is eeprom used then value is normally read from there, otherwose
> >>>> just set default. clock is easy to test. I don´t know how many
> >>>> i2c-address
> >>>> are supported by chip, but most probably there is not too many.
> >>>> Hopefully
> >>>> only 4. You can look from specs or from other drivers what
> >>>> i2c-addresses
> >>>> are used for mt2060. I think it will take 2-10 test to find correct
> >>>> values
> >>>> by trial and error method.
> >>>>
> >>>
> >>
> >> I've tried adding the mt2060 code - it compiles OK & does seem to be
> >> nearly
> >> right,the tuner is being recognised, but I think loading the module
> >> causes
> >> the I2c bit of the kernel to Oops - would an incorrect i2c address cause
> >> this?
> >>
> > Here's my dmesg output:
> > m920x_mt2060_tuner_attach
> > BUG: unable to handle kernel NULL pointer dereference at virtual address
> > 0000006c
>
> because you have passed tuner i2c-address as parameter to the dvb_attach()
>
> Sorry if I've made an obvious error, its the 1st time I've tried to change
> a driver, what should I be passing - is it "&adap->dev->i2c_adap"? I tried
> to find an example of mt2060 being attached, but I was barking up the wrong
> tree :). I don't want to waste your (or anyone elses) time, but I'd like to
> learn something about kernel drivers & maybe make some contribution if I
> can.

cheers Andrew

[-- Attachment #1.2: Type: text/html, Size: 2604 bytes --]

[-- Attachment #2: Type: text/plain, Size: 150 bytes --]

_______________________________________________
linux-dvb mailing list
linux-dvb@linuxtv.org
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [linux-dvb] Dposh DVB-T USB2.0 seems to not work properly
  2008-06-24  6:30                   ` Antti Palosaari
  2008-06-24  9:20                     ` Andrew Websdale
@ 2008-06-24 19:09                     ` Andrew Websdale
  2008-06-25 22:28                       ` Andrew Websdale
  1 sibling, 1 reply; 20+ messages in thread
From: Andrew Websdale @ 2008-06-24 19:09 UTC (permalink / raw)
  To: Antti Palosaari; +Cc: linux-dvb


[-- Attachment #1.1: Type: text/plain, Size: 2351 bytes --]

2008/6/24 Antti Palosaari <crope@iki.fi>:

> ma 23.6.2008 21:58 Andrew Websdale kirjoitti:
>
> >> I've tried adding the mt2060 code - it compiles OK & does seem to be
> >> nearly
> >> right,the tuner is being recognised, but I think loading the module
> >> causes
> >> the I2c bit of the kernel to Oops - would an incorrect i2c address cause
> >> this?
> >>
> > Here's my dmesg output:
> > m920x_mt2060_tuner_attach
> > BUG: unable to handle kernel NULL pointer dereference at virtual address
> > 0000006c
>
> because you have passed tuner i2c-address as parameter to the dvb_attach()




I've changed the parameter to '&adap->dev->i2c_adap' & I now get this dmesg
output:

dvb-usb: found a 'Dposh(mt2060 tuner) DVB-T USB2.0' in cold state, will try
to load a firmware
dvb-usb: downloading firmware from file 'dvb-usb-dposh-01.fw'
80 0 b0 0
ff
firmware uploaded!
dvb_usb_m920x: probe of 5-1:1.0 failed with error 64
usb 5-1: USB disconnect, address 4
usb 5-1: new high speed USB device using ehci_hcd and address 5
usb 5-1: configuration #1 chosen from 1 choice
Probing for m920x device at interface 0
dvb-usb: found a 'Dposh(mt2060 tuner) DVB-T USB2.0' in warm state.
dvb-usb: will pass the complete MPEG2 transport stream to the software
demuxer.
DVB: registering new adapter (Dposh(mt2060 tuner) DVB-T USB2.0)
m920x_mt352_frontend_attach
DVB: registering frontend 0 (Zarlink MT352 DVB-T)...
m920x_mt2060_tuner_attach
MT2060: successfully identified (IF1 = 1220)
dvb-usb: Dposh(mt2060 tuner) DVB-T USB2.0 successfully initialized and
connected.

so far so good :) , but when I scan with Kaffeine I get this:

Demod init!    //this repeated ~ 30 times

mt352_read_register: readreg error (reg=3, ret==-110)  //then this block or
mt2060 I2C write failed (len=2)                           //similar repeated
until end of scan
mt2060 I2C write failed (len=6)
mt2060 I2C read failed
mt2060 I2C read failed
mt2060 I2C read failed
mt2060 I2C read failed
mt2060 I2C read failed
mt2060 I2C read failed
mt2060 I2C read failed
mt2060 I2C read failed
mt2060 I2C read failed
mt2060 I2C read failed
mt352_write() to reg 51 failed (err = -110)!
mt352_write() to reg 5e failed (err = -110)!


Could this just be due to not getting the .i2c_address set in the
'm920x_mt2060_config' struct correct, or is it another dumb error on my
part?
cheers for the help,
Andrew

[-- Attachment #1.2: Type: text/html, Size: 3095 bytes --]

[-- Attachment #2: Type: text/plain, Size: 150 bytes --]

_______________________________________________
linux-dvb mailing list
linux-dvb@linuxtv.org
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [linux-dvb] Dposh DVB-T USB2.0 seems to not work properly
  2008-06-24 19:09                     ` Andrew Websdale
@ 2008-06-25 22:28                       ` Andrew Websdale
  2008-07-04 23:13                         ` Andrew Websdale
  0 siblings, 1 reply; 20+ messages in thread
From: Andrew Websdale @ 2008-06-25 22:28 UTC (permalink / raw)
  To: linux-dvb


[-- Attachment #1.1: Type: text/plain, Size: 1099 bytes --]

2008/6/24 Andrew Websdale <websdaleandrew@googlemail.com>:

>
>
> m920x_mt2060_tuner_attach
> MT2060: successfully identified (IF1 = 1220)
> dvb-usb: Dposh(mt2060 tuner) DVB-T USB2.0 successfully initialized and
> connected.
>
> so far so good :) , but when I scan with Kaffeine I get this:
>
> Demod init!    //this repeated ~ 30 times
>
> mt352_read_register: readreg error (reg=3, ret==-110)  //then this block or
> mt2060 I2C write failed (len=2)                           //similar
> repeated until end of scan
> mt2060 I2C write failed (len=6)
> mt2060 I2C read failed
>
> Could this just be due to not getting the .i2c_address set in the
> 'm920x_mt2060_config' struct correct, or is it another dumb error on my
> part?
>


after trying a different address (0x61) I no longer get all the "Demod
Inits!" & the failed reads, however I still have no result on scanning. I
shall try to find out what's going on with dvbsnoop also maybe try different
i2c addresses.I've attached the my version of m920x.c, so anyone is welcome
to point out any mistakes, as I'm v.new to driver dev.
regards
Andrew

[-- Attachment #1.2: Type: text/html, Size: 1645 bytes --]

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: m920x.c --]
[-- Type: text/x-csrc; name=m920x.c, Size: 24522 bytes --]

/* DVB USB compliant linux driver for MSI Mega Sky 580 DVB-T USB2.0 receiver
 *
 * Copyright (C) 2006 Aapo Tahkola (aet@rasterburn.org)
 *
 *	This program is free software; you can redistribute it and/or modify it
 *	under the terms of the GNU General Public License as published by the
 *	Free Software Foundation, version 2.
 *
 * see Documentation/dvb/README.dvb-usb for more information
 */

#include "m920x.h"
#include "mt2060.h"
#include "mt352.h"
#include "mt352_priv.h"
#include "qt1010.h"
#include "tda1004x.h"
#include "tda827x.h"
#include <asm/unaligned.h>

/* debug */
static int dvb_usb_m920x_debug;
static bool bdposh_warm = false;
module_param_named(debug,dvb_usb_m920x_debug, int, 0644);
MODULE_PARM_DESC(debug, "set debugging level (1=rc (or-able))." DVB_USB_DEBUG_STATUS);

DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);

static int m920x_set_filter(struct dvb_usb_device *d, int type, int idx, int pid);

static inline int m920x_read(struct usb_device *udev, u8 request, u16 value,
			     u16 index, void *data, int size)
{
	int ret;

	ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
			      request, USB_TYPE_VENDOR | USB_DIR_IN,
			      value, index, data, size, 2000);
	if (ret < 0) {
		printk(KERN_INFO "m920x_read = error: %d\n", ret);
		return ret;
	}

	if (ret != size) {
		deb("m920x_read = no data\n");
		return -EIO;
	}

	return 0;
}

static inline int m920x_write(struct usb_device *udev, u8 request,
			      u16 value, u16 index)
{
	int ret;

	ret = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
			      request, USB_TYPE_VENDOR | USB_DIR_OUT,
			      value, index, NULL, 0, 2000);

	return ret;
}

static int m920x_init(struct dvb_usb_device *d, struct m920x_inits *rc_seq)
{
	int ret = 0, i, epi, flags = 0;
	int adap_enabled[M9206_MAX_ADAPTERS] = { 0 };

	/* Remote controller init. */
	if (d->props.rc_query) {
		deb("Initialising remote control\n");
		while (rc_seq->address) {
			if ((ret = m920x_write(d->udev, M9206_CORE,
					       rc_seq->data,
					       rc_seq->address)) != 0) {
				deb("Initialising remote control failed\n");
				return ret;
			}

			rc_seq++;
		}

		deb("Initialising remote control success\n");
	}

	for (i = 0; i < d->props.num_adapters; i++)
		flags |= d->adapter[i].props.caps;

	/* Some devices(Dposh) might crash if we attempt touch at all. */
	if (flags & DVB_USB_ADAP_HAS_PID_FILTER) {
		for (i = 0; i < d->props.num_adapters; i++) {
			epi = d->adapter[i].props.stream.endpoint - 0x81;

			if (epi < 0 || epi >= M9206_MAX_ADAPTERS) {
				printk(KERN_INFO "m920x: Unexpected adapter endpoint!\n");
				return -EINVAL;
			}

			adap_enabled[epi] = 1;
		}

		for (i = 0; i < M9206_MAX_ADAPTERS; i++) {
			if (adap_enabled[i])
				continue;

			if ((ret = m920x_set_filter(d, 0x81 + i, 0, 0x0)) != 0)
				return ret;

			if ((ret = m920x_set_filter(d, 0x81 + i, 0, 0x02f5)) != 0)
				return ret;
		}
	}

	return ret;
}

static int m920x_init_ep(struct usb_interface *intf)
{
	struct usb_device *udev = interface_to_usbdev(intf);
	struct usb_host_interface *alt;

	if ((alt = usb_altnum_to_altsetting(intf, 1)) == NULL) {
		deb("No alt found!\n");
		return -ENODEV;
	}

	return usb_set_interface(udev, alt->desc.bInterfaceNumber,
				 alt->desc.bAlternateSetting);
}

static int m920x_rc_query(struct dvb_usb_device *d, u32 *event, int *state)
{
	struct m920x_state *m = d->priv;
	int i, ret = 0;
	u8 rc_state[2];

	if ((ret = m920x_read(d->udev, M9206_CORE, 0x0, M9206_RC_STATE, rc_state, 1)) != 0)
		goto unlock;

	if ((ret = m920x_read(d->udev, M9206_CORE, 0x0, M9206_RC_KEY, rc_state + 1, 1)) != 0)
		goto unlock;

	for (i = 0; i < d->props.rc_key_map_size; i++)
		if (d->props.rc_key_map[i].data == rc_state[1]) {
			*event = d->props.rc_key_map[i].event;

			switch(rc_state[0]) {
			case 0x80:
				*state = REMOTE_NO_KEY_PRESSED;
				goto unlock;

			case 0x88: /* framing error or "invalid code" */
			case 0x99:
			case 0xc0:
			case 0xd8:
				*state = REMOTE_NO_KEY_PRESSED;
				m->rep_count = 0;
				goto unlock;

			case 0x93:
			case 0x92:
				m->rep_count = 0;
				*state = REMOTE_KEY_PRESSED;
				goto unlock;

			case 0x91:
				/* prevent immediate auto-repeat */
				if (++m->rep_count > 2)
					*state = REMOTE_KEY_REPEAT;
				else
					*state = REMOTE_NO_KEY_PRESSED;
				goto unlock;

			default:
				deb("Unexpected rc state %02x\n", rc_state[0]);
				*state = REMOTE_NO_KEY_PRESSED;
				goto unlock;
			}
		}

	if (rc_state[1] != 0)
		deb("Unknown rc key %02x\n", rc_state[1]);

	*state = REMOTE_NO_KEY_PRESSED;

 unlock:

	return ret;
}

/* I2C */
static int m920x_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[], int num)
{
	struct dvb_usb_device *d = i2c_get_adapdata(adap);
	int i, j;
	int ret = 0;

	if (!num)
		return -EINVAL;

	if (mutex_lock_interruptible(&d->i2c_mutex) < 0)
		return -EAGAIN;

	for (i = 0; i < num; i++) {
		if (msg[i].flags & (I2C_M_NO_RD_ACK | I2C_M_IGNORE_NAK | I2C_M_TEN) || msg[i].len == 0) {
			/* For a 0 byte message, I think sending the address
			 * to index 0x80|0x40 would be the correct thing to
			 * do.  However, zero byte messages are only used for
			 * probing, and since we don't know how to get the
			 * slave's ack, we can't probe. */
			ret = -ENOTSUPP;
			goto unlock;
		}
		/* Send START & address/RW bit */
		if (!(msg[i].flags & I2C_M_NOSTART)) {
			if ((ret = m920x_write(d->udev, M9206_I2C,
					(msg[i].addr << 1) |
					(msg[i].flags & I2C_M_RD ? 0x01 : 0), 0x80)) != 0)
				goto unlock;
			/* Should check for ack here, if we knew how. */
		}
		if (msg[i].flags & I2C_M_RD) {
			for (j = 0; j < msg[i].len; j++) {
				/* Last byte of transaction?
				 * Send STOP, otherwise send ACK. */
				int stop = (i+1 == num && j+1 == msg[i].len) ? 0x40 : 0x01;

				if ((ret = m920x_read(d->udev, M9206_I2C, 0x0,
						      0x20 | stop,
						      &msg[i].buf[j], 1)) != 0)
					goto unlock;
			}
		} else {
			for (j = 0; j < msg[i].len; j++) {
				/* Last byte of transaction? Then send STOP. */
				int stop = (i+1 == num && j+1 == msg[i].len) ? 0x40 : 0x00;

				if ((ret = m920x_write(d->udev, M9206_I2C, msg[i].buf[j], stop)) != 0)
					goto unlock;
				/* Should check for ack here too. */
			}
		}
	}
	ret = num;

 unlock:
	mutex_unlock(&d->i2c_mutex);

	return ret;
}

static u32 m920x_i2c_func(struct i2c_adapter *adapter)
{
	return I2C_FUNC_I2C;
}

static struct i2c_algorithm m920x_i2c_algo = {
	.master_xfer   = m920x_i2c_xfer,
	.functionality = m920x_i2c_func,
};

/* pid filter */
static int m920x_set_filter(struct dvb_usb_device *d, int type, int idx, int pid)
{
	int ret = 0;

	if (pid >= 0x8000)
		return -EINVAL;

	pid |= 0x8000;

	if ((ret = m920x_write(d->udev, M9206_FILTER, pid, (type << 8) | (idx * 4) )) != 0)
		return ret;

	if ((ret = m920x_write(d->udev, M9206_FILTER, 0, (type << 8) | (idx * 4) )) != 0)
		return ret;

	return ret;
}

static int m920x_update_filters(struct dvb_usb_adapter *adap)
{
	struct m920x_state *m = adap->dev->priv;
	int enabled = m->filtering_enabled[adap->id];
	int i, ret = 0, filter = 0;
	int ep = adap->props.stream.endpoint;

	for (i = 0; i < M9206_MAX_FILTERS; i++)
		if (m->filters[adap->id][i] == 8192)
			enabled = 0;

	/* Disable all filters */
	if ((ret = m920x_set_filter(adap->dev, ep, 1, enabled)) != 0)
		return ret;

	for (i = 0; i < M9206_MAX_FILTERS; i++)
		if ((ret = m920x_set_filter(adap->dev, ep, i + 2, 0)) != 0)
			return ret;

	/* Set */
	if (enabled) {
		for (i = 0; i < M9206_MAX_FILTERS; i++) {
			if (m->filters[adap->id][i] == 0)
				continue;

			if ((ret = m920x_set_filter(adap->dev, ep, filter + 2, m->filters[adap->id][i])) != 0)
				return ret;

			filter++;
		}
	}

	return ret;
}

static int m920x_pid_filter_ctrl(struct dvb_usb_adapter *adap, int onoff)
{
	struct m920x_state *m = adap->dev->priv;

	m->filtering_enabled[adap->id] = onoff ? 1 : 0;

	return m920x_update_filters(adap);
}

static int m920x_pid_filter(struct dvb_usb_adapter *adap, int index, u16 pid, int onoff)
{
	struct m920x_state *m = adap->dev->priv;

	m->filters[adap->id][index] = onoff ? pid : 0;

	return m920x_update_filters(adap);
}

static int m920x_firmware_download(struct usb_device *udev, const struct firmware *fw)
{
	u16 value, index, size;
	u8 read[4], *buff;
	int i, pass, ret = 0;

	buff = kmalloc(65536, GFP_KERNEL);

	if ((ret = m920x_read(udev, M9206_FILTER, 0x0, 0x8000, read, 4)) != 0)
		goto done;
	deb("%x %x %x %x\n", read[0], read[1], read[2], read[3]);

	if ((ret = m920x_read(udev, M9206_FW, 0x0, 0x0, read, 1)) != 0)
		goto done;
	deb("%x\n", read[0]);

	for (pass = 0; pass < 2; pass++) {
		for (i = 0; i + (sizeof(u16) * 3) < fw->size;) {
			value = get_unaligned_le16(fw->data + i);
			i += sizeof(u16);

			index = get_unaligned_le16(fw->data + i);
			i += sizeof(u16);

			size = get_unaligned_le16(fw->data + i);
			i += sizeof(u16);

			if (pass == 1) {
				/* Will stall if using fw->data ... */
				memcpy(buff, fw->data + i, size);

				ret = usb_control_msg(udev, usb_sndctrlpipe(udev,0),
						      M9206_FW,
						      USB_TYPE_VENDOR | USB_DIR_OUT,
						      value, index, buff, size, 20);
				if (ret != size) {
					deb("error while uploading fw!\n");
					ret = -EIO;
					goto done;
				}
				msleep(3);
			}
			i += size;
		}
		if (i != fw->size) {
			deb("bad firmware file!\n");
			ret = -EINVAL;
			goto done;
		}
	}

	msleep(36);

	/* m920x will disconnect itself from the bus after this. */
	(void) m920x_write(udev, M9206_CORE, 0x01, M9206_FW_GO);
	deb("firmware uploaded!\n");

 done:
	kfree(buff);

	return ret;
}

/* Callbacks for DVB USB */
static int m920x_identify_state(struct usb_device *udev,
				struct dvb_usb_device_properties *props,
				struct dvb_usb_device_description **desc,
				int *cold)
{
	struct usb_host_interface *alt;

	alt = usb_altnum_to_altsetting(usb_ifnum_to_if(udev, 0), 1);
	*cold = (alt == NULL) ? 1 : 0;

	return 0;
}

/* demod configurations */
static int m920x_mt352_demod_init(struct dvb_frontend *fe)
{
	int ret;
	u8 config[] = { CONFIG, 0x3d };
	u8 clock[] = { CLOCK_CTL, 0x30 };
	u8 reset[] = { RESET, 0x80 };
	u8 adc_ctl[] = { ADC_CTL_1, 0x40 };
	u8 agc[] = { AGC_TARGET, 0x1c, 0x20 };
	u8 sec_agc[] = { 0x69, 0x00, 0xff, 0xff, 0x40, 0xff, 0x00, 0x40, 0x40 };
	u8 unk1[] = { 0x93, 0x1a };
	u8 unk2[] = { 0xb5, 0x7a };

	deb("Demod init!\n");

	if ((ret = mt352_write(fe, config, ARRAY_SIZE(config))) != 0)
		return ret;
	if ((ret = mt352_write(fe, clock, ARRAY_SIZE(clock))) != 0)
		return ret;
	if ((ret = mt352_write(fe, reset, ARRAY_SIZE(reset))) != 0)
		return ret;
	if ((ret = mt352_write(fe, adc_ctl, ARRAY_SIZE(adc_ctl))) != 0)
		return ret;
	if ((ret = mt352_write(fe, agc, ARRAY_SIZE(agc))) != 0)
		return ret;
	if ((ret = mt352_write(fe, sec_agc, ARRAY_SIZE(sec_agc))) != 0)
		return ret;
	if ((ret = mt352_write(fe, unk1, ARRAY_SIZE(unk1))) != 0)
		return ret;
	if ((ret = mt352_write(fe, unk2, ARRAY_SIZE(unk2))) != 0)
		return ret;

	return 0;
}

static struct mt352_config m920x_mt352_config = {
	.demod_address = 0x0f,
	.no_tuner = 1,
	.demod_init = m920x_mt352_demod_init,
};

static struct tda1004x_config m920x_tda10046_08_config = {
	.demod_address = 0x08,
	.invert = 0,
	.invert_oclk = 0,
	.ts_mode = TDA10046_TS_SERIAL,
	.xtal_freq = TDA10046_XTAL_16M,
	.if_freq = TDA10046_FREQ_045,
	.agc_config = TDA10046_AGC_TDA827X,
	.gpio_config = TDA10046_GPTRI,
	.request_firmware = NULL,
};

static struct tda1004x_config m920x_tda10046_0b_config = {
	.demod_address = 0x0b,
	.invert = 0,
	.invert_oclk = 0,
	.ts_mode = TDA10046_TS_SERIAL,
	.xtal_freq = TDA10046_XTAL_16M,
	.if_freq = TDA10046_FREQ_045,
	.agc_config = TDA10046_AGC_TDA827X,
	.gpio_config = TDA10046_GPTRI,
	.request_firmware = NULL, /* uses firmware EEPROM */
};

/* tuner configurations */
static struct qt1010_config m920x_qt1010_config = {
	.i2c_address = 0x62
};

static struct mt2060_config m920x_mt2060_config = {
	.i2c_address = 0x61          
};

/* Callbacks for DVB USB */
static int m920x_mt352_frontend_attach(struct dvb_usb_adapter *adap)
{
	deb("%s\n",__func__);

	if ((adap->fe = dvb_attach(mt352_attach,
				   &m920x_mt352_config,
				   &adap->dev->i2c_adap)) == NULL)
		return -EIO;

	return 0;
}

static int m920x_tda10046_08_frontend_attach(struct dvb_usb_adapter *adap)
{
	deb("%s\n",__func__);

	if ((adap->fe = dvb_attach(tda10046_attach,
				   &m920x_tda10046_08_config,
				   &adap->dev->i2c_adap)) == NULL)
		return -EIO;

	return 0;
}

static int m920x_tda10046_0b_frontend_attach(struct dvb_usb_adapter *adap)
{
	deb("%s\n",__func__);

	if ((adap->fe = dvb_attach(tda10046_attach,
				   &m920x_tda10046_0b_config,
				   &adap->dev->i2c_adap)) == NULL)
		return -EIO;

	return 0;
}

static int m920x_qt1010_tuner_attach(struct dvb_usb_adapter *adap)
{
	deb("%s\n",__func__);

	if (dvb_attach(qt1010_attach, adap->fe, &adap->dev->i2c_adap, &m920x_qt1010_config) == NULL)
		return -ENODEV;

	return 0;
}

static int m920x_tda8275_60_tuner_attach(struct dvb_usb_adapter *adap)
{
	deb("%s\n",__func__);

	if (dvb_attach(tda827x_attach, adap->fe, 0x60, &adap->dev->i2c_adap, NULL) == NULL)
		return -ENODEV;

	return 0;
}

static int m920x_tda8275_61_tuner_attach(struct dvb_usb_adapter *adap)
{
	deb("%s\n",__func__);

	if (dvb_attach(tda827x_attach, adap->fe, 0x61, &adap->dev->i2c_adap, NULL) == NULL)
		return -ENODEV;

	return 0;
}

static int m920x_mt2060_tuner_attach(struct dvb_usb_adapter *adap)
{
	u16 if1;
	
	deb("%s\n",__func__);
	
	if1 = 1220;
	
	if (dvb_attach(mt2060_attach, adap->fe, &adap->dev->i2c_adap, &m920x_mt2060_config, if1) == NULL)
		return -ENODEV;

	return 0;
}
/* device-specific initialization */
static struct m920x_inits megasky_rc_init [] = {
	{ M9206_RC_INIT2, 0xa8 },
	{ M9206_RC_INIT1, 0x51 },
	{ } /* terminating entry */
};

static struct m920x_inits tvwalkertwin_rc_init [] = {
	{ M9206_RC_INIT2, 0x00 },
	{ M9206_RC_INIT1, 0xef },
	{ 0xff28,         0x00 },
	{ 0xff23,         0x00 },
	{ 0xff21,         0x30 },
	{ } /* terminating entry */
};

/* ir keymaps */
static struct dvb_usb_rc_key megasky_rc_keys [] = {
	{ 0x0, 0x12, KEY_POWER },
	{ 0x0, 0x1e, KEY_CYCLEWINDOWS }, /* min/max */
	{ 0x0, 0x02, KEY_CHANNELUP },
	{ 0x0, 0x05, KEY_CHANNELDOWN },
	{ 0x0, 0x03, KEY_VOLUMEUP },
	{ 0x0, 0x06, KEY_VOLUMEDOWN },
	{ 0x0, 0x04, KEY_MUTE },
	{ 0x0, 0x07, KEY_OK }, /* TS */
	{ 0x0, 0x08, KEY_STOP },
	{ 0x0, 0x09, KEY_MENU }, /* swap */
	{ 0x0, 0x0a, KEY_REWIND },
	{ 0x0, 0x1b, KEY_PAUSE },
	{ 0x0, 0x1f, KEY_FASTFORWARD },
	{ 0x0, 0x0c, KEY_RECORD },
	{ 0x0, 0x0d, KEY_CAMERA }, /* screenshot */
	{ 0x0, 0x0e, KEY_COFFEE }, /* "MTS" */
};

static struct dvb_usb_rc_key tvwalkertwin_rc_keys [] = {
	{ 0x0, 0x01, KEY_ZOOM }, /* Full Screen */
	{ 0x0, 0x02, KEY_CAMERA }, /* snapshot */
	{ 0x0, 0x03, KEY_MUTE },
	{ 0x0, 0x04, KEY_REWIND },
	{ 0x0, 0x05, KEY_PLAYPAUSE }, /* Play/Pause */
	{ 0x0, 0x06, KEY_FASTFORWARD },
	{ 0x0, 0x07, KEY_RECORD },
	{ 0x0, 0x08, KEY_STOP },
	{ 0x0, 0x09, KEY_TIME }, /* Timeshift */
	{ 0x0, 0x0c, KEY_COFFEE }, /* Recall */
	{ 0x0, 0x0e, KEY_CHANNELUP },
	{ 0x0, 0x12, KEY_POWER },
	{ 0x0, 0x15, KEY_MENU }, /* source */
	{ 0x0, 0x18, KEY_CYCLEWINDOWS }, /* TWIN PIP */
	{ 0x0, 0x1a, KEY_CHANNELDOWN },
	{ 0x0, 0x1b, KEY_VOLUMEDOWN },
	{ 0x0, 0x1e, KEY_VOLUMEUP },
};

/* DVB USB Driver stuff */
static struct dvb_usb_device_properties megasky_properties;
static struct dvb_usb_device_properties digivox_mini_ii_properties;
static struct dvb_usb_device_properties tvwalkertwin_properties;
static struct dvb_usb_device_properties dposh_properties;//qt1010
static struct dvb_usb_device_properties dposh_mt_properties;//for mt2060

static int m920x_probe(struct usb_interface *intf,
		       const struct usb_device_id *id)
{
	struct dvb_usb_device *d = NULL;
	int ret;
	struct m920x_inits *rc_init_seq = NULL;
	int bInterfaceNumber = intf->cur_altsetting->desc.bInterfaceNumber;

	deb("Probing for m920x device at interface %d\n", bInterfaceNumber);

	if (bInterfaceNumber == 0) {
		/* Single-tuner device, or first interface on
		 * multi-tuner device
		 */

		ret = dvb_usb_device_init(intf, &megasky_properties,
					  THIS_MODULE, &d, adapter_nr);
		if (ret == 0) {
			rc_init_seq = megasky_rc_init;
			goto found;
		}

		ret = dvb_usb_device_init(intf, &digivox_mini_ii_properties,
					  THIS_MODULE, &d, adapter_nr);
		if (ret == 0) {
			/* No remote control, so no rc_init_seq */
			goto found;
		}

		/* This configures both tuners on the TV Walker Twin */
		ret = dvb_usb_device_init(intf, &tvwalkertwin_properties,
					  THIS_MODULE, &d, adapter_nr);
		if (ret == 0) {
			rc_init_seq = tvwalkertwin_rc_init;
			goto found;
		}
		
		ret = dvb_usb_device_init(intf, &dposh_mt_properties,
					  THIS_MODULE, &d, adapter_nr);
		if (ret == 0) {
			/* Remote controller not supported yet. */
			bdposh_warm = true;			
			goto found;
		}
		
		if (bdposh_warm != true){ 		
			ret = dvb_usb_device_init(intf, &dposh_properties,
					  THIS_MODULE, &d, adapter_nr);
			if (ret == 0) {
			/* Remote controller not supported yet. */
				goto found;
			}
		}



		return ret;
	} else {
		/* Another interface on a multi-tuner device */

		/* The LifeView TV Walker Twin gets here, but struct
		 * tvwalkertwin_properties already configured both
		 * tuners, so there is nothing for us to do here
		 */
	}

 found:
	if ((ret = m920x_init_ep(intf)) < 0)
		return ret;

	if (d && (ret = m920x_init(d, rc_init_seq)) != 0)
		return ret;

	return ret;
}

static struct usb_device_id m920x_table [] = {
		{ USB_DEVICE(USB_VID_MSI, USB_PID_MSI_MEGASKY580) },
		{ USB_DEVICE(USB_VID_ANUBIS_ELECTRONIC,
			     USB_PID_MSI_DIGI_VOX_MINI_II) },
		{ USB_DEVICE(USB_VID_ANUBIS_ELECTRONIC,
			     USB_PID_LIFEVIEW_TV_WALKER_TWIN_COLD) },
		{ USB_DEVICE(USB_VID_ANUBIS_ELECTRONIC,
			     USB_PID_LIFEVIEW_TV_WALKER_TWIN_WARM) },
		{ USB_DEVICE(USB_VID_DPOSH, USB_PID_DPOSH_M9206_COLD) },
		{ USB_DEVICE(USB_VID_DPOSH, USB_PID_DPOSH_M9206_WARM) },
		{ }		/* Terminating entry */
};
MODULE_DEVICE_TABLE (usb, m920x_table);

static struct dvb_usb_device_properties megasky_properties = {
	.caps = DVB_USB_IS_AN_I2C_ADAPTER,

	.usb_ctrl = DEVICE_SPECIFIC,
	.firmware = "dvb-usb-megasky-02.fw",
	.download_firmware = m920x_firmware_download,

	.rc_interval      = 100,
	.rc_key_map       = megasky_rc_keys,
	.rc_key_map_size  = ARRAY_SIZE(megasky_rc_keys),
	.rc_query         = m920x_rc_query,

	.size_of_priv     = sizeof(struct m920x_state),

	.identify_state   = m920x_identify_state,
	.num_adapters = 1,
	.adapter = {{
		.caps = DVB_USB_ADAP_HAS_PID_FILTER |
			DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,

		.pid_filter_count = 8,
		.pid_filter       = m920x_pid_filter,
		.pid_filter_ctrl  = m920x_pid_filter_ctrl,

		.frontend_attach  = m920x_mt352_frontend_attach,
		.tuner_attach     = m920x_qt1010_tuner_attach,

		.stream = {
			.type = USB_BULK,
			.count = 8,
			.endpoint = 0x81,
			.u = {
				.bulk = {
					.buffersize = 512,
				}
			}
		},
	}},
	.i2c_algo         = &m920x_i2c_algo,

	.num_device_descs = 1,
	.devices = {
		{   "MSI Mega Sky 580 DVB-T USB2.0",
			{ &m920x_table[0], NULL },
			{ NULL },
		}
	}
};

static struct dvb_usb_device_properties digivox_mini_ii_properties = {
	.caps = DVB_USB_IS_AN_I2C_ADAPTER,

	.usb_ctrl = DEVICE_SPECIFIC,
	.firmware = "dvb-usb-digivox-02.fw",
	.download_firmware = m920x_firmware_download,

	.size_of_priv     = sizeof(struct m920x_state),

	.identify_state   = m920x_identify_state,
	.num_adapters = 1,
	.adapter = {{
		.caps = DVB_USB_ADAP_HAS_PID_FILTER |
			DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,

		.pid_filter_count = 8,
		.pid_filter       = m920x_pid_filter,
		.pid_filter_ctrl  = m920x_pid_filter_ctrl,

		.frontend_attach  = m920x_tda10046_08_frontend_attach,
		.tuner_attach     = m920x_tda8275_60_tuner_attach,

		.stream = {
			.type = USB_BULK,
			.count = 8,
			.endpoint = 0x81,
			.u = {
				.bulk = {
					.buffersize = 0x4000,
				}
			}
		},
	}},
	.i2c_algo         = &m920x_i2c_algo,

	.num_device_descs = 1,
	.devices = {
		{   "MSI DIGI VOX mini II DVB-T USB2.0",
			{ &m920x_table[1], NULL },
			{ NULL },
		},
	}
};

/* LifeView TV Walker Twin support by Nick Andrew <nick@nick-andrew.net>
 *
 * LifeView TV Walker Twin has 1 x M9206, 2 x TDA10046, 2 x TDA8275A
 * TDA10046 #0 is located at i2c address 0x08
 * TDA10046 #1 is located at i2c address 0x0b
 * TDA8275A #0 is located at i2c address 0x60
 * TDA8275A #1 is located at i2c address 0x61
 */
static struct dvb_usb_device_properties tvwalkertwin_properties = {
	.caps = DVB_USB_IS_AN_I2C_ADAPTER,

	.usb_ctrl = DEVICE_SPECIFIC,
	.firmware = "dvb-usb-tvwalkert.fw",
	.download_firmware = m920x_firmware_download,

	.rc_interval      = 100,
	.rc_key_map       = tvwalkertwin_rc_keys,
	.rc_key_map_size  = ARRAY_SIZE(tvwalkertwin_rc_keys),
	.rc_query         = m920x_rc_query,

	.size_of_priv     = sizeof(struct m920x_state),

	.identify_state   = m920x_identify_state,
	.num_adapters = 2,
	.adapter = {{
		.caps = DVB_USB_ADAP_HAS_PID_FILTER |
			DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,

		.pid_filter_count = 8,
		.pid_filter       = m920x_pid_filter,
		.pid_filter_ctrl  = m920x_pid_filter_ctrl,

		.frontend_attach  = m920x_tda10046_08_frontend_attach,
		.tuner_attach     = m920x_tda8275_60_tuner_attach,

		.stream = {
			.type = USB_BULK,
			.count = 8,
			.endpoint = 0x81,
			.u = {
				 .bulk = {
					 .buffersize = 512,
				 }
			}
		}},{
		.caps = DVB_USB_ADAP_HAS_PID_FILTER |
			DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,

		.pid_filter_count = 8,
		.pid_filter       = m920x_pid_filter,
		.pid_filter_ctrl  = m920x_pid_filter_ctrl,

		.frontend_attach  = m920x_tda10046_0b_frontend_attach,
		.tuner_attach     = m920x_tda8275_61_tuner_attach,

		.stream = {
			.type = USB_BULK,
			.count = 8,
			.endpoint = 0x82,
			.u = {
				 .bulk = {
					 .buffersize = 512,
				 }
			}
		},
	}},
	.i2c_algo         = &m920x_i2c_algo,

	.num_device_descs = 1,
	.devices = {
		{   .name = "LifeView TV Walker Twin DVB-T USB2.0",
		    .cold_ids = { &m920x_table[2], NULL },
		    .warm_ids = { &m920x_table[3], NULL },
		},
	}
};

static struct dvb_usb_device_properties dposh_properties = {
	.caps = DVB_USB_IS_AN_I2C_ADAPTER,

	.usb_ctrl = DEVICE_SPECIFIC,
	.firmware = "dvb-usb-dposh-01.fw",
	.download_firmware = m920x_firmware_download,

	.size_of_priv     = sizeof(struct m920x_state),

	.identify_state   = m920x_identify_state,
	.num_adapters = 1,
	.adapter = {{
		/* Hardware pid filters don't work with this device/firmware */

		.frontend_attach  = m920x_mt352_frontend_attach,
		.tuner_attach     = m920x_qt1010_tuner_attach,

		.stream = {
			.type = USB_BULK,
			.count = 8,
			.endpoint = 0x81,
			.u = {
				 .bulk = {
					 .buffersize = 512,
				 }
			}
		},
	}},
	.i2c_algo         = &m920x_i2c_algo,

	.num_device_descs = 1,
	.devices = {
		 {   .name = "Dposh(qt1010 tuner) DVB-T USB2.0",
		     .cold_ids = { &m920x_table[4], NULL },
		     .warm_ids = { &m920x_table[5], NULL },
		 },
	 }
};


static struct dvb_usb_device_properties dposh_mt_properties = {
	.caps = DVB_USB_IS_AN_I2C_ADAPTER,

	.usb_ctrl = DEVICE_SPECIFIC,
	.firmware = "dvb-usb-dposh-01.fw",
	.download_firmware = m920x_firmware_download,

	.size_of_priv     = sizeof(struct m920x_state),

	.identify_state   = m920x_identify_state,
	.num_adapters = 1,
	.adapter = {{

		.frontend_attach  = m920x_mt352_frontend_attach,
		.tuner_attach     = m920x_mt2060_tuner_attach,

		.stream = {
			.type = USB_BULK,
			.count = 7,
			.endpoint = 0x81,
			.u = {
				 .bulk = {
					 .buffersize = 512,
				 }
			}
		},
	}},
	.i2c_algo         = &m920x_i2c_algo,

	.num_device_descs = 1,
	.devices = {
		 {   .name = "Dposh(mt2060 tuner) DVB-T USB2.0",
		     .cold_ids = { &m920x_table[4], NULL },
		     .warm_ids = { &m920x_table[5], NULL },
		 },
	 }


};


static struct usb_driver m920x_driver = {
#if LINUX_VERSION_CODE <=  KERNEL_VERSION(2,6,15)
	.owner		= THIS_MODULE,
#endif
	.name		= "dvb_usb_m920x",
	.probe		= m920x_probe,
	.disconnect	= dvb_usb_device_exit,
	.id_table	= m920x_table,
};

/* module stuff */
static int __init m920x_module_init(void)
{
	int ret;

	if ((ret = usb_register(&m920x_driver))) {
		err("usb_register failed. Error number %d", ret);
		return ret;
	}

	return 0;
}

static void __exit m920x_module_exit(void)
{
	/* deregister this driver from the USB subsystem */
	usb_deregister(&m920x_driver);
}

module_init (m920x_module_init);
module_exit (m920x_module_exit);

MODULE_AUTHOR("Aapo Tahkola <aet@rasterburn.org>");
MODULE_DESCRIPTION("DVB Driver for ULI M920x");
MODULE_VERSION("0.1");
MODULE_LICENSE("GPL");

/*
 * Local variables:
 * c-basic-offset: 8
 */

[-- Attachment #3: Type: text/plain, Size: 150 bytes --]

_______________________________________________
linux-dvb mailing list
linux-dvb@linuxtv.org
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [linux-dvb] Dposh DVB-T USB2.0 seems to not work properly
  2008-06-25 22:28                       ` Andrew Websdale
@ 2008-07-04 23:13                         ` Andrew Websdale
  2008-07-05  9:20                           ` Antti Palosaari
  0 siblings, 1 reply; 20+ messages in thread
From: Andrew Websdale @ 2008-07-04 23:13 UTC (permalink / raw)
  To: linux-dvb; +Cc: Antti Palosaari


[-- Attachment #1.1: Type: text/plain, Size: 1289 bytes --]

I can report some (limited) success with the m920x driver. It seems to be
trying to tune when I scan, although no locks on any channels, but it may
just be that I've got a poor signal. When trying Kaffeine there is some
fluctuation from the signal & SNR meters, & there is this output in syslog:
Jul  4 23:43:33 toshiba kernel: MT2060: IF1: 1220MHz
Jul  4 23:43:33 toshiba kernel: MT2060: PLL freq=537833kHz
f_lo1=1757750kHz  f_lo2=1183750kHz
Jul  4 23:43:33 toshiba kernel: MT2060: PLL div1=109  num1=55  div2=73
num2=8064
Jul  4 23:43:33 toshiba kernel: MT2060: PLL [1..5]: 5d 6d 30 f8 93
Jul  4 23:43:34 toshiba kernel: MT2060: IF1: 1220MHz
Jul  4 23:43:34 toshiba kernel: MT2060: PLL freq=537833kHz
f_lo1=1757750kHz  f_lo2=1183750kHz
Jul  4 23:43:34 toshiba kernel: MT2060: PLL div1=109  num1=55  div2=73
num2=8064
Jul  4 23:43:34 toshiba kernel: MT2060: PLL [1..5]: 5d 6d 30 f8 93

and so on...

However, the LED still doesn't light (does that indicate a bigger problem
than just the LED?) and I've still to get a video signal. I shall try to
test it on a known good signal, as there are things interfering with my TV
signal right now.
But it looks pretty hopeful - is there anything you can tell me about
maximising the signal etc?
I've attached my version of m920x.c
regards Andrew

[-- Attachment #1.2: Type: text/html, Size: 1465 bytes --]

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: m920x.c --]
[-- Type: text/x-csrc; name=m920x.c, Size: 24522 bytes --]

/* DVB USB compliant linux driver for MSI Mega Sky 580 DVB-T USB2.0 receiver
 *
 * Copyright (C) 2006 Aapo Tahkola (aet@rasterburn.org)
 *
 *	This program is free software; you can redistribute it and/or modify it
 *	under the terms of the GNU General Public License as published by the
 *	Free Software Foundation, version 2.
 *
 * see Documentation/dvb/README.dvb-usb for more information
 */

#include "m920x.h"
#include "mt2060.h"
#include "mt352.h"
#include "mt352_priv.h"
#include "qt1010.h"
#include "tda1004x.h"
#include "tda827x.h"
#include <asm/unaligned.h>

/* debug */
static int dvb_usb_m920x_debug;
static bool bdposh_warm = false;
module_param_named(debug,dvb_usb_m920x_debug, int, 0644);
MODULE_PARM_DESC(debug, "set debugging level (1=rc (or-able))." DVB_USB_DEBUG_STATUS);

DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);

static int m920x_set_filter(struct dvb_usb_device *d, int type, int idx, int pid);

static inline int m920x_read(struct usb_device *udev, u8 request, u16 value,
			     u16 index, void *data, int size)
{
	int ret;

	ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
			      request, USB_TYPE_VENDOR | USB_DIR_IN,
			      value, index, data, size, 2000);
	if (ret < 0) {
		printk(KERN_INFO "m920x_read = error: %d\n", ret);
		return ret;
	}

	if (ret != size) {
		deb("m920x_read = no data\n");
		return -EIO;
	}

	return 0;
}

static inline int m920x_write(struct usb_device *udev, u8 request,
			      u16 value, u16 index)
{
	int ret;

	ret = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
			      request, USB_TYPE_VENDOR | USB_DIR_OUT,
			      value, index, NULL, 0, 2000);

	return ret;
}

static int m920x_init(struct dvb_usb_device *d, struct m920x_inits *rc_seq)
{
	int ret = 0, i, epi, flags = 0;
	int adap_enabled[M9206_MAX_ADAPTERS] = { 0 };

	/* Remote controller init. */
	if (d->props.rc_query) {
		deb("Initialising remote control\n");
		while (rc_seq->address) {
			if ((ret = m920x_write(d->udev, M9206_CORE,
					       rc_seq->data,
					       rc_seq->address)) != 0) {
				deb("Initialising remote control failed\n");
				return ret;
			}

			rc_seq++;
		}

		deb("Initialising remote control success\n");
	}

	for (i = 0; i < d->props.num_adapters; i++)
		flags |= d->adapter[i].props.caps;

	/* Some devices(Dposh) might crash if we attempt touch at all. */
	if (flags & DVB_USB_ADAP_HAS_PID_FILTER) {
		for (i = 0; i < d->props.num_adapters; i++) {
			epi = d->adapter[i].props.stream.endpoint - 0x81;

			if (epi < 0 || epi >= M9206_MAX_ADAPTERS) {
				printk(KERN_INFO "m920x: Unexpected adapter endpoint!\n");
				return -EINVAL;
			}

			adap_enabled[epi] = 1;
		}

		for (i = 0; i < M9206_MAX_ADAPTERS; i++) {
			if (adap_enabled[i])
				continue;

			if ((ret = m920x_set_filter(d, 0x81 + i, 0, 0x0)) != 0)
				return ret;

			if ((ret = m920x_set_filter(d, 0x81 + i, 0, 0x02f5)) != 0)
				return ret;
		}
	}

	return ret;
}

static int m920x_init_ep(struct usb_interface *intf)
{
	struct usb_device *udev = interface_to_usbdev(intf);
	struct usb_host_interface *alt;

	if ((alt = usb_altnum_to_altsetting(intf, 1)) == NULL) {
		deb("No alt found!\n");
		return -ENODEV;
	}

	return usb_set_interface(udev, alt->desc.bInterfaceNumber,
				 alt->desc.bAlternateSetting);
}

static int m920x_rc_query(struct dvb_usb_device *d, u32 *event, int *state)
{
	struct m920x_state *m = d->priv;
	int i, ret = 0;
	u8 rc_state[2];

	if ((ret = m920x_read(d->udev, M9206_CORE, 0x0, M9206_RC_STATE, rc_state, 1)) != 0)
		goto unlock;

	if ((ret = m920x_read(d->udev, M9206_CORE, 0x0, M9206_RC_KEY, rc_state + 1, 1)) != 0)
		goto unlock;

	for (i = 0; i < d->props.rc_key_map_size; i++)
		if (d->props.rc_key_map[i].data == rc_state[1]) {
			*event = d->props.rc_key_map[i].event;

			switch(rc_state[0]) {
			case 0x80:
				*state = REMOTE_NO_KEY_PRESSED;
				goto unlock;

			case 0x88: /* framing error or "invalid code" */
			case 0x99:
			case 0xc0:
			case 0xd8:
				*state = REMOTE_NO_KEY_PRESSED;
				m->rep_count = 0;
				goto unlock;

			case 0x93:
			case 0x92:
				m->rep_count = 0;
				*state = REMOTE_KEY_PRESSED;
				goto unlock;

			case 0x91:
				/* prevent immediate auto-repeat */
				if (++m->rep_count > 2)
					*state = REMOTE_KEY_REPEAT;
				else
					*state = REMOTE_NO_KEY_PRESSED;
				goto unlock;

			default:
				deb("Unexpected rc state %02x\n", rc_state[0]);
				*state = REMOTE_NO_KEY_PRESSED;
				goto unlock;
			}
		}

	if (rc_state[1] != 0)
		deb("Unknown rc key %02x\n", rc_state[1]);

	*state = REMOTE_NO_KEY_PRESSED;

 unlock:

	return ret;
}

/* I2C */
static int m920x_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[], int num)
{
	struct dvb_usb_device *d = i2c_get_adapdata(adap);
	int i, j;
	int ret = 0;

	if (!num)
		return -EINVAL;

	if (mutex_lock_interruptible(&d->i2c_mutex) < 0)
		return -EAGAIN;

	for (i = 0; i < num; i++) {
		if (msg[i].flags & (I2C_M_NO_RD_ACK | I2C_M_IGNORE_NAK | I2C_M_TEN) || msg[i].len == 0) {
			/* For a 0 byte message, I think sending the address
			 * to index 0x80|0x40 would be the correct thing to
			 * do.  However, zero byte messages are only used for
			 * probing, and since we don't know how to get the
			 * slave's ack, we can't probe. */
			ret = -ENOTSUPP;
			goto unlock;
		}
		/* Send START & address/RW bit */
		if (!(msg[i].flags & I2C_M_NOSTART)) {
			if ((ret = m920x_write(d->udev, M9206_I2C,
					(msg[i].addr << 1) |
					(msg[i].flags & I2C_M_RD ? 0x01 : 0), 0x80)) != 0)
				goto unlock;
			/* Should check for ack here, if we knew how. */
		}
		if (msg[i].flags & I2C_M_RD) {
			for (j = 0; j < msg[i].len; j++) {
				/* Last byte of transaction?
				 * Send STOP, otherwise send ACK. */
				int stop = (i+1 == num && j+1 == msg[i].len) ? 0x40 : 0x01;

				if ((ret = m920x_read(d->udev, M9206_I2C, 0x0,
						      0x20 | stop,
						      &msg[i].buf[j], 1)) != 0)
					goto unlock;
			}
		} else {
			for (j = 0; j < msg[i].len; j++) {
				/* Last byte of transaction? Then send STOP. */
				int stop = (i+1 == num && j+1 == msg[i].len) ? 0x40 : 0x00;

				if ((ret = m920x_write(d->udev, M9206_I2C, msg[i].buf[j], stop)) != 0)
					goto unlock;
				/* Should check for ack here too. */
			}
		}
	}
	ret = num;

 unlock:
	mutex_unlock(&d->i2c_mutex);

	return ret;
}

static u32 m920x_i2c_func(struct i2c_adapter *adapter)
{
	return I2C_FUNC_I2C;
}

static struct i2c_algorithm m920x_i2c_algo = {
	.master_xfer   = m920x_i2c_xfer,
	.functionality = m920x_i2c_func,
};

/* pid filter */
static int m920x_set_filter(struct dvb_usb_device *d, int type, int idx, int pid)
{
	int ret = 0;

	if (pid >= 0x8000)
		return -EINVAL;

	pid |= 0x8000;

	if ((ret = m920x_write(d->udev, M9206_FILTER, pid, (type << 8) | (idx * 4) )) != 0)
		return ret;

	if ((ret = m920x_write(d->udev, M9206_FILTER, 0, (type << 8) | (idx * 4) )) != 0)
		return ret;

	return ret;
}

static int m920x_update_filters(struct dvb_usb_adapter *adap)
{
	struct m920x_state *m = adap->dev->priv;
	int enabled = m->filtering_enabled[adap->id];
	int i, ret = 0, filter = 0;
	int ep = adap->props.stream.endpoint;

	for (i = 0; i < M9206_MAX_FILTERS; i++)
		if (m->filters[adap->id][i] == 8192)
			enabled = 0;

	/* Disable all filters */
	if ((ret = m920x_set_filter(adap->dev, ep, 1, enabled)) != 0)
		return ret;

	for (i = 0; i < M9206_MAX_FILTERS; i++)
		if ((ret = m920x_set_filter(adap->dev, ep, i + 2, 0)) != 0)
			return ret;

	/* Set */
	if (enabled) {
		for (i = 0; i < M9206_MAX_FILTERS; i++) {
			if (m->filters[adap->id][i] == 0)
				continue;

			if ((ret = m920x_set_filter(adap->dev, ep, filter + 2, m->filters[adap->id][i])) != 0)
				return ret;

			filter++;
		}
	}

	return ret;
}

static int m920x_pid_filter_ctrl(struct dvb_usb_adapter *adap, int onoff)
{
	struct m920x_state *m = adap->dev->priv;

	m->filtering_enabled[adap->id] = onoff ? 1 : 0;

	return m920x_update_filters(adap);
}

static int m920x_pid_filter(struct dvb_usb_adapter *adap, int index, u16 pid, int onoff)
{
	struct m920x_state *m = adap->dev->priv;

	m->filters[adap->id][index] = onoff ? pid : 0;

	return m920x_update_filters(adap);
}

static int m920x_firmware_download(struct usb_device *udev, const struct firmware *fw)
{
	u16 value, index, size;
	u8 read[4], *buff;
	int i, pass, ret = 0;

	buff = kmalloc(65536, GFP_KERNEL);

	if ((ret = m920x_read(udev, M9206_FILTER, 0x0, 0x8000, read, 4)) != 0)
		goto done;
	deb("%x %x %x %x\n", read[0], read[1], read[2], read[3]);

	if ((ret = m920x_read(udev, M9206_FW, 0x0, 0x0, read, 1)) != 0)
		goto done;
	deb("%x\n", read[0]);

	for (pass = 0; pass < 2; pass++) {
		for (i = 0; i + (sizeof(u16) * 3) < fw->size;) {
			value = get_unaligned_le16(fw->data + i);
			i += sizeof(u16);

			index = get_unaligned_le16(fw->data + i);
			i += sizeof(u16);

			size = get_unaligned_le16(fw->data + i);
			i += sizeof(u16);

			if (pass == 1) {
				/* Will stall if using fw->data ... */
				memcpy(buff, fw->data + i, size);

				ret = usb_control_msg(udev, usb_sndctrlpipe(udev,0),
						      M9206_FW,
						      USB_TYPE_VENDOR | USB_DIR_OUT,
						      value, index, buff, size, 20);
				if (ret != size) {
					deb("error while uploading fw!\n");
					ret = -EIO;
					goto done;
				}
				msleep(3);
			}
			i += size;
		}
		if (i != fw->size) {
			deb("bad firmware file!\n");
			ret = -EINVAL;
			goto done;
		}
	}

	msleep(36);

	/* m920x will disconnect itself from the bus after this. */
	(void) m920x_write(udev, M9206_CORE, 0x01, M9206_FW_GO);
	deb("firmware uploaded!\n");

 done:
	kfree(buff);

	return ret;
}

/* Callbacks for DVB USB */
static int m920x_identify_state(struct usb_device *udev,
				struct dvb_usb_device_properties *props,
				struct dvb_usb_device_description **desc,
				int *cold)
{
	struct usb_host_interface *alt;

	alt = usb_altnum_to_altsetting(usb_ifnum_to_if(udev, 0), 1);
	*cold = (alt == NULL) ? 1 : 0;

	return 0;
}

/* demod configurations */
static int m920x_mt352_demod_init(struct dvb_frontend *fe)
{
	int ret;
	u8 config[] = { CONFIG, 0x3d };
	u8 clock[] = { CLOCK_CTL, 0x30 };
	u8 reset[] = { RESET, 0x80 };
	u8 adc_ctl[] = { ADC_CTL_1, 0x40 };
	u8 agc[] = { AGC_TARGET, 0x1c, 0x20 };
	u8 sec_agc[] = { 0x69, 0x00, 0xff, 0xff, 0x40, 0xff, 0x00, 0x40, 0x40 };
	u8 unk1[] = { 0x93, 0x1a };
	u8 unk2[] = { 0xb5, 0x7a };

	deb("Demod init!\n");

	if ((ret = mt352_write(fe, config, ARRAY_SIZE(config))) != 0)
		return ret;
	if ((ret = mt352_write(fe, clock, ARRAY_SIZE(clock))) != 0)
		return ret;
	if ((ret = mt352_write(fe, reset, ARRAY_SIZE(reset))) != 0)
		return ret;
	if ((ret = mt352_write(fe, adc_ctl, ARRAY_SIZE(adc_ctl))) != 0)
		return ret;
	if ((ret = mt352_write(fe, agc, ARRAY_SIZE(agc))) != 0)
		return ret;
	if ((ret = mt352_write(fe, sec_agc, ARRAY_SIZE(sec_agc))) != 0)
		return ret;
	if ((ret = mt352_write(fe, unk1, ARRAY_SIZE(unk1))) != 0)
		return ret;
	if ((ret = mt352_write(fe, unk2, ARRAY_SIZE(unk2))) != 0)
		return ret;

	return 0;
}

static struct mt352_config m920x_mt352_config = {
	.demod_address = 0x0f,
	.no_tuner = 1,
	.demod_init = m920x_mt352_demod_init,
};

static struct tda1004x_config m920x_tda10046_08_config = {
	.demod_address = 0x08,
	.invert = 0,
	.invert_oclk = 0,
	.ts_mode = TDA10046_TS_SERIAL,
	.xtal_freq = TDA10046_XTAL_16M,
	.if_freq = TDA10046_FREQ_045,
	.agc_config = TDA10046_AGC_TDA827X,
	.gpio_config = TDA10046_GPTRI,
	.request_firmware = NULL,
};

static struct tda1004x_config m920x_tda10046_0b_config = {
	.demod_address = 0x0b,
	.invert = 0,
	.invert_oclk = 0,
	.ts_mode = TDA10046_TS_SERIAL,
	.xtal_freq = TDA10046_XTAL_16M,
	.if_freq = TDA10046_FREQ_045,
	.agc_config = TDA10046_AGC_TDA827X,
	.gpio_config = TDA10046_GPTRI,
	.request_firmware = NULL, /* uses firmware EEPROM */
};

/* tuner configurations */
static struct qt1010_config m920x_qt1010_config = {
	.i2c_address = 0x62
};

static struct mt2060_config m920x_mt2060_config = {
	.i2c_address = 0x60          
};

/* Callbacks for DVB USB */
static int m920x_mt352_frontend_attach(struct dvb_usb_adapter *adap)
{
	deb("%s\n",__func__);

	if ((adap->fe = dvb_attach(mt352_attach,
				   &m920x_mt352_config,
				   &adap->dev->i2c_adap)) == NULL)
		return -EIO;

	return 0;
}

static int m920x_tda10046_08_frontend_attach(struct dvb_usb_adapter *adap)
{
	deb("%s\n",__func__);

	if ((adap->fe = dvb_attach(tda10046_attach,
				   &m920x_tda10046_08_config,
				   &adap->dev->i2c_adap)) == NULL)
		return -EIO;

	return 0;
}

static int m920x_tda10046_0b_frontend_attach(struct dvb_usb_adapter *adap)
{
	deb("%s\n",__func__);

	if ((adap->fe = dvb_attach(tda10046_attach,
				   &m920x_tda10046_0b_config,
				   &adap->dev->i2c_adap)) == NULL)
		return -EIO;

	return 0;
}

static int m920x_qt1010_tuner_attach(struct dvb_usb_adapter *adap)
{
	deb("%s\n",__func__);

	if (dvb_attach(qt1010_attach, adap->fe, &adap->dev->i2c_adap, &m920x_qt1010_config) == NULL)
		return -ENODEV;

	return 0;
}

static int m920x_tda8275_60_tuner_attach(struct dvb_usb_adapter *adap)
{
	deb("%s\n",__func__);

	if (dvb_attach(tda827x_attach, adap->fe, 0x60, &adap->dev->i2c_adap, NULL) == NULL)
		return -ENODEV;

	return 0;
}

static int m920x_tda8275_61_tuner_attach(struct dvb_usb_adapter *adap)
{
	deb("%s\n",__func__);

	if (dvb_attach(tda827x_attach, adap->fe, 0x61, &adap->dev->i2c_adap, NULL) == NULL)
		return -ENODEV;

	return 0;
}

static int m920x_mt2060_tuner_attach(struct dvb_usb_adapter *adap)
{
	u16 if1;
	
	deb("%s\n",__func__);
	
	if1 = 1220;
	
	if (dvb_attach(mt2060_attach, adap->fe, &adap->dev->i2c_adap, &m920x_mt2060_config, if1) == NULL)
		return -ENODEV;

	return 0;
}
/* device-specific initialization */
static struct m920x_inits megasky_rc_init [] = {
	{ M9206_RC_INIT2, 0xa8 },
	{ M9206_RC_INIT1, 0x51 },
	{ } /* terminating entry */
};

static struct m920x_inits tvwalkertwin_rc_init [] = {
	{ M9206_RC_INIT2, 0x00 },
	{ M9206_RC_INIT1, 0xef },
	{ 0xff28,         0x00 },
	{ 0xff23,         0x00 },
	{ 0xff21,         0x30 },
	{ } /* terminating entry */
};

/* ir keymaps */
static struct dvb_usb_rc_key megasky_rc_keys [] = {
	{ 0x0, 0x12, KEY_POWER },
	{ 0x0, 0x1e, KEY_CYCLEWINDOWS }, /* min/max */
	{ 0x0, 0x02, KEY_CHANNELUP },
	{ 0x0, 0x05, KEY_CHANNELDOWN },
	{ 0x0, 0x03, KEY_VOLUMEUP },
	{ 0x0, 0x06, KEY_VOLUMEDOWN },
	{ 0x0, 0x04, KEY_MUTE },
	{ 0x0, 0x07, KEY_OK }, /* TS */
	{ 0x0, 0x08, KEY_STOP },
	{ 0x0, 0x09, KEY_MENU }, /* swap */
	{ 0x0, 0x0a, KEY_REWIND },
	{ 0x0, 0x1b, KEY_PAUSE },
	{ 0x0, 0x1f, KEY_FASTFORWARD },
	{ 0x0, 0x0c, KEY_RECORD },
	{ 0x0, 0x0d, KEY_CAMERA }, /* screenshot */
	{ 0x0, 0x0e, KEY_COFFEE }, /* "MTS" */
};

static struct dvb_usb_rc_key tvwalkertwin_rc_keys [] = {
	{ 0x0, 0x01, KEY_ZOOM }, /* Full Screen */
	{ 0x0, 0x02, KEY_CAMERA }, /* snapshot */
	{ 0x0, 0x03, KEY_MUTE },
	{ 0x0, 0x04, KEY_REWIND },
	{ 0x0, 0x05, KEY_PLAYPAUSE }, /* Play/Pause */
	{ 0x0, 0x06, KEY_FASTFORWARD },
	{ 0x0, 0x07, KEY_RECORD },
	{ 0x0, 0x08, KEY_STOP },
	{ 0x0, 0x09, KEY_TIME }, /* Timeshift */
	{ 0x0, 0x0c, KEY_COFFEE }, /* Recall */
	{ 0x0, 0x0e, KEY_CHANNELUP },
	{ 0x0, 0x12, KEY_POWER },
	{ 0x0, 0x15, KEY_MENU }, /* source */
	{ 0x0, 0x18, KEY_CYCLEWINDOWS }, /* TWIN PIP */
	{ 0x0, 0x1a, KEY_CHANNELDOWN },
	{ 0x0, 0x1b, KEY_VOLUMEDOWN },
	{ 0x0, 0x1e, KEY_VOLUMEUP },
};

/* DVB USB Driver stuff */
static struct dvb_usb_device_properties megasky_properties;
static struct dvb_usb_device_properties digivox_mini_ii_properties;
static struct dvb_usb_device_properties tvwalkertwin_properties;
static struct dvb_usb_device_properties dposh_properties;//qt1010
static struct dvb_usb_device_properties dposh_mt_properties;//for mt2060

static int m920x_probe(struct usb_interface *intf,
		       const struct usb_device_id *id)
{
	struct dvb_usb_device *d = NULL;
	int ret;
	struct m920x_inits *rc_init_seq = NULL;
	int bInterfaceNumber = intf->cur_altsetting->desc.bInterfaceNumber;

	deb("Probing for m920x device at interface %d\n", bInterfaceNumber);

	if (bInterfaceNumber == 0) {
		/* Single-tuner device, or first interface on
		 * multi-tuner device
		 */

		ret = dvb_usb_device_init(intf, &megasky_properties,
					  THIS_MODULE, &d, adapter_nr);
		if (ret == 0) {
			rc_init_seq = megasky_rc_init;
			goto found;
		}

		ret = dvb_usb_device_init(intf, &digivox_mini_ii_properties,
					  THIS_MODULE, &d, adapter_nr);
		if (ret == 0) {
			/* No remote control, so no rc_init_seq */
			goto found;
		}

		/* This configures both tuners on the TV Walker Twin */
		ret = dvb_usb_device_init(intf, &tvwalkertwin_properties,
					  THIS_MODULE, &d, adapter_nr);
		if (ret == 0) {
			rc_init_seq = tvwalkertwin_rc_init;
			goto found;
		}
		
		ret = dvb_usb_device_init(intf, &dposh_mt_properties,
					  THIS_MODULE, &d, adapter_nr);
		if (ret == 0) {
			/* Remote controller not supported yet. */
			bdposh_warm = true;			
			goto found;
		}
		
		if (bdposh_warm != true){ 		
			ret = dvb_usb_device_init(intf, &dposh_properties,
					  THIS_MODULE, &d, adapter_nr);
			if (ret == 0) {
			/* Remote controller not supported yet. */
				goto found;
			}
		}



		return ret;
	} else {
		/* Another interface on a multi-tuner device */

		/* The LifeView TV Walker Twin gets here, but struct
		 * tvwalkertwin_properties already configured both
		 * tuners, so there is nothing for us to do here
		 */
	}

 found:
	if ((ret = m920x_init_ep(intf)) < 0)
		return ret;

	if (d && (ret = m920x_init(d, rc_init_seq)) != 0)
		return ret;

	return ret;
}

static struct usb_device_id m920x_table [] = {
		{ USB_DEVICE(USB_VID_MSI, USB_PID_MSI_MEGASKY580) },
		{ USB_DEVICE(USB_VID_ANUBIS_ELECTRONIC,
			     USB_PID_MSI_DIGI_VOX_MINI_II) },
		{ USB_DEVICE(USB_VID_ANUBIS_ELECTRONIC,
			     USB_PID_LIFEVIEW_TV_WALKER_TWIN_COLD) },
		{ USB_DEVICE(USB_VID_ANUBIS_ELECTRONIC,
			     USB_PID_LIFEVIEW_TV_WALKER_TWIN_WARM) },
		{ USB_DEVICE(USB_VID_DPOSH, USB_PID_DPOSH_M9206_COLD) },
		{ USB_DEVICE(USB_VID_DPOSH, USB_PID_DPOSH_M9206_WARM) },
		{ }		/* Terminating entry */
};
MODULE_DEVICE_TABLE (usb, m920x_table);

static struct dvb_usb_device_properties megasky_properties = {
	.caps = DVB_USB_IS_AN_I2C_ADAPTER,

	.usb_ctrl = DEVICE_SPECIFIC,
	.firmware = "dvb-usb-megasky-02.fw",
	.download_firmware = m920x_firmware_download,

	.rc_interval      = 100,
	.rc_key_map       = megasky_rc_keys,
	.rc_key_map_size  = ARRAY_SIZE(megasky_rc_keys),
	.rc_query         = m920x_rc_query,

	.size_of_priv     = sizeof(struct m920x_state),

	.identify_state   = m920x_identify_state,
	.num_adapters = 1,
	.adapter = {{
		.caps = DVB_USB_ADAP_HAS_PID_FILTER |
			DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,

		.pid_filter_count = 8,
		.pid_filter       = m920x_pid_filter,
		.pid_filter_ctrl  = m920x_pid_filter_ctrl,

		.frontend_attach  = m920x_mt352_frontend_attach,
		.tuner_attach     = m920x_qt1010_tuner_attach,

		.stream = {
			.type = USB_BULK,
			.count = 8,
			.endpoint = 0x81,
			.u = {
				.bulk = {
					.buffersize = 512,
				}
			}
		},
	}},
	.i2c_algo         = &m920x_i2c_algo,

	.num_device_descs = 1,
	.devices = {
		{   "MSI Mega Sky 580 DVB-T USB2.0",
			{ &m920x_table[0], NULL },
			{ NULL },
		}
	}
};

static struct dvb_usb_device_properties digivox_mini_ii_properties = {
	.caps = DVB_USB_IS_AN_I2C_ADAPTER,

	.usb_ctrl = DEVICE_SPECIFIC,
	.firmware = "dvb-usb-digivox-02.fw",
	.download_firmware = m920x_firmware_download,

	.size_of_priv     = sizeof(struct m920x_state),

	.identify_state   = m920x_identify_state,
	.num_adapters = 1,
	.adapter = {{
		.caps = DVB_USB_ADAP_HAS_PID_FILTER |
			DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,

		.pid_filter_count = 8,
		.pid_filter       = m920x_pid_filter,
		.pid_filter_ctrl  = m920x_pid_filter_ctrl,

		.frontend_attach  = m920x_tda10046_08_frontend_attach,
		.tuner_attach     = m920x_tda8275_60_tuner_attach,

		.stream = {
			.type = USB_BULK,
			.count = 8,
			.endpoint = 0x81,
			.u = {
				.bulk = {
					.buffersize = 0x4000,
				}
			}
		},
	}},
	.i2c_algo         = &m920x_i2c_algo,

	.num_device_descs = 1,
	.devices = {
		{   "MSI DIGI VOX mini II DVB-T USB2.0",
			{ &m920x_table[1], NULL },
			{ NULL },
		},
	}
};

/* LifeView TV Walker Twin support by Nick Andrew <nick@nick-andrew.net>
 *
 * LifeView TV Walker Twin has 1 x M9206, 2 x TDA10046, 2 x TDA8275A
 * TDA10046 #0 is located at i2c address 0x08
 * TDA10046 #1 is located at i2c address 0x0b
 * TDA8275A #0 is located at i2c address 0x60
 * TDA8275A #1 is located at i2c address 0x61
 */
static struct dvb_usb_device_properties tvwalkertwin_properties = {
	.caps = DVB_USB_IS_AN_I2C_ADAPTER,

	.usb_ctrl = DEVICE_SPECIFIC,
	.firmware = "dvb-usb-tvwalkert.fw",
	.download_firmware = m920x_firmware_download,

	.rc_interval      = 100,
	.rc_key_map       = tvwalkertwin_rc_keys,
	.rc_key_map_size  = ARRAY_SIZE(tvwalkertwin_rc_keys),
	.rc_query         = m920x_rc_query,

	.size_of_priv     = sizeof(struct m920x_state),

	.identify_state   = m920x_identify_state,
	.num_adapters = 2,
	.adapter = {{
		.caps = DVB_USB_ADAP_HAS_PID_FILTER |
			DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,

		.pid_filter_count = 8,
		.pid_filter       = m920x_pid_filter,
		.pid_filter_ctrl  = m920x_pid_filter_ctrl,

		.frontend_attach  = m920x_tda10046_08_frontend_attach,
		.tuner_attach     = m920x_tda8275_60_tuner_attach,

		.stream = {
			.type = USB_BULK,
			.count = 8,
			.endpoint = 0x81,
			.u = {
				 .bulk = {
					 .buffersize = 512,
				 }
			}
		}},{
		.caps = DVB_USB_ADAP_HAS_PID_FILTER |
			DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,

		.pid_filter_count = 8,
		.pid_filter       = m920x_pid_filter,
		.pid_filter_ctrl  = m920x_pid_filter_ctrl,

		.frontend_attach  = m920x_tda10046_0b_frontend_attach,
		.tuner_attach     = m920x_tda8275_61_tuner_attach,

		.stream = {
			.type = USB_BULK,
			.count = 8,
			.endpoint = 0x82,
			.u = {
				 .bulk = {
					 .buffersize = 512,
				 }
			}
		},
	}},
	.i2c_algo         = &m920x_i2c_algo,

	.num_device_descs = 1,
	.devices = {
		{   .name = "LifeView TV Walker Twin DVB-T USB2.0",
		    .cold_ids = { &m920x_table[2], NULL },
		    .warm_ids = { &m920x_table[3], NULL },
		},
	}
};

static struct dvb_usb_device_properties dposh_properties = {
	.caps = DVB_USB_IS_AN_I2C_ADAPTER,

	.usb_ctrl = DEVICE_SPECIFIC,
	.firmware = "dvb-usb-dposh-01.fw",
	.download_firmware = m920x_firmware_download,

	.size_of_priv     = sizeof(struct m920x_state),

	.identify_state   = m920x_identify_state,
	.num_adapters = 1,
	.adapter = {{
		/* Hardware pid filters don't work with this device/firmware */

		.frontend_attach  = m920x_mt352_frontend_attach,
		.tuner_attach     = m920x_qt1010_tuner_attach,

		.stream = {
			.type = USB_BULK,
			.count = 8,
			.endpoint = 0x81,
			.u = {
				 .bulk = {
					 .buffersize = 512,
				 }
			}
		},
	}},
	.i2c_algo         = &m920x_i2c_algo,

	.num_device_descs = 1,
	.devices = {
		 {   .name = "Dposh(qt1010 tuner) DVB-T USB2.0",
		     .cold_ids = { &m920x_table[4], NULL },
		     .warm_ids = { &m920x_table[5], NULL },
		 },
	 }
};


static struct dvb_usb_device_properties dposh_mt_properties = {
	.caps = DVB_USB_IS_AN_I2C_ADAPTER,

	.usb_ctrl = DEVICE_SPECIFIC,
	.firmware = "dvb-usb-dposh-01.fw",
	.download_firmware = m920x_firmware_download,

	.size_of_priv     = sizeof(struct m920x_state),

	.identify_state   = m920x_identify_state,
	.num_adapters = 1,
	.adapter = {{

		.frontend_attach  = m920x_mt352_frontend_attach,
		.tuner_attach     = m920x_mt2060_tuner_attach,

		.stream = {
			.type = USB_BULK,
			.count = 7,
			.endpoint = 0x81,
			.u = {
				 .bulk = {
					 .buffersize = 512,
				 }
			}
		},
	}},
	.i2c_algo         = &m920x_i2c_algo,

	.num_device_descs = 1,
	.devices = {
		 {   .name = "Dposh(mt2060 tuner) DVB-T USB2.0",
		     .cold_ids = { &m920x_table[4], NULL },
		     .warm_ids = { &m920x_table[5], NULL },
		 },
	 }


};


static struct usb_driver m920x_driver = {
#if LINUX_VERSION_CODE <=  KERNEL_VERSION(2,6,15)
	.owner		= THIS_MODULE,
#endif
	.name		= "dvb_usb_m920x",
	.probe		= m920x_probe,
	.disconnect	= dvb_usb_device_exit,
	.id_table	= m920x_table,
};

/* module stuff */
static int __init m920x_module_init(void)
{
	int ret;

	if ((ret = usb_register(&m920x_driver))) {
		err("usb_register failed. Error number %d", ret);
		return ret;
	}

	return 0;
}

static void __exit m920x_module_exit(void)
{
	/* deregister this driver from the USB subsystem */
	usb_deregister(&m920x_driver);
}

module_init (m920x_module_init);
module_exit (m920x_module_exit);

MODULE_AUTHOR("Aapo Tahkola <aet@rasterburn.org>");
MODULE_DESCRIPTION("DVB Driver for ULI M920x");
MODULE_VERSION("0.1");
MODULE_LICENSE("GPL");

/*
 * Local variables:
 * c-basic-offset: 8
 */

[-- Attachment #3: Type: text/plain, Size: 150 bytes --]

_______________________________________________
linux-dvb mailing list
linux-dvb@linuxtv.org
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [linux-dvb] Dposh DVB-T USB2.0 seems to not work properly
  2008-07-04 23:13                         ` Andrew Websdale
@ 2008-07-05  9:20                           ` Antti Palosaari
  2008-07-05 12:33                             ` Andrew Websdale
  0 siblings, 1 reply; 20+ messages in thread
From: Antti Palosaari @ 2008-07-05  9:20 UTC (permalink / raw)
  To: Andrew Websdale; +Cc: linux-dvb

Andrew Websdale wrote:
> 
> I can report some (limited) success with the m920x driver. It seems to 
> be trying to tune when I scan, although no locks on any channels, but it 
> may just be that I've got a poor signal. When trying Kaffeine there is 
> some fluctuation from the signal & SNR meters, & there is this output in 
> syslog:
> Jul  4 23:43:33 toshiba kernel: MT2060: IF1: 1220MHz
> Jul  4 23:43:33 toshiba kernel: MT2060: PLL freq=537833kHz  
> f_lo1=1757750kHz  f_lo2=1183750kHz
> Jul  4 23:43:33 toshiba kernel: MT2060: PLL div1=109  num1=55  div2=73  
> num2=8064
> Jul  4 23:43:33 toshiba kernel: MT2060: PLL [1..5]: 5d 6d 30 f8 93
> Jul  4 23:43:34 toshiba kernel: MT2060: IF1: 1220MHz
> Jul  4 23:43:34 toshiba kernel: MT2060: PLL freq=537833kHz  
> f_lo1=1757750kHz  f_lo2=1183750kHz
> Jul  4 23:43:34 toshiba kernel: MT2060: PLL div1=109  num1=55  div2=73  
> num2=8064
> Jul  4 23:43:34 toshiba kernel: MT2060: PLL [1..5]: 5d 6d 30 f8 93
> 
> and so on...
> 
> However, the LED still doesn't light (does that indicate a bigger 
> problem than just the LED?) and I've still to get a video signal. I 
> shall try to test it on a known good signal, as there are things 
> interfering with my TV signal right now.
> But it looks pretty hopeful - is there anything you can tell me about 
> maximising the signal etc?
> I've attached my version of m920x.c
> regards Andrew

There is two kind of LEDs in those sticks. One is power LED that lights 
all the time when device is powered and the other lock LED that lights 
only when demodulator is locked to the valid channel. I assume your 
device has lock LED that should light only when device is locked to the 
valid channel. Controlling LEDs is sometimes possible by the driver 
software and sometimes not at all. Don't care LED before device is not 
working.

I think it is better to strong known good signal and test device against 
it to see if everything is almost right. After that you can try to find 
settings to reach better receiving sensitivity.

regards
Antti
-- 
http://palosaari.fi/

_______________________________________________
linux-dvb mailing list
linux-dvb@linuxtv.org
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [linux-dvb] Dposh DVB-T USB2.0 seems to not work properly
  2008-07-05  9:20                           ` Antti Palosaari
@ 2008-07-05 12:33                             ` Andrew Websdale
  0 siblings, 0 replies; 20+ messages in thread
From: Andrew Websdale @ 2008-07-05 12:33 UTC (permalink / raw)
  To: Antti Palosaari; +Cc: linux-dvb


[-- Attachment #1.1: Type: text/plain, Size: 779 bytes --]

2008/7/5 Antti Palosaari <crope@iki.fi>:

>
> There is two kind of LEDs in those sticks. One is power LED that lights all
> the time when device is powered and the other lock LED that lights only when
> demodulator is locked to the valid channel. I assume your device has lock
> LED that should light only when device is locked to the valid channel.
> Controlling LEDs is sometimes possible by the driver software and sometimes
> not at all. Don't care LED before device is not working.
>
> I think it is better to strong known good signal and test device against it
> to see if everything is almost right. After that you can try to find
> settings to reach better receiving sensitivity.
>


I'm going to try with a better signal this p.m. Thanks for info re:LED

Regards
Andrew

[-- Attachment #1.2: Type: text/html, Size: 1142 bytes --]

[-- Attachment #2: Type: text/plain, Size: 150 bytes --]

_______________________________________________
linux-dvb mailing list
linux-dvb@linuxtv.org
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb

^ permalink raw reply	[flat|nested] 20+ messages in thread

end of thread, other threads:[~2008-07-05 12:33 UTC | newest]

Thread overview: 20+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-06-10 21:49 [linux-dvb] Dposh DVB-T USB2.0 seems to not work properly Andrew Websdale
2008-06-10 22:17 ` Antti Palosaari
  -- strict thread matches above, loose matches on Subject: below --
2008-06-11 22:12 Andrew Websdale
2008-06-11 22:49 ` Antti Palosaari
2008-06-12  8:58   ` Andrew Websdale
2008-06-12 10:08     ` Antti Palosaari
2008-06-12 13:19       ` Andrew Websdale
2008-06-17 19:29         ` Andrew Websdale
2008-06-18 19:16           ` Andrew Websdale
2008-06-19 18:07           ` Antti Palosaari
2008-06-19 18:19             ` Andrew Websdale
2008-06-23 11:14               ` Andrew Websdale
2008-06-23 18:58                 ` Andrew Websdale
2008-06-24  6:30                   ` Antti Palosaari
2008-06-24  9:20                     ` Andrew Websdale
2008-06-24 19:09                     ` Andrew Websdale
2008-06-25 22:28                       ` Andrew Websdale
2008-07-04 23:13                         ` Andrew Websdale
2008-07-05  9:20                           ` Antti Palosaari
2008-07-05 12:33                             ` Andrew Websdale

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox