X-Git-Url: http://code.vuplus.com/gitweb/?p=vuplus_dvbapp;a=blobdiff_plain;f=lib%2Fdvb%2Fsec.cpp;h=2affc6553161aa375e756977eb5ba93332663e5a;hp=851e9b1d9c4df565fa8b4b3bfa6040e4e7aefd53;hb=927892fd15874451b09b5d5c280d5f4b335ea383;hpb=e013d09af0e010f15e225a12dcc217abc052ee19 diff --git a/lib/dvb/sec.cpp b/lib/dvb/sec.cpp index 851e9b1..2affc65 100644 --- a/lib/dvb/sec.cpp +++ b/lib/dvb/sec.cpp @@ -49,18 +49,13 @@ eDVBSatelliteEquipmentControl::eDVBSatelliteEquipmentControl(eSmartPtrListis_simulate(); bool direct_connected = m_not_linked_slot_mask & slot_id; int score=0, satcount=0; - long linked_prev_ptr=-1, linked_next_ptr=-1, linked_csw=-1, linked_ucsw=-1, linked_toneburst=-1, + long linked_prev_ptr=-1, linked_next_ptr=-1, linkable_csw=-1, linkable_ucsw=-1, linkable_toneburst=-1, fe_satpos_depends_ptr=-1, fe_rotor_pos=-1; bool linked_in_use = false; @@ -94,9 +89,9 @@ int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite // when a linked in use tuner is found we get the tuner data... if (linked_in_use) { - fe->getData(eDVBFrontend::CSW, linked_csw); - fe->getData(eDVBFrontend::UCSW, linked_ucsw); - fe->getData(eDVBFrontend::TONEBURST, linked_toneburst); + fe->getData(eDVBFrontend::LINKABLE_CSW, linkable_csw); + fe->getData(eDVBFrontend::LINKABLE_UCSW, linkable_ucsw); + fe->getData(eDVBFrontend::LINKABLE_TONEBURST, linkable_toneburst); } if (highest_score_lnb) @@ -169,8 +164,8 @@ int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite if (linked_in_use && !is_unicable) { // compare tuner data - if ( (csw != linked_csw) || - ( diseqc && (ucsw != linked_ucsw || toneburst != linked_toneburst) ) || + if ( (csw != linkable_csw) || + ( diseqc && (ucsw != linkable_ucsw || toneburst != linkable_toneburst) ) || ( rotor && rotor_pos != sat.orbital_position ) ) { ret = 0; @@ -279,11 +274,6 @@ bool need_turn_fast(int turn_speed) if (!simulate) \ eDebug(x); \ } while(0) -// else \ -// { \ -// eDebugNoNewLine("SIMULATE:"); \ -// eDebug(x); \ -// } \ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPARAMETERS &parm, const eDVBFrontendParametersSatellite &sat, int slot_id, unsigned int tunetimeout) { @@ -328,16 +318,17 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA int RotorCmd=-1; int send_mask = 0; + bool direct_connected = m_not_linked_slot_mask & slot_id; + lnb_param.guard_offset = 0; //HACK - frontend.setData(eDVBFrontend::SATCR, lnb_param.SatCR_idx); if (diseqc13V) voltage_mode = eDVBSatelliteSwitchParameters::HV; frontend.getData(eDVBFrontend::SATPOS_DEPENDS_PTR, satposDependPtr); - if (!(m_not_linked_slot_mask & slot_id)) // frontend with direct connection? + if (!direct_connected) // frontend with direct connection? { long linked_prev_ptr; frontend.getData(eDVBFrontend::LINKED_PREV_PTR, linked_prev_ptr); @@ -349,6 +340,7 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA } if (satposDependPtr != -1) // we dont need uncommitted switch and rotor cmds on second output of a rotor lnb diseqc_mode = eDVBSatelliteDiseqcParameters::V1_0; +#if 0 // Since following code causes lock fail for linked tuners in certain conditions, it does not apply. else { // in eDVBFrontend::tuneLoop we call closeFrontend and ->inc_use() in this this condition (to put the kernel frontend thread into idle state) // so we must resend all diseqc stuff (voltage is disabled when the frontend is closed) @@ -357,6 +349,7 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA if (!linked_fe->m_inuse && state != eDVBFrontend::stateIdle) forceChanged = true; } +#endif } sec_fe->getData(eDVBFrontend::CSW, lastcsw); @@ -400,21 +393,52 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA } else { - int tmp1 = abs(sat.frequency - -lof) - + lnb_param.SatCRvco - - 1400000 - + lnb_param.guard_offset; - int tmp2 = ((((tmp1 * 2) / 4000) + 1) / 2) * 4000; - parm.FREQUENCY = lnb_param.SatCRvco - (tmp1-tmp2) + lnb_param.guard_offset; - lnb_param.UnicableTuningWord = ((tmp2 / 4000) - | ((band & 1) ? 0x400 : 0) //HighLow - | ((band & 2) ? 0x800 : 0) //VertHor - | ((lnb_param.LNBNum & 1) ? 0 : 0x1000) //Umschaltung LNB1 LNB2 - | (lnb_param.SatCR_idx << 13)); //Adresse des SatCR - eDebug("[prepare] UnicableTuningWord %#04x",lnb_param.UnicableTuningWord); - eDebug("[prepare] guard_offset %d",lnb_param.guard_offset); - frontend.setData(eDVBFrontend::FREQ_OFFSET, (lnb_param.UnicableTuningWord & 0x3FF) *4000 + 1400000 + lof - (2 * (lnb_param.SatCRvco - (tmp1-tmp2))) ); + switch(lnb_param.SatCR_format) + { + case 1: + { + eDebug("[prepare] JESS"); + + int tmp1 = abs(sat.frequency + -lof) + - 100000; + volatile unsigned int tmp2 = (1000 + 2 * tmp1) / (2 *1000); //round to multiple of 1000 + parm.FREQUENCY = lnb_param.SatCRvco - (tmp1 - (1000 * tmp2)); + frontend.setData(eDVBFrontend::FREQ_OFFSET, sat.frequency - lof -(lnb_param.SatCRvco - parm.FREQUENCY)); + + lnb_param.UnicableTuningWord = + (band & 0x3) //Bit0:HighLow Bit1:VertHor + | (((lnb_param.LNBNum - 1) & 0x3F) << 2) //position number (max. 63) + | ((tmp2 & 0x7FF)<< 8) //frequency (-100MHz Offset) + | ((lnb_param.SatCR_idx & 0x1F) << 19); //adresse of SatCR (max. 32) + + eDebug("[prepare] UnicableTuningWord %#06x",lnb_param.UnicableTuningWord); + } + break; + case 0: + default: + { + eDebug("[prepare] Unicable"); + int tmp1 = abs(sat.frequency + -lof) + + lnb_param.SatCRvco + - 1400000 + + lnb_param.guard_offset; + volatile unsigned int tmp2 = (4000 + 2 * tmp1) / (2 *4000); //round to multiple of 4000 + + parm.FREQUENCY = lnb_param.SatCRvco - (tmp1 - (4000 * tmp2)) + lnb_param.guard_offset; + lnb_param.UnicableTuningWord = tmp2 + | ((band & 1) ? 0x400 : 0) //HighLow + | ((band & 2) ? 0x800 : 0) //VertHor + | ((lnb_param.LNBNum & 1) ? 0 : 0x1000) //Umschaltung LNB1 LNB2 + | (lnb_param.SatCR_idx << 13); //Adresse des SatCR + + eDebug("[prepare] UnicableTuningWord %#04x",lnb_param.UnicableTuningWord); + eDebug("[prepare] guard_offset %d",lnb_param.guard_offset); + + frontend.setData(eDVBFrontend::FREQ_OFFSET, (lnb_param.UnicableTuningWord & 0x3FF) *4000 + 1400000 + lof - (2 * (lnb_param.SatCRvco - (tmp1 - (4000 * tmp2)))) ); + } + } voltage = VOLTAGE(13); } @@ -428,15 +452,22 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA bool send_csw = (di_param.m_committed_cmd != eDVBSatelliteDiseqcParameters::SENDNO); - bool changed_csw = send_csw && (forceChanged || csw != lastcsw); bool send_ucsw = (di_param.m_uncommitted_cmd && diseqc_mode > eDVBSatelliteDiseqcParameters::V1_0); - bool changed_ucsw = send_ucsw && (forceChanged || ucsw != lastucsw); bool send_burst = (di_param.m_toneburst_param != eDVBSatelliteDiseqcParameters::NO); - bool changed_burst = send_burst && (forceChanged || toneburst != lastToneburst); + + bool changed_csw = false; + bool changed_ucsw = false; + bool changed_burst = false; + if (direct_connected || (!linked_fe->m_frontend->isLoopTimerActive() || !linked_fe->m_frontend->isScheduledSendDiseqc())) + { + changed_csw = send_csw && (forceChanged || csw != lastcsw); + changed_ucsw = send_ucsw && (forceChanged || ucsw != lastucsw); + changed_burst = send_burst && (forceChanged || toneburst != lastToneburst); + } /* send_mask 1 must send csw @@ -697,6 +728,9 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA sec_fe->setData(eDVBFrontend::NEW_CSW, csw); sec_fe->setData(eDVBFrontend::NEW_UCSW, ucsw); sec_fe->setData(eDVBFrontend::NEW_TONEBURST, di_param.m_toneburst_param); + sec_fe->setData(eDVBFrontend::LINKABLE_CSW, csw); + sec_fe->setData(eDVBFrontend::LINKABLE_UCSW, ucsw); + sec_fe->setData(eDVBFrontend::LINKABLE_TONEBURST, di_param.m_toneburst_param); if(is_unicable) { @@ -711,15 +745,104 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, VOLTAGE(18)) ); sec_sequence.push_back( eSecCommand(eSecCommand::SET_TONE, iDVBFrontend::toneOff) ); sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_VOLTAGE_CHANGE_BEFORE_SWITCH_CMDS]) ); // wait 20 ms after voltage change - + eDVBDiseqcCommand diseqc; memset(diseqc.data, 0, MAX_DISEQC_LENGTH); - diseqc.len = 5; - diseqc.data[0] = 0xE0; - diseqc.data[1] = 0x10; - diseqc.data[2] = 0x5A; - diseqc.data[3] = lnb_param.UnicableTuningWord >> 8; - diseqc.data[4] = lnb_param.UnicableTuningWord; + + long oldSatcr, oldPin, oldDiction; + frontend.getData(eDVBFrontend::SATCR, oldSatcr); + frontend.getData(eDVBFrontend::PIN, oldPin); + frontend.getData(eDVBFrontend::DICTION, oldDiction); + + if((oldSatcr != -1) && (oldSatcr != lnb_param.SatCR_idx)) + { + switch (oldDiction) + { + case 1: + if(oldPin < 1) + { + diseqc.len = 4; + diseqc.data[0] = 0x70; + } + else + { + diseqc.len = 5; + diseqc.data[0] = 0x71; + diseqc.data[4] = oldPin; + } + diseqc.data[1] = oldSatcr << 3; + diseqc.data[2] = 0x00; + diseqc.data[3] = 0x00; + break; + case 0: + default: + if(oldPin < 1) + { + diseqc.len = 5; + diseqc.data[2] = 0x5A; + } + else + { + diseqc.len = 6; + diseqc.data[2] = 0x5C; + diseqc.data[5] = oldPin; + } + diseqc.data[0] = 0xE0; + diseqc.data[1] = 0x10; + diseqc.data[3] = oldSatcr << 5; + diseqc.data[4] = 0x00; + break; + } + sec_sequence.push_back( eSecCommand(eSecCommand::SEND_DISEQC, diseqc) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_LAST_DISEQC_CMD]) ); + frontend.setData(eDVBFrontend::SATCR, -1); + } + + frontend.setData(eDVBFrontend::DICTION, lnb_param.SatCR_format); +//TODO frontend.setData(eDVBFrontend::PIN, lnb_param.SatCR_pin); + + long pin = 0; // hack + + switch(lnb_param.SatCR_format) + { + case 1: //JESS + if(pin < 1) + { + diseqc.len = 4; + diseqc.data[0] = 0x70; + diseqc.data[1] = lnb_param.UnicableTuningWord >> 16; + diseqc.data[2] = lnb_param.UnicableTuningWord >> 8; + diseqc.data[3] = lnb_param.UnicableTuningWord; + } + else + { + diseqc.len = 5; + diseqc.data[0] = 0x71; + diseqc.data[4] = pin; + } + diseqc.data[1] = lnb_param.UnicableTuningWord >> 16; + diseqc.data[2] = lnb_param.UnicableTuningWord >> 8; + diseqc.data[3] = lnb_param.UnicableTuningWord; + break; + case 0: //DiSEqC + default: + if(pin < 1) + { + diseqc.len = 5; + diseqc.data[2] = 0x5A; + } + else + { + diseqc.len = 6; + diseqc.data[2] = 0x5C; + diseqc.data[5] = pin; + } + diseqc.data[0] = 0xE0; + diseqc.data[1] = 0x10; + diseqc.data[3] = lnb_param.UnicableTuningWord >> 8; + diseqc.data[4] = lnb_param.UnicableTuningWord; + } + frontend.setData(eDVBFrontend::SATCR, lnb_param.SatCR_idx); sec_sequence.push_back( eSecCommand(eSecCommand::SEND_DISEQC, diseqc) ); sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_LAST_DISEQC_CMD]) ); @@ -954,8 +1077,9 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA return -1; } -void eDVBSatelliteEquipmentControl::prepareTurnOffSatCR(iDVBFrontend &frontend, int satcr) +void eDVBSatelliteEquipmentControl::prepareTurnOffSatCR(iDVBFrontend &frontend) { + long satcr, diction, pin; eSecCommandList sec_sequence; // check if voltage is disabled @@ -973,12 +1097,48 @@ void eDVBSatelliteEquipmentControl::prepareTurnOffSatCR(iDVBFrontend &frontend, eDVBDiseqcCommand diseqc; memset(diseqc.data, 0, MAX_DISEQC_LENGTH); - diseqc.len = 5; - diseqc.data[0] = 0xE0; - diseqc.data[1] = 0x10; - diseqc.data[2] = 0x5A; - diseqc.data[3] = satcr << 5; - diseqc.data[4] = 0x00; + frontend.getData(eDVBFrontend::SATCR, satcr); + frontend.getData(eDVBFrontend::DICTION, diction); + frontend.getData(eDVBFrontend::PIN, pin); + + switch (diction) + { + case 1: + if(pin < 1) + { + diseqc.len = 4; + diseqc.data[0] = 0x70; + } + else + { + diseqc.len = 5; + diseqc.data[0] = 0x71; + diseqc.data[4] = pin; + } + diseqc.data[1] = satcr << 3; + diseqc.data[2] = 0x00; + diseqc.data[3] = 0x00; + break; + case 0: + default: + if(pin < 1) + { + diseqc.len = 5; + diseqc.data[2] = 0x5A; + } + else + { + diseqc.len = 6; + diseqc.data[2] = 0x5C; + diseqc.data[5] = pin; + } + diseqc.data[0] = 0xE0; + diseqc.data[1] = 0x10; + diseqc.data[3] = satcr << 5; + diseqc.data[4] = 0x00; + break; + } + frontend.setData(eDVBFrontend::SATCR, -1); sec_sequence.push_back( eSecCommand(eSecCommand::SEND_DISEQC, diseqc) ); sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_LAST_DISEQC_CMD]) ); @@ -1010,6 +1170,13 @@ RESULT eDVBSatelliteEquipmentControl::clear() it->m_frontend->setData(eDVBFrontend::ROTOR_POS, -1); it->m_frontend->setData(eDVBFrontend::ROTOR_CMD, -1); it->m_frontend->setData(eDVBFrontend::SATCR, -1); + + if (it->m_frontend->is_FBCTuner()) + { + eFBCTunerManager *fbcmng = eFBCTunerManager::getInstance(); + if (fbcmng) + fbcmng->setDefaultFBCID(*it); + } } for (eSmartPtrList::iterator it(m_avail_simulate_frontends.begin()); it != m_avail_simulate_frontends.end(); ++it) @@ -1254,6 +1421,18 @@ RESULT eDVBSatelliteEquipmentControl::setInputpowerDelta(int delta) } /* Unicable Specific Parameters */ +RESULT eDVBSatelliteEquipmentControl::setLNBSatCRformat(int SatCR_format) +{ + eSecDebug("eDVBSatelliteEquipmentControl::setLNBSatCRformat(%d)", SatCR_format); + if(!((SatCR_format >-1) && (SatCR_format < 2))) + return -EPERM; + if ( currentLNBValid() ) + m_lnbs[m_lnbidx].SatCR_format = SatCR_format; + else + return -ENOENT; + return 0; +} + RESULT eDVBSatelliteEquipmentControl::setLNBSatCR(int SatCR_idx) { eSecDebug("eDVBSatelliteEquipmentControl::setLNBSatCR(%d)", SatCR_idx); @@ -1299,6 +1478,13 @@ RESULT eDVBSatelliteEquipmentControl::getLNBSatCRpositions() return -ENOENT; } +RESULT eDVBSatelliteEquipmentControl::getLNBSatCRformat() +{ + if ( currentLNBValid() ) + return m_lnbs[m_lnbidx].SatCR_format; + return -ENOENT; +} + RESULT eDVBSatelliteEquipmentControl::getLNBSatCR() { if ( currentLNBValid() ) @@ -1435,6 +1621,12 @@ RESULT eDVBSatelliteEquipmentControl::setTunerLinked(int tu1, int tu2) char c; p1->m_frontend->setData(eDVBFrontend::LINKED_PREV_PTR, (long)p2); p2->m_frontend->setData(eDVBFrontend::LINKED_NEXT_PTR, (long)p1); + + eFBCTunerManager *fbcmng = eFBCTunerManager::getInstance(); + if (p1->m_frontend->is_FBCTuner() && fbcmng) + { + fbcmng->updateFBCID(p1, p2); + } } p1=p2=NULL;