X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/134f31483989e72a606c6b7ae5d5ae6e753a470e..ed31f016b6ab55e864bb31bcc0f4c922dfeb7040:/lib/dvb/frontend.cpp diff --git a/lib/dvb/frontend.cpp b/lib/dvb/frontend.cpp index be7bdc74..a26f6bd8 100644 --- a/lib/dvb/frontend.cpp +++ b/lib/dvb/frontend.cpp @@ -195,8 +195,8 @@ RESULT eDVBFrontendParameters::getHash(unsigned long &hash) const { case iDVBFrontend::feSatellite: { - hash = sat.frequency & 0xFFFF; - hash |= sat.orbital_position << 16; + hash = (sat.orbital_position << 16); + hash |= ((sat.frequency/1000)&0xFFFF)|((sat.polarisation&1) << 15); return 0; } case iDVBFrontend::feCable: @@ -229,9 +229,6 @@ eDVBFrontend::eDVBFrontend(int adap, int fe, int &ok): m_type(-1), m_fe(fe), m_c ok = 0; return; } - else - eDebug("m_secfd is %d", m_secfd); - FrontendInfo fe_info; sprintf(filename, "/dev/dvb/card%d/frontend%d", adap, fe); #else @@ -288,7 +285,13 @@ eDVBFrontend::eDVBFrontend(int adap, int fe, int &ok): m_type(-1), m_fe(fe), m_c m_tuneTimer = new eTimer(eApp); CONNECT(m_tuneTimer->timeout, eDVBFrontend::tuneLoop); - memset(m_data, 0xFFFF, sizeof(m_data)); + int entries = sizeof(m_data) / sizeof(int); + for (int i=0; icanMeasureLNBCurrent() ) + int power=m_fe; // this is needed for read inputpower from the correct tuner ! + + // open front prozessor + int fp=::open("/dev/dbox/fp0", O_RDWR); + if (fp < 0) { -// switch ( eSystemInfo::getInstance()->getHwType() ) - { -// case eSystemInfo::DM7000: -// case eSystemInfo::DM7020: - { - // open front prozessor - int fp=::open("/dev/dbox/fp0", O_RDWR); - if (fp < 0) - { - eDebug("couldn't open fp"); - return -1; - } - static bool old_fp = (::ioctl(fp, FP_IOCTL_GET_ID) < 0); - if ( ioctl( fp, old_fp ? 9 : 0x100, &power ) < 0 ) - { - eDebug("FP_IOCTL_GET_LNB_CURRENT failed (%m)"); - return -1; - } - ::close(fp); -// break; - } -// default: -// eDebug("Inputpower read for platform %d not yet implemented", eSystemInfo::getInstance()->getHwType()); - } + eDebug("couldn't open fp"); + return -1; } + static bool old_fp = (::ioctl(fp, FP_IOCTL_GET_ID) < 0); + if ( ioctl( fp, old_fp ? 9 : 0x100, &power ) < 0 ) + { + eDebug("FP_IOCTL_GET_LNB_CURRENT failed (%m)"); + return -1; + } + ::close(fp); + return power; } @@ -501,6 +522,7 @@ void eDVBFrontend::tuneLoop() // called by m_tuneTimer if (!m_timeoutCount) { eDebug("[SEC] rotor timout"); + m_sec->setRotorMoving(false); setSecSequencePos(m_sec_sequence.current()->steps); } else @@ -508,7 +530,10 @@ void eDVBFrontend::tuneLoop() // called by m_tuneTimer break; case eSecCommand::SET_POWER_LIMITING_MODE: { - int fd=::open("/dev/i2c/0", O_RDWR); + int fd = m_fe ? + ::open("/dev/i2c/1", O_RDWR) : + ::open("/dev/i2c/0", O_RDWR); + unsigned char data[2]; ::ioctl(fd, I2C_SLAVE_FORCE, 0x10 >> 1); if(::read(fd, data, 1) != 1) @@ -551,6 +576,7 @@ void eDVBFrontend::tuneLoop() // called by m_tuneTimer eDebug("[SEC] rotor %s step %d ok", txt, cmd.okcount); if ( cmd.okcount > 6 ) { + m_sec->setRotorMoving(cmd.direction); eDebug("[SEC] rotor is %s", txt); if (setSecSequencePos(cmd.steps)) break; @@ -609,6 +635,8 @@ RESULT eDVBFrontend::getFrontendType(int &t) RESULT eDVBFrontend::tune(const iDVBFrontendParameters &where) { + eDebug("(%d)tune", m_fe); + if (m_type == -1) return -ENODEV; @@ -645,40 +673,45 @@ RESULT eDVBFrontend::tune(const iDVBFrontendParameters &where) } case feCable: { +#if HAVE_DVB_API_VERSION >= 3 eDVBFrontendParametersCable feparm; if (where.getDVBC(feparm)) return -EINVAL; #if HAVE_DVB_API_VERSION < 3 parm.Frequency = feparm.frequency * 1000; + parm.u.qam.SymbolRate = feparm.symbol_rate; #else parm.frequency = feparm.frequency * 1000; parm.u.qam.symbol_rate = feparm.symbol_rate; #endif - - - + fe_modulation_t mod; switch (feparm.modulation) { case eDVBFrontendParametersCable::Modulation::QAM16: - parm.u.qam.modulation = QAM_16; + mod = QAM_16; break; case eDVBFrontendParametersCable::Modulation::QAM32: - parm.u.qam.modulation = QAM_32; + mod = QAM_32; break; case eDVBFrontendParametersCable::Modulation::QAM64: - parm.u.qam.modulation = QAM_64; + mod = QAM_64; break; case eDVBFrontendParametersCable::Modulation::QAM128: - parm.u.qam.modulation = QAM_128; + mod = QAM_128; break; case eDVBFrontendParametersCable::Modulation::QAM256: - parm.u.qam.modulation = QAM_256; + mod = QAM_256; break; case eDVBFrontendParametersCable::Modulation::Auto: - parm.u.qam.modulation = QAM_AUTO; + mod = QAM_AUTO; break; } - switch (feparm.modulation) +#if HAVE_DVB_API_VERSION < 3 + parm.u.qam.QAM = mod; +#else + parm.u.qam.modulation = mod; +#endif + switch (feparm.inversion) { case eDVBFrontendParametersCable::Inversion::On: #if HAVE_DVB_API_VERSION < 3 @@ -703,41 +736,51 @@ RESULT eDVBFrontend::tune(const iDVBFrontendParameters &where) parm.inversion = #endif INVERSION_AUTO; - break; + break; } + + fe_code_rate_t fec_inner; switch (feparm.fec_inner) { case eDVBFrontendParametersCable::FEC::fNone: - parm.u.qam.fec_inner = FEC_NONE; + fec_inner = FEC_NONE; break; case eDVBFrontendParametersCable::FEC::f1_2: - parm.u.qam.fec_inner = FEC_1_2; + fec_inner = FEC_1_2; break; case eDVBFrontendParametersCable::FEC::f2_3: - parm.u.qam.fec_inner = FEC_2_3; + fec_inner = FEC_2_3; break; case eDVBFrontendParametersCable::FEC::f3_4: - parm.u.qam.fec_inner = FEC_3_4; + fec_inner = FEC_3_4; break; case eDVBFrontendParametersCable::FEC::f4_5: - parm.u.qam.fec_inner = FEC_4_5; + fec_inner = FEC_4_5; break; case eDVBFrontendParametersCable::FEC::f5_6: - parm.u.qam.fec_inner = FEC_5_6; + fec_inner = FEC_5_6; break; case eDVBFrontendParametersCable::FEC::f6_7: - parm.u.qam.fec_inner = FEC_6_7; + fec_inner = FEC_6_7; break; case eDVBFrontendParametersCable::FEC::f7_8: - parm.u.qam.fec_inner = FEC_7_8; + fec_inner = FEC_7_8; break; case eDVBFrontendParametersCable::FEC::f8_9: - parm.u.qam.fec_inner = FEC_8_9; + fec_inner = FEC_8_9; break; case eDVBFrontendParametersCable::FEC::fAuto: - parm.u.qam.fec_inner = FEC_AUTO; + fec_inner = FEC_AUTO; break; } +#if HAVE_DVB_API_VERSION < 3 + parm.u.qam.FEC_inner = fec_inner; +#else + parm.u.qam.fec_inner = fec_inner; +#endif +#else + eFatal("Old API not fully supported"); +#endif // old api break; } case feTerrestrial: @@ -980,7 +1023,7 @@ RESULT eDVBFrontend::setSecSequence(const eSecCommandList &list) RESULT eDVBFrontend::getData(int num, int &data) { - if ( num < 7 ) + if ( num < (int)(sizeof(m_data)/sizeof(int)) ) { data = m_data[num]; return 0; @@ -990,7 +1033,7 @@ RESULT eDVBFrontend::getData(int num, int &data) RESULT eDVBFrontend::setData(int num, int val) { - if ( num < 7 ) + if ( num < (int)(sizeof(m_data)/sizeof(int)) ) { m_data[num] = val; return 0; @@ -1000,14 +1043,16 @@ RESULT eDVBFrontend::setData(int num, int val) int eDVBFrontend::isCompatibleWith(ePtr &feparm) { - if (m_type != eDVBFrontend::feSatellite) - return 1; - - ASSERT(m_sec); - - eDVBFrontendParametersSatellite sat_parm; - - ASSERT(!feparm->getDVBS(sat_parm)); + int type; + if (feparm->getSystem(type) || type != m_type) + return 0; - return m_sec->canTune(sat_parm, this, 1 << m_fe); + if (m_type == eDVBFrontend::feSatellite) + { + ASSERT(m_sec); + eDVBFrontendParametersSatellite sat_parm; + ASSERT(!feparm->getDVBS(sat_parm)); + return m_sec->canTune(sat_parm, this, 1 << m_fe); + } + return 1; }