WinTV-NOVA HD-S2 unable to load firmware since register 0x20 is allways 0x00

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello,

I bought a brandnew Hauppauge WinTV-NOVA HD-S2 which does not load the 
firmware since the value of register 0x20 is allways 0x00. After changing the 
cx24116 driver to not check register 0x20, the firmware is loaded and the 
card works as expected (DVB-S, audio and remote control). Below are a few 
details and the changes I made.

Any ideas why this is required for my card?

This is the card (lspci -vvv):

03:00.0 Multimedia video controller: Conexant CX23880/1/2/3 PCI Video and 
Audio Decoder (rev 05)
        Subsystem: Hauppauge computer works Inc. Device 6906
        Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- 
Stepping- SERR- FastB2B- DisINTx-
        Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- 
<TAbort- <MAbort- >SERR- <PERR- INTx-
        Latency: 32 (5000ns min, 13750ns max), Cache Line Size: 32 bytes
        Interrupt: pin A routed to IRQ 20
        Region 0: Memory at e3000000 (32-bit, non-prefetchable) [size=16M]
        Capabilities: [44] Vital Product Data <?>
        Capabilities: [4c] Power Management version 2
                Flags: PMEClk- DSI+ D1- D2- AuxCurrent=0mA 
PME(D0-,D1-,D2-,D3hot-,D3cold-)
                Status: D0 PME-Enable- DSel=0 DScale=0 PME-
        Kernel driver in use: cx8800
        Kernel modules: cx8800

03:00.1 Multimedia controller: Conexant CX23880/1/2/3 PCI Video and Audio 
Decoder [Audio Port] (rev 05)
        Subsystem: Hauppauge computer works Inc. Device 6906
        Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- 
Stepping- SERR- FastB2B- DisINTx-
        Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- 
<TAbort- <MAbort- >SERR- <PERR- INTx-
        Latency: 32 (1000ns min, 63750ns max), Cache Line Size: 32 bytes
        Interrupt: pin A routed to IRQ 20
        Region 0: Memory at e4000000 (32-bit, non-prefetchable) [size=16M]
        Capabilities: [4c] Power Management version 2
                Flags: PMEClk- DSI+ D1- D2- AuxCurrent=0mA 
PME(D0-,D1-,D2-,D3hot-,D3cold-)
                Status: D0 PME-Enable- DSel=0 DScale=0 PME-
        Kernel driver in use: cx88_audio
        Kernel modules: cx88-alsa

03:00.2 Multimedia controller: Conexant CX23880/1/2/3 PCI Video and Audio 
Decoder [MPEG Port] (rev 05)
        Subsystem: Hauppauge computer works Inc. Device 6906
        Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- 
Stepping- SERR- FastB2B- DisINTx-
        Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- 
<TAbort- <MAbort- >SERR- <PERR- INTx-
        Latency: 32 (1500ns min, 22000ns max), Cache Line Size: 32 bytes
        Interrupt: pin A routed to IRQ 20
        Region 0: Memory at e5000000 (32-bit, non-prefetchable) [size=16M]
        Capabilities: [4c] Power Management version 2
                Flags: PMEClk- DSI+ D1- D2- AuxCurrent=0mA 
PME(D0-,D1-,D2-,D3hot-,D3cold-)
                Status: D0 PME-Enable- DSel=0 DScale=0 PME-
        Kernel driver in use: cx88-mpeg driver manager
        Kernel modules: cx8802

03:00.4 Multimedia controller: Conexant CX23880/1/2/3 PCI Video and Audio 
Decoder [IR Port] (rev 05)
        Subsystem: Hauppauge computer works Inc. Device 6906
        Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- 
Stepping- SERR- FastB2B- DisINTx-
        Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- 
<TAbort- <MAbort- >SERR- <PERR- INTx-
        Latency: 32 (1500ns min, 63750ns max), Cache Line Size: 32 bytes
        Interrupt: pin A routed to IRQ 3
        Region 0: Memory at e6000000 (32-bit, non-prefetchable) [size=16M]
        Capabilities: [4c] Power Management version 2
                Flags: PMEClk- DSI+ D1- D2- AuxCurrent=0mA 
PME(D0-,D1-,D2-,D3hot-,D3cold-)
                Status: D0 PME-Enable- DSel=0 DScale=0 PME-


This is logged by the kernel during boot:

Linux video capture interface: v2.00
cx88/0: cx2388x v4l2 driver version 0.0.7 loaded
ACPI: PCI Interrupt 0000:03:00.0[A] -> GSI 20 (level, low) -> IRQ 20
cx88[0]: subsystem: 0070:6906, board: Hauppauge WinTV-HVR4000(Lite) DVB-S/S2 
[card=69,autodetected], frontend(s): 1
cx88[0]: TV tuner type -1, Radio tuner type -1
cx88/2: cx2388x MPEG-TS Driver Manager version 0.0.7 loaded
cx2388x alsa driver version 0.0.7 loaded
tveeprom 1-0050: Hauppauge model 69100, rev B4C3, serial# 7083032
tveeprom 1-0050: MAC address is f7b6fd4d
tveeprom 1-0050: tuner model is Conexant CX24118A (idx 123, type 4)
tveeprom 1-0050: TV standards ATSC/DVB Digital (eeprom 0x80)
tveeprom 1-0050: audio processor is None (idx 0)
tveeprom 1-0050: decoder processor is CX880 (idx 20)
tveeprom 1-0050: has no radio, has IR receiver, has no IR transmitter
cx88[0]: hauppauge eeprom: model=69100
input: cx88 IR (Hauppauge WinTV-HVR400 as /class/input/input5
Creating IR device irrcv0
cx88[0]/0: found at 0000:03:00.0, rev: 5, irq: 20, latency: 32, mmio: 
0xe3000000
cx88[0]/0: registered device video0 [v4l2]
cx88[0]/0: registered device vbi0
cx88[0]/2: cx2388x 8802 Driver Manager
ACPI: PCI Interrupt 0000:03:00.2[A] -> GSI 20 (level, low) -> IRQ 20
cx88[0]/2: found at 0000:03:00.2, rev: 5, irq: 20, latency: 32, mmio: 
0xe5000000
ACPI: PCI Interrupt 0000:03:00.1[A] -> GSI 20 (level, low) -> IRQ 20
cx88[0]/1: CX88x/0: ALSA support for cx2388x boards
cx88/2: cx2388x dvb driver version 0.0.7 loaded
cx88/2: registering cx8802 driver, type: dvb access: shared
cx88[0]/2: subsystem: 0070:6906, board: Hauppauge WinTV-HVR4000(Lite) DVB-S/S2 
[card=69]
cx88[0]/2: cx2388x based DVB/ATSC card
cx8802_alloc_frontends() allocating 1 frontend(s)
ACPI: PCI Interrupt 0000:03:01.0[A] -> GSI 19 (level, low) -> IRQ 19
DVB: registering new adapter (cx88[0])
DVB: registering adapter 0 frontend 0 (Conexant CX24116/CX24118)...


The following happens when I use the 
command "scan /usr/share/dvb/dvb-s/Astra-19.2E". As you can see register 0x20 
has the value 0x00. Regarding to the cx24116 source code I assume this should 
be normally only the case when the firmware is already loaded. But there is 
and was no firmware loaded into my card as the scan command is the very first 
DVB command I execute.

Because register 0x20 has the value 0x00 it never loads the firmware and hence 
I cannot use the card:

[  137.488208] cx24116: cx24116_initfe()
[  137.488208] cx24116: cx24116_writereg: write reg 0xe0, value 0x00
[  137.488208] cx24116: cx24116_writereg: write reg 0xe1, value 0x00
[  137.488208] cx24116: cx24116_writereg: write reg 0xea, value 0x00
[  137.488690] cx24116: cx24116_cmd_execute()
[  137.488690] cx24116: cx24116_firmware_ondemand()
[  137.489281] cx24116: read reg 0x20, value 0x00
[  137.489283] cx24116: cx24116_cmd_execute: 0x00 == 0x36
[  137.489284] cx24116: cx24116_writereg: write reg 0x00, value 0x36
[  137.489765] cx24116: cx24116_cmd_execute: 0x01 == 0x00
[  137.489767] cx24116: cx24116_writereg: write reg 0x01, value 0x00
[  137.490247] cx24116: cx24116_writereg: write reg 0x1f, value 0x01
[  137.491375] cx24116: read reg 0x1f, value 0x01
[...]
[  138.588200] cx24116_cmd_execute() Firmware not responding
[  138.664193] cx24116: cx24116_set_tone(1)
[  138.664849] cx24116: read reg 0xbc, value 0x00
[  138.664851] cx24116: cx24116_wait_for_lnb() qstatus = 0x00
[  138.665500] cx24116: read reg 0xbc, value 0x00
[...]
[  139.156936] cx24116: cx24116_wait_for_lnb(): LNB not ready
[  139.208929] cx24116: cx24116_set_frontend()
[  139.208929] cx24116: cx24116_set_frontend: DVB-S delivery system selected
[  139.208929] cx24116: cx24116_set_inversion(2)
[  139.208929] cx24116: cx24116_set_fec(0x00,0x05)
[  139.208929] cx24116: cx24116_lookup_fecmod(0x00,0x05)
[  139.208929] cx24116: cx24116_set_fec() mask/val = 0x20/0x31
[  139.208929] cx24116: cx24116_set_symbolrate(22000000)
[  139.208929] cx24116: cx24116_set_symbolrate() symbol_rate = 22000000
[  139.208929] cx24116: cx24116_set_frontend:   delsys      = 5
[  139.208929] cx24116: cx24116_set_frontend:   modulation  = 0
[  139.208929] cx24116: cx24116_set_frontend:   frequency   = 1951500
[  139.208929] cx24116: cx24116_set_frontend:   pilot       = 0 (val = 0x00)
[  139.208929] cx24116: cx24116_set_frontend:   retune      = 1
[  139.208929] cx24116: cx24116_set_frontend:   rolloff     = 0 (val = 0x02)
[  139.208929] cx24116: cx24116_set_frontend:   symbol_rate = 22000000
[  139.208929] cx24116: cx24116_set_frontend:   FEC         = 5 (mask/val = 
0x20/0x31)
[  139.208929] cx24116: cx24116_set_frontend:   Inversion   = 2 (val = 0x0c)
[  139.208929] cx24116: cx24116_cmd_execute()
[  139.208929] cx24116: cx24116_firmware_ondemand()
[  139.208929] cx24116: read reg 0x20, value 0x00


I have changed the following to get the firmware loaded:

--- linux/drivers/media/dvb/frontends/cx24116.c.orig    2010-05-18 
14:50:03.000000000 +0200
+++ linux/drivers/media/dvb/frontends/cx24116.c 2010-06-20 01:30:10.000000000 
+0200
@@ -482,7 +482,7 @@

        dprintk("%s()\n", __func__);

-       if (cx24116_readreg(state, 0x20) > 0) {
+//     if (cx24116_readreg(state, 0x20) > 0) {

                if (state->skip_fw_load)
                        return 0;
@@ -516,8 +516,8 @@
                        ret == 0 ? "complete" : "failed");

                /* Ensure firmware is always loaded if required */
-               state->skip_fw_load = 0;
-       }
+//             state->skip_fw_load = 0;
+//     }

        return ret;
 }


This removes the check against register 0x20. Since the firmware is then 
loaded on every command I have also removed the "state->skip_fw_load = 0". 
This is a quick hack and has probably drawbacks, but it works for me. After 
this changes the first DVB command loads the firmware and the card works as 
expected:

[  159.522909] cx24116_firmware_ondemand: Waiting for firmware upload 
(dvb-fe-cx24116.fw)...
[  159.522909] firmware: requesting dvb-fe-cx24116.fw
[  159.556998] cx24116_firmware_ondemand: Waiting for firmware upload(2)...
[  164.525282] cx24116_load_firmware: FW version 1.26.90.0
[  164.525320] cx24116_firmware_ondemand: Firmware upload complete


The patch is for v4l-dvb-20100130, I use it together with Kernel 2.6.26 from 
Debian Lenny. I have also tried Kernel 2.6.32 from backports.org but the 
issue is exactly the same. Also the cx24116.c source of kernel 2.6.35-rc3 and 
the latest version from the v4l-dvb HG repository contains the check for 
register 0x20 so I assume it still can't work with my card.

I however do not fully understand the source that I have changed. I assume 
that register 0x20 is normally unequal 0x00 when no firmware is loaded and 
changes to 0x00 when a firmware is loaded. The question is then how do I 
check this properly on my card where register 0x20 is allways 0x00 
independently if a firmware is loaded or not?

Any idea why my card behave differently? Is it a new hardware revision or some 
kind of a buggy card?

Thanks,

Andi
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux