[linux-dvb] [PATCH] dst_ca : convert back Application Info DST
reply to EN 50221 message.
Perceval Anichini
perceval.anichini at streamvision.fr
Tue Sep 6 10:38:51 CEST 2005
Hello !
As fas as i understand, the DST_CA driver works as described below :
- The driver is fed with EN 50221 messages.
- The driver translates these messages to DST proprietary
command
- The DST process the command and reply to the driver in a
proprietary format (!@*#!@^$!&*!($@!#@!#@!)
- The driver return the 'data' as is.
It seems to me that it would be interesting to return replies in EN
50221 format. Below is a patch that does it for the 'Application Info'
reply, as described page 28 of the standard. I will send patches for
other replies if i can retrieve some documentations about the DST
part of the card.
Do someone have links or the documentation about the DST
proprietary commands ? Or did these information had to be reversed
engineered ? If a documentation exists, could you forward it to me ???
Moreover, I don't understand the ca_msg structure.
- Why is the msg field only 256 bytes long ? If I understood
the standard, an EN 50221 message can be up to 65536 + 6 (3 bytes for
tag, up to 3 bytes for field_length, and 65536 bytes of payload.) Is it
a kernel related limitation (?)
- I do not understand the index and type member. They seems to
be always set to zero by the driver.
- I do think I understand the length part :) But the driver
set it to 0 too...
For information, we are using a Technisat Skystar 1/CI, with an ASTON
CAM PRO Viaccess (firmware 2.0100) .
- The second patch included corrects the asn_1_decode function.
Patches apply in following order :
- patch-1-dst_ca-application-info-en50221
- patch-2-dst_ca-asn_1_decode
Thanks a lot.
Perceval.
-------------- next part --------------
--- dvb-kernel.orig/linux/drivers/media/dvb/bt8xx/dst_ca.c 2005-09-02 21:41:47.000000000 +0200
+++ dvb-kernel/linux/drivers/media/dvb/bt8xx/dst_ca.c 2005-09-06 10:22:32.000000000 +0200
@@ -163,6 +163,27 @@
(state->messages[10] << 8) | state->messages[11], __FUNCTION__, (char *)(&state->messages[12]));
dprintk(verbose, DST_CA_INFO, 1, " ==================================================================================================");
+ // Now, we need to build the correct EN 50221
+ // First, replace weird DST reply by EN 50221 Application Info SPDU (p 28)
+ state->messages[0] = 0x9f;
+ state->messages[1] = 0x80;
+ state->messages[2] = 0x21;
+
+ // Second, compute field_length :
+ // FIXME -> might be coded on more than 1 byte.
+ // FIXME -> Information already coded in state->messages[5] (???)
+ state->messages[3] = 6 + strlen (state->messages + 12);
+
+ // Third, fill application_type.
+ state->messages[4] = state->messages[7];
+
+ // Third, move application_manufacturer and manufacturer_code to the correct place.
+ memmove (state->messages + 5, state->messages + 8, 2 * sizeof (u16));
+
+ // And last, format correctly the menu_string_length
+ state->messages[9] = strlen (state->messages + 12);
+ memmove (state->messages + 10, state->messages + 12, state->messages[9]);
+
return 0;
}
-------------- next part --------------
--- dvb-kernel.orig/linux/drivers/media/dvb/bt8xx/dst_ca.c 2005-09-02 21:41:47.000000000 +0200
+++ dvb-kernel/linux/drivers/media/dvb/bt8xx/dst_ca.c 2005-09-06 10:22:32.000000000 +0200
@@ -329,7 +350,8 @@
} else {
word_count = length_field & 0x7f;
for (count = 0; count < word_count; count++) {
- length = (length | asn_1_array[count + 1]) << 8;
+ length = length << 8;
+ length += asn_1_array[count + 1];
dprintk(verbose, DST_CA_DEBUG, 1, " Length=[%04x]", length);
}
}
More information about the linux-dvb
mailing list