[linux-dvb] [PATCH] Multi protocol support (stage #1)

Johannes Stezenbach js at linuxtv.org
Thu Apr 27 01:11:30 CEST 2006


Hi Manu,

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

On Tue, Apr 25, 2006, Manu Abraham wrote:

> 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.

> +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!

> +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?

> 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

> 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?

> +       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?

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


> +};
> +
> +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.

> +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

> +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 :-(

> +#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.

> #endif /*_DVBFRONTEND_H_*/



Johannes



More information about the linux-dvb mailing list