[vlc-commits] DTV: Linux-specific DiSEqC 1.0 master support

Rémi Denis-Courmont git at videolan.org
Thu Mar 24 19:57:30 CET 2011


vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Thu Mar 24 20:57:01 2011 +0200| [01810bfc5ac4d43026f76040ee51e84d0e4eab44] | committer: Rémi Denis-Courmont

DTV: Linux-specific DiSEqC 1.0 master support

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=01810bfc5ac4d43026f76040ee51e84d0e4eab44
---

 modules/access/dtv/access.c |   14 +++++++-----
 modules/access/dtv/linux.c  |   45 ++++++++++++++++++++++++++++++++++++++----
 modules/access/dvb/access.c |    5 ----
 3 files changed, 48 insertions(+), 16 deletions(-)

diff --git a/modules/access/dtv/access.c b/modules/access/dtv/access.c
index 2a33cd5..851df49 100644
--- a/modules/access/dtv/access.c
+++ b/modules/access/dtv/access.c
@@ -172,13 +172,16 @@ static const char *const polarization_user[] = { N_("Unspecified (0V)"),
     "A continuous tone at 22kHz can be sent on the cable. " \
     "This normally selects the higher frequency band from a universal LNB.")
 
-#if 0
 #define SATNO_TEXT N_("DiSEqC LNB number")
 #define SATNO_LONGTEXT N_( \
     "If the satellite receiver is connected to multiple " \
     "low noise block-downconverters (LNB) through a DiSEqC 1.0 switch, " \
     "the correct LNB can be selected (1 to 4). " \
     "If there is no switch, this parameter should be 0.")
+#ifdef __linux__
+static const int satno_vlc[] = { 0, 1, 2, 3, 4 };
+static const char *const satno_user[] = { N_("Unspecified"),
+    "A/1", "B/2", "C/3", "D/4" };
 #endif
 
 static int  Open (vlc_object_t *);
@@ -286,13 +289,12 @@ vlc_module_begin ()
                  LNB_SWITCH_TEXT, LNB_SWITCH_LONGTEXT, true)
         change_integer_range (0, 0x7fffffff)
         add_deprecated_alias ("dvb-lnb-slof")
-    add_integer ("dvb-tone", -1, TONE_TEXT, TONE_LONGTEXT, true)
-        change_integer_list (auto_off_on_vlc, auto_off_on_user)
-#if 0
+#ifdef __linux
     add_integer ("dvb-satno", 0, SATNO_TEXT, SATNO_LONGTEXT, true)
-        change_integer_range (0, 4)
-        change_safe ()
+        change_integer_list (satno_vlc, satno_user)
 #endif
+    add_integer ("dvb-tone", -1, TONE_TEXT, TONE_LONGTEXT, true)
+        change_integer_list (auto_off_on_vlc, auto_off_on_user)
 vlc_module_end ()
 
 struct access_sys_t
diff --git a/modules/access/dtv/linux.c b/modules/access/dtv/linux.c
index 80d4402..65cad0a 100644
--- a/modules/access/dtv/linux.c
+++ b/modules/access/dtv/linux.c
@@ -595,9 +595,6 @@ known:
         freq *= -1;
     assert (freq < 0x7fffffff);
 
-    /* TODO: DiSEqC */
-
-    /* Continuous tone (to select high oscillator frequency) */
     int tone;
     switch (var_InheritInteger (d->obj, "dvb-tone"))
     {
@@ -606,10 +603,48 @@ known:
         default: tone = high ? SEC_TONE_ON : SEC_TONE_OFF;
     }
 
+    /*** LNB selection / DiSEqC ***/
     unsigned voltage = dvb_parse_polarization (pol);
+    if (dvb_set_props (d, 2, DTV_TONE, SEC_TONE_OFF, DTV_VOLTAGE, voltage))
+        return -1;
+
+    unsigned satno = var_InheritInteger (d->obj, "dvb-satno");
+    if (satno > 0)
+    {
+        /* DiSEqC 1.0 */
+#undef msleep /* we know what we are doing! */
+        struct dvb_diseqc_master_cmd cmd;
+
+        satno = (satno - 1) & 3;
+        cmd.msg[0] = 0xE0; /* framing: master, no reply, 1st TX */
+        cmd.msg[1] = 0x10; /* address: all LNB/switch */
+        cmd.msg[2] = 0x38; /* command: Write Port Group 0 */
+        cmd.msg[3] = 0xF0  /* data[0]: clear all bits */
+                   | (satno << 2) /* LNB (A, B, C or D) */
+                   | ((voltage == SEC_VOLTAGE_18) << 1) /* polarization */
+                   | (tone == SEC_TONE_ON); /* option */
+        cmd.msg[4] = cmd.msg[5] = 0; /* unused */
+        msleep (15000); /* wait 15 ms before DiSEqC command */
+        if (ioctl (d->frontend, FE_DISEQC_SEND_MASTER_CMD, &cmd) < 0)
+        {
+            msg_Err (d->obj, "cannot send DiSEqC command: %m");
+            return -1;
+        }
+        msleep (54000 + 15000);
+
+        /* Mini-DiSEqC */
+        satno &= 1;
+        if (ioctl (d->frontend, FE_DISEQC_SEND_BURST,
+                   satno ? SEC_MINI_B : SEC_MINI_A) < 0)
+        {
+            msg_Err (d->obj, "cannot send Mini-DiSEqC tone burst: %m");
+            return -1;
+        }
+        msleep (15000);
+    }
 
-    return dvb_set_props (d, 3, DTV_FREQUENCY, freq,
-                          DTV_VOLTAGE, voltage, DTV_TONE, tone);
+    /* Continuous tone (to select high oscillator frequency) */
+    return dvb_set_props (d, 2, DTV_FREQUENCY, freq, DTV_TONE, tone);
 }
 
 int dvb_set_dvbs (dvb_device_t *d, uint32_t freq,
diff --git a/modules/access/dvb/access.c b/modules/access/dvb/access.c
index b47c612..605ddf9 100644
--- a/modules/access/dvb/access.c
+++ b/modules/access/dvb/access.c
@@ -68,9 +68,6 @@ static void Close( vlc_object_t *p_this );
 #define SATELLITE_TEXT N_("Satellite scanning config")
 #define SATELLITE_LONGTEXT N_("filename of config file in share/dvb/dvb-s")
 
-#define SATNO_TEXT N_("Satellite number in the Diseqc system")
-#define SATNO_LONGTEXT N_("[0=no diseqc, 1-4=satellite number].")
-
 #define HOST_TEXT N_( "HTTP Host address" )
 #define HOST_LONGTEXT N_( \
     "To enable the internal HTTP server, set its address and port here." )
@@ -115,8 +112,6 @@ vlc_module_begin ()
     /* DVB-S (satellite) */
     add_string( "dvb-satellite", NULL, SATELLITE_TEXT, SATELLITE_LONGTEXT,
                 true )
-    add_integer( "dvb-satno", 0, SATNO_TEXT, SATNO_LONGTEXT,
-                 true )
 #ifdef ENABLE_HTTPD
     /* MMI HTTP interface */
     set_section( N_("HTTP server" ), 0 )



More information about the vlc-commits mailing list