Re: [PATCH] Multi protocol support (stage #1)

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

 



Johannes Stezenbach wrote:
Hi Manu,

How does this proposal relate to the DVB-S2 proposal by mws?
Does it supersede it?


I think Marcel (mws) also like this patch, apart from the comments you have. I had been working on the stb0899 + stb6100 (a multi standard device that supports DVB-S/S2 and DSS with a silicon tuner. It is now a lot done. hence i took a hand at the patch. It should be complete soon.

diff -Naurp multi-proto-orig/linux/drivers/media/dvb/dvb-core/dvb_frontend.c multi-proto2/linux/drivers/media/dvb/dvb-core/dvb_frontend.c
--- multi-proto-orig/linux/drivers/media/dvb/dvb-core/dvb_frontend.c    2006-04-20 20:56:39.000000000 +0400
+++ multi-proto2/linux/drivers/media/dvb/dvb-core/dvb_frontend.c        2006-04-25 03:46:55.000000000 +0400
@@ -94,6 +94,8 @@ struct dvb_frontend_private {
        /* thread/frontend values */
        struct dvb_device *dvbdev;
        struct dvb_frontend_parameters parameters;
+       struct dvb_frontend_params params;

Bad naming -- make it clear which one is new / legacy.


I will add in some comments.

+struct modcod_table dvbs2_modcod_lookup[] = {
+       { MOD_QPSK_1_4,         FE_MOD_QPSK,    FE_FECRATE_1_4  },

I see this cruft is actually in the DVB-S2 standard. Ugh!


It is not just in the standard alone, but in fact these values are directly returned from the STB0899 DSP itself. We can straight away get the modulation/code rates directly from it.


+int decode_dvbs2_modcod(struct dvb_frontend *fe, enum fe_modcod modcod)
+{
+       int i;
+
+       struct modcod_table *table;
+       struct dvb_frontend_private *fepriv = fe->frontend_priv;
+       struct dvb_frontend_params *params = &fepriv->params;
+
+       if (params->delivery & FE_DELSYS_DVBS2) {
+               for (i = 0, table = dvbs2_modcod_lookup;
+                       i < ARRAY_SIZE(dvbs2_modcod_lookup);
+                       i++, table++) {
+
+                       if (table->modcod == modcod) {
+                               params->delsys.dvbs2.modulation = table->modulation;
+                               params->delsys.dvbs2.fecrate = table->fecrate;
+                       }
+               }
+       }
+
+       return 0;
+}
+EXPORT_SYMBOL(decode_dvbs2_modcod);

What's the loop for? Why not just make modcod an index into the array?


yeah, right.

diff -Naurp multi-proto-orig/linux/drivers/media/dvb/dvb-core/dvb_frontend.h multi-proto2/linux/drivers/media/dvb/dvb-core/dvb_frontend.h
--- multi-proto-orig/linux/drivers/media/dvb/dvb-core/dvb_frontend.h    2006-04-20 20:56:39.000000000 +0400
+++ multi-proto2/linux/drivers/media/dvb/dvb-core/dvb_frontend.h        2006-04-25 03:30:38.000000000 +0400
@@ -61,6 +61,12 @@ struct dvb_tuner_info {
        u32 bandwidth_step;
};

+struct modcod_table {
+       u32 modcod;
+       u32 modulation;
+       u32 fecrate;
+};
+

Is used in implementation only -> move to .c file


ok


diff -Naurp multi-proto-orig/linux/include/linux/dvb/frontend.h multi-proto2/linux/include/linux/dvb/frontend.h
--- multi-proto-orig/linux/include/linux/dvb/frontend.h 2006-04-20 20:56:40.000000000 +0400
+++ multi-proto2/linux/include/linux/dvb/frontend.h     2006-04-25 03:47:10.000000000 +0400
@@ -274,4 +274,273 @@ struct dvb_frontend_event {

#define FE_DISHNETWORK_SEND_LEGACY_CMD _IO('o', 80) /* unsigned int */

+/**
+ *     Supported delivery systems
+ *     some frontends are capable of supporting
+ *     multiple delivery systems
+ */
+enum fe_delsys {
+       FE_DELSYS_QUERY                 = 0x00000000,

How is QUERY used?


Initially we had only one MODCOD table from where everything was decoded, at that time Ralph suggested that we can use "0" to query to identify between multi standard devices, which was a very cool idea. Then someone came up with the thought that there wouldn't be enough space in the structure for the future, and hence now we have split up the table. I think it would be better if we replace QUERY with IGNORE, ie FE_DELSYS_IGNORE etc, we can ask GET_PARAMS/CAPS not to retrieve that value. this will be helpful to avoid unnecessary I2C communication, which results in faster results.


+       FE_DELSYS_DVBS                  = 0x00000001,
+       FE_DELSYS_DVBS2                 = 0x00000002,
+       FE_DELSYS_DSS                   = 0x00000004,
+       FE_DELSYS_DVBC                  = 0x00000008,
+       FE_DELSYS_DVBT                  = 0x00000010,
+       FE_DELSYS_DVBH                  = 0x00000020,
+       FE_DELSYS_ATSC                  = 0x00000040,
+       FE_DELSYS_AUTO                  = 0x10000000

What does AUTO mean here?
Did you mean to use 0x80000000?


Ah, yes. Human error.

Generally, I prefer to write (1 << 31) etc., but that's
a matter of taste.



Ah, yes, since you pointed it out, will go that way, using the bitmasks only for the STB0899

+};
+
+enum fe_matype {
+       FE_MATYPE_QUERY                 = 0x00000000,
+       FE_TRANSPORT                    = 0x00000001,
+       FE_GENERIC_PACKET               = 0x00000002,
+       FE_GENERIC_CONTINUOUS           = 0x00000004,
+       FE_RESERVED                     = 0x00000008,
+       FE_MATYPE_AUTO                  = 0x10000000
+};

I'm not sure if it makes sense to include this. Let's stick
with MPEG2 TS untils someone can demonstrate the other
modes are useful.


Well, the Nyquist rolloff rates are based on these parameters, ie, a = 0.20, a =0.25, a = 0.35

at the STB0899 side i have something like this , which maps to this like this ..

enum stb0899_rrc_alpha {
   STB0899_RRC_20            = 0x00000000,
   STB0899_RRC_25,
   STB0899_RRC_35
};

+struct dvb_frontend_cap {
+       enum fe_delsys                  delivery;
+       enum fe_inversion               inversion;
+
+       union {
+               struct dvbs_params      dvbs;
+               struct dvbs2_params     dvbs2;
+               struct dss_params       dss;
+               struct dvbc_params      dvbc;
+               struct dvbt_params      dvbt;
+               struct dvbh_params      dvbh;
+               struct atsc_params      atsc;
+       } delsys;
+};

if this doesn't report capabilities then _cap is the wrong name


I noticed it a little while back only. In fact the IOCTL naming is wrong. :-(
I will fix this.

+struct dvb_frontend_params {
+       __u32                           frequency;
+       enum fe_delsys                  delivery;
+       enum fe_inversion               inversion;
+
+       union {
+               struct dvbs_params      dvbs;
+               struct dvbs2_params     dvbs2;
+               struct dss_params       dss;
+               struct dvbc_params      dvbc;
+               struct dvbt_params      dvbt;
+               struct dvbh_params      dvbh;
+               struct atsc_params      atsc;
+       } delsys;

The kernel now requires gcc-3.x, so you could use anonymous unions if
you want.
But you repeat the same mistake which we already made: No room
for future binary compitable extension :-(


What's your thought on removing the size field in the IOCTL, so that the size won't be an issue ? That way it will be binary compatible. :-) Or any other thoughts you have ? We can retain the size for now, but we can remove it as and when need arises ..

+#define FE_SET_PARAMS                  _IOW('o', 81, struct dvb_frontend_params)
+#define FE_GET_PARAMS                  _IOWR('o', 82, struct dvb_frontend_cap)

Again, the name doesn't make it clear which is new / legacy.
It wouldn't hurt to add a short comment, too.


Ah, i will update it up with the changes. Thanks for the comments.


Thanks,
Manu



_______________________________________________

linux-dvb@xxxxxxxxxxx
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb

[Index of Archives]     [Linux Media]     [Video 4 Linux]     [Asterisk]     [Samba]     [Xorg]     [Xfree86]     [Linux USB]

  Powered by Linux