<br><br><div class="gmail_quote">On Mon, Oct 12, 2009 at 10:47 AM, Lou Otway <span dir="ltr"><<a href="mailto:lotway@nildram.co.uk">lotway@nildram.co.uk</a>></span> wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Hi,<br>
<br>
I've used the attached code to tune DVB-S2 adapters, under Linux, with the v4l drivers.<br>
<br>
The patch is against VLC 0.9.8a.<br></blockquote><div><br>Could you update it against git master branch?<br><br>The patch looks ok. I cannot test it, because I do not own an DVB-S2 card or satellite dish. So if someone of the team has one, please test.<br>
<br>gtz<br>Jean-Paul Saman<br> <br></div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<br>
Thanks,<br><font color="#888888">
<br>
Lou<br>
<br>
<br>
</font><br>diff -urN --exclude 'Make*' vlc-0.9.8a.orig/modules/access/dvb/access.c vlc-0.9.8a/modules/access/dvb/access.c<br>
--- vlc-0.9.8a.orig/modules/access/dvb/access.c 2008-10-15 20:31:20.000000000 +0100<br>
+++ vlc-0.9.8a/modules/access/dvb/access.c      2009-02-25 14:16:50.000000000 +0000<br>
@@ -86,6 +86,9 @@<br>
 #define DEVICE_TEXT N_("Device number to use on adapter")<br>
 #define DEVICE_LONGTEXT ""<br>
<br>
+#define DELIVERY_TEXT N_("Delivery System")<br>
+#define DELIVERY_LONGTEXT ""<br>
+<br>
 #define FREQ_TEXT N_("Transponder/multiplex frequency")<br>
 #define FREQ_LONGTEXT N_("In kHz for DVB-S or Hz for DVB-C/T")<br>
<br>
@@ -109,6 +112,9 @@<br>
 #define HIGH_VOLTAGE_LONGTEXT N_("Enable high voltage if your cables are " \<br>
     "particularly long. This is not supported by all frontends.")<br>
<br>
+#define MODULATION_2G_TEXT N_("2nd Gen Modulation")<br>
+#define MODULATION_2G_LONGTEXT N_("DVB-S2, C2 and T2 support")<br>
+<br>
 #define TONE_TEXT N_("22 kHz tone")<br>
 #define TONE_LONGTEXT N_("[0=off, 1=on, -1=auto].")<br>
<br>
@@ -196,6 +202,8 @@<br>
                  false );<br>
     add_integer( "dvb-device", 0, NULL, DEVICE_TEXT, DEVICE_LONGTEXT,<br>
                  true );<br>
+    add_integer( "dvb-delivery", 0, NULL, DELIVERY_TEXT, DELIVERY_LONGTEXT,<br>
+                 true );<br>
     add_integer( "dvb-frequency", 11954000, NULL, FREQ_TEXT, FREQ_LONGTEXT,<br>
                  false );<br>
     add_integer( "dvb-inversion", 2, NULL, INVERSION_TEXT, INVERSION_LONGTEXT,<br>
@@ -208,6 +216,9 @@<br>
                  true );<br>
     add_integer( "dvb-voltage", 13, NULL, VOLTAGE_TEXT, VOLTAGE_LONGTEXT,<br>
                  true );<br>
+    // TODO: Added 2G modulation<br>
+    add_bool( "dvb-2g-modulation", 0, NULL, MODULATION_2G_TEXT,<br>
+               MODULATION_2G_LONGTEXT, true );<br>
     add_bool( "dvb-high-voltage", 0, NULL, HIGH_VOLTAGE_TEXT,<br>
               HIGH_VOLTAGE_LONGTEXT, true );<br>
     add_integer( "dvb-tone", -1, NULL, TONE_TEXT, TONE_LONGTEXT,<br>
@@ -661,12 +672,15 @@<br>
     /* */<br>
     var_Create( p_access, "dvb-adapter", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );<br>
     var_Create( p_access, "dvb-device", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );<br>
+    var_Create( p_access, "dvb-delivery", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );<br>
     var_Create( p_access, "dvb-frequency", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );<br>
     var_Create( p_access, "dvb-inversion", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );<br>
     var_Create( p_access, "dvb-probe", VLC_VAR_BOOL | VLC_VAR_DOINHERIT );<br>
     var_Create( p_access, "dvb-budget-mode", VLC_VAR_BOOL | VLC_VAR_DOINHERIT );<br>
<br>
     /* */<br>
+    //TODO: Added 2nd gen mod<br>
+    var_Create( p_access, "dvb-2g-modulation", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );<br>
     var_Create( p_access, "dvb-satno", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );<br>
     var_Create( p_access, "dvb-voltage", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );<br>
     var_Create( p_access, "dvb-high-voltage", VLC_VAR_BOOL | VLC_VAR_DOINHERIT );<br>
@@ -745,8 +759,9 @@<br>
         else GET_OPTION_INT("inversion")<br>
         else GET_OPTION_BOOL("probe")<br>
         else GET_OPTION_BOOL("budget-mode")<br>
-<br>
+               else GET_OPTION_INT("dvb-delivery")<br>
         else GET_OPTION_INT("voltage")<br>
+        else GET_OPTION_BOOL("dvb-2g-modulation")<br>
         else GET_OPTION_BOOL("high-voltage")<br>
         else GET_OPTION_INT("tone")<br>
         else GET_OPTION_INT("satno")<br>
diff -urN --exclude 'Make*' vlc-0.9.8a.orig/modules/access/dvb/linux_dvb.c vlc-0.9.8a/modules/access/dvb/linux_dvb.c<br>
--- vlc-0.9.8a.orig/modules/access/dvb/linux_dvb.c      2008-10-15 20:31:20.000000000 +0100<br>
+++ vlc-0.9.8a/modules/access/dvb/linux_dvb.c   2009-02-25 14:18:12.000000000 +0000<br>
@@ -82,6 +82,7 @@<br>
 #define FRONTEND_LOCK_TIMEOUT 10000000 /* 10 s */<br>
<br>
 /* Local prototypes */<br>
+static fe_modulation_t DecodeModulationPSK( access_t *p_access );<br>
 static int FrontendInfo( access_t * );<br>
 static int FrontendSetQPSK( access_t * );<br>
 static int FrontendSetQAM( access_t * );<br>
@@ -133,6 +134,7 @@<br>
             return VLC_EGENERIC;<br>
         }<br>
<br>
+        msg_Dbg( p_access, "Frontend open - about to check type" );<br>
         switch( p_frontend->info.type )<br>
         {<br>
         case FE_OFDM:<br>
@@ -142,7 +144,16 @@<br>
             psz_real = "DVB-C";<br>
             break;<br>
         case FE_QPSK:<br>
-            psz_real = "DVB-S";<br>
+                msg_Dbg( p_access, "Checking for DVB-S or DVB-S2" );<br>
+                if (p_frontend->info.caps & FE_CAN_2G_MODULATION)<br>
+               {<br>
+                       // If can do 2G Mod, we have a DVB-S2 card<br>
+                       psz_real = "DVB-S2";<br>
+               }<br>
+               else<br>
+               {<br>
+                       psz_real = "DVB-S";<br>
+               }<br>
             break;<br>
         case FE_ATSC:<br>
             psz_real = "ATSC";<br>
@@ -240,7 +251,7 @@<br>
     case FE_QPSK:<br>
         if( FrontendSetQPSK( p_access ) < 0 )<br>
         {<br>
-            msg_Err( p_access, "DVB-S: tuning failed" );<br>
+            msg_Err( p_access, "DVB-S/DVB-S2: tuning failed" );<br>
             return VLC_EGENERIC;<br>
         }<br>
         break;<br>
@@ -541,7 +552,14 @@<br>
     switch( p_frontend->info.type )<br>
     {<br>
         case FE_QPSK:<br>
-            msg_Dbg( p_access, "  type = QPSK (DVB-S)" );<br>
+               if (p_frontend->info.caps & FE_CAN_2G_MODULATION)<br>
+               {<br>
+                       msg_Dbg( p_access, "  type = DVB-S2" );<br>
+               }<br>
+               else<br>
+               {<br>
+                       msg_Dbg( p_access, "  type = DVB-S" );<br>
+               }<br>
             break;<br>
         case FE_QAM:<br>
             msg_Dbg( p_access, "  type = QAM (DVB-C)" );<br>
@@ -631,6 +649,8 @@<br>
         msg_Dbg(p_access, "  card can mute TS");<br>
     if( p_frontend->info.caps & FE_CAN_RECOVER)<br>
         msg_Dbg(p_access, "  card can recover from a cable unplug");<br>
+    if( p_frontend->info.caps & FE_CAN_2G_MODULATION)<br>
+        msg_Dbg(p_access, "  card can do 2nd gen modulation");<br>
     if( p_frontend->info.caps & FE_CAN_8VSB)<br>
         msg_Dbg(p_access, "  card can do 8vsb");<br>
     if( p_frontend->info.caps & FE_CAN_16VSB)<br>
@@ -664,6 +684,9 @@<br>
     return fe_inversion;<br>
 }<br>
<br>
+/*****************************************************************************<br>
+ * DecodeFEC: Returns FEC value<br>
+ *****************************************************************************/<br>
 static fe_code_rate_t DecodeFEC( access_t *p_access, int i_val )<br>
 {<br>
     fe_code_rate_t      fe_fec = FEC_NONE;<br>
@@ -682,6 +705,11 @@<br>
         case 7: fe_fec = FEC_7_8; break;<br>
         case 8: fe_fec = FEC_8_9; break;<br>
         case 9: fe_fec = FEC_AUTO; break;<br>
+<br>
+        // Added new values<br>
+        case 10: fe_fec = FEC_3_5; break;<br>
+        case 11: fe_fec = FEC_9_10; break;<br>
+<br>
         default:<br>
             /* cannot happen */<br>
             fe_fec = FEC_NONE;<br>
@@ -691,6 +719,9 @@<br>
     return fe_fec;<br>
 }<br>
<br>
+/*****************************************************************************<br>
+ * DecodeModulationQAM: Returns QAM modulation<br>
+ *****************************************************************************/<br>
 static fe_modulation_t DecodeModulationQAM( access_t *p_access )<br>
 {<br>
     switch( var_GetInteger( p_access, "dvb-modulation" ) )<br>
@@ -706,6 +737,10 @@<br>
             return QAM_AUTO;<br>
     }<br>
 }<br>
+<br>
+/*****************************************************************************<br>
+ * DecodeModulationOFDM : Returns OFDM modulation<br>
+ *****************************************************************************/<br>
 static fe_modulation_t DecodeModulationOFDM( access_t *p_access )<br>
 {<br>
     switch( var_GetInteger( p_access, "dvb-modulation" ) )<br>
@@ -722,6 +757,9 @@<br>
             return QAM_AUTO;<br>
     }<br>
 }<br>
+/*****************************************************************************<br>
+ * DecodeModulationATSC : Returns ATSC modulation<br>
+ *****************************************************************************/<br>
 static fe_modulation_t DecodeModulationATSC( access_t *p_access )<br>
 {<br>
     switch( var_GetInteger( p_access, "dvb-modulation" ) )<br>
@@ -735,7 +773,37 @@<br>
 }<br>
<br>
 /*****************************************************************************<br>
- * FrontendSetQPSK : controls the FE device<br>
+ * DecodeDeliverySystem : Returns delivery system<br>
+ *****************************************************************************/<br>
+static fe_delivery_system_t DecodeDeliverySystem( access_t *p_access )<br>
+{<br>
+       return var_GetInteger( p_access, "dvb-delivery" );<br>
+}<br>
+<br>
+/*****************************************************************************<br>
+ * DecodeModulationPSK : Returns DVB-S modulation<br>
+ *****************************************************************************/<br>
+static fe_modulation_t DecodeModulationPSK( access_t *p_access )<br>
+{<br>
+       int mod;<br>
+<br>
+       mod = var_GetInteger( p_access, "dvb-modulation" );<br>
+<br>
+       switch(mod)<br>
+    {<br>
+        case QPSK:     return QPSK;<br>
+        case PSK_8:            return PSK_8;<br>
+        case APSK_16:          return APSK_16;<br>
+        case APSK_32:  return APSK_32;<br>
+        default:<br>
+            msg_Dbg( p_access, "DVB modulation not set, got %d, using QPSK",mod);<br>
+            return QPSK;<br>
+    }<br>
+}<br>
+<br>
+<br>
+/*****************************************************************************<br>
+ * DecodeVoltage : controls the FE device<br>
  *****************************************************************************/<br>
 static fe_sec_voltage_t DecodeVoltage( access_t *p_access )<br>
 {<br>
@@ -890,18 +958,27 @@<br>
     return 0;<br>
 }<br>
<br>
+/*****************************************************************************<br>
+ * FrontendSetQPSK : controls the FE device<br>
+ *****************************************************************************/<br>
 static int FrontendSetQPSK( access_t *p_access )<br>
 {<br>
     access_sys_t *p_sys = p_access->p_sys;<br>
     struct dvb_frontend_parameters fep;<br>
+    fe_modulation_t modulation;<br>
     int i_ret;<br>
     vlc_value_t val;<br>
     int i_frequency, i_lnb_slof = 0, i_lnb_lof1, i_lnb_lof2 = 0;<br>
+    fe_delivery_system_t delSys;<br>
<br>
     /* Prepare the fep structure */<br>
     var_Get( p_access, "dvb-frequency", &val );<br>
     i_frequency = val.i_int;<br>
<br>
+    modulation = DecodeModulationPSK(p_access);<br>
+    // TODO: is this a valid way of determining between DVB-S and DVB-S2?<br>
+    delSys = DecodeDeliverySystem(p_access);<br>
+<br>
     var_Get( p_access, "dvb-lnb-lof1", &val );<br>
     if ( val.i_int == 0 )<br>
     {<br>
@@ -983,21 +1060,36 @@<br>
         return VLC_EGENERIC;<br>
     }<br>
<br>
-    /* Empty the event queue */<br>
-    for( ; ; )<br>
-    {<br>
-        struct dvb_frontend_event event;<br>
-        if ( ioctl( p_sys->i_frontend_handle, FE_GET_EVENT, &event ) < 0<br>
-              && errno == EWOULDBLOCK )<br>
-            break;<br>
-    }<br>
+       struct dvb_frontend_event ev;<br>
+       struct dtv_property p_tune[] = {<br>
+               { .cmd = DTV_DELIVERY_SYSTEM,   .u.data = delSys },<br>
+               { .cmd = DTV_FREQUENCY,                 .u.data = fep.frequency },<br>
+               { .cmd = DTV_MODULATION,                .u.data = modulation },<br>
+               { .cmd = DTV_SYMBOL_RATE,               .u.data = fep.u.qpsk.symbol_rate },<br>
+               { .cmd = DTV_INNER_FEC,                 .u.data = fep.u.qpsk.fec_inner },<br>
+               { .cmd = DTV_INVERSION,                 .u.data = fep.inversion },<br>
+               { .cmd = DTV_ROLLOFF,                   .u.data = ROLLOFF_AUTO },<br>
+               { .cmd = DTV_TUNE },<br>
+       };<br>
+       struct dtv_properties cmdseq_tune = {<br>
+               .num = 8,               //Important - this must match the count of .cmd's above<br>
+               .props = p_tune<br>
+       };<br>
+<br>
+       /* discard stale QPSK events */<br>
+       while (1) {<br>
+               if (ioctl(p_sys->i_frontend_handle, FE_GET_EVENT, &ev) == -1)<br>
+                       break;<br>
+       }<br>
+<br>
+       msg_Dbg(p_access,"About to tune: mod=%d delivery=%d, freq=%d",modulation,delSys,fep.frequency);<br>
<br>
     /* Now send it all to the frontend device */<br>
-    if( (i_ret = ioctl( p_sys->i_frontend_handle, FE_SET_FRONTEND, &fep )) < 0 )<br>
-    {<br>
-        msg_Err( p_access, "DVB-S: setting frontend failed (%d) %m", i_ret );<br>
-        return VLC_EGENERIC;<br>
-    }<br>
+       if ((ioctl(p_sys->i_frontend_handle, FE_SET_PROPERTY, &cmdseq_tune)) == -1)<br>
+       {<br>
+               msg_Err(p_access,"FE_SET_PROPERTY TUNE failed");<br>
+               return VLC_EGENERIC;<br>
+       }<br>
<br>
     return VLC_SUCCESS;<br>
 }<br>
@@ -1493,7 +1585,7 @@<br>
         msg_Dbg( p_access, "CAMInit: NDS scrambling system supported" );<br>
     if ( caps.descr_type & CA_DSS )<br>
         msg_Dbg( p_access, "CAMInit: DSS scrambling system supported" );<br>
-<br>
+<br>
     if ( caps.slot_num == 0 )<br>
     {<br>
         msg_Err( p_access, "CAMInit: CAM module with no slots" );<br>
<br>_______________________________________________<br>
vlc-devel mailing list<br>
To unsubscribe or modify your subscription options:<br>
<a href="http://mailman.videolan.org/listinfo/vlc-devel" target="_blank">http://mailman.videolan.org/listinfo/vlc-devel</a><br>
<br></blockquote></div><br>