[linux-dvb] dvb-bt8xx: A frontend driver was not found for device 109e/0878 subsystem 1822/0001

Manu Abraham manu at kromtek.com
Fri Jun 24 14:07:06 CEST 2005


Oivind wrote:
> Hi,
> 
> Is ca_set_pmt() from section 8.4.3.4 of EN50221 spec?
> 
> It looks like the offset is wrong for fetching ES length. I did some
> modifications do dst_ca.c aswell. Aslo, the offset for fetching CA
> descriptor (checking for 0x09) looks like wrong offset to me. The
> relevant code for the additional debug info below is;
> 

There is a high chance that the offset is wrong, yesterday i just made 
the patch a bit too fast .. !

>         buf_offset += 1;// hw_offset += 1;
>         for (i = buf_offset; i < length; i++) {
> //              dprintk("%s: Stream Header ", __FUNCTION__);
>                 count = copy_string(hw_buffer->msg, p_ca_message->msg,
> hw_offset, buf_offset, 5);
>                 modify_4_bits(hw_buffer->msg, (hw_offset + 3));
> 
>                 hw_offset += 5, buf_offset += 5, i += 4;
>                 debug_string(hw_buffer->msg, hw_offset, (hw_offset - 5));
>                 dprintk("%s: buf_offset-2
> [p_ca_message->msg[buf_offset-2]]=%02x
> [%02x]\n",__FUNCTION__,buf_offset-2, p_ca_message->msg[buf_offset-2]);
>                 dprintk("%s: buf_offset-1
> [p_ca_message->msg[buf_offset-1]]=%02x
> [%02x]\n",__FUNCTION__,buf_offset-1, p_ca_message->msg[buf_offset-1]);
>                 dprintk("%s: ES Info length bytes = [%02x %02x]\n",
> __FUNCTION__, p_ca_message->msg[buf_offset - 1],
> p_ca_message->msg[buf_offset]);
>                 es_info_length = 0;
>                 es_info_length = p_ca_message->msg[buf_offset-2] & 0x0f;
>                 es_info_length <<= 8;
>                 es_info_length |= p_ca_message->msg[buf_offset-1];
> //              es_info_length = ((es_info_length |
> (p_ca_message->msg[buf_offset - 1] & 0x0f)) << 8) |
> p_ca_message->msg[buf_offset];
>                 dprintk("%s: ES info length=[%02x]\n", __FUNCTION__,
> es_info_length);
>                 if (es_info_length) {
>                         dprintk("%s: buf_offset+1
> [p_ca_message->msg[buf_offset+1]]=%02x
> [%02x]\n",__FUNCTION__,buf_offset+1,p_ca_message->msg[buf_offset+1]);
>                         dprintk("%s: buf_offset+2
> [p_ca_message->msg[buf_offset+2]]=%02x
> [%02x]\n",__FUNCTION__,buf_offset+2,p_ca_message->msg[buf_offset+2]);
>                         dprintk("%s: buf_offset+2
> [p_ca_message->msg[buf_offset+3]]=%02x
> [%02x]\n",__FUNCTION__,buf_offset+3,p_ca_message->msg[buf_offset+3]);
>                         // copy descriptors @ STREAM level
>                         if (p_ca_message->msg[buf_offset + 2] == 0x09)
> {        // Copy CA descriptor only
>                                 copy_string(hw_buffer->msg,
> p_ca_message->msg, hw_offset, buf_offset, (es_info_length - 1));
>                                 dprintk("%s: Descriptors @ STREAM
> level...!!! \n", __FUNCTION__);
>                         }
>                 }
> 
>         }
> 
> 
> 
> 
> 
>>From dmesg with your patch
> -----------------------------
> dst_ca_open:Device opened [ffff81003cc1ea80]
> dst_ca_ioctl: Sending message
> ca_send_message
> ca_send_message:Command=[0x9f8032]
> Command = SEND_CA_PMT
> asn_1_decode: Length field=[12]
> asn_1_decode: Length=[12]
> ca_set_pmt: CA Message length=[18]
> ca_set_pmt: ASN.1  String=[ 03 05 e4 01 10 06 01 09 04 0b 00 e5 05 02
> e2 02 f0 05 ]
> copy_string: Copying [ 03 05 e4 01 10 06]
> ca_set_pmt: Probably an ASIC bug !!!
>  String=[ 19 40 03 00 03 12 00 03 05 e4 01 00 06 00 00 00 00 00 00 ]
> ca_set_pmt: Program info length=[06]
> copy_string: Copying [ 01 09 04 0b 00 e5 05]
> copy_string: Copying [ 02 e2 02 f0 05]
> ca_set_pmt: ES Info length bytes = [05 00]

Yep, offset is wrong .. 0xf0 and 0x05 contain es_info_length bytes 
inside the EN50221 message..

> ca_set_pmt: ES info length=[500]

And ES info length is wrong ..

>  String=[ 19 40 03 00 03 12 00 03 05 e4 01 00 07 01 09 04 0b 00 e5 05
> 02 e2 02 00 05 ad ]
> dst_put_ci: Put Command
> write_to_8820: DST-CI Command succes.
> ca_send_message: -->CA_PMT Success !
> dst_ca_release:Device closed.
> 
> 
>>From dmesg with some additional debug info
> ------------------------------------------
> dst_ca_open:Device opened [ffff81003d1687c0]
> dst_ca_ioctl: Sending message
> ca_send_message
> ca_send_message:Command=[0x9f8032]
> Command = SEND_CA_PMT
> asn_1_decode: Length field=[12]
> asn_1_decode: Length=[12]
> ca_set_pmt: CA Message length=[18]
> ca_set_pmt: ASN.1  String=[ 03 05 e4 01 10 06 01 09 04 0b 00 e5 05 02
> e2 02 f0 05 ]
> copy_string: Copying [ 03 05 e4 01 10 06]
> ca_set_pmt: Probably an ASIC bug !!!
>  String=[ 19 40 03 00 03 12 00 03 05 e4 01 00 06 00 00 00 00 00 00 ]
> ca_set_pmt: Program info length=[06]
> copy_string: Copying [ 01 09 04 0b 00 e5 05]
> copy_string: Copying [ 02 e2 02 f0 05]
>  String=[ 02 e2 02 00 05 ]
> ca_set_pmt: buf_offset-2 [p_ca_message->msg[buf_offset-2]]=14 [f0]
> ca_set_pmt: buf_offset-1 [p_ca_message->msg[buf_offset-1]]=15 [05]
> ca_set_pmt: ES Info length bytes = [05 00]      (offsets 15,16)
> ca_set_pmt: ES info length=[05]

ES info length eventhough correct, uses the wrong words, ie offset is 
wrong .. ? ie it should have been using 0xf0 and 0x05, offsets 15 and 16..

The offset is important since for some cards, the reserved 4 bits needs 
to be set to 0 for some cards..

> ca_set_pmt: buf_offset+1 [p_ca_message->msg[buf_offset+1]]=17 [00]
> ca_set_pmt: buf_offset+2 [p_ca_message->msg[buf_offset+2]]=18 [00]
> ca_set_pmt: buf_offset+2 [p_ca_message->msg[buf_offset+3]]=19 [00]
>  String=[ 19 40 03 00 03 12 00, 03 05 e4 01 00 07 01 09 04 0b 00 e5 05
> 02 e2 02 00 05 ad ]

The string looks somewhat okay, but program_info_length is just after 
0x03 just after the comma that i placed in your log to show it out ..

In this case the program_info_length becomes 0x05 0xe4 which is wrong ..
And the entire message seems to be shifted to the left by 1 word, due to 
a wrong offset

Get the correct offset, other than that everything looks moreor less okay ..



Manu




More information about the linux-dvb mailing list