diff --git a/lib/src/dvb.c b/lib/src/dvb.c index 14b3316..e6d446a 100644 --- a/lib/src/dvb.c +++ b/lib/src/dvb.c @@ -182,7 +182,7 @@ static int diseqc(int fd, int sat, int hor, int band) return 0; } -static int set_en50494(struct dddvb_fe *fe, uint32_t freq, uint32_t sr, +static int set_en50494(struct dddvb_fe *fe, uint32_t freq_khz, uint32_t sr, int sat, int hor, int band, uint32_t slot, uint32_t ubfreq, fe_delivery_system_t ds) @@ -194,8 +194,10 @@ static int set_en50494(struct dddvb_fe *fe, uint32_t freq, uint32_t sr, uint16_t t; uint32_t input = 3 & (sat >> 6); int fd = fe->fd; + uint32_t freq = (freq_khz + 2000) / 4000; + int32_t fdiff = freq_khz - freq * 1000; - t = (freq + ubfreq + 2) / 4 - 350; + t = (freq_khz / 1000 + ubfreq + 2) / 4 - 350; hor &= 1; cmd.msg[3] = ((t & 0x0300) >> 8) | @@ -219,7 +221,7 @@ static int set_en50494(struct dddvb_fe *fe, uint32_t freq, uint32_t sr, cmd.msg[0], cmd.msg[1], cmd.msg[2], cmd.msg[3], cmd.msg[4]); } -static int set_en50607(struct dddvb_fe *fe, uint32_t freq, uint32_t sr, +static int set_en50607(struct dddvb_fe *fe, uint32_t freq_khz, uint32_t sr, int sat, int hor, int band, uint32_t slot, uint32_t ubfreq, fe_delivery_system_t ds) @@ -228,6 +230,8 @@ static int set_en50607(struct dddvb_fe *fe, uint32_t freq, uint32_t sr, .msg = {0x70, 0x00, 0x00, 0x00, 0x00}, .msg_len = 4 }; + uint32_t freq = (freq_khz + 500) / 1000; + int32_t fdiff = freq_khz - freq * 1000; uint32_t t = freq - 100; uint32_t input = 3 & (sat >> 6); int fd = fe->fd; @@ -251,11 +255,11 @@ static int set_en50607(struct dddvb_fe *fe, uint32_t freq, uint32_t sr, if (ioctl(fd, FE_SET_VOLTAGE, SEC_VOLTAGE_13) == -1) perror("FE_SET_VOLTAGE failed"); - set_fe_input(fe, ubfreq * 1000, sr, ds, input); + set_fe_input(fe, ubfreq * 1000 + fdiff, sr, ds, input); dbgprintf(DEBUG_DVB, "EN50607 %02x %02x %02x %02x\n", cmd.msg[0], cmd.msg[1], cmd.msg[2], cmd.msg[3]); - dbgprintf(DEBUG_DVB, "EN50607 freq %u sr %u hor %u\n", - freq, sr, hor); + dbgprintf(DEBUG_DVB, "EN50607 freq %u ubfreq %u fdiff %d sr %u hor %u\n", + freq, ubfreq, fdiff, sr, hor); } @@ -289,14 +293,20 @@ static int tune_sat(struct dddvb_fe *fe) freq = lofs - freq; } #endif - if (freq > 3000000) { if (lofs) hi = (freq > lofs) ? 1 : 0; - if (hi) - freq -= fe->lof2[lnbc]; - else - freq -= fe->lof1[lnbc]; + if (lofs > 10000000) { + if (hi) + freq -= fe->lof2[lnbc]; + else + freq -= fe->lof1[lnbc]; + } else { + if (hi) + freq = fe->lof2[lnbc] - freq; + else + freq = fe->lof1[lnbc] - freq; + } } dbgprintf(DEBUG_DVB, "tune_sat IF=%u\n", freq); if (fe->first) { @@ -309,13 +319,13 @@ static int tune_sat(struct dddvb_fe *fe) dbgprintf(DEBUG_DVB, "scif_type = %u\n", fe->scif_type); if (fe->scif_type == 1) { pthread_mutex_lock(&fe->dd->uni_lock); - set_en50494(fe, freq / 1000, fe->param.param[PARAM_SR], + set_en50494(fe, freq, fe->param.param[PARAM_SR], lnb, fe->param.param[PARAM_POL], hi, fe->scif_slot, fe->scif_freq, ds); pthread_mutex_unlock(&fe->dd->uni_lock); } else if (fe->scif_type == 2) { pthread_mutex_lock(&fe->dd->uni_lock); - set_en50607(fe, freq / 1000, fe->param.param[PARAM_SR], + set_en50607(fe, freq, fe->param.param[PARAM_SR], lnb, fe->param.param[PARAM_POL], hi, fe->scif_slot, fe->scif_freq, ds); pthread_mutex_unlock(&fe->dd->uni_lock); @@ -325,8 +335,9 @@ static int tune_sat(struct dddvb_fe *fe) if (input != DDDVB_UNDEF) { input = 3 & (input >> 6); dbgprintf(DEBUG_DVB, "input = %u\n", input); + set_property(fe->fd, DTV_INPUT, input); } - diseqc(fe->fd, lnb, fe->param.param[PARAM_POL], hi); + //diseqc(fe->fd, lnb, fe->param.param[PARAM_POL], hi); set_fe_input(fe, freq, fe->param.param[PARAM_SR], ds, input); //set_fe_input(fe, freq, fe->param.param[PARAM_SR], ds, DDDVB_UNDEF); }