X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/68794a76cf18bbf9fd6970bdce4e5074896129c7..1ab30fb1e63cb408ae1da3534910c3082a1d03dd:/lib/dvb/frontend.cpp diff --git a/lib/dvb/frontend.cpp b/lib/dvb/frontend.cpp index 8b214130..c6a52056 100644 --- a/lib/dvb/frontend.cpp +++ b/lib/dvb/frontend.cpp @@ -382,6 +382,8 @@ RESULT eDVBFrontendParameters::getHash(unsigned long &hash) const DEFINE_REF(eDVBFrontend); +int eDVBFrontend::PriorityOrder=0; + eDVBFrontend::eDVBFrontend(int adap, int fe, int &ok) :m_enabled(false), m_type(-1), m_dvbid(fe), m_slotid(fe) ,m_fd(-1), m_need_rotor_workaround(false), m_sn(0), m_timeout(0), m_tuneTimer(0) @@ -615,14 +617,14 @@ int eDVBFrontend::readFrontendData(int type) eDebug("FE_READ_BER failed (%m)"); return ber; } - case signalPower: + case signalQuality: { uint16_t snr=0; if (ioctl(m_fd, FE_READ_SNR, &snr) < 0 && errno != ERANGE) eDebug("FE_READ_SNR failed (%m)"); return snr; } - case signalPowerdB: /* this will move into the driver */ + case signalQualitydB: /* this will move into the driver */ { uint16_t snr=0; if (ioctl(m_fd, FE_READ_SNR, &snr) < 0 && errno != ERANGE) @@ -667,12 +669,14 @@ int eDVBFrontend::readFrontendData(int type) { float snr_in_db=(snr-39075)/1764.7; return (int)(snr_in_db * 100.0); - } - else - eDebug("no SNR dB caluclation for frontendtype %s yet", m_description); + } else if (!strcmp(m_description, "Alps BSBE2")) + { + return (int)((snr >> 7) * 10.0); + } /* else + eDebug("no SNR dB calculation for frontendtype %s yet", m_description); */ return 0x12345678; } - case signalQuality: + case signalPower: { uint16_t strength=0; if (ioctl(m_fd, FE_READ_SIGNAL_STRENGTH, &strength) < 0 && errno != ERANGE) @@ -1059,17 +1063,17 @@ void eDVBFrontend::getFrontendStatus(ePyObject dest) PutToDict(dest, "tuner_locked", readFrontendData(locked)); PutToDict(dest, "tuner_synced", readFrontendData(synced)); PutToDict(dest, "tuner_bit_error_rate", readFrontendData(bitErrorRate)); - PutToDict(dest, "tuner_signal_power", readFrontendData(signalPower)); - int sigPowerdB = readFrontendData(signalPowerdB); - if (sigPowerdB == 0x12345678) // not support yet + PutToDict(dest, "tuner_signal_quality", readFrontendData(signalQuality)); + int sigQualitydB = readFrontendData(signalQualitydB); + if (sigQualitydB == 0x12345678) // not support yet { ePyObject obj=Py_None; Py_INCREF(obj); - PutToDict(dest, "tuner_signal_power_db", obj); + PutToDict(dest, "tuner_signal_quality_db", obj); } else - PutToDict(dest, "tuner_signal_power_db", sigPowerdB); - PutToDict(dest, "tuner_signal_quality", readFrontendData(signalQuality)); + PutToDict(dest, "tuner_signal_quality_db", sigQualitydB); + PutToDict(dest, "tuner_signal_power", readFrontendData(signalPower)); } } @@ -1155,21 +1159,34 @@ void eDVBFrontend::getFrontendData(ePyObject dest) int eDVBFrontend::readInputpower() { int power=m_slotid; // this is needed for read inputpower from the correct tuner ! - - // open front prozessor - int fp=::open("/dev/dbox/fp0", O_RDWR); - if (fp < 0) + char proc_name[64]; + sprintf(proc_name, "/proc/stb/fp/lnb_sense%d", m_slotid); + FILE *f=fopen(proc_name, "r"); + if (f) { - eDebug("couldn't open fp"); - return -1; + if (fscanf(f, "%08x", &power) != 1) + eDebug("read %s failed!! (%m)", proc_name); + else + eDebug("%s is %d\n", proc_name, power); + fclose(f); } - static bool old_fp = (::ioctl(fp, FP_IOCTL_GET_ID) < 0); - if ( ioctl( fp, old_fp ? 9 : 0x100, &power ) < 0 ) + else { - eDebug("FP_IOCTL_GET_LNB_CURRENT failed (%m)"); - return -1; + // 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); } - ::close(fp); return power; } @@ -1442,37 +1459,37 @@ void eDVBFrontend::tuneLoop() // called by m_tuneTimer break; case eSecCommand::SET_POWER_LIMITING_MODE: { - if (!m_need_rotor_workaround) - break; - - char dev[16]; - - // FIXMEEEEEE hardcoded i2c devices for dm7025 and dm8000 - if (m_slotid < 2) - sprintf(dev, "/dev/i2c/%d", m_slotid); - else if (m_slotid == 2) - sprintf(dev, "/dev/i2c/2"); // first nim socket on DM8000 use /dev/i2c/2 - else if (m_slotid == 3) - sprintf(dev, "/dev/i2c/4"); // second nim socket on DM8000 use /dev/i2c/4 - int fd = ::open(dev, O_RDWR); - - unsigned char data[2]; - ::ioctl(fd, I2C_SLAVE_FORCE, 0x10 >> 1); - if(::read(fd, data, 1) != 1) - eDebug("[SEC] error read lnbp (%m)"); - if ( m_sec_sequence.current()->mode == eSecCommand::modeStatic ) - { - data[0] |= 0x80; // enable static current limiting - eDebug("[SEC] set static current limiting"); - } - else + if (m_need_rotor_workaround) { - data[0] &= ~0x80; // enable dynamic current limiting - eDebug("[SEC] set dynamic current limiting"); + char dev[16]; + + // FIXMEEEEEE hardcoded i2c devices for dm7025 and dm8000 + if (m_slotid < 2) + sprintf(dev, "/dev/i2c/%d", m_slotid); + else if (m_slotid == 2) + sprintf(dev, "/dev/i2c/2"); // first nim socket on DM8000 use /dev/i2c/2 + else if (m_slotid == 3) + sprintf(dev, "/dev/i2c/4"); // second nim socket on DM8000 use /dev/i2c/4 + int fd = ::open(dev, O_RDWR); + + unsigned char data[2]; + ::ioctl(fd, I2C_SLAVE_FORCE, 0x10 >> 1); + if(::read(fd, data, 1) != 1) + eDebug("[SEC] error read lnbp (%m)"); + if ( m_sec_sequence.current()->mode == eSecCommand::modeStatic ) + { + data[0] |= 0x80; // enable static current limiting + eDebug("[SEC] set static current limiting"); + } + else + { + data[0] &= ~0x80; // enable dynamic current limiting + eDebug("[SEC] set dynamic current limiting"); + } + if(::write(fd, data, 1) != 1) + eDebug("[SEC] error write lnbp (%m)"); + ::close(fd); } - if(::write(fd, data, 1) != 1) - eDebug("[SEC] error write lnbp (%m)"); - ::close(fd); ++m_sec_sequence.current(); break; } @@ -2149,7 +2166,9 @@ bool eDVBFrontend::setSlotInfo(ePyObject obj) m_slotid = PyInt_AsLong(Id); m_enabled = Enabled == Py_True; // HACK.. the rotor workaround is neede for all NIMs with LNBP21 voltage regulator... - m_need_rotor_workaround = !!strstr(m_description, "Alps BSBE1") || !!strstr(m_description, "Alps -S"); + m_need_rotor_workaround = !!strstr(m_description, "Alps BSBE1") || + !!strstr(m_description, "Alps BSBE2") || + !!strstr(m_description, "Alps -S"); eDebug("setSlotInfo for dvb frontend %d to slotid %d, descr %s, need rotorworkaround %s, enabled %s", m_dvbid, m_slotid, m_description, m_need_rotor_workaround ? "Yes" : "No", m_enabled ? "Yes" : "No" ); return true;