Part of Slepp's ProjectsPastebinTURLImagebinFilebin
Feedback -- English French German Japanese
Create Upload Newest Tools Donate
Sign In | Create Account

Paste Description for gp8psk-dvbs2-091506.

Modifyed additional dvb-s2 patches and cleaned up for current v4l-dvb tree.

gp8psk-dvbs2-091506.
Friday, September 15th, 2006 at 3:51:09pm UTC 

  1. --- v4l-dvb/linux/drivers/media/dvb/dvb-core/dvb_frontend.c.orig   2006-09-15 09:40:29.000000000 -0400
  2. +++ v4l-dvb/linux/drivers/media/dvb/dvb-core/dvb_frontend.c        2006-09-15 10:32:50.000000000 -0400
  3. @@ -96,6 +96,7 @@
  4.         /* thread/frontend values */
  5.         struct dvb_device *dvbdev;
  6.         struct dvb_frontend_parameters parameters;
  7. +       struct dvb_frontend_parameters_new parameters_new;
  8.         struct dvb_fe_events events;
  9.         struct semaphore sem;
  10.         struct list_head list_head;
  11. @@ -111,6 +112,8 @@
  12.         int tone;
  13.         int voltage;
  14.  
  15. +       int current_standard_set;
  16. +       fe_type_t current_standard;
  17.         /* swzigzag values */
  18.         unsigned int state;
  19.         unsigned int bending;
  20. @@ -262,13 +265,23 @@
  21.         int autoinversion;
  22.         int ready = 0;
  23.         struct dvb_frontend_private *fepriv = fe->frontend_priv;
  24. -       int original_inversion = fepriv->parameters.inversion;
  25. -       u32 original_frequency = fepriv->parameters.frequency;
  26. +        int original_inversion;
  27. +        u32 original_frequency;
  28. +
  29. +        if (fepriv->current_standard_set) {
  30. +                original_inversion = fepriv->parameters_new.inversion;
  31. +                original_frequency = fepriv->parameters_new.frequency;
  32. +        } else {
  33. +                original_inversion = fepriv->parameters.inversion;
  34. +                original_frequency = fepriv->parameters.frequency;
  35. +        }
  36.  
  37.         /* are we using autoinversion? */
  38.         autoinversion = ((!(fe->ops.info.caps & FE_CAN_INVERSION_AUTO)) &&
  39. -                        (fepriv->parameters.inversion == INVERSION_AUTO));
  40. -
  41. +                ((fepriv->current_standard_set &&
  42. +                  fepriv->parameters_new.inversion == INVERSION_AUTO) ||
  43. +                 (! fepriv->current_standard_set &&
  44. +                   fepriv->parameters.inversion == INVERSION_AUTO)));
  45.         /* setup parameters correctly */
  46.         while(!ready) {
  47.                 /* calculate the lnb_drift */
  48. @@ -333,14 +346,24 @@
  49.                 fepriv->auto_step, fepriv->auto_sub_step, fepriv->started_auto_step);
  50.  
  51.         /* set the frontend itself */
  52. -       fepriv->parameters.frequency += fepriv->lnb_drift;
  53. -       if (autoinversion)
  54. -               fepriv->parameters.inversion = fepriv->inversion;
  55. -       if (fe->ops.set_frontend)
  56. -               fe->ops.set_frontend(fe, &fepriv->parameters);
  57. -
  58. -       fepriv->parameters.frequency = original_frequency;
  59. -       fepriv->parameters.inversion = original_inversion;
  60. +        if (fepriv->current_standard_set) {
  61. +                fepriv->parameters_new.frequency += fepriv->lnb_drift;
  62. +                if (autoinversion)
  63. +                        fepriv->parameters_new.inversion = fepriv->inversion;
  64. +                if (fe->ops.set_frontend2)
  65. +                        fe->ops.set_frontend2(fe, &fepriv->parameters_new);
  66. +                fepriv->parameters_new.frequency = original_frequency;
  67. +                fepriv->parameters_new.inversion = original_inversion;
  68. +        } else {         
  69. +                fepriv->parameters.frequency += fepriv->lnb_drift;
  70. +                if (autoinversion)
  71. +                        fepriv->parameters.inversion = fepriv->inversion;
  72. +                if (fe->ops.set_frontend)
  73. +                        fe->ops.set_frontend(fe, &fepriv->parameters);
  74. +
  75. +                fepriv->parameters.frequency = original_frequency;
  76. +                fepriv->parameters.inversion = original_inversion;
  77. +        }
  78.  
  79.         fepriv->auto_sub_step++;           
  80.         return 0;
  81. @@ -361,8 +384,13 @@
  82.         /* in SCAN mode, we just set the frontend when asked and leave it alone */
  83.         if (fepriv->tune_mode_flags & FE_TUNE_MODE_ONESHOT) {     
  84.                 if (fepriv->state & FESTATE_RETUNE) {             
  85. -                       if (fe->ops.set_frontend)
  86. -                               fe->ops.set_frontend(fe, &fepriv->parameters);
  87. +                        if (fepriv->current_standard_set) {
  88. +                                if (fe->ops.set_frontend2)               
  89. +                                        fe->ops.set_frontend2(fe, &fepriv->parameters_new);
  90. +                        } else {
  91. +                                if (fe->ops.set_frontend)
  92. +                                        fe->ops.set_frontend(fe, &fepriv->parameters);
  93. +                        }
  94.                         fepriv->state = FESTATE_TUNED;               
  95.                 }
  96.                 fepriv->delay = 3*HZ;
  97. @@ -937,18 +965,21 @@
  98.                         /* default values */
  99.                         switch(fe->ops.info.type) {
  100.                         case FE_QPSK:
  101. +                       case FE_DVB_S:
  102.                                 fepriv->min_delay = HZ/20;
  103.                                 fepriv->step_size = fepriv->parameters.u.qpsk.symbol_rate / 16000;
  104.                                 fepriv->max_drift = fepriv->parameters.u.qpsk.symbol_rate / 2000;
  105.                                 break;
  106.  
  107.                         case FE_QAM:
  108. +                       case FE_DVB_C:
  109.                                 fepriv->min_delay = HZ/20;
  110.                                 fepriv->step_size = 0; /* no zigzag */
  111.                                 fepriv->max_drift = 0;                 
  112.                                 break;
  113.  
  114.                         case FE_OFDM:     
  115. +                       case FE_DVB_T:
  116.                                 fepriv->min_delay = HZ/20;             
  117.                                 fepriv->step_size = fe->ops.info.frequency_stepsize * 2;
  118.                                 fepriv->max_drift = (fe->ops.info.frequency_stepsize * 2) + 1;
  119. @@ -958,6 +989,103 @@
  120.                                 fepriv->step_size = 0;
  121.                                 fepriv->max_drift = 0;
  122.                                 break;   
  123. +                       case FE_DVB_S2:
  124. +                               printk("dvb-core: ERROR FE_DVB_S2 is handled via FE_SET_FRONTEND2.\n");
  125. +                               break;
  126. +                       }
  127. +               }
  128. +               if (dvb_override_tune_delay > 0)
  129. +                       fepriv->min_delay = (dvb_override_tune_delay * HZ) / 1000;
  130. +               
  131. +               fepriv->state = FESTATE_RETUNE;
  132. +               dvb_frontend_wakeup(fe);
  133. +               dvb_frontend_add_event(fe, 0);                     
  134. +               fepriv->status = 0;                               
  135. +               err = 0;
  136. +               break;
  137. +       }
  138. +       case FE_SET_FRONTEND2: {
  139. +               struct dvb_frontend_tune_settings fetunesettings;
  140. +               struct dvb_frontend_parameters_new *castedparg;
  141. +                               
  142. +               if (!fepriv->current_standard_set) {
  143. +                       err = -EINVAL;
  144. +                       break;
  145. +               }
  146. +
  147. +               castedparg = (struct dvb_frontend_parameters_new *)parg;
  148. +               memcpy (&fepriv->parameters_new, parg,
  149. +                        sizeof (struct dvb_frontend_parameters_new));
  150. +
  151. +               memset(&fetunesettings, 0, sizeof(struct dvb_frontend_tune_settings));
  152. +
  153. +               /* be sure struct union pointer is set - even if it is NULL */
  154. +               fetunesettings.parameters_new.u = castedparg->u;
  155. +
  156. +               /* force auto frequency inversion if requested */
  157. +               if (dvb_force_auto_inversion) {
  158. +                       fepriv->parameters_new.inversion = INVERSION_AUTO;
  159. +                       fetunesettings.parameters_new.inversion = INVERSION_AUTO;
  160. +               }
  161. +               if (fe->ops.info.type == FE_DVB_T || fe->ops.info.type == FE_OFDM) {
  162. +                       /* without hierachical coding code_rate_LP is irrelevant,
  163. +                       * so we tolerate the otherwise invalid FEC_NONE setting */
  164. +                       if (fepriv->parameters_new.u.ofdm.hierarchy_information == HIERARCHY_NONE &&
  165. +                                                fepriv->parameters_new.u.ofdm.code_rate_LP == FEC_NONE)
  166. +                               fepriv->parameters_new.u.ofdm.code_rate_LP = FEC_AUTO;
  167. +               }
  168. +
  169. +               /* get frontend-specific tuning settings */
  170. +               if (fe->ops.get_tune_settings && (fe->ops.get_tune_settings(fe, &fetunesettings) == 0)) {
  171. +                       fepriv->min_delay = (fetunesettings.min_delay_ms * HZ) / 1000;
  172. +                       fepriv->max_drift = fetunesettings.max_drift;
  173. +                       fepriv->step_size = fetunesettings.step_size;
  174. +               } else {
  175. +                       /* default values */
  176. +                       switch(fe->ops.info.type) {
  177. +                       case FE_DVB_S:
  178. +                       case FE_QPSK:           
  179. +                               if (fepriv->current_standard != FE_DVB_S) {       
  180. +                                       err = -EINVAL;
  181. +                                       break;
  182. +                               }       
  183. +                               fepriv->min_delay = HZ/20;         
  184. +                               fepriv->step_size = fepriv->parameters_new.u.qpsk.symbol_rate / 16000;
  185. +                               fepriv->max_drift = fepriv->parameters_new.u.qpsk.symbol_rate / 2000;
  186. +                               break;
  187. +                       case FE_DVB_C:
  188. +                       case FE_QAM:
  189. +                               if (fepriv->current_standard != FE_DVB_C) {
  190. +                                       err = -EINVAL;         
  191. +                                       break;
  192. +                               }
  193. +                               fepriv->min_delay = HZ/20;
  194. +                               fepriv->step_size = 0; /* no zigzag */
  195. +                               fepriv->max_drift = 0;
  196. +                               break;
  197. +                       case FE_DVB_T:
  198. +                       case FE_OFDM:                 
  199. +                               if (fepriv->current_standard != FE_DVB_T) {
  200. +                                       err = -EINVAL;
  201. +                                       break;
  202. +                               }
  203. +                               fepriv->min_delay = HZ/20;
  204. +                               fepriv->step_size = fe->ops.info.frequency_stepsize * 2;
  205. +                               fepriv->max_drift = (fe->ops.info.frequency_stepsize * 2) + 1;
  206. +                               break;
  207. +                       case FE_ATSC:         
  208. +                               printk("dvb-core: FE_ATSC not handled yet.\n");
  209. +                               break;
  210. +                       case FE_DVB_S2:
  211. +                               if (fepriv->current_standard != FE_DVB_S2) {       
  212. +                                       err = -EINVAL;
  213. +                                       break;
  214. +                               }
  215. +                               fepriv->min_delay = HZ/20;
  216. +                               fepriv->step_size = fepriv->parameters_new.u.qpsk2.symbol_rate / 16000;
  217. +                               fepriv->max_drift = fepriv->parameters_new.u.qpsk2.symbol_rate / 2000;
  218. +                               break;
  219. +               
  220.                         }
  221.                 }
  222.                 if (dvb_override_tune_delay > 0)
  223. @@ -968,6 +1096,7 @@
  224.                 dvb_frontend_add_event(fe, 0);
  225.                 fepriv->status = 0;         
  226.                 err = 0;
  227. +               /* if previously used delete old tuning params */
  228.                 break;                         
  229.         }
  230.  
  231. @@ -981,6 +1110,48 @@
  232.                         err = fe->ops.get_frontend(fe, (struct dvb_frontend_parameters*) parg);
  233.                 }
  234.                 break;
  235. +       case FE_GET_FRONTEND2:
  236. +               if (!fepriv->current_standard) {
  237. +                       err = -EINVAL;
  238. +                       break;     
  239. +               }
  240. +               if (fe->ops.get_frontend2) {                   
  241. +                       memcpy (parg, &fepriv->parameters_new, sizeof (struct dvb_frontend_parameters_new));
  242. +                       err = fe->ops.get_frontend2(fe, (struct dvb_frontend_parameters_new*) parg);
  243. +               }
  244. +               break;
  245. +                               
  246. +       case FE_SET_STANDARD:         
  247. +               /*
  248. +               * current_standard_set and current_standard are reset
  249. +               * this prevents user from ignoring return value and       
  250. +               * if current_standard would be kept as fallback, users may
  251. +               * supply corrupted tuning data.
  252. +               * if the new standard isn't supported no FE_SET_FRONTEND2
  253. +               * is possible. it will return EINVAL     
  254. +               */
  255. +               fepriv->current_standard_set = 0;
  256. +               fepriv->current_standard = 0;
  257. +               {
  258. +                       fe_type_t fetype = (fe_type_t) parg;
  259. +                       if (fetype != FE_DVB_S && fetype != FE_DVB_C && fetype != FE_DVB_T && fetype != FE_DVB_S2 && fetype != FE_ATSC) {
  260. +                               err = -EINVAL;
  261. +                       } else if (fe->ops.set_standard) {                         
  262. +                               err = fe->ops.set_standard(fe, fetype);
  263. +                               if (!err) {   
  264. +                                       fepriv->current_standard_set = 1;
  265. +                                       fepriv->current_standard = fetype;
  266. +                               }
  267. +                       }
  268. +               }
  269. +               break;
  270. +
  271. +       case FE_GET_EXTENDED_INFO: {
  272. +               struct dvb_fe_caps_extended* info = parg;
  273. +               memcpy(info, &fe->ops.extended_info, sizeof(struct dvb_fe_caps_extended));
  274. +               err = 0;
  275. +               break;                     
  276. +       }               
  277.  
  278.         case FE_SET_FRONTEND_TUNE_MODE:         
  279.                 fepriv->tune_mode_flags = (unsigned long) parg;
  280. @@ -1026,7 +1197,10 @@
  281.                 fepriv->tune_mode_flags &= ~FE_TUNE_MODE_ONESHOT;
  282.                 fepriv->tone = -1;
  283.                 fepriv->voltage = -1;
  284. -
  285. +                fepriv->current_standard_set = 0;
  286. +                fepriv->current_standard = 0
  287. +                if (fe->ops.set_standard)
  288. +                        fe->ops.set_standard(fe, 0);
  289.                 ret = dvb_frontend_start (fe);
  290.                 if (ret)
  291.                         dvb_generic_release (inode, file);
  292. diff -r 436e56df57d3 v4l-dvb/linux/drivers/media/dvb/dvb-core/dvb_frontend.h
  293. --- v4l-dvb/linux/drivers/media/dvb/dvb-core/dvb_frontend.h     Thu Apr 13 18:50:22 2006 -0300
  294. +++ v4l-dvb/linux/drivers/media/dvb/dvb-core/dvb_frontend.h     Sat Apr 22 13:38:01 2006 -0700
  295. @@ -45,6 +45,7 @@               
  296.         int step_size;               
  297.         int max_drift;
  298.         struct dvb_frontend_parameters parameters;
  299. +       struct dvb_frontend_parameters_new parameters_new;                 
  300.  };
  301.  
  302.  struct dvb_frontend;
  303. @@ -90,6 +91,7 @@
  304.  struct dvb_frontend_ops {
  305.  
  306.         struct dvb_frontend_info info;       
  307. +       struct dvb_fe_caps_extended extended_info;
  308.  
  309.         void (*release)(struct dvb_frontend* fe);
  310.  
  311. @@ -124,6 +126,10 @@
  312.         int (*enable_high_lnb_voltage)(struct dvb_frontend* fe, long arg);
  313.         int (*dishnetwork_send_legacy_command)(struct dvb_frontend* fe, unsigned long cmd);
  314.         int (*i2c_gate_ctrl)(struct dvb_frontend* fe, int enable);       
  315. +       int (*set_standard)(struct dvb_frontend* fe, fe_type_t type);     
  316. +       int (*get_extended_info)(struct dvb_frontend* fe, struct dvb_fe_caps_extended* extendedinfo);
  317. +       int (*set_frontend2)(struct dvb_frontend* fe, struct dvb_frontend_parameters_new* params);
  318. +       int (*get_frontend2)(struct dvb_frontend* fe, struct dvb_frontend_parameters_new* params);
  319.  
  320.         struct dvb_tuner_ops tuner_ops;
  321.  };
  322. diff -r 436e56df57d3 v4l-dvb/linux/include/linux/dvb/frontend.h
  323. --- v4l-dvb/linux/include/linux/dvb/frontend.h  Thu Apr 13 18:50:22 2006 -0300           
  324. +++ v4l-dvb/linux/include/linux/dvb/frontend.h  Sat Apr 22 13:38:01 2006 -0700
  325. @@ -28,14 +28,23 @@                         
  326.  
  327.  #include <asm/types.h>
  328.  
  329. -
  330. +/**                 
  331. + * Usage of fe_type_t enumerations:
  332. + * Don't use FE_QPSK, FE_QAM, FE_OFDM any longer in new applications.
  333. + * If the FE_HAS_EXTENDED_INFO is set within the fe_caps,
  334. + * applications should ignore the fe_type_t returned by the FE_GET_INFO ioctl.
  335. + *
  336. + */
  337.  typedef enum fe_type {
  338. -       FE_QPSK,
  339. -       FE_QAM,
  340. -       FE_OFDM,       
  341. -       FE_ATSC
  342. +       FE_QPSK = 0,
  343. +       FE_QAM = 1,
  344. +       FE_OFDM = 2,
  345. +       FE_ATSC = 3,           
  346. +       FE_DVB_S = (1 << 2),         
  347. +       FE_DVB_C = (1 << 3),
  348. +       FE_DVB_T = (1 << 4),
  349. +       FE_DVB_S2 = (1 << 5),
  350.  } fe_type_t;
  351. -
  352.  typedef enum fe_caps {
  353.         FE_IS_STUPID                    = 0,
  354. @@ -62,11 +71,11 @@ typedef enum fe_caps {
  355.         FE_CAN_HIERARCHY_AUTO           = 0x100000,
  356.         FE_CAN_8VSB                     = 0x200000,
  357.         FE_CAN_16VSB                    = 0x400000,
  358. +       FE_HAS_EXTENDED_INFO            = 0x10000000,
  359.         FE_NEEDS_BENDING                = 0x20000000, // not supported anymore, don't use (frontend requires frequency bending)
  360.         FE_CAN_RECOVER                  = 0x40000000, // frontend can recover from a cable unplug automatically
  361.         FE_CAN_MUTE_TS                  = 0x80000000  // frontend can stop spurious TS data output
  362.  } fe_caps_t;
  363. -
  364.  
  365.  struct dvb_frontend_info {
  366.         char       name[128];
  367. @@ -82,7 +91,6 @@ struct dvb_frontend_info {
  368.         fe_caps_t  caps;
  369.  };
  370.  
  371. -
  372.  /**
  373.   *  Check out the DiSEqC bus spec available on http://www.eutelsat.org/ for 
  374.   *  the meaning of this struct...         
  375. @@ -126,9 +134,9 @@ typedef enum fe_status {
  376.         FE_HAS_SYNC     = 0x08,   /*  found sync bytes  */
  377.         FE_HAS_LOCK     = 0x10,   /*  everything's working... */
  378.         FE_TIMEDOUT     = 0x20,   /*  no lock within the last ~2 seconds */
  379. -       FE_REINIT       = 0x40    /*  frontend was reinitialized,  */
  380. -} fe_status_t;                   /*  application is recommended to reset */
  381. -                                 /*  DiSEqC, tone and parameters */ 
  382. +       FE_REINIT       = 0x40    /*  legacy cruft, do not use */
  383. +} fe_status_t;
  384.  
  385.  typedef enum fe_spectral_inversion {
  386.         INVERSION_OFF,
  387. @@ -147,21 +155,45 @@ typedef enum fe_code_rate {
  388.         FEC_6_7,       
  389.         FEC_7_8,
  390.         FEC_8_9,   
  391. -       FEC_AUTO   
  392. +       FEC_AUTO,   
  393. +       FEC_3_5,               
  394. +       FEC_9_10                     
  395.  } fe_code_rate_t;         
  396.  
  397.  
  398.  typedef enum fe_modulation {
  399. -       QPSK,
  400. -       QAM_16,
  401. -       QAM_32,       
  402. -       QAM_64,
  403. -       QAM_128,
  404. -       QAM_256,
  405. -       QAM_AUTO,
  406. -       VSB_8,
  407. -       VSB_16
  408. +       MOD_QPSK     = 0,
  409. +       QPSK         = 0,
  410. +       MOD_QAM_16   = 1,
  411. +       QAM_16       = 1,
  412. +       MOD_QAM_32   = 2,
  413. +       QAM_32       = 2,
  414. +       MOD_QAM_64   = 3
  415. +       QAM_64       = 3,   
  416. +       MOD_QAM_128  = 4,
  417. +       QAM_128      = 4,
  418. +       MOD_QAM_256  = 5,
  419. +       QAM_256      = 5,
  420. +       MOD_QAM_AUTO = 6,
  421. +       QAM_AUTO     = 6,
  422. +       MOD_8VSB     = 7,
  423. +       VSB_8        = 7,                   
  424. +       MOD_16VSB    = 8,
  425. +       VSB_16       = 8,
  426. +       MOD_2VSB     = 9,
  427. +       MOD_4VSB     = 10,
  428. +       MOD_BPSK     = 11,
  429. +       MOD_16APSK   = 12,
  430. +       MOD_32APSK   = 13,
  431. +       MOD_8PSK     = 14,
  432. +       MOD_16PSK    = 15,
  433.  } fe_modulation_t;
  434. +
  435. +typedef enum fe_rolloff_factor {   
  436. +       ROLLOFF_ALPHA_0_35,
  437. +       ROLLOFF_ALPHA_0_25,
  438. +       ROLLOFF_ALPHA_0_20
  439. +} fe_rolloff_factor_t;
  440.  
  441.  typedef enum fe_transmit_mode {
  442.         TRANSMISSION_MODE_2K,
  443. @@ -194,23 +226,34 @@ typedef enum fe_hierarchy {
  444.         HIERARCHY_AUTO               
  445.  } fe_hierarchy_t;         
  446.  
  447. -
  448. -struct dvb_qpsk_parameters {
  449. -       __u32           symbol_rate;  /* symbol rate in Symbols per second */
  450. +/**           
  451. + *  this struct will be filled by the FE_GET_EXTENDED_INFO ioctl.
  452. + *  it is a extension to the normal frontend capabilities and provided
  453. + *  if the dvb_fe_info.caps is having the FE_HAS_EXTENDED_INFO bit set.
  454. + */           
  455. +struct dvb_fe_caps_extended {
  456. +       __u32   fecs;           /* supported fecs */
  457. +       __u32   modulations;    /* supported modulations */
  458. +       __u32   standards;      /* supported frontend_types */
  459. +};
  460. +                       
  461. +                       
  462. +struct dvb_dvbs_parameters {
  463. +       __u32           symbol_rate;  /* symbol rate in symbols per second */
  464.         fe_code_rate_t  fec_inner;    /* forward error correction (see above) */
  465.  };
  466.  
  467. -struct dvb_qam_parameters {
  468. -       __u32           symbol_rate; /* symbol rate in Symbols per second */
  469. +struct dvb_dvbc_parameters {
  470. +       __u32           symbol_rate; /* symbol rate in symbols per second */
  471.         fe_code_rate_t  fec_inner;   /* forward error correction (see above) */
  472.         fe_modulation_t modulation;  /* modulation type (see above) */
  473.  };
  474.  
  475. -struct dvb_vsb_parameters {
  476. +struct dvb_atsc_parameters {
  477.         fe_modulation_t modulation;  /* modulation type (see above) */
  478.  };
  479.  
  480. -struct dvb_ofdm_parameters {
  481. +struct dvb_dvbt_parameters {
  482.         fe_bandwidth_t      bandwidth;
  483.         fe_code_rate_t      code_rate_HP;  /* high priority stream code rate */
  484.         fe_code_rate_t      code_rate_LP;  /* low priority stream code rate */
  485. @@ -220,25 +263,75 @@ struct dvb_ofdm_parameters {
  486.         fe_hierarchy_t      hierarchy_information;
  487.  };                         
  488.  
  489. -
  490. +struct dvb_dvbs2_parameters {
  491. +       __u32                   symbol_rate;    /* symbol rate in symbols per second */
  492. +       fe_code_rate_t          fec_inner;      /* forward error correction (see above) */
  493. +       fe_modulation_t         modulation;     /* modulation type (see above) */
  494. +       fe_rolloff_factor_t     rolloff_factor; /* rolloff factor needed for dvb-s2 */
  495. +};
  496. +
  497. +/* The following structure is used to allocate enough space in the union
  498. +   for future expansion.
  499. +*/
  500. +struct dvb_private_parameters {
  501. +       __u32           priv[64];
  502. +};
  503. +
  504. +#define dvb_qpsk_parameters dvb_dvbs_parameters
  505. +#define dvb_qam_parameters dvb_dvbc_parameters
  506. +#define dvb_ofdm_parameters dvb_dvbt_parameters   
  507. +#define dvb_vsb_parameters dvb_atsc_parameters           
  508. +       
  509. +/* just kept for backwards binary compatibility
  510. + * deprecated for usage in actual applications
  511. + */                     
  512.  struct dvb_frontend_parameters {
  513.         __u32 frequency;     /* (absolute) frequency in Hz for QAM/OFDM/ATSC */
  514.                              /* intermediate frequency in kHz for QPSK */       
  515.         fe_spectral_inversion_t inversion;
  516.         union {
  517. -               struct dvb_qpsk_parameters qpsk;
  518. -               struct dvb_qam_parameters  qam;
  519. -               struct dvb_ofdm_parameters ofdm;
  520. -               struct dvb_vsb_parameters vsb;
  521. +               struct dvb_dvbs_parameters qpsk;
  522. +               struct dvb_dvbc_parameters  qam;
  523. +               struct dvb_dvbt_parameters ofdm;
  524. +               struct dvb_atsc_parameters vsb;
  525.         } u;               
  526. -};
  527. -
  528. +};// __attribute((__deprecated__));
  529. +
  530. +typedef union {             
  531. +               struct dvb_dvbs_parameters qpsk;
  532. +               struct dvb_dvbc_parameters qam;
  533. +               struct dvb_dvbt_parameters ofdm;
  534. +               struct dvb_atsc_parameters vsb;
  535. +               struct dvb_dvbs2_parameters qpsk2;
  536. +               struct dvb_private_parameters priv;
  537. +} frontend_parameters_union;
  538. +
  539. +struct dvb_frontend_parameters_new {
  540. +       __u32 frequency;     /* (absolute) frequency in Hz for QAM/OFDM/ATSC */
  541. +                            /* intermediate frequency in kHz for QPSK */             
  542. +       fe_spectral_inversion_t inversion;
  543. +       frontend_parameters_union u;
  544. +};
  545. +/**
  546. + * Important:
  547. + * FE_GET_EVENT and struct dvb_frontend_event
  548. + * are deprecated due to:
  549. + * FE_GET_EVENT is a mis-designed ioctl
  550. + * informations within dvb_frontend_event will
  551. + * always return stale information.
  552. + * Applications should:
  553. + * - open the frontend device with O_NONBLOCK 
  554. + * - poll() for events
  555. + * - FE_GET_EVENT all pending events to clear the POLLPRI status,
  556. + *   and throw them away
  557. + * - FE_READ_STATUS etc. to get current information
  558. + */
  559.  
  560.  struct dvb_frontend_event {
  561.         fe_status_t status;     
  562.         struct dvb_frontend_parameters parameters;
  563. -};
  564. -
  565. +}; // __attribute((__deprecated__));
  566.  
  567.  /**
  568.   * When set, this flag will disable any zigzagging or other "normal" tuning
  569. @@ -267,9 +360,36 @@ struct dvb_frontend_event {
  570.  #define FE_READ_SNR               _IOR('o', 72, __u16)
  571.  #define FE_READ_UNCORRECTED_BLOCKS _IOR('o', 73, __u32)
  572.  
  573. +#define FE_SET_FRONTEND2          _IOW('o', 84, struct dvb_frontend_parameters_new)
  574. +#define FE_GET_FRONTEND2          _IOR('o', 85, struct dvb_frontend_parameters_new)
  575. +/**
  576. + * next two IOCTLs are deprecated for further use in applications
  577. + */
  578.  #define FE_SET_FRONTEND                   _IOW('o', 76, struct dvb_frontend_parameters)
  579.  #define FE_GET_FRONTEND                   _IOR('o', 77, struct dvb_frontend_parameters)
  580. +               
  581. +               
  582.  #define FE_SET_FRONTEND_TUNE_MODE  _IO('o', 81) /* unsigned int */
  583. +               
  584. +/**
  585. + * use to set the FE_STANDARD - if a tuner supports more than one type.
  586. + * e.g. DVB-C/T or DVB-S/S2 combi frontends. after FE_SET_STANDARD was set,
  587. + * the drivers has to make sure still to reflect the standards available,
  588. + * but capabilities should be adjusted to the selected standard               
  589. + */
  590. +#define FE_SET_STANDARD                   _IO('o', 82) /* fe_type_t */
  591. +       
  592. +/**
  593. + * used to query the extended frontend capabilities (see above for details)
  594. + */
  595. +#define FE_GET_EXTENDED_INFO      _IOR('o', 83, struct dvb_fe_caps_extended)
  596. +
  597. +/**
  598. + * FE_GET_EVENT is deprecated for applications.
  599. + * you should use FE_READ_STATUS and if needed the FE_GET_FRONTEND_NEW
  600. + * IOCTLs.
  601. + */
  602.  #define FE_GET_EVENT              _IOR('o', 78, struct dvb_frontend_event)
  603.  
  604.  #define FE_DISHNETWORK_SEND_LEGACY_CMD _IO('o', 80) /* unsigned int */
  605. --- v4l-dvb/linux/drivers/media/dvb/dvb-usb/gp8psk-fe.c.orig    2006-09-15 07:27:07.000000000 -0400
  606. +++ v4l-dvb/linux/drivers/media/dvb/dvb-usb/gp8psk-fe.c 2006-09-15 07:29:11.000000000 -0400
  607. @@ -41,6 +41,17 @@
  608.         return 0;
  609.  }
  610.  
  611. +static int gp8psk_set_standard(struct dvb_frontend* fe, u32 type)
  612. +{
  613. +       (void) fe;
  614. +       if (type == FE_DVB_S2 || type == FE_DVB_S) {
  615. +               fe->ops.info.type = type;
  616. +               return 0;
  617. +       } else {
  618. +               fe->ops.info.type = FE_QPSK;   
  619. +               return 1;
  620. +       }
  621. +}
  622.  /* not supported by this Frontend */
  623.  static int gp8psk_fe_read_ber(struct dvb_frontend* fe, u32 *ber)
  624.  {
  625. @@ -90,8 +101,8 @@
  626.         return 0;
  627.  } 
  628.  
  629. -static int gp8psk_fe_set_frontend(struct dvb_frontend* fe,
  630. -                                 struct dvb_frontend_parameters *fep)
  631. +static int gp8psk_fe_set_frontend2(struct dvb_frontend* fe,
  632. +                                 struct dvb_frontend_parameters_new *fep)
  633.  {             
  634.         struct gp8psk_fe_state *state = fe->demodulator_priv;
  635.         u8 cmd[10];
  636. @@ -103,6 +114,7 @@
  637.         cmd[7] = (freq >> 24) & 0xff;
  638.  
  639.         switch(fe->ops.info.type) {
  640. +        case FE_DVB_S:
  641.         case FE_QPSK:
  642.                 cmd[0] =  fep->u.qpsk.symbol_rate        & 0xff;
  643.                 cmd[1] = (fep->u.qpsk.symbol_rate >>  8) & 0xff;           
  644. @@ -111,6 +123,17 @@
  645.                 cmd[8] = ADV_MOD_DVB_QPSK;
  646.                 cmd[9] = 0x03; /*ADV_MOD_FEC_XXX*/
  647.                 break;
  648. +       case FE_DVB_S2:
  649. +               cmd[0] =  fep->u.qpsk2.symbol_rate        & 0xff;     
  650. +               cmd[1] = (fep->u.qpsk2.symbol_rate >>  8) & 0xff;
  651. +               cmd[2] = (fep->u.qpsk2.symbol_rate >> 16) & 0xff;
  652. +               cmd[3] = (fep->u.qpsk2.symbol_rate >> 24) & 0xff;         
  653. +               if (fep->u.qpsk2.modulation == MOD_8PSK)
  654. +                       cmd[8] = ADV_MOD_TURBO_8PSK;
  655. +               else
  656. +                       cmd[8] = ADV_MOD_DVB_QPSK;
  657. +               cmd[9] = 0x03; /*ADV_MOD_FEC_XXX*/
  658. +               break;
  659.         default:
  660.                 // other modes are unsuported right now
  661.                 cmd[0] = 0;
  662. @@ -129,6 +152,14 @@
  663.         return 0;
  664.  }
  665.  
  666. +static int gp8psk_fe_set_frontend(struct dvb_frontend* fe,
  667. +                                 struct dvb_frontend_parameters *fep)
  668. +{
  669. +       return gp8psk_fe_set_frontend2(fe,
  670. +                       (struct dvb_frontend_parameters_new *) fep);
  671. +}
  672. +                       
  673. +               
  674.  static int gp8psk_fe_get_frontend(struct dvb_frontend* fe,
  675.                                   struct dvb_frontend_parameters *fep)
  676.  {               
  677. @@ -246,8 +277,15 @@
  678.                 .caps = FE_CAN_INVERSION_AUTO |
  679.                                 FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
  680.                                 FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
  681. -                               FE_CAN_QPSK                 
  682. +                               FE_CAN_QPSK | FE_HAS_EXTENDED_INFO       
  683. +       },     
  684. +       .extended_info = {
  685. +               .fecs           = FEC_1_2 | FEC_2_3 | FEC_3_4 | FEC_5_6 |
  686. +                                        FEC_7_8 | FEC_AUTO,
  687. +               .modulations    = MOD_QPSK | MOD_BPSK | MOD_8PSK,
  688. +               .standards      = FE_DVB_S | FE_DVB_S2
  689.         },
  690. +       .set_standard = gp8psk_set_standard,
  691.  
  692.         .release = gp8psk_fe_release,
  693.  
  694. @@ -256,6 +294,10 @@
  695.  
  696.         .set_frontend = gp8psk_fe_set_frontend,   
  697.         .get_frontend = gp8psk_fe_get_frontend,
  698. +                     
  699. +       .set_frontend2 = gp8psk_fe_set_frontend2,                     
  700. +       .get_frontend2 = NULL,
  701. +               
  702.         .get_tune_settings = gp8psk_fe_get_tune_settings,                 
  703.  
  704.         .read_status = gp8psk_fe_read_status,

Update the Post

Either update this post and resubmit it with changes, or make a new post.

You may also comment on this post.

update paste below
details of the post (optional)

Note: Only the paste content is required, though the following information can be useful to others.

Save name / title?

(space separated, optional)



Please note that information posted here will expire by default in one month. If you do not want it to expire, please set the expiry time above. If it is set to expire, web search engines will not be allowed to index it prior to it expiring. Items that are not marked to expire will be indexable by search engines. Be careful with your passwords. All illegal activities will be reported and any information will be handed over to the authorities, so be good.

comments powered by Disqus
worth-right