fix deprecated conversion from string constant to char* by using const char* instead...
[enigma2.git] / lib / dvb / sec.cpp
index f7271c1878db54466c9b8c3c1906c2ff7c655d2a..655f64fca0be73995c08d06c89fec0953e6544dd 100644 (file)
@@ -1,6 +1,7 @@
 #include <lib/dvb/dvb.h>
 #include <lib/dvb/sec.h>
 #include <lib/dvb/rotor_calc.h>
+#include <lib/dvb/dvbtime.h>
 
 #include <set>
 
 #endif
 #include <lib/base/eerror.h>
 
+//#define SEC_DEBUG
+
+#ifdef SEC_DEBUG
+#define eSecDebug(arg...) eDebug(arg)
+#else
+#define eSecDebug(arg...)
+#endif
+
 DEFINE_REF(eDVBSatelliteEquipmentControl);
 
 eDVBSatelliteEquipmentControl *eDVBSatelliteEquipmentControl::instance;
@@ -105,12 +114,12 @@ eDVBSatelliteEquipmentControl::eDVBSatelliteEquipmentControl(eSmartPtrList<eDVBR
        setRotorPosNum(1); // stored pos 1
 }
 
-static void checkLinkedParams(int direction, int &linked_ptr, int &ret, const eDVBFrontendParametersSatellite &sat, int csw, int ucsw, int toneburst, bool diseqc, bool rotor, int RotorPos)
+static void checkLinkedParams(int direction, long &linked_ptr, int &ret, const eDVBFrontendParametersSatellite &sat, int csw, int ucsw, int toneburst, bool diseqc, bool rotor, int RotorPos)
 {
        eDVBRegisteredFrontend *linked_fe = (eDVBRegisteredFrontend*) linked_ptr;
        if (linked_fe->m_inuse)
        {
-               int ocsw = -1,
+               long ocsw = -1,
                        oucsw = -1,
                        oToneburst = -1;
                linked_fe->m_frontend->getData(eDVBFrontend::CSW, ocsw);
@@ -136,7 +145,7 @@ static void checkLinkedParams(int direction, int &linked_ptr, int &ret, const eD
 //             else
 //                     eDebug("OK .. can tune this transponder with linked tuner in use :)");
        }
-       linked_fe->m_frontend->getData(direction, linked_ptr);
+       linked_fe->m_frontend->getData(direction, (long&)linked_ptr);
 }
 
 int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite &sat, iDVBFrontend *fe, int slot_id )
@@ -157,7 +166,7 @@ int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite
                                lnb_param.m_satellites.find(sat.orbital_position);
                        if ( sit != lnb_param.m_satellites.end())
                        {
-                               int band=0,
+                               long band=0,
                                        linked_prev_ptr=-1,
                                        linked_next_ptr=-1,
                                        satpos_depends_ptr=-1,
@@ -245,6 +254,30 @@ int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite
        return ret;
 }
 
+bool need_turn_fast(int turn_speed)
+{
+       if (turn_speed == eDVBSatelliteRotorParameters::FAST)
+               return true;
+       else if (turn_speed != eDVBSatelliteRotorParameters::SLOW)
+       {
+               int begin = turn_speed >> 16; // high word is start time
+               int end = turn_speed&0xFFFF; // low word is end time
+               time_t now_time = eDVBLocalTimeHandler::getInstance()->nowTime();
+               tm nowTime;
+               localtime_r(&now_time, &nowTime);
+               int now = (nowTime.tm_hour + 1) * 60 + nowTime.tm_min + 1;
+               bool neg = end <= begin;
+               if (neg) {
+                       int tmp = begin;
+                       begin = end;
+                       end = tmp;
+               }
+               if ((now >= begin && now < end) ^ neg)
+                       return true;
+       }
+       return false;
+}
+
 #define VOLTAGE(x) (lnb_param.m_increased_voltage ? iDVBFrontend::voltage##x##_5 : iDVBFrontend::voltage##x)
 
 RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPARAMETERS &parm, const eDVBFrontendParametersSatellite &sat, int slot_id)
@@ -265,7 +298,7 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA
                        bool doSetFrontend = true;
                        bool doSetVoltageToneFrontend = m_not_linked_slot_mask & slot_id;
                        bool allowDiseqc1_2 = true;
-                       int band=0,
+                       long band=0,
                                voltage = iDVBFrontend::voltageOff,
                                tone = iDVBFrontend::toneOff,
                                csw = di_param.m_committed_cmd,
@@ -574,7 +607,7 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA
                                                }
                                        }
 
-                                       eDebug("RotorCmd %02x, lastRotorCmd %02x", RotorCmd, lastRotorCmd);
+                                       eDebug("RotorCmd %02x, lastRotorCmd %02lx", RotorCmd, lastRotorCmd);
                                        if ( RotorCmd != -1 && RotorCmd != lastRotorCmd )
                                        {
                                                eSecCommand::pair compare;
@@ -667,11 +700,11 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA
                                                        sec_sequence.push_back( eSecCommand(eSecCommand::IF_INPUTPOWER_DELTA_GOTO, cmd ) );  // check if rotor has started
                                                        sec_sequence.push_back( eSecCommand(eSecCommand::IF_TIMEOUT_GOTO, +2 ) );  // timeout .. we assume now the rotor is already at the correct position
                                                        sec_sequence.push_back( eSecCommand(eSecCommand::GOTO, -4) );  // goto loop start
-                                                       sec_sequence.push_back( eSecCommand(eSecCommand::IF_NO_MORE_ROTOR_DISEQC_RETRYS_GOTO, +10 ) );  // timeout .. we assume now the rotor is already at the correct position
+                                                       sec_sequence.push_back( eSecCommand(eSecCommand::IF_NO_MORE_ROTOR_DISEQC_RETRYS_GOTO, +9 ) );  // timeout .. we assume now the rotor is already at the correct position
                                                        sec_sequence.push_back( eSecCommand(eSecCommand::GOTO, -8) );  // goto loop start
 ////////////////////
-                                                       sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, VOLTAGE(18)) );
-                                                       sec_sequence.push_back( eSecCommand(eSecCommand::SET_POWER_LIMITING_MODE, eSecCommand::modeDynamic) );
+                                                       if (need_turn_fast(rotor_param.m_inputpower_parameters.m_turning_speed))
+                                                               sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, VOLTAGE(18)) );
                                                        sec_sequence.push_back( eSecCommand(eSecCommand::SET_TIMEOUT, m_params[MOTOR_RUNNING_TIMEOUT]*20) );  // 2 minutes running timeout
 // rotor running loop
                                                        sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 50) );  // wait 50msec
@@ -679,11 +712,11 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA
                                                        cmd.direction=0;  // check for stopped rotor
                                                        cmd.steps=+4;
                                                        sec_sequence.push_back( eSecCommand(eSecCommand::IF_INPUTPOWER_DELTA_GOTO, cmd ) );
-                                                       sec_sequence.push_back( eSecCommand(eSecCommand::IF_TIMEOUT_GOTO, +4 ) );  // timeout ? this should never happen
+                                                       sec_sequence.push_back( eSecCommand(eSecCommand::IF_TIMEOUT_GOTO, +3 ) );  // timeout ? this should never happen
                                                        sec_sequence.push_back( eSecCommand(eSecCommand::GOTO, -4) );  // running loop start
 /////////////////////
-                                                       sec_sequence.push_back( eSecCommand(eSecCommand::SET_POWER_LIMITING_MODE, eSecCommand::modeDynamic) );
                                                        sec_sequence.push_back( eSecCommand(eSecCommand::UPDATE_CURRENT_ROTORPARAMS) );
+                                                       sec_sequence.push_back( eSecCommand(eSecCommand::SET_POWER_LIMITING_MODE, eSecCommand::modeDynamic) );
                                                }
                                                else
                                                {  // use normal turning mode
@@ -768,6 +801,7 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA
 
 RESULT eDVBSatelliteEquipmentControl::clear()
 {
+       eSecDebug("eDVBSatelliteEquipmentControl::clear()");
        for (int i=0; i <= m_lnbidx; ++i)
        {
                m_lnbs[i].m_satellites.clear();
@@ -780,6 +814,18 @@ RESULT eDVBSatelliteEquipmentControl::clear()
        //reset some tuner configuration
        for (eSmartPtrList<eDVBRegisteredFrontend>::iterator it(m_avail_frontends.begin()); it != m_avail_frontends.end(); ++it)
        {
+               long tmp;
+               if (!strcmp(it->m_frontend->getDescription(), "BCM4501 (internal)") && !it->m_frontend->getData(eDVBFrontend::LINKED_PREV_PTR, tmp) && tmp != -1)
+               {
+                       FILE *f=fopen("/proc/stb/tsmux/lnb_b_input", "w");
+                       if (!f || fwrite("B", 1, 1, f) != 1)
+                               eDebug("set /proc/stb/tsmux/lnb_b_input to B failed!! (%m)");
+                       else
+                       {
+                               eDebug("set /proc/stb/tsmux/lnb_b_input to B OK");
+                               fclose(f);
+                       }
+               }
                it->m_frontend->setData(eDVBFrontend::SATPOS_DEPENDS_PTR, -1);
                it->m_frontend->setData(eDVBFrontend::LINKED_PREV_PTR, -1);
                it->m_frontend->setData(eDVBFrontend::LINKED_NEXT_PTR, -1);
@@ -800,11 +846,13 @@ RESULT eDVBSatelliteEquipmentControl::addLNB()
                eDebug("no more LNB free... cnt is %d", m_lnbidx);
                return -ENOSPC;
        }
+       eSecDebug("eDVBSatelliteEquipmentControl::addLNB(%d)", m_lnbidx-1);
        return 0;
 }
 
 RESULT eDVBSatelliteEquipmentControl::setLNBSlotMask(int slotmask)
 {
+       eSecDebug("eDVBSatelliteEquipmentControl::setLNBSlotMask(%d)", slotmask);
        if ( currentLNBValid() )
                m_lnbs[m_lnbidx].slot_mask = slotmask;
        else
@@ -814,6 +862,7 @@ RESULT eDVBSatelliteEquipmentControl::setLNBSlotMask(int slotmask)
 
 RESULT eDVBSatelliteEquipmentControl::setLNBLOFL(int lofl)
 {
+       eSecDebug("eDVBSatelliteEquipmentControl::setLNBLOFL(%d)", lofl);
        if ( currentLNBValid() )
                m_lnbs[m_lnbidx].m_lof_lo = lofl;
        else
@@ -823,6 +872,7 @@ RESULT eDVBSatelliteEquipmentControl::setLNBLOFL(int lofl)
 
 RESULT eDVBSatelliteEquipmentControl::setLNBLOFH(int lofh)
 {
+       eSecDebug("eDVBSatelliteEquipmentControl::setLNBLOFH(%d)", lofh);
        if ( currentLNBValid() )
                m_lnbs[m_lnbidx].m_lof_hi = lofh;
        else
@@ -832,6 +882,7 @@ RESULT eDVBSatelliteEquipmentControl::setLNBLOFH(int lofh)
 
 RESULT eDVBSatelliteEquipmentControl::setLNBThreshold(int threshold)
 {
+       eSecDebug("eDVBSatelliteEquipmentControl::setLNBThreshold(%d)", threshold);
        if ( currentLNBValid() )
                m_lnbs[m_lnbidx].m_lof_threshold = threshold;
        else
@@ -841,6 +892,7 @@ RESULT eDVBSatelliteEquipmentControl::setLNBThreshold(int threshold)
 
 RESULT eDVBSatelliteEquipmentControl::setLNBIncreasedVoltage(bool onoff)
 {
+       eSecDebug("eDVBSatelliteEquipmentControl::setLNBIncreasedVoltage(%d)", onoff);
        if ( currentLNBValid() )
                m_lnbs[m_lnbidx].m_increased_voltage = onoff;
        else
@@ -851,6 +903,7 @@ RESULT eDVBSatelliteEquipmentControl::setLNBIncreasedVoltage(bool onoff)
 /* DiSEqC Specific Parameters */
 RESULT eDVBSatelliteEquipmentControl::setDiSEqCMode(int diseqcmode)
 {
+       eSecDebug("eDVBSatelliteEquipmentControl::setDiSEqcMode(%d)", diseqcmode);
        if ( currentLNBValid() )
                m_lnbs[m_lnbidx].m_diseqc_parameters.m_diseqc_mode = (eDVBSatelliteDiseqcParameters::t_diseqc_mode)diseqcmode;
        else
@@ -860,6 +913,7 @@ RESULT eDVBSatelliteEquipmentControl::setDiSEqCMode(int diseqcmode)
 
 RESULT eDVBSatelliteEquipmentControl::setToneburst(int toneburst)
 {
+       eSecDebug("eDVBSatelliteEquipmentControl::setToneburst(%d)", toneburst);
        if ( currentLNBValid() )
                m_lnbs[m_lnbidx].m_diseqc_parameters.m_toneburst_param = (eDVBSatelliteDiseqcParameters::t_toneburst_param)toneburst;
        else
@@ -869,6 +923,7 @@ RESULT eDVBSatelliteEquipmentControl::setToneburst(int toneburst)
 
 RESULT eDVBSatelliteEquipmentControl::setRepeats(int repeats)
 {
+       eSecDebug("eDVBSatelliteEquipmentControl::setRepeats(%d)", repeats);
        if ( currentLNBValid() )
                m_lnbs[m_lnbidx].m_diseqc_parameters.m_repeats=repeats;
        else
@@ -878,6 +933,7 @@ RESULT eDVBSatelliteEquipmentControl::setRepeats(int repeats)
 
 RESULT eDVBSatelliteEquipmentControl::setCommittedCommand(int command)
 {
+       eSecDebug("eDVBSatelliteEquipmentControl::setCommittedCommand(%d)", command);
        if ( currentLNBValid() )
                m_lnbs[m_lnbidx].m_diseqc_parameters.m_committed_cmd=command;
        else
@@ -887,6 +943,7 @@ RESULT eDVBSatelliteEquipmentControl::setCommittedCommand(int command)
 
 RESULT eDVBSatelliteEquipmentControl::setUncommittedCommand(int command)
 {
+       eSecDebug("eDVBSatelliteEquipmentControl::setUncommittedCommand(%d)", command);
        if ( currentLNBValid() )
                m_lnbs[m_lnbidx].m_diseqc_parameters.m_uncommitted_cmd = command;
        else
@@ -896,6 +953,7 @@ RESULT eDVBSatelliteEquipmentControl::setUncommittedCommand(int command)
 
 RESULT eDVBSatelliteEquipmentControl::setCommandOrder(int order)
 {
+       eSecDebug("eDVBSatelliteEquipmentControl::setCommandOrder(%d)", order);
        if ( currentLNBValid() )
                m_lnbs[m_lnbidx].m_diseqc_parameters.m_command_order=order;
        else
@@ -905,6 +963,7 @@ RESULT eDVBSatelliteEquipmentControl::setCommandOrder(int order)
 
 RESULT eDVBSatelliteEquipmentControl::setFastDiSEqC(bool onoff)
 {
+       eSecDebug("eDVBSatelliteEquipmentControl::setFastDiSEqc(%d)", onoff);
        if ( currentLNBValid() )
                m_lnbs[m_lnbidx].m_diseqc_parameters.m_use_fast=onoff;
        else
@@ -914,6 +973,7 @@ RESULT eDVBSatelliteEquipmentControl::setFastDiSEqC(bool onoff)
 
 RESULT eDVBSatelliteEquipmentControl::setSeqRepeat(bool onoff)
 {
+       eSecDebug("eDVBSatelliteEquipmentControl::setSeqRepeat(%d)", onoff);
        if ( currentLNBValid() )
                m_lnbs[m_lnbidx].m_diseqc_parameters.m_seq_repeat = onoff;
        else
@@ -924,6 +984,7 @@ RESULT eDVBSatelliteEquipmentControl::setSeqRepeat(bool onoff)
 /* Rotor Specific Parameters */
 RESULT eDVBSatelliteEquipmentControl::setLongitude(float longitude)
 {
+       eSecDebug("eDVBSatelliteEquipmentControl::setLongitude(%f)", longitude);
        if ( currentLNBValid() )
                m_lnbs[m_lnbidx].m_rotor_parameters.m_gotoxx_parameters.m_longitude=longitude;
        else
@@ -933,6 +994,7 @@ RESULT eDVBSatelliteEquipmentControl::setLongitude(float longitude)
 
 RESULT eDVBSatelliteEquipmentControl::setLatitude(float latitude)
 {
+       eSecDebug("eDVBSatelliteEquipmentControl::setLatitude(%f)", latitude);
        if ( currentLNBValid() )
                m_lnbs[m_lnbidx].m_rotor_parameters.m_gotoxx_parameters.m_latitude=latitude;
        else
@@ -942,6 +1004,7 @@ RESULT eDVBSatelliteEquipmentControl::setLatitude(float latitude)
 
 RESULT eDVBSatelliteEquipmentControl::setLoDirection(int direction)
 {
+       eSecDebug("eDVBSatelliteEquipmentControl::setLoDirection(%d)", direction);
        if ( currentLNBValid() )
                m_lnbs[m_lnbidx].m_rotor_parameters.m_gotoxx_parameters.m_lo_direction=direction;
        else
@@ -951,6 +1014,7 @@ RESULT eDVBSatelliteEquipmentControl::setLoDirection(int direction)
 
 RESULT eDVBSatelliteEquipmentControl::setLaDirection(int direction)
 {
+       eSecDebug("eDVBSatelliteEquipmentControl::setLaDirection(%d)", direction);
        if ( currentLNBValid() )
                m_lnbs[m_lnbidx].m_rotor_parameters.m_gotoxx_parameters.m_la_direction=direction;
        else
@@ -960,6 +1024,7 @@ RESULT eDVBSatelliteEquipmentControl::setLaDirection(int direction)
 
 RESULT eDVBSatelliteEquipmentControl::setUseInputpower(bool onoff)
 {
+       eSecDebug("eDVBSatelliteEquipmentControl::setUseInputpower(%d)", onoff);
        if ( currentLNBValid() )
                m_lnbs[m_lnbidx].m_rotor_parameters.m_inputpower_parameters.m_use=onoff;
        else
@@ -969,6 +1034,7 @@ RESULT eDVBSatelliteEquipmentControl::setUseInputpower(bool onoff)
 
 RESULT eDVBSatelliteEquipmentControl::setInputpowerDelta(int delta)
 {
+       eSecDebug("eDVBSatelliteEquipmentControl::setInputpowerDelta(%d)", delta);
        if ( currentLNBValid() )
                m_lnbs[m_lnbidx].m_rotor_parameters.m_inputpower_parameters.m_delta=delta;
        else
@@ -979,6 +1045,7 @@ RESULT eDVBSatelliteEquipmentControl::setInputpowerDelta(int delta)
 /* Satellite Specific Parameters */
 RESULT eDVBSatelliteEquipmentControl::addSatellite(int orbital_position)
 {
+       eSecDebug("eDVBSatelliteEquipmentControl::addSatellite(%d)", orbital_position);
        if ( currentLNBValid() )
        {
                std::map<int, eDVBSatelliteSwitchParameters>::iterator it =
@@ -1004,6 +1071,7 @@ RESULT eDVBSatelliteEquipmentControl::addSatellite(int orbital_position)
 
 RESULT eDVBSatelliteEquipmentControl::setVoltageMode(int mode)
 {
+       eSecDebug("eDVBSatelliteEquipmentControl::setVoltageMode(%d)", mode);
        if ( currentLNBValid() && m_curSat != m_lnbs[m_lnbidx].m_satellites.end() )
                m_curSat->second.m_voltage_mode = (eDVBSatelliteSwitchParameters::t_voltage_mode)mode;
        else
@@ -1014,6 +1082,7 @@ RESULT eDVBSatelliteEquipmentControl::setVoltageMode(int mode)
 
 RESULT eDVBSatelliteEquipmentControl::setToneMode(int mode)
 {
+       eSecDebug("eDVBSatelliteEquipmentControl::setToneMode(%d)", mode);
        if ( currentLNBValid() )
        {
                if ( m_curSat != m_lnbs[m_lnbidx].m_satellites.end() )
@@ -1028,6 +1097,7 @@ RESULT eDVBSatelliteEquipmentControl::setToneMode(int mode)
 
 RESULT eDVBSatelliteEquipmentControl::setRotorPosNum(int rotor_pos_num)
 {
+       eSecDebug("eDVBSatelliteEquipmentControl::setRotorPosNum(%d)", rotor_pos_num);
        if ( currentLNBValid() )
        {
                if ( m_curSat != m_lnbs[m_lnbidx].m_satellites.end() )
@@ -1040,6 +1110,16 @@ RESULT eDVBSatelliteEquipmentControl::setRotorPosNum(int rotor_pos_num)
        return 0;
 }
 
+RESULT eDVBSatelliteEquipmentControl::setRotorTurningSpeed(int speed)
+{
+       eSecDebug("eDVBSatelliteEquipmentControl::setRotorTurningSpeed(%d)", speed);
+       if ( currentLNBValid() )
+               m_lnbs[m_lnbidx].m_rotor_parameters.m_inputpower_parameters.m_turning_speed = speed;
+       else
+               return -ENOENT;
+       return 0;
+}
+
 struct sat_compare
 {
        int orb_pos, lofl, lofh;
@@ -1087,7 +1167,7 @@ PyObject *eDVBSatelliteEquipmentControl::get_exclusive_satellites(int tu1, int t
 
                        do 
                        {
-                               int tmp;
+                               long tmp;
                                p1->m_frontend->getData(eDVBFrontend::LINKED_PREV_PTR, tmp);
                                if (tmp != -1)
                                        p1 = (eDVBRegisteredFrontend*)tmp;
@@ -1098,7 +1178,7 @@ PyObject *eDVBSatelliteEquipmentControl::get_exclusive_satellites(int tu1, int t
 
                        do 
                        {
-                               int tmp;
+                               long tmp;
                                p2->m_frontend->getData(eDVBFrontend::LINKED_PREV_PTR, tmp);
                                if (tmp != -1)
                                        p2 = (eDVBRegisteredFrontend*)tmp;
@@ -1109,8 +1189,8 @@ PyObject *eDVBSatelliteEquipmentControl::get_exclusive_satellites(int tu1, int t
 
                        if (p1 != p2)
                        {
-                               int tmp1=-1;
-                               int tmp2=-1;
+                               long tmp1=-1;
+                               long tmp2=-1;
                                // check for rotor dependency
                                p1->m_frontend->getData(eDVBFrontend::SATPOS_DEPENDS_PTR, tmp1);
                                if (tmp1 != -1)
@@ -1172,6 +1252,7 @@ PyObject *eDVBSatelliteEquipmentControl::get_exclusive_satellites(int tu1, int t
 
 RESULT eDVBSatelliteEquipmentControl::setTunerLinked(int tu1, int tu2)
 {
+       eSecDebug("eDVBSatelliteEquipmentControl::setTunerLinked(%d, %d)", tu1, tu2);
        if (tu1 != tu2)
        {
                eDVBRegisteredFrontend *p1=NULL, *p2=NULL;
@@ -1186,8 +1267,19 @@ RESULT eDVBSatelliteEquipmentControl::setTunerLinked(int tu1, int tu2)
                }
                if (p1 && p2)
                {
-                       p1->m_frontend->setData(eDVBFrontend::LINKED_PREV_PTR, (int)p2);
-                       p2->m_frontend->setData(eDVBFrontend::LINKED_NEXT_PTR, (int)p1);
+                       p1->m_frontend->setData(eDVBFrontend::LINKED_PREV_PTR, (long)p2);
+                       p2->m_frontend->setData(eDVBFrontend::LINKED_NEXT_PTR, (long)p1);
+                       if (!strcmp(p1->m_frontend->getDescription(), p2->m_frontend->getDescription()) && !strcmp(p1->m_frontend->getDescription(), "BCM4501 (internal)"))
+                       {
+                               FILE *f=fopen("/proc/stb/tsmux/lnb_b_input", "w");
+                               if (!f || fwrite("A", 1, 1, f) != 1)
+                                       eDebug("set /proc/stb/tsmux/lnb_b_input to A failed!! (%m)");
+                               else
+                               {
+                                       eDebug("set /proc/stb/tsmux/lnb_b_input to A OK");
+                                       fclose(f);
+                               }
+                       }
                        return 0;
                }
        }
@@ -1196,6 +1288,7 @@ RESULT eDVBSatelliteEquipmentControl::setTunerLinked(int tu1, int tu2)
 
 RESULT eDVBSatelliteEquipmentControl::setTunerDepends(int tu1, int tu2)
 {
+       eSecDebug("eDVBSatelliteEquipmentControl::setTunerDepends(%d, %d)", tu1, tu2);
        if (tu1 == tu2)
                return -1;
 
@@ -1211,8 +1304,8 @@ RESULT eDVBSatelliteEquipmentControl::setTunerDepends(int tu1, int tu2)
        }
        if (p1 && p2)
        {
-               p1->m_frontend->setData(eDVBFrontend::SATPOS_DEPENDS_PTR, (int)p2);
-               p2->m_frontend->setData(eDVBFrontend::SATPOS_DEPENDS_PTR, (int)p1);
+               p1->m_frontend->setData(eDVBFrontend::SATPOS_DEPENDS_PTR, (long)p2);
+               p2->m_frontend->setData(eDVBFrontend::SATPOS_DEPENDS_PTR, (long)p1);
                return 0;
        }
        return -1;
@@ -1220,6 +1313,7 @@ RESULT eDVBSatelliteEquipmentControl::setTunerDepends(int tu1, int tu2)
 
 void eDVBSatelliteEquipmentControl::setSlotNotLinked(int slot_no)
 {
+       eSecDebug("eDVBSatelliteEquipmentControl::setSlotNotLinked(%d)", slot_no);
        m_not_linked_slot_mask |= (1 << slot_no);
 }