diff --git a/patches/minisatip8-axe.patch b/patches/minisatip8-axe.patch index 7d8bc574..217bc3ff 100644 --- a/patches/minisatip8-axe.patch +++ b/patches/minisatip8-axe.patch @@ -1,8 +1,49 @@ +diff --git a/html/status.html b/html/status.html +index 8812322..519f3da 100755 +--- a/html/status.html ++++ b/html/status.html +@@ -133,6 +133,7 @@ + myTable += "Pos."; + myTable += "Frequency"; + myTable += "SR/BW"; ++ myTable += "Stream"; + myTable += "Signal"; + if (has_axe) { + myTable += "Packets"; +@@ -202,6 +203,12 @@ + else + myTable += ""; + ++ // STREAM ++ var stream = state['ad_stream'][i]; ++ if (parseInt(stream) <= 0) ++ stream = ''; ++ myTable += "" + stream + " "; ++ + // SIGNAL + var signal = ""; + if (!ad_enabled) { +@@ -227,6 +234,7 @@ + } + myTable += "" + signal + " "; + ++ // AXE + if (has_axe) { + myTable += "" + state['ad_axe_pktc'][i] + " "; + myTable += "" + state['ad_axe_ccerr'][i] + " "; diff --git a/src/adapter.c b/src/adapter.c -index e034e3e..f7727b8 100644 +index e034e3e..9862114 100644 --- a/src/adapter.c +++ b/src/adapter.c -@@ -550,7 +550,7 @@ int getAdaptersCount() +@@ -75,6 +75,7 @@ adapter *adapter_alloc() + + /* diseqc setup */ + ad->diseqc_param.fast = opts.diseqc_fast; ++ ad->diseqc_param.addr = opts.diseqc_addr; + ad->diseqc_param.committed_no = opts.diseqc_committed_no; + ad->diseqc_param.uncommitted_no = opts.diseqc_uncommitted_no; + +@@ -550,7 +551,7 @@ int getAdaptersCount() memset(&fe_map, -1, sizeof(fe_map)); k = 0; @@ -11,7 +52,7 @@ index e034e3e..f7727b8 100644 { int sys = order[i]; for (j = 0; j < ifes[sys]; j++) -@@ -676,7 +676,7 @@ int get_free_adapter(transponder *tp) +@@ -676,7 +677,7 @@ int get_free_adapter(transponder *tp) adapter *ad = a[0]; @@ -20,7 +61,7 @@ index e034e3e..f7727b8 100644 { fe = fe_map[fe - 1]; ad = a[fe]; -@@ -878,7 +878,7 @@ int update_pids(int aid) +@@ -878,7 +879,7 @@ int update_pids(int aid) if (dp) dump_pids(aid); dp = 0; @@ -29,7 +70,7 @@ index e034e3e..f7727b8 100644 if ((ad->pids[i].fd = ad->set_pid(ad, ad->pids[i].pid)) < 0) { -@@ -888,6 +888,8 @@ int update_pids(int aid) +@@ -888,6 +889,8 @@ int update_pids(int aid) LOG0("Maximum pid filter reached, lowering the value to %d", opts.max_pids); break; } @@ -38,7 +79,7 @@ index e034e3e..f7727b8 100644 ad->pids[i].flags = 1; if (ad->pids[i].pid == 0) ad->pat_processed = 0; -@@ -895,7 +897,6 @@ int update_pids(int aid) +@@ -895,7 +898,6 @@ int update_pids(int aid) ad->pids[i].cc = 255; ad->pids[i].cc_err = 0; ad->pids[i].dec_err = 0; @@ -46,7 +87,7 @@ index e034e3e..f7727b8 100644 } if (ad->commit) ad->commit(ad); -@@ -906,7 +907,9 @@ int update_pids(int aid) +@@ -906,7 +908,9 @@ int update_pids(int aid) void post_tune(adapter *ad) { @@ -56,7 +97,7 @@ index e034e3e..f7727b8 100644 #ifndef DISABLE_PMT SPid *p = find_pid(aid, 0); SPid *p_all = find_pid(aid, 8192); -@@ -1066,7 +1069,7 @@ void mark_pids_deleted(int aid, int sid, char *pids) //pids==NULL -> delete all +@@ -1066,7 +1070,7 @@ void mark_pids_deleted(int aid, int sid, char *pids) //pids==NULL -> delete all pids ? pids : "NULL"); if (pids) { @@ -65,7 +106,7 @@ index e034e3e..f7727b8 100644 for (i = 0; i < la; i++) { pid = map_int(arg[i], NULL); -@@ -1146,7 +1149,7 @@ int mark_pids_add(int sid, int aid, char *pids) +@@ -1146,7 +1150,7 @@ int mark_pids_add(int sid, int aid, char *pids) LOG("adding pids to adapter %d, sid %d, pids=%s", aid, sid, pids ? pids : "NULL"); @@ -74,7 +115,40 @@ index e034e3e..f7727b8 100644 for (i = 0; i < la; i++) { pid = map_intd(arg[i], NULL, -1); -@@ -1242,7 +1245,7 @@ int set_adapter_parameters(int aid, int sid, transponder *tp) +@@ -1165,11 +1169,11 @@ int compare_tunning_parameters(int aid, transponder *tp) + if (!ad) + return -1; + +- LOGM("new parameters: f:%d, plp:%d, diseqc:%d, pol:%d, sr:%d, mtype:%d", +- tp->freq, tp->plp, tp->diseqc, tp->pol, tp->sr, tp->mtype); +- LOGM("old parameters: f:%d, plp:%d, diseqc:%d, pol:%d, sr:%d, mtype:%d", +- ad->tp.freq, ad->tp.plp, ad->tp.diseqc, ad->tp.pol, ad->tp.sr, ad->tp.mtype); +- if (tp->freq != ad->tp.freq || tp->plp != ad->tp.plp || tp->diseqc != ad->tp.diseqc || (tp->pol > 0 && tp->pol != ad->tp.pol) || (tp->sr > 1000 && tp->sr != ad->tp.sr) || (tp->mtype > 0 && tp->mtype != ad->tp.mtype)) ++ LOGM("new parameters: f:%d, plp/isi:%d, diseqc:%d, pol:%d, sr:%d, mtype:%d", ++ tp->freq, tp->plp_isi, tp->diseqc, tp->pol, tp->sr, tp->mtype); ++ LOGM("old parameters: f:%d, plp/isi:%d, diseqc:%d, pol:%d, sr:%d, mtype:%d", ++ ad->tp.freq, ad->tp.plp_isi, ad->tp.diseqc, ad->tp.pol, ad->tp.sr, ad->tp.mtype); ++ if (tp->freq != ad->tp.freq || tp->plp_isi != ad->tp.plp_isi || tp->diseqc != ad->tp.diseqc || (tp->pol > 0 && tp->pol != ad->tp.pol) || (tp->sr > 1000 && tp->sr != ad->tp.sr) || (tp->mtype > 0 && tp->mtype != ad->tp.mtype)) + + return 1; + +@@ -1196,11 +1200,11 @@ int set_adapter_parameters(int aid, int sid, transponder *tp) + { + mutex_unlock(&ad->mutex); + LOG( +- "secondary stream requested tune, not gonna happen ad: f:%d sr:%d pol:%d plp:%d src:%d mod %d -> \ +- new: f:%d sr:%d pol:%d plp:%d src:%d mod %d", +- ad->tp.freq, ad->tp.sr, ad->tp.pol, ad->tp.plp, ++ "secondary stream requested tune, not gonna happen ad: f:%d sr:%d pol:%d plp/isi:%d src:%d mod %d -> \ ++ new: f:%d sr:%d pol:%d plp/isi:%d src:%d mod %d", ++ ad->tp.freq, ad->tp.sr, ad->tp.pol, ad->tp.plp_isi, + ad->tp.diseqc, ad->tp.mtype, tp->freq, tp->sr, tp->pol, +- tp->plp, tp->diseqc, tp->mtype); ++ tp->plp_isi, tp->diseqc, tp->mtype); + return -1; + } + ad->do_tune = 1; +@@ -1242,7 +1246,7 @@ int set_adapter_parameters(int aid, int sid, transponder *tp) { char *arg[64]; int i, la; @@ -83,7 +157,25 @@ index e034e3e..f7727b8 100644 for (i = 0; i < la; i++) { int pmt = map_int(arg[i], NULL); -@@ -1436,12 +1439,12 @@ void set_disable(int i, int v) +@@ -1346,7 +1350,7 @@ describe_adapter(int sid, int aid, char *dad, int ld) + ad ? ad->tp.fe : aid + 1, strength, status, snr, + (double)t->freq / 1000.0, t->bw / 1000000, get_delsys(t->sys), + get_tmode(t->tmode), get_modulation(t->mtype), +- get_gi(t->gi), get_fec(t->fec), t->plp, t->t2id, t->sm); ++ get_gi(t->gi), get_fec(t->fec), t->plp_isi, t->t2id, t->sm); + else + len = + snprintf(dad, ld, +@@ -1354,7 +1358,7 @@ describe_adapter(int sid, int aid, char *dad, int ld) + ad ? ad->tp.fe : aid + 1, strength, status, snr, + (double)t->freq / 1000, get_delsys(t->sys), + get_modulation(t->mtype), t->sr / 1000, t->c2tft, t->ds, +- t->plp, get_inversion(t->inversion)); ++ t->plp_isi, get_inversion(t->inversion)); + + if (use_ad) + len += strlen(get_stream_pids(sid, dad + len, ld - len)); +@@ -1436,12 +1440,12 @@ void set_disable(int i, int v) void enable_adapters(char *o) { int i, la, st, end, j; @@ -98,7 +190,7 @@ index e034e3e..f7727b8 100644 for (i = 0; i < la; i++) { sep = strchr(arg[i], '-'); -@@ -1463,10 +1466,10 @@ void enable_adapters(char *o) +@@ -1463,10 +1467,10 @@ void enable_adapters(char *o) void set_unicable_adapters(char *o, int type) { int i, la, a_id, slot, freq, pin, o13v; @@ -111,11 +203,13 @@ index e034e3e..f7727b8 100644 for (i = 0; i < la; i++) { a_id = map_intd(arg[i], NULL, -1); -@@ -1504,10 +1507,10 @@ void set_unicable_adapters(char *o, int type) +@@ -1503,11 +1507,11 @@ void set_unicable_adapters(char *o, int type) + void set_diseqc_adapters(char *o) { - int i, la, a_id, fast, committed_no, uncommitted_no; +- int i, la, a_id, fast, committed_no, uncommitted_no; - char buf[100], *arg[20], *sep1, *sep2; ++ int i, la, a_id, fast, addr, committed_no, uncommitted_no; + char buf[1000], *arg[40], *sep1, *sep2; adapter *ad; SAFE_STRCPY(buf, o); @@ -124,7 +218,69 @@ index e034e3e..f7727b8 100644 for (i = 0; i < la; i++) { if (arg[i] && arg[i][0] == '*') -@@ -1567,10 +1570,10 @@ void set_diseqc_adapters(char *o) +@@ -1531,8 +1535,28 @@ void set_diseqc_adapters(char *o) + + if (!sep1 || !sep2) + continue; +- if ((fast = (sep1[1] == '*')) != 0) +- sep1++; ++ ++ fast = 0; ++ addr = 0x10; ++ while (sep1[1] == '*' || sep1[1] == '@' || sep1[1] == '.') ++ { ++ if (sep1[1] == '*') ++ { ++ fast = 1; ++ sep1++; ++ } ++ else if (sep1[1] == '@') ++ { ++ addr = 0; ++ sep1++; ++ } ++ else if (sep1[1] == '.') ++ { ++ addr = 0x11; ++ sep1++; ++ } ++ } ++ + committed_no = map_intd(sep1 + 1, NULL, -1); + uncommitted_no = map_intd(sep2 + 1, NULL, -1); + if (committed_no < 0 || uncommitted_no < 0) +@@ -1541,12 +1565,14 @@ void set_diseqc_adapters(char *o) + if (ad) + { + ad->diseqc_param.fast = fast; ++ ad->diseqc_param.addr = addr; + ad->diseqc_param.committed_no = committed_no; + ad->diseqc_param.uncommitted_no = uncommitted_no; + } + else + { + opts.diseqc_fast = fast; ++ opts.diseqc_addr = addr; + opts.diseqc_committed_no = committed_no; + opts.diseqc_uncommitted_no = uncommitted_no; + int j; +@@ -1554,23 +1580,24 @@ void set_diseqc_adapters(char *o) + if (a[j]) + { + a[j]->diseqc_param.fast = fast; ++ a[j]->diseqc_param.addr = addr; + a[j]->diseqc_param.committed_no = committed_no; + a[j]->diseqc_param.uncommitted_no = uncommitted_no; + } + } + LOG( +- "Setting diseqc adapter %d fast %d committed_no %d uncommitted_no %d", +- a_id, fast, committed_no, uncommitted_no); ++ "Setting diseqc adapter %d fast %d addr 0x%02x committed_no %d uncommitted_no %d", ++ a_id, fast, addr, committed_no, uncommitted_no); + } + } + void set_diseqc_multi(char *o) { int i, la, a_id, position; @@ -137,7 +293,7 @@ index e034e3e..f7727b8 100644 for (i = 0; i < la; i++) { if (arg[i] && arg[i][0] == '*') -@@ -1619,10 +1622,10 @@ void set_diseqc_multi(char *o) +@@ -1619,10 +1646,10 @@ void set_diseqc_multi(char *o) void set_lnb_adapters(char *o) { int i, la, a_id, lnb_low, lnb_high, lnb_switch; @@ -150,7 +306,7 @@ index e034e3e..f7727b8 100644 for (i = 0; i < la; i++) { if (arg[i] && arg[i][0] == '*') -@@ -1692,11 +1695,11 @@ void set_diseqc_timing(char *o) +@@ -1692,11 +1719,11 @@ void set_diseqc_timing(char *o) int i, la, a_id; int before_cmd, after_cmd, after_repeated_cmd; int after_switch, after_burst, after_tone; @@ -164,7 +320,7 @@ index e034e3e..f7727b8 100644 for (i = 0; i < la; i++) { if (arg[i] && arg[i][0] == '*') -@@ -1773,10 +1776,10 @@ void set_diseqc_timing(char *o) +@@ -1773,10 +1800,10 @@ void set_diseqc_timing(char *o) void set_slave_adapters(char *o) { int i, j, la, a_id, a_id2, master = 0; @@ -177,7 +333,7 @@ index e034e3e..f7727b8 100644 for (i = 0; i < la; i++) { a_id = map_intd(arg[i], NULL, -1); -@@ -1826,13 +1829,13 @@ void set_timeout_adapters(char *o) +@@ -1826,13 +1853,13 @@ void set_timeout_adapters(char *o) { int i, j, la, a_id, a_id2; int timeout = opts.adapter_timeout / 1000; @@ -193,7 +349,7 @@ index e034e3e..f7727b8 100644 if (arg[0] && (arg[0][0] == '*')) { opts.adapter_timeout = timeout * 1000; -@@ -1876,10 +1879,10 @@ extern char *fe_delsys[]; +@@ -1876,10 +1903,10 @@ extern char *fe_delsys[]; void set_adapters_delsys(char *o) { int i, la, a_id, ds; @@ -206,7 +362,7 @@ index e034e3e..f7727b8 100644 for (i = 0; i < la; i++) { a_id = map_intd(arg[i], NULL, -1); -@@ -1916,10 +1919,10 @@ void set_adapters_delsys(char *o) +@@ -1916,10 +1943,10 @@ void set_adapters_delsys(char *o) void set_adapter_dmxsource(char *o) { int i, j, la, st, end, fd; @@ -219,7 +375,7 @@ index e034e3e..f7727b8 100644 for (i = 0; i < la; i++) { sep = strchr(arg[i], '-'); -@@ -1956,10 +1959,10 @@ void set_signal_multiplier(char *o) +@@ -1956,10 +1983,10 @@ void set_signal_multiplier(char *o) { int i, la, a_id; float strength_multiplier, snr_multiplier; @@ -232,8 +388,16 @@ index e034e3e..f7727b8 100644 for (i = 0; i < la; i++) { if (arg[i] && arg[i][0] == '*') +@@ -2193,6 +2220,7 @@ _symbols adapters_sym[] = + {"ad_sr", VAR_AARRAY_INT, a, 1. / 1000, MAX_ADAPTERS, offsetof(adapter, tp.sr)}, + {"ad_bw", VAR_AARRAY_INT, a, 1. / 1000, MAX_ADAPTERS, offsetof(adapter, tp.bw)}, + {"ad_diseqc", VAR_AARRAY_INT, a, 1, MAX_ADAPTERS, offsetof(adapter, tp.diseqc)}, ++ {"ad_stream", VAR_AARRAY_INT, a, 1, MAX_ADAPTERS, offsetof(adapter, tp.plp_isi)}, + {"ad_fe", VAR_AARRAY_INT, a, 1, MAX_ADAPTERS, offsetof(adapter, fe)}, + {"ad_master", VAR_AARRAY_UINT8, a, 1, MAX_ADAPTERS, offsetof(adapter, master_sid)}, + {"ad_sidcount", VAR_AARRAY_UINT8, a, 1, MAX_ADAPTERS, offsetof(adapter, sid_cnt)}, diff --git a/src/axe.c b/src/axe.c -index 52e8dad..b3fe35e 100644 +index 52e8dad..57ba3a6 100644 --- a/src/axe.c +++ b/src/axe.c @@ -48,7 +48,7 @@ @@ -245,7 +409,66 @@ index 52e8dad..b3fe35e 100644 int send_jess(adapter *ad, int fd, int freq, int pos, int pol, int hiband, diseqc *d); int send_unicable(adapter *ad, int fd, int freq, int pos, int pol, int hiband, diseqc *d); int send_diseqc(adapter *ad, int fd, int pos, int pos_change, int pol, int hiband, diseqc *d); -@@ -210,7 +210,7 @@ static inline int extra_quattro(int input, int diseqc, int *equattro) +@@ -68,6 +68,8 @@ static inline void axe_fp_fd_write(const char *s) + ssize_t r; + + axe_fp_fd_open(); ++ if (axe_fp_fd < 0) ++ return; + len = strlen(b = s); + while (len > 0) + { +@@ -152,6 +154,49 @@ void axe_post_init(adapter *ad) + sockets_setread(ad->sock, axe_read); + } + ++static void axe_stv0900_i2c_4(const char *name, int pa, int v) ++{ ++ char buf[64]; ++ const char *b; ++ int fd; ++ size_t len; ++ ssize_t r; ++ ++ snprintf(buf, sizeof(buf), "/sys/devices/platform/i2c-stm.0/i2c-0/stv0900_%s%d", name, pa + 1); ++ fd = open(buf, O_WRONLY); ++ if (fd < 0) ++ return; ++ snprintf(buf, sizeof(buf), "%d", v); ++ len = strlen(b = buf); ++ while (len > 0) ++ { ++ r = write(fd, b, len); ++ if (r > 0) ++ { ++ len -= r; ++ b += r; ++ } ++ } ++ close(fd); ++} ++ ++static void axe_pls_isi(adapter *ad, transponder *tp) ++{ ++ static int isi[4] = { -2, -2, -2, -2 }; ++ static int pls_code[4] = { -2, -2, -2, -2 }; ++ int v; ++ if (tp->plp_isi != isi[ad->pa]) { ++ v = tp->plp_isi < 0 ? -1 : (tp->plp_isi & 0xff); ++ axe_stv0900_i2c_4("mis", ad->pa, v); ++ isi[ad->pa] = tp->plp_isi; ++ } ++ if (tp->pls_code != pls_code[ad->pa]) { ++ v = tp->pls_code < 0 ? 0 : (tp->pls_code & 0x3ffff); ++ axe_stv0900_i2c_4("pls", ad->pa, v); ++ pls_code[ad->pa] = tp->pls_code; ++ } ++} ++ + void axe_wakeup(void *_ad, int fe_fd, int voltage) + { + int i, mask; +@@ -210,7 +255,7 @@ static inline int extra_quattro(int input, int diseqc, int *equattro) return *equattro; } @@ -254,13 +477,13 @@ index 52e8dad..b3fe35e 100644 { int input2 = input < 4 ? input : -1; adapter *ad = get_configured_adapter(input2); -@@ -229,8 +229,30 @@ adapter *use_adapter(int input) +@@ -229,8 +274,30 @@ adapter *use_adapter(int input) return ad; } -int tune_check(adapter *ad, int pol, int hiband, int diseqc) +int axe_get_hiband(transponder *tp, diseqc *diseqc_param) - { ++{ + if (tp->pol > 2 && diseqc_param->lnb_circular > 0) + return 0; + if (tp->freq < diseqc_param->lnb_switch) @@ -280,13 +503,13 @@ index 52e8dad..b3fe35e 100644 +} + +int axe_tune_check(adapter *ad, transponder *tp, diseqc *diseqc_param, int diseqc) -+{ + { + int pol = (tp->pol - 1) & 1; + int hiband = axe_get_hiband(tp, diseqc_param); LOGM("axe: tune check for adapter %d, pol %d/%d, hiband %d/%d, diseqc %d/%d", ad->id, ad->old_pol, pol, ad->old_hiband, hiband, ad->old_diseqc, diseqc); if (ad->old_pol != pol) -@@ -249,33 +271,25 @@ int axe_setup_switch(adapter *ad) +@@ -249,33 +316,25 @@ int axe_setup_switch(adapter *ad) { int frontend_fd = ad->fe; transponder *tp = &ad->tp; @@ -332,7 +555,7 @@ index 52e8dad..b3fe35e 100644 { input = ad->id; if (!opts.quattro || extra_quattro(input, diseqc, &equattro)) -@@ -298,7 +312,7 @@ int axe_setup_switch(adapter *ad) +@@ -298,7 +357,7 @@ int axe_setup_switch(adapter *ad) continue; if ((ad2->axe_used & ~(1 << ad->id)) == 0) continue; @@ -341,7 +564,7 @@ index 52e8dad..b3fe35e 100644 continue; break; } -@@ -327,7 +341,7 @@ int axe_setup_switch(adapter *ad) +@@ -327,7 +386,7 @@ int axe_setup_switch(adapter *ad) } diseqc = pos; master = aid; @@ -350,7 +573,7 @@ index 52e8dad..b3fe35e 100644 if (adm == NULL) { LOG("axe_fe: unknown master adapter for input %d", input); -@@ -337,7 +351,7 @@ int axe_setup_switch(adapter *ad) +@@ -337,7 +396,7 @@ int axe_setup_switch(adapter *ad) else { master = (ad->master_source >= 0) ? ad->master_source : ad->pa; @@ -359,7 +582,7 @@ index 52e8dad..b3fe35e 100644 if (adm == NULL) { LOG("axe_fe: unknown master adapter for input %d", input); -@@ -357,7 +371,7 @@ int axe_setup_switch(adapter *ad) +@@ -357,7 +416,7 @@ int axe_setup_switch(adapter *ad) if (ad2->sid_cnt > 0) break; } @@ -368,7 +591,7 @@ index 52e8dad..b3fe35e 100644 { LOG("unable to use slave adapter %d (master %d)", input, adm->pa); return 0; -@@ -368,10 +382,13 @@ int axe_setup_switch(adapter *ad) +@@ -368,10 +427,13 @@ int axe_setup_switch(adapter *ad) if (master >= 0) { input = master; @@ -384,7 +607,7 @@ index 52e8dad..b3fe35e 100644 adm->old_pol = pol; adm->old_hiband = hiband; adm->old_diseqc = diseqc; -@@ -381,6 +398,7 @@ int axe_setup_switch(adapter *ad) +@@ -381,6 +443,7 @@ int axe_setup_switch(adapter *ad) } else if (opts.quattro) { @@ -392,7 +615,7 @@ index 52e8dad..b3fe35e 100644 if (opts.quattro_hiband == 1 && hiband) { LOG("axe_fe: hiband is not allowed for quattro config (adapter %d)", input); -@@ -392,17 +410,19 @@ int axe_setup_switch(adapter *ad) +@@ -392,17 +455,19 @@ int axe_setup_switch(adapter *ad) return 0; } input = ((hiband ^ 1) << 1) | (pol ^ 1); @@ -416,7 +639,7 @@ index 52e8dad..b3fe35e 100644 adm->old_pol = pol; adm->old_hiband = hiband; adm->old_diseqc = 0; -@@ -414,9 +434,15 @@ int axe_setup_switch(adapter *ad) +@@ -414,9 +479,15 @@ int axe_setup_switch(adapter *ad) else { aid = ad->id & 3; @@ -434,7 +657,7 @@ index 52e8dad..b3fe35e 100644 if (ad == NULL) { LOGM("axe setup: unable to find adapter %d", input); -@@ -429,17 +455,20 @@ int axe_setup_switch(adapter *ad) +@@ -429,17 +500,20 @@ int axe_setup_switch(adapter *ad) ad->id, input, ad->fe, ad->fe2); } @@ -460,7 +683,7 @@ index 52e8dad..b3fe35e 100644 { LOG("FD %d (%d) is a slave adapter", frontend_fd); } -@@ -447,7 +476,7 @@ int axe_setup_switch(adapter *ad) +@@ -447,7 +521,7 @@ int axe_setup_switch(adapter *ad) { if (ad->old_pol != pol || ad->old_hiband != hiband || ad->old_diseqc != diseqc) send_diseqc(ad, frontend_fd, diseqc, ad->old_diseqc != diseqc, pol, @@ -469,7 +692,46 @@ index 52e8dad..b3fe35e 100644 else LOGM("Skip sending diseqc commands since " "the switch position doesn't need to be changed: " -@@ -669,8 +698,8 @@ fe_delivery_system_t axe_delsys(int aid, int fd, fe_delivery_system_t *sys) +@@ -545,7 +619,10 @@ int axe_tune(int aid, transponder *tp) + ADD_PROP(DTV_SYMBOL_RATE, tp->sr) + ADD_PROP(DTV_INNER_FEC, tp->fec) + #if DVBAPIVERSION >= 0x0502 +- ADD_PROP(DTV_STREAM_ID, tp->plp) ++ ADD_PROP(DTV_STREAM_ID, tp->plp_isi) ++#endif ++#if DVBAPIVERSION >= 0x050b /* 5.11 */ ++ ADD_PROP(DTV_SCRAMBLING_SEQUENCE_INDEX, tp->pls_code) + #endif + + LOG("tuning to %d(%d) pol: %s (%d) sr:%d fec:%s delsys:%s mod:%s rolloff:%s pilot:%s, ts clear=%jd, ts pol=%jd", +@@ -569,7 +646,7 @@ int axe_tune(int aid, transponder *tp) + ADD_PROP(DTV_TRANSMISSION_MODE, tp->tmode) + ADD_PROP(DTV_HIERARCHY, HIERARCHY_AUTO) + #if DVBAPIVERSION >= 0x0502 +- ADD_PROP(DTV_STREAM_ID, tp->plp & 0xFF) ++ ADD_PROP(DTV_STREAM_ID, tp->plp_isi & 0xFF) + #endif + + LOG( +@@ -588,7 +665,7 @@ int axe_tune(int aid, transponder *tp) + freq = freq * 1000; + ADD_PROP(DTV_SYMBOL_RATE, tp->sr) + #if DVBAPIVERSION >= 0x0502 +- ADD_PROP(DTV_STREAM_ID, ((tp->ds & 0xFF) << 8) | (tp->plp & 0xFF)) ++ ADD_PROP(DTV_STREAM_ID, ((tp->ds & 0xFF) << 8) | (tp->plp_isi & 0xFF)) + #endif + // valid for DD DVB-C2 devices + +@@ -617,6 +694,8 @@ int axe_tune(int aid, transponder *tp) + break; + } + ++ axe_pls_isi(ad, tp); ++ + if ((ioctl(fd_frontend, FE_SET_PROPERTY, &p)) == -1) + if (ioctl(fd_frontend, FE_SET_PROPERTY, &p) == -1) + { +@@ -669,8 +748,8 @@ fe_delivery_system_t axe_delsys(int aid, int fd, fe_delivery_system_t *sys) void axe_get_signal(adapter *ad) { @@ -480,7 +742,7 @@ index 52e8dad..b3fe35e 100644 get_signal(ad, &status, &ber, &strength, &snr); strength = strength * 240 / 24000; -@@ -819,9 +848,11 @@ void free_axe_input(adapter *ad) +@@ -819,9 +898,11 @@ void free_axe_input(adapter *ad) for (aid = 0; aid < 4; aid++) { @@ -494,7 +756,7 @@ index 52e8dad..b3fe35e 100644 } } -@@ -829,11 +860,11 @@ void free_axe_input(adapter *ad) +@@ -829,11 +910,11 @@ void free_axe_input(adapter *ad) void set_link_adapters(char *o) { int i, la, a_id, b_id; @@ -508,7 +770,7 @@ index 52e8dad..b3fe35e 100644 for (i = 0; i < la; i++) { a_id = map_intd(arg[i], NULL, -1); -@@ -857,11 +888,11 @@ void set_link_adapters(char *o) +@@ -857,11 +938,11 @@ void set_link_adapters(char *o) void set_absolute_src(char *o) { int i, la, src, inp, pos; @@ -523,10 +785,20 @@ index 52e8dad..b3fe35e 100644 { inps = strchr(arg[i], ':'); diff --git a/src/dvb.c b/src/dvb.c -index 5184c4d..f3b6ac3 100644 +index 5184c4d..1171f54 100644 --- a/src/dvb.c +++ b/src/dvb.c -@@ -192,7 +192,7 @@ int detect_dvb_parameters(char *s, transponder *tp) +@@ -177,7 +177,8 @@ int detect_dvb_parameters(char *s, transponder *tp) + tp->diseqc = -1; + tp->c2tft = -1; + tp->ds = -1; +- tp->plp = -1; ++ tp->plp_isi = -1; ++ tp->pls_code = -1; + + tp->pids = tp->apids = tp->dpids = tp->x_pmt = NULL; + +@@ -192,7 +193,7 @@ int detect_dvb_parameters(char *s, transponder *tp) init_dvb_parameters(tp); LOG("detect_dvb_parameters (S)-> %s", s); @@ -535,11 +807,150 @@ index 5184c4d..f3b6ac3 100644 for (i = 0; i < la; i++) { +@@ -228,8 +229,11 @@ int detect_dvb_parameters(char *s, transponder *tp) + tp->c2tft = map_int(arg[i] + 6, NULL); + if (strncmp("ds=", arg[i], 3) == 0) + tp->ds = map_int(arg[i] + 3, NULL); +- if (strncmp("plp=", arg[i], 4) == 0) +- tp->plp = map_int(arg[i] + 4, NULL); ++ if (strncmp("plp=", arg[i], 4) == 0 || ++ strncmp("isi=", arg[i], 4) == 0) ++ tp->plp_isi = map_int(arg[i] + 4, NULL); ++ if (strncmp("plsc=", arg[i], 5) == 0) ++ tp->pls_code = map_int(arg[i] + 5, NULL); + + if (strncmp("x_pmt=", arg[i], 6) == 0) + tp->x_pmt = arg[i] + 6; +@@ -323,8 +327,10 @@ void copy_dvb_parameters(transponder *s, transponder *d) + d->c2tft = s->c2tft; + if (s->ds != -1) + d->ds = s->ds; +- if (s->plp != -1) +- d->plp = s->plp; ++ if (s->plp_isi != -1) ++ d->plp_isi = s->plp_isi; ++ if (s->pls_code != -1) ++ d->pls_code = s->pls_code; + + d->x_pmt = s->x_pmt; + d->apids = s->apids; +@@ -506,7 +512,9 @@ int send_diseqc(adapter *ad, int fd, int pos, int pos_change, int pol, int hiban + posu = pos / 4; + } + ++ cmd.msg[1] = d->addr; + cmd.msg[3] = 0xf0 | (((posc << 2) & 0x0c) | (hiband ? 1 : 0) | (pol ? 2 : 0)); ++ uncmd.msg[1] = d->addr; + uncmd.msg[3] = 0xf0 | (posu & 0x0f); + + LOGM("send_diseqc fd %d, pos = %d (c %d u %d), pol = %d, hiband = %d", +@@ -554,12 +562,13 @@ int send_unicable(adapter *ad, int fd, int freq, int pos, int pol, int hiband, d + { + struct dvb_diseqc_master_cmd cmd = + { +- {0xe0, 0x11, 0x5a, 0x00, 0x00}, 5}; ++ {0xe0, 0x10, 0x5a, 0x00, 0x00}, 5}; + int t; + int committed_no = d->committed_no; + + t = (freq + d->ufreq + 2) / 4 - 350; + ++ cmd.msg[1] = d->addr; + cmd.msg[3] = ((t & 0x0300) >> 8) | (d->uslot << 5) | (pos ? 0x10 : 0) | (hiband ? 4 : 0) | (pol ? 8 : 0); + cmd.msg[4] = t & 0xff; + +@@ -825,7 +834,10 @@ int dvb_tune(int aid, transponder *tp) + ADD_PROP(DTV_PILOT, tp->plts) + ADD_PROP(DTV_ROLLOFF, tp->ro) + #if DVBAPIVERSION >= 0x0502 +- ADD_PROP(DTV_STREAM_ID, tp->plp) ++ ADD_PROP(DTV_STREAM_ID, tp->plp_isi) ++#endif ++#if DVBAPIVERSION >= 0x050b /* 5.11 */ ++ ADD_PROP(DTV_SCRAMBLING_SEQUENCE_INDEX, tp->pls_code) + #endif + + #ifdef USE_DVBAPI3 +@@ -856,7 +868,7 @@ int dvb_tune(int aid, transponder *tp) + ADD_PROP(DTV_TRANSMISSION_MODE, tp->tmode) + ADD_PROP(DTV_HIERARCHY, HIERARCHY_AUTO) + #if DVBAPIVERSION >= 0x0502 +- ADD_PROP(DTV_STREAM_ID, tp->plp & 0xFF) ++ ADD_PROP(DTV_STREAM_ID, tp->plp_isi & 0xFF) + #endif + + // old DVBAPI version 3 +@@ -894,7 +906,7 @@ int dvb_tune(int aid, transponder *tp) + freq = freq * 1000; + ADD_PROP(DTV_SYMBOL_RATE, tp->sr) + #if DVBAPIVERSION >= 0x0502 +- ADD_PROP(DTV_STREAM_ID, ((tp->ds & 0xFF) << 8) | (tp->plp & 0xFF)) ++ ADD_PROP(DTV_STREAM_ID, ((tp->ds & 0xFF) << 8) | (tp->plp_isi & 0xFF)) + #endif + // valid for DD DVB-C2 devices + +diff --git a/src/dvb.h b/src/dvb.h +index 9830487..21622dc 100644 +--- a/src/dvb.h ++++ b/src/dvb.h +@@ -189,12 +189,14 @@ typedef struct diseqc + #define SWITCH_SLAVE 3 + int switch_type; + /* parameters */ +- int uslot; // unicable/jess slot +- int ufreq; // unicable/jess frequency +- int pin; +- int only13v; // unicable - use 13V voltage only +- int fast; // don't send diseqc without position change +- int committed_no, uncommitted_no; // diseqc info ++ int uslot; // unicable/jess slot ++ int ufreq; // unicable/jess frequency ++ int pin; // unicable pin code ++ int only13v; // unicable - use 13V voltage only ++ int fast; // don't send diseqc without position change ++ int addr; // diseqc address (second byte in the sequence) ++ int committed_no; // committed switch number ++ int uncommitted_no; // uncommitted switch number + /* timing */ + int before_cmd; + int after_cmd; +@@ -232,10 +234,10 @@ typedef struct struct_transponder + + diseqc diseqc_param; + +- // DVB-C2 +- int c2tft; +- int ds; +- int plp; ++ int c2tft; // DVB-C2 ++ int ds; // DVB-C2 (data slice) ++ int plp_isi; // DVB-T2/DVB-S2 ++ int pls_code; // DVB-S2 + + char *apids, *pids, *dpids, *x_pmt; + } transponder; diff --git a/src/minisatip.c b/src/minisatip.c -index 0cd9b0b..a35ef19 100644 +index 0cd9b0b..884f14c 100644 --- a/src/minisatip.c +++ b/src/minisatip.c -@@ -552,7 +552,7 @@ void set_options(int argc, char *argv[]) +@@ -286,6 +286,8 @@ Help\n\ + * eg: -d 0:1-0 (which is the default for each adapter).\n\ + - note: * as adapter means apply to all adapters\n\ + - note: * before committed number enables fast-switch (only voltage/tone)\n\ ++ - note: @ before committed number sets 'Any Device' diseqc address (0x00)\n\ ++ - note: . before committed number sets 'LNB' diseqc address (0x11)\n\ + \n\ + * -q --diseqc-timing ADAPTER1:BEFORE_CMD1-AFTER_CMD1-AFTER_REPEATED_CMD1-AFTER_SWITCH1-AFTER_BURST1-AFTER_TONE1[,...]\n\ + \t* All timing values are in ms, default adapter values are: 15-54-15-15-15-0\n\ +@@ -513,6 +515,7 @@ void set_options(int argc, char *argv[]) + opts.document_root = "html"; + opts.xml_path = DESC_XML; + opts.th_priority = -1; ++ opts.diseqc_addr = 0x10; + opts.diseqc_before_cmd = 15; + opts.diseqc_after_cmd = 54; + opts.diseqc_after_repeated_cmd = 15; +@@ -552,7 +555,7 @@ void set_options(int argc, char *argv[]) #endif #ifdef AXE opts.no_threads = 1; @@ -548,7 +959,7 @@ index 0cd9b0b..a35ef19 100644 #define AXE_OPTS "7:QW:8:A:" #else #define AXE_OPTS "" -@@ -614,7 +614,7 @@ void set_options(int argc, char *argv[]) +@@ -614,7 +617,7 @@ void set_options(int argc, char *argv[]) int i; memset(buf, 0, sizeof(buf)); strncpy(buf, optarg, sizeof(buf) - 1); @@ -557,7 +968,7 @@ index 0cd9b0b..a35ef19 100644 for (i = 0; i < la; i++) { int level = map_intd(arg[i], loglevels, -1); -@@ -1046,7 +1046,7 @@ int read_rtsp(sockets *s) +@@ -1046,7 +1049,7 @@ int read_rtsp(sockets *s) return 0; } @@ -566,7 +977,7 @@ index 0cd9b0b..a35ef19 100644 cseq = 0; if (la < 2) LOG_AND_RETURN(0, -@@ -1311,7 +1311,7 @@ int read_http(sockets *s) +@@ -1311,7 +1314,7 @@ int read_http(sockets *s) LOG("read HTTP from %d sid: %d: ", s->sock, s->sid); LOGM("%s", s->buf); @@ -576,7 +987,7 @@ index 0cd9b0b..a35ef19 100644 if (strncmp(arg[0], "GET", 3) && strncmp(arg[0], "POST", 4) && !is_head) REPLY_AND_RETURN(503); diff --git a/src/minisatip.h b/src/minisatip.h -index 6512250..1725565 100644 +index 6512250..af22d77 100644 --- a/src/minisatip.h +++ b/src/minisatip.h @@ -9,7 +9,7 @@ @@ -584,12 +995,20 @@ index 6512250..1725565 100644 #define VERSION_BUILD "16" #define CC(a, b, c) #a b #c -#define VERSION CC(0.7., VERSION_BUILD, ) -+#define VERSION CC(0.7., VERSION_BUILD, -axe211) ++#define VERSION CC(0.7., VERSION_BUILD, -axe212) void set_options(int argc, char *argv[]); +@@ -94,6 +94,7 @@ struct struct_opts + char no_threads; + int th_priority; + int diseqc_fast; ++ int diseqc_addr; + int diseqc_committed_no; + int diseqc_uncommitted_no; + int diseqc_before_cmd; diff --git a/src/satipc.c b/src/satipc.c -index 24c82ff..38df122 100644 +index 24c82ff..46ecb90 100644 --- a/src/satipc.c +++ b/src/satipc.c @@ -176,7 +176,7 @@ int satipc_reply(sockets *s) @@ -601,7 +1020,34 @@ index 24c82ff..38df122 100644 rc = map_int(arg[1], NULL); if (sip->option_no_session && sip->last_cmd == RTSP_OPTIONS && !sess && sip->session[0]) -@@ -1288,7 +1288,7 @@ void find_satip_adapter(adapter **a) +@@ -807,6 +807,8 @@ void get_s2_url(adapter *ad, char *url) + FILL("&fec=%s", tp->fec, FEC_AUTO, get_fec(tp->fec)); + FILL("&ro=%s", ro, ROLLOFF_AUTO, get_rolloff(ro)); + FILL("&plts=%s", plts, PILOT_AUTO, get_pilot(plts)); ++ FILL("&isi=%d", tp->plp_isi, 0, tp->plp_isi); ++ FILL("&plsc=%d", tp->pls_code, -1, tp->pls_code); + url[len] = 0; + return; + } +@@ -831,7 +833,7 @@ void get_c2_url(adapter *ad, char *url) + FILL("&specinv=%d", tp->inversion, INVERSION_AUTO, tp->inversion); + FILL("&t2id=%d", tp->t2id, 0, tp->t2id); + FILL("&sm=%d", tp->sm, 0, tp->sm); +- FILL("&plp=%d", tp->plp, 0, tp->plp); ++ FILL("&plp=%d", tp->plp_isi, 0, tp->plp_isi); + url[len] = 0; + return; + } +@@ -855,7 +857,7 @@ void get_t2_url(adapter *ad, char *url) + FILL("&specinv=%d", tp->inversion, INVERSION_AUTO, tp->inversion); + FILL("&c2tft=%d", tp->c2tft, 0, tp->c2tft); + FILL("&ds=%d", tp->ds, 0, tp->ds); +- FILL("&plp=%d", tp->plp, 0, tp->plp); ++ FILL("&plp=%d", tp->plp_isi, 0, tp->plp_isi); + url[len] = 0; + return; + } +@@ -1288,7 +1290,7 @@ void find_satip_adapter(adapter **a) return; char satip_servers[strlen(opts.satip_servers) + 10]; strcpy(satip_servers, opts.satip_servers); @@ -610,7 +1056,7 @@ index 24c82ff..38df122 100644 for (i = 0; i < la; i++) { -@@ -1420,7 +1420,7 @@ void satip_getxml_data(char *data, int len, void *opaque, Shttp_client *h) +@@ -1420,7 +1422,7 @@ void satip_getxml_data(char *data, int len, void *opaque, Shttp_client *h) eos = strchr(sep, '<'); if (eos) *eos = 0; @@ -619,7 +1065,7 @@ index 24c82ff..38df122 100644 for (i = 0; i < la; i++) { int ds = map_intd(arg[i], satip_delsys, -1); -@@ -1474,7 +1474,7 @@ int satip_getxml(void *x) +@@ -1474,7 +1476,7 @@ int satip_getxml(void *x) memset(satip_xml, 0, sizeof(satip_xml)); memset(sxd, 0, sizeof(sxd)); strncpy(satip_xml, opts.satip_xml, sizeof(satip_xml) - 1);