* 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 [linux-dvb] Dposh DVB-T USB2.0 seems to not work properly 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
* [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 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
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-11 22:12 [linux-dvb] Dposh DVB-T USB2.0 seems to not work properly 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 -- strict thread matches above, loose matches on Subject: below -- 2008-06-10 21:49 Andrew Websdale 2008-06-10 22:17 ` Antti Palosaari
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox