properly round SCR frequencies

This commit is contained in:
rjkm 2022-02-12 15:37:49 +01:00
parent 2194f8e03a
commit 75821a6e3c
1 changed files with 25 additions and 14 deletions

View File

@ -182,7 +182,7 @@ static int diseqc(int fd, int sat, int hor, int band)
return 0; 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, int sat, int hor, int band,
uint32_t slot, uint32_t ubfreq, uint32_t slot, uint32_t ubfreq,
fe_delivery_system_t ds) 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; uint16_t t;
uint32_t input = 3 & (sat >> 6); uint32_t input = 3 & (sat >> 6);
int fd = fe->fd; 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; hor &= 1;
cmd.msg[3] = ((t & 0x0300) >> 8) | 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]); 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, int sat, int hor, int band,
uint32_t slot, uint32_t ubfreq, uint32_t slot, uint32_t ubfreq,
fe_delivery_system_t ds) 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 = {0x70, 0x00, 0x00, 0x00, 0x00},
.msg_len = 4 .msg_len = 4
}; };
uint32_t freq = (freq_khz + 500) / 1000;
int32_t fdiff = freq_khz - freq * 1000;
uint32_t t = freq - 100; uint32_t t = freq - 100;
uint32_t input = 3 & (sat >> 6); uint32_t input = 3 & (sat >> 6);
int fd = fe->fd; 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) if (ioctl(fd, FE_SET_VOLTAGE, SEC_VOLTAGE_13) == -1)
perror("FE_SET_VOLTAGE failed"); 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", dbgprintf(DEBUG_DVB, "EN50607 %02x %02x %02x %02x\n",
cmd.msg[0], cmd.msg[1], cmd.msg[2], cmd.msg[3]); cmd.msg[0], cmd.msg[1], cmd.msg[2], cmd.msg[3]);
dbgprintf(DEBUG_DVB, "EN50607 freq %u sr %u hor %u\n", dbgprintf(DEBUG_DVB, "EN50607 freq %u ubfreq %u fdiff %d sr %u hor %u\n",
freq, sr, hor); freq, ubfreq, fdiff, sr, hor);
} }
@ -289,14 +293,20 @@ static int tune_sat(struct dddvb_fe *fe)
freq = lofs - freq; freq = lofs - freq;
} }
#endif #endif
if (freq > 3000000) { if (freq > 3000000) {
if (lofs) if (lofs)
hi = (freq > lofs) ? 1 : 0; hi = (freq > lofs) ? 1 : 0;
if (hi) if (lofs > 10000000) {
freq -= fe->lof2[lnbc]; if (hi)
else freq -= fe->lof2[lnbc];
freq -= fe->lof1[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); dbgprintf(DEBUG_DVB, "tune_sat IF=%u\n", freq);
if (fe->first) { 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); dbgprintf(DEBUG_DVB, "scif_type = %u\n", fe->scif_type);
if (fe->scif_type == 1) { if (fe->scif_type == 1) {
pthread_mutex_lock(&fe->dd->uni_lock); 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, lnb, fe->param.param[PARAM_POL], hi,
fe->scif_slot, fe->scif_freq, ds); fe->scif_slot, fe->scif_freq, ds);
pthread_mutex_unlock(&fe->dd->uni_lock); pthread_mutex_unlock(&fe->dd->uni_lock);
} else if (fe->scif_type == 2) { } else if (fe->scif_type == 2) {
pthread_mutex_lock(&fe->dd->uni_lock); 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, lnb, fe->param.param[PARAM_POL], hi,
fe->scif_slot, fe->scif_freq, ds); fe->scif_slot, fe->scif_freq, ds);
pthread_mutex_unlock(&fe->dd->uni_lock); pthread_mutex_unlock(&fe->dd->uni_lock);
@ -325,8 +335,9 @@ static int tune_sat(struct dddvb_fe *fe)
if (input != DDDVB_UNDEF) { if (input != DDDVB_UNDEF) {
input = 3 & (input >> 6); input = 3 & (input >> 6);
dbgprintf(DEBUG_DVB, "input = %u\n", input); 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, input);
//set_fe_input(fe, freq, fe->param.param[PARAM_SR], ds, DDDVB_UNDEF); //set_fe_input(fe, freq, fe->param.param[PARAM_SR], ds, DDDVB_UNDEF);
} }