[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