diff --git a/Makefile b/Makefile index bbaee4bc..04edcf15 100644 --- a/Makefile +++ b/Makefile @@ -32,7 +32,7 @@ KMODULES = drivers/usb/serial/cp210x.ko \ MINISATIP_COMMIT=54df9348e7bd7e6075f54f1b93ec4ad36429abe0 MINISATIP5_COMMIT=67e88c2d743d6df9c4a96aad772414169f61b764 -MINISATIP7_COMMIT=df737931da04bc1a178d7abddb3d6d9b57d70fe9 +MINISATIP7_COMMIT=c42b769e74e1587aa649932edb3292a6bb70f54e BUSYBOX=busybox-1.26.2 diff --git a/patches/minisatip7-axe.patch b/patches/minisatip7-axe.patch index 9c2613d9..a067dc20 100644 --- a/patches/minisatip7-axe.patch +++ b/patches/minisatip7-axe.patch @@ -1,8 +1,177 @@ +diff --git a/.gitignore b/.gitignore +index 8e8a5b9..ad34b81 100644 +--- a/.gitignore ++++ b/.gitignore +@@ -1,5 +1,6 @@ + /minisatip + *.o ++*.d + config.log + config.status + Makefile +diff --git a/Makefile.in b/Makefile.in +index ed8b1e5..f41b772 100644 +--- a/Makefile.in ++++ b/Makefile.in +@@ -14,7 +14,7 @@ LINUXDVB=@LINUXDVB@ + AXE=@AXE@ + + +-CFLAGS?=-ggdb -fPIC $(EXTRA_CFLAGS) @CFLAGS@ ++CFLAGS?=-Wall -Wno-switch -ggdb -fPIC $(EXTRA_CFLAGS) @CFLAGS@ + LDFLAGS?=-lpthread -lrt @LDFLAGS@ + + OBJS=minisatip.o socketworks.o stream.o adapter.o utils.o +@@ -78,7 +78,7 @@ CFLAGS+=-DDISABLE_LINUXDVB + OBJS+=dvb.o + endif + +-OBJS-$(AXE) += axe.c ++OBJS-$(AXE) += axe.o + CFLAGS-$(AXE) += -DAXE + + +@@ -96,14 +96,23 @@ OBJS+=$(OBJS-1) + CFLAGS+=$(CFLAGS-1) + LDFLAGS+=$(LDFLAGS-1) + ++DEPS=$(OBJS:.o=.d) + +-minisatip: $(OBJS) ++minisatip: $(DEPS) $(OBJS) + $(CC) $(CFLAGS) -o $@ $(OBJS) $(LDFLAGS) + ++%.d : %.c ++ @$(CC) $(CFLAGS) -MM $(basename $*).c | sed -e 's@^\(.*\)\.o:@\1.d \1.o:@' > $@ ++ + %.o : %.c +- $(CC) $(CFLAGS) -c $< -o $@ ++ $(CC) $(CFLAGS) -c $*.c -o $@ + + all: minisatip + + clean: +- rm *.o minisatip >> /dev/null ++ rm *.o *.d minisatip >> /dev/null ++ ++# pull in dependency info for *existing* .o files ++ifneq "$(MAKECMDGOALS)" "clean" ++-include $(DEPS) ++endif diff --git a/adapter.c b/adapter.c -index 26bd3b6..4606a1e 100644 +index 26bd3b6..c88ddef 100644 --- a/adapter.c +++ b/adapter.c -@@ -1873,9 +1873,9 @@ _symbols adapters_sym[] = +@@ -119,8 +119,7 @@ void find_adapters() + // avoid adapter close unless all the adapters can be closed + int adapter_timeout(sockets *s) + { +- int do_close = 1, i; +- int64_t rtime = getTick(), max_close = 0; ++ int do_close = 1; + adapter *ad = get_adapter(s->sid); + if (!ad) + return 1; +@@ -187,7 +186,6 @@ int num_adapters = 0; + + int init_hw(int i) + { +- char name[100]; + int64_t st, et; + adapter *ad; + if (i < 0 || i >= MAX_ADAPTERS) +@@ -291,7 +289,6 @@ int init_hw(int i) + get_delsys(ad->sys[0]), get_delsys(ad->sys[1]), + get_delsys(ad->sys[2]), get_delsys(ad->sys[3])); + +-OK: + mutex_unlock(&ad->mutex); + return 0; + +@@ -303,7 +300,6 @@ NOK: + int init_all_hw() + { + int i, rv; +- char name[50]; + + LOG("starting init_all_hw %d", init_complete); + if (init_complete) +@@ -385,11 +381,10 @@ int close_adapter(int na) + + int getAdaptersCount() + { +- int i, j, k; +- char sys; ++ int i, j, k, sys; + adapter *ad; +- char fes[20][MAX_ADAPTERS]; +- char ifes[20]; ++ int fes[20][MAX_ADAPTERS]; ++ int ifes[20]; + char order[] = + { SYS_DVBS2, SYS_DVBT, SYS_DVBC_ANNEX_A, SYS_DVBT2, SYS_DVBC2 }; + +@@ -701,7 +696,6 @@ int tune(int aid, int sid) + { + adapter *ad = get_adapter(aid); + int rv = 0, flush_data = 0; +- SPid *p; + + if (!ad) + return -400; +@@ -936,7 +930,6 @@ int mark_pids_add(int sid, int aid, char *pids) + + int compare_tunning_parameters(int aid, transponder * tp) + { +- int same = 0; + adapter *ad = get_adapter(aid); + if (!ad) + return -1; +@@ -1072,7 +1065,7 @@ char* get_stream_pids(int s_id, char *dest, int max_size); + char * + describe_adapter(int sid, int aid, char *dad, int ld) + { +- int i = 0, ts, j, use_ad, len; ++ int use_ad, len; + transponder *t; + adapter *ad; + streams *ss; +@@ -1092,7 +1085,7 @@ describe_adapter(int sid, int aid, char *dad, int ld) + } + else + t = &ad->tp; +- memset(dad, 0, sizeof(dad)); ++ memset(dad, 0, ld); + + if (use_ad) + { +@@ -1404,7 +1397,7 @@ void set_diseqc_timing(char *o) + int before_cmd, after_cmd, after_repeated_cmd; + int after_switch, after_burst, after_tone; + char buf[2000], *arg[20]; +- char *sep1, *sep2, *sep3, *sep4, *sep5, *sep6, *sep7; ++ char *sep1, *sep2, *sep3, *sep4, *sep5, *sep6; + adapter *ad; + strncpy(buf, o, sizeof(buf)); + la = split(arg, buf, sizeof(arg), ','); +@@ -1550,7 +1543,7 @@ void set_nopm_adapters(char *o) + extern char *fe_delsys[]; + void set_adapters_delsys(char *o) + { +- int i, j, la, a_id, ds; ++ int i, la, a_id, ds; + char buf[100], *arg[20], *sep; + adapter *ad; + strncpy(buf, o, sizeof(buf)); +@@ -1652,7 +1645,6 @@ int signal_thread(sockets *s) + int i; + int64_t ts, ctime; + adapter *ad; +- int status; + for (i = 0; i < MAX_ADAPTERS; i++) + if ((ad = get_adapter_nw(i)) && ad->get_signal && ad->tp.freq + && (ad->status_cnt++ > 2) // make sure the kernel has updated the status +@@ -1873,9 +1865,9 @@ _symbols adapters_sym[] = { "ad_sys", VAR_AARRAY_INT, a, 1, MAX_ADAPTERS, offsetof( adapter, tp.sys) }, { "ad_allsys", VAR_FUNCTION_STRING, (void *) &get_all_delsys, 0, @@ -14,11 +183,43 @@ index 26bd3b6..4606a1e 100644 { "tuner_s2", VAR_INT, &tuner_s2, 1, 0, 0 }, { "tuner_t2", VAR_INT, &tuner_t2, 1, 0, 0 }, { "tuner_c2", VAR_INT, &tuner_c2, 1, 0, 0 }, +diff --git a/adapter.h b/adapter.h +index db7c270..06055b3 100755 +--- a/adapter.h ++++ b/adapter.h +@@ -53,6 +53,7 @@ typedef int (*Del_filters)(int fd, int pid); + typedef int (*Adapter_commit)(void *ad); + typedef int (*Open_device)(void *ad); + typedef int (*Device_signal)(void *ad); ++typedef int (*Device_wakeup)(void *ad, int fd, int voltage); + typedef int (*Tune)(int aid, transponder * tp); + typedef fe_delivery_system_t (*Dvb_delsys)(int aid, int fd, + fe_delivery_system_t *sys); +@@ -115,6 +116,7 @@ typedef struct struct_adapter + Tune tune; + Dvb_delsys delsys; + Device_signal get_signal; ++ Device_wakeup wakeup; + Adapter_commit post_init, close; + } adapter; + diff --git a/axe.c b/axe.c -index 486b2f8..642f152 100755 +index 486b2f8..9f136ab 100755 --- a/axe.c +++ b/axe.c -@@ -107,6 +107,8 @@ void axe_set_network_led(int on) +@@ -47,10 +47,7 @@ + #ifndef DISABLE_LINUXDVB + + extern struct struct_opts opts; +-int dvb_tune(int aid, transponder * tp); +-int setup_switch(adapter *ad); +-void get_signal(int fd, int * status, uint32_t * ber, uint16_t * strength, +- uint16_t * snr); ++void get_signal(int fd, uint32_t * status, uint32_t * ber, uint16_t * strength, uint16_t * snr); + 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); +@@ -107,6 +104,8 @@ void axe_set_network_led(int on) int axe_read(int socket, void *buf, int len, sockets *ss, int *rv) { *rv = read(socket, buf, len); @@ -27,7 +228,240 @@ index 486b2f8..642f152 100755 // if(*rv < 0 || *rv == 0 || errno == -EAGAIN) if(*rv < 0 || *rv == 0 || errno == -EAGAIN) { -@@ -770,9 +772,9 @@ char *get_axe_coax(int aid, char *dest, int max_size) +@@ -155,7 +154,7 @@ void axe_post_init(adapter *ad) + } + + +-void axe_wakeup(int fe_fd, int voltage) ++void axe_wakeup(void *_ad, int fe_fd, int voltage) + { + int i, mask; + adapter *a; +@@ -270,7 +269,7 @@ int axe_setup_switch(adapter *ad) + } + + adapter *ad2, *adm; +- int input = 0, src, aid, pos = 0, equattro = 0, master = -1; ++ int input = 0, aid, pos = 0, equattro = 0, master = -1; + + if (tp->diseqc_param.switch_type != SWITCH_UNICABLE && + tp->diseqc_param.switch_type != SWITCH_JESS) { +@@ -385,18 +384,35 @@ int axe_setup_switch(adapter *ad) + }else + ad->axe_used |= (1 << aid); + +- LOG("adapter %d: using source %d, fe %d fe2 %d", ad->id, input, ad->fe, ad->fe2); ++ LOG("adapter %d: using source %d, fe %d fe2 %d", ++ ad->id, input, ad->fe, ad->fe2); + } + + if (tp->diseqc_param.switch_type == SWITCH_UNICABLE) + { + freq = send_unicable(ad, ad->fe2, freq / 1000, diseqc, +- pol, hiband, &tp->diseqc_param); ++ pol, hiband, &tp->diseqc_param); + } + else if (tp->diseqc_param.switch_type == SWITCH_JESS) + { + freq = send_jess(ad, ad->fe2, freq / 1000, diseqc, +- pol, hiband, &tp->diseqc_param); ++ pol, hiband, &tp->diseqc_param); ++ } ++ else if (tp->diseqc_param.switch_type == SWITCH_SLAVE) ++ { ++ LOGL(2, "FD %d (%d) is a slave adapter", frontend_fd); ++ } ++ else ++ { ++ if (ad->old_pol != pol || ad->old_hiband != hiband ++ || ad->old_diseqc != diseqc) ++ send_diseqc(ad, frontend_fd, diseqc, ad->old_diseqc != diseqc, pol, ++ hiband, &tp->diseqc_param); ++ else ++ LOGL(3, "Skip sending diseqc commands since " ++ "the switch position doesn't need to be changed: " ++ "pol %d, hiband %d, switch position %d", ++ pol, hiband, diseqc); + } + + ad->old_pol = pol; +@@ -415,30 +431,154 @@ axe: + LOG("axe_fe: RESET failed for fd %d: %s", frontend_fd, strerror(errno)); + if (axe_fe_input(frontend_fd, input)) + LOG("axe_fe: INPUT failed for fd %d input %d: %s", frontend_fd, input, strerror(errno)); +- if (opts.quattro) +- return freq; + + return freq; + } + ++#define ADD_PROP(c, d) { \ ++ p_cmd[iProp].cmd = (c); \ ++ p_cmd[iProp].u.data = (d); \ ++ iProp++; \ ++} + + int axe_tune(int aid, transponder * tp) + { + adapter *ad = get_adapter(aid); +- + ssize_t drv; + char buf[1316]; ++ ++ int64_t bclear, bpol; ++ int iProp = 0; ++ int fd_frontend = ad->fe; ++ ++ int freq = tp->freq; ++ struct dtv_property p_cmd[20]; ++ struct dtv_properties p = ++ { .num = 0, .props = p_cmd }; ++ struct dvb_frontend_event ev; ++ ++ struct dtv_property p_clear[] = ++ { ++ { .cmd = DTV_CLEAR }, ++ }; ++ ++ struct dtv_properties cmdseq_clear = ++ { .num = 1, .props = p_clear }; ++ + axe_set_tuner_led(aid + 1, 1); + axe_dmxts_stop(ad->dvr); + axe_fe_reset(ad->fe); + + //probably can be removed +- + do { drv = read(ad->dvr, buf, sizeof(buf)); } while (drv > 0); + +- return dvb_tune(aid, tp); ++ memset(p_cmd, 0, sizeof(p_cmd)); ++ bclear = getTick(); + ++ if ((ioctl(fd_frontend, FE_SET_PROPERTY, &cmdseq_clear)) == -1) ++ { ++ LOG("FE_SET_PROPERTY DTV_CLEAR failed for fd %d: %s", fd_frontend, ++ strerror(errno)); ++ // return -1; ++ } ++ ++ switch (tp->sys) ++ { ++ case SYS_DVBS: ++ case SYS_DVBS2: ++ ++ bpol = getTick(); ++ freq = axe_setup_switch(ad); ++ if (freq < MIN_FRQ_DVBS || freq > MAX_FRQ_DVBS) ++ LOG_AND_RETURN(-404, "Frequency %d is not within range ", freq) ++ ++ ADD_PROP(DTV_SYMBOL_RATE, tp->sr) ++ ADD_PROP(DTV_INNER_FEC, tp->fec) ++#if DVBAPIVERSION >= 0x0502 ++ ADD_PROP(DTV_STREAM_ID, tp->plp) ++#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", ++ tp->freq, freq, get_pol(tp->pol), tp->pol, tp->sr, ++ fe_fec[tp->fec], fe_delsys[tp->sys], fe_modulation[tp->mtype], ++ "auto", "auto", ++ bclear, bpol) ++ break; ++ ++ case SYS_DVBT: ++ case SYS_DVBT2: ++ ++ if (tp->freq < MIN_FRQ_DVBT || tp->freq > MAX_FRQ_DVBT) ++ LOG_AND_RETURN(-404, "Frequency %d is not within range ", tp->freq) ++ ++ freq = freq * 1000; ++ ADD_PROP(DTV_BANDWIDTH_HZ, tp->bw) ++ ADD_PROP(DTV_CODE_RATE_HP, tp->fec) ++ ADD_PROP(DTV_CODE_RATE_LP, tp->fec) ++ ADD_PROP(DTV_GUARD_INTERVAL, tp->gi) ++ ADD_PROP(DTV_TRANSMISSION_MODE, tp->tmode) ++ ADD_PROP(DTV_HIERARCHY, HIERARCHY_AUTO) ++#if DVBAPIVERSION >= 0x0502 ++ ADD_PROP(DTV_STREAM_ID, tp->plp & 0xFF) ++#endif ++ ++ LOG( ++ "tuning to %d delsys: %s bw:%d inversion:%s mod:%s fec:%s guard:%s transmission: %s, ts clear = %jd", ++ freq, fe_delsys[tp->sys], tp->bw, fe_specinv[tp->inversion], ++ fe_modulation[tp->mtype], fe_fec[tp->fec], fe_gi[tp->gi], ++ fe_tmode[tp->tmode], bclear) ++ break; ++ ++ case SYS_DVBC2: ++ case SYS_DVBC_ANNEX_A: ++ ++ if (tp->freq < MIN_FRQ_DVBC || tp->freq > MAX_FRQ_DVBC) ++ LOG_AND_RETURN(-404, "Frequency %d is not within range ", tp->freq) ++ ++ 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)) ++#endif ++ // valid for DD DVB-C2 devices ++ ++ LOG("tuning to %d sr:%d specinv:%s delsys:%s mod:%s ts clear = %jd", ++ freq, tp->sr, fe_specinv[tp->inversion], fe_delsys[tp->sys], ++ fe_modulation[tp->mtype], bclear) ++ break; ++ ++ default: ++ LOG("tuning to unknown delsys: %s freq %s ts clear = %jd", freq, ++ fe_delsys[tp->sys], bclear) ++ break; ++ } ++ ++ ADD_PROP(DTV_FREQUENCY, freq) ++ ADD_PROP(DTV_INVERSION, tp->inversion) ++ ADD_PROP(DTV_MODULATION, tp->mtype); ++ ADD_PROP(DTV_DELIVERY_SYSTEM, tp->sys); ++ ADD_PROP(DTV_TUNE, 0) ++ ++ p.num = iProp; ++ /* discard stale QPSK events */ ++ while (1) ++ { ++ if (ioctl(fd_frontend, FE_GET_EVENT, &ev) == -1) ++ break; ++ } ++ ++ if ((ioctl(fd_frontend, FE_SET_PROPERTY, &p)) == -1) ++ if (ioctl(fd_frontend, FE_SET_PROPERTY, &p) == -1) ++ { ++ LOG("dvb_tune: set property failed %d %s", errno, strerror(errno)); ++ axe_set_tuner_led(aid + 1, 0); ++ return -404; ++ } ++ ++ axe_dmxts_start(ad->dvr); ++ return 0; + } ++ + int axe_set_pid(adapter *a, uint16_t i_pid) + { + if (i_pid > 8192 || a == NULL) +@@ -597,6 +737,7 @@ void find_axe_adapter(adapter **a) + ad->post_init = (Adapter_commit) axe_post_init; + ad->close = (Adapter_commit) axe_close; + ad->get_signal = (Device_signal) axe_get_signal; ++ ad->wakeup = (Device_wakeup) axe_wakeup; + ad->type = ADAPTER_DVB; + close(fd); + na++; +@@ -715,7 +856,6 @@ adapter *axe_vdevice_sync(int aid) + char buf[1024], *p; + int64_t t; + uint32_t addr, pktc, syncerrc, tperrc, ccerr; +- int fd; + + if (!ad) + return NULL; +@@ -770,9 +910,9 @@ char *get_axe_coax(int aid, char *dest, int max_size) _symbols axe_sym[] = { @@ -40,6 +474,223 @@ index 486b2f8..642f152 100755 { NULL, 0, NULL, 0, 0 } }; +diff --git a/axe.h b/axe.h +index af35a61..46ce50c 100644 +--- a/axe.h ++++ b/axe.h +@@ -97,7 +97,7 @@ static inline int axe_dmxts_stop(int fd) + void axe_set_tuner_led(int tuner, int on); + void axe_set_network_led(int on); + void axe_status(char *buf, size_t buflen); +-void axe_wakeup(int fe_fd, int voltage); ++void axe_wakeup(void *ad, int fe_fd, int voltage); + void find_axe_adapter(adapter **a); + int axe_setup_switch(adapter *ad); + void free_axe_input(adapter *ad); +diff --git a/dvb.c b/dvb.c +index 15f59c8..a5d20fb 100644 +--- a/dvb.c ++++ b/dvb.c +@@ -42,10 +42,6 @@ + #include "ca.h" + #include "utils.h" + +-#ifdef AXE +-#include "axe.h" +-#endif +- + char *fe_pilot[] = + { "on", "off", " ", //auto + NULL }; +@@ -436,9 +432,8 @@ int send_diseqc(adapter *ad, int fd, int pos, int pos_change, int pol, int hiban + + LOGL(3, "send_diseqc fd %d, pos = %d (c %d u %d), pol = %d, hiband = %d", + fd, pos, posc, posu, pol, hiband); +-#ifdef AXE +- axe_wakeup(fd, pol ? SEC_VOLTAGE_18 : SEC_VOLTAGE_13); +-#endif ++ if (ad->wakeup) ++ ad->wakeup(ad, fd, pol ? SEC_VOLTAGE_18 : SEC_VOLTAGE_13); + + if (ioctl(fd, FE_SET_TONE, SEC_TONE_OFF) == -1) + LOG("send_diseqc: FE_SET_TONE failed for fd %d: %s", fd, +@@ -504,9 +499,8 @@ int send_unicable(adapter *ad, int fd, int freq, int pos, int pol, int hiband, d + "send_unicable fd %d, freq %d, ufreq %d, pos = %d, pol = %d, hiband = %d, slot %d, diseqc => %02x %02x %02x %02x %02x", + fd, freq, d->ufreq, pos, pol, hiband, d->uslot, cmd.msg[0], + cmd.msg[1], cmd.msg[2], cmd.msg[3], cmd.msg[4]); +-#ifdef AXE +- axe_wakeup(fd, SEC_VOLTAGE_13); +-#endif ++ if (ad->wakeup) ++ ad->wakeup(ad, fd, SEC_VOLTAGE_13); + if(!ad->tune_time) + { + if (ioctl(fd, FE_SET_VOLTAGE, SEC_VOLTAGE_13) == -1) +@@ -551,14 +545,12 @@ int send_jess(adapter *ad, int fd, int freq, int pos, int pol, int hiband, diseq + cmd.msg[4] = d->pin; + } + +- LOGL(3, +- "send_jess fd %d, freq %d, ufreq %d, pos = %d, pol = %d, hiband = %d, slot %d, diseqc => %02x %02x %02x %02x %02x", +- fd, freq, d->ufreq, pos, pol, hiband, d->uslot, cmd.msg[0], +- cmd.msg[1], cmd.msg[2], cmd.msg[3], cmd.msg[4]); ++ LOGL(3, "send_jess fd %d, freq %d, ufreq %d, pos = %d, pol = %d, hiband = %d, slot %d, diseqc => %02x %02x %02x %02x %02x", ++ fd, freq, d->ufreq, pos, pol, hiband, d->uslot, cmd.msg[0], ++ cmd.msg[1], cmd.msg[2], cmd.msg[3], cmd.msg[4]); + +-#ifdef AXE +- axe_wakeup(fd, SEC_VOLTAGE_13); +-#endif ++ if (ad->wakeup) ++ ad->wakeup(ad, fd, SEC_VOLTAGE_13); + + if(!ad->tune_time) + { +@@ -609,23 +601,13 @@ int setup_switch(adapter *ad) + + if (tp->diseqc_param.switch_type == SWITCH_UNICABLE) + { +-#ifdef AXE +- freq = send_unicable(ad, ad->fe2, freq / 1000, diseqc, pol, hiband, +- &tp->diseqc_param); +-#else +- freq = send_unicable(ad, frontend_fd, freq / 1000, diseqc, pol, hiband, +- &tp->diseqc_param); +-#endif ++ freq = send_unicable(ad, frontend_fd, freq / 1000, diseqc, ++ pol, hiband, &tp->diseqc_param); + } + else if (tp->diseqc_param.switch_type == SWITCH_JESS) + { +-#ifdef AXE +- freq = send_jess(ad, ad->fe2, freq / 1000, diseqc, pol, hiband, +- &tp->diseqc_param); +-#else +- freq = send_jess(ad, frontend_fd, freq / 1000, diseqc, pol, hiband, +- &tp->diseqc_param); +-#endif ++ freq = send_jess(ad, frontend_fd, freq / 1000, diseqc, ++ pol, hiband, &tp->diseqc_param); + } + else if (tp->diseqc_param.switch_type == SWITCH_SLAVE) + { +@@ -639,9 +621,9 @@ int setup_switch(adapter *ad) + hiband, &tp->diseqc_param); + else + LOGL(3, "Skip sending diseqc commands since " +- "the switch position doesn't need to be changed: " +- "pol %d, hiband %d, switch position %d", pol, hiband, +- diseqc); ++ "the switch position doesn't need to be changed: " ++ "pol %d, hiband %d, switch position %d", ++ pol, hiband, diseqc); + } + + ad->old_pol = pol; +@@ -694,35 +676,24 @@ int dvb_tune(int aid, transponder * tp) + case SYS_DVBS2: + + bpol = getTick(); +-#ifndef AXE + freq = setup_switch(ad); +-#else +- freq = axe_setup_switch(ad); +-#endif + if (freq < MIN_FRQ_DVBS || freq > MAX_FRQ_DVBS) + LOG_AND_RETURN(-404, "Frequency %d is not within range ", freq) + +- ADD_PROP(DTV_SYMBOL_RATE, tp->sr) ++ ADD_PROP(DTV_SYMBOL_RATE, tp->sr) + ADD_PROP(DTV_INNER_FEC, tp->fec) +-#ifndef AXE +- ADD_PROP(DTV_PILOT, tp->plts) +- ADD_PROP(DTV_ROLLOFF, tp->ro) +-#endif ++ 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) + #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", +- tp->freq, freq, get_pol(tp->pol), tp->pol, tp->sr, +- fe_fec[tp->fec], fe_delsys[tp->sys], fe_modulation[tp->mtype], +-#ifdef AXE +- "auto", "auto", +-#else +- fe_rolloff[tp->ro], fe_pilot[tp->plts], +-#endif +- bclear, bpol) +- break; ++ 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", ++ tp->freq, freq, get_pol(tp->pol), tp->pol, tp->sr, ++ fe_fec[tp->fec], fe_delsys[tp->sys], fe_modulation[tp->mtype], ++ fe_rolloff[tp->ro], fe_pilot[tp->plts], ++ bclear, bpol) ++ break; + + case SYS_DVBT: + case SYS_DVBT2: +@@ -799,7 +770,7 @@ int dvb_tune(int aid, transponder * tp) + + break; + default: +- LOG("tuninng to unknown delsys: %s freq %s ts clear = %jd", freq, ++ LOG("tuning to unknown delsys: %s freq %s ts clear = %jd", freq, + fe_delsys[tp->sys], bclear) + break; + } +@@ -822,14 +793,8 @@ int dvb_tune(int aid, transponder * tp) + if (ioctl(fd_frontend, FE_SET_PROPERTY, &p) == -1) + { + LOG("dvb_tune: set property failed %d %s", errno, strerror(errno)); +-#ifdef AXE +- axe_set_tuner_led(aid + 1, 0); +-#endif + return -404; + } +-#ifdef AXE +- axe_dmxts_start(ad->dvr); +-#endif + + return 0; + } +@@ -984,7 +949,7 @@ fe_delivery_system_t dvb_delsys(int aid, int fd, fe_delivery_system_t *sys) + + } + +-void get_signal(int fd, int * status, uint32_t * ber, uint16_t * strength, ++void get_signal(int fd, uint32_t * status, uint32_t * ber, uint16_t * strength, + uint16_t * snr) + { + *status = *ber = *snr = *strength = 0; +@@ -1009,7 +974,7 @@ void get_signal(int fd, int * status, uint32_t * ber, uint16_t * strength, + } + } + +-int get_signal_new(int fd, int * status, uint32_t * ber, uint16_t * strength, ++int get_signal_new(int fd, uint32_t * status, uint32_t * ber, uint16_t * strength, + uint16_t * snr) + { + +diff --git a/dvb.h b/dvb.h +index ae3991e..26a67d2 100644 +--- a/dvb.h ++++ b/dvb.h +@@ -241,4 +241,11 @@ char *get_gi(int i); + char *get_specinv(int i); + char *get_pol(int i); + ++extern char *fe_delsys[]; ++extern char *fe_fec[]; ++extern char *fe_tmode[]; ++extern char *fe_modulation[]; ++extern char *fe_specinv[]; ++extern char *fe_gi[]; ++ + #endif /* */ diff --git a/html/sort_desc.png b/html/sort_desc.png new file mode 100644 index 0000000..0e156de @@ -559,7 +1210,7 @@ index 8d2f6e5..812a13d 100755 }); diff --git a/minisatip.c b/minisatip.c -index 71b4881..a645854 100755 +index e6e2254..bdb96d5 100755 --- a/minisatip.c +++ b/minisatip.c @@ -482,7 +482,7 @@ void set_options(int argc, char *argv[]) @@ -571,7 +1222,24 @@ index 71b4881..a645854 100755 #define AXE_OPTS "7:QW:M:8:A:" #else #define AXE_OPTS "" -@@ -1024,7 +1024,7 @@ int read_rtsp(sockets * s) +@@ -830,7 +830,6 @@ int read_rtsp(sockets * s) + int sess_id = 0; + int end = s->type == TYPE_HTTP; + char buf[2000]; +- char tmp_ra[50]; + streams *sid = get_sid(s->sid); + + if (s->buf[0] == 0x24 && s->buf[1] < 2) +@@ -850,7 +849,7 @@ int read_rtsp(sockets * s) + } + } + +- if (s->rlen < 4 || !end_of_header(s->buf + s->rlen - 4)) ++ if (s->rlen < 4 || !end_of_header((char *)s->buf + s->rlen - 4)) + { + if (s->rlen > RBUF - 10) + { +@@ -1024,7 +1023,7 @@ int read_rtsp(sockets * s) arg[1], getTick(), (getTickUs() / 1000000)); } if (buf[0] == 0 && sid->type == STREAM_HTTP) @@ -580,7 +1248,7 @@ index 71b4881..a645854 100755 http_response(s, 200, buf, NULL, cseq, 0, end); } else if (strncmp(arg[0], "TEARDOWN", 8) == 0) -@@ -1066,6 +1066,8 @@ int read_rtsp(sockets * s) +@@ -1066,6 +1065,8 @@ int read_rtsp(sockets * s) #define REPLY_AND_RETURN(c) {http_response (s, c, NULL, NULL, 0, 0, 1); return 0;} @@ -589,7 +1257,25 @@ index 71b4881..a645854 100755 char uuid[100]; int uuidi; struct sockaddr_in ssdp_sa; -@@ -1134,6 +1136,8 @@ int read_http(sockets * s) +@@ -1096,7 +1097,7 @@ int read_http(sockets * s) + "%s" + "%s" + ""; +- if (s->rlen < 5 || !end_of_header(s->buf + s->rlen - 4)) ++ if (s->rlen < 5 || !end_of_header((char *)s->buf + s->rlen - 4)) + { + if (s->rlen > RBUF - 10) + { +@@ -1114,7 +1115,7 @@ int read_http(sockets * s) + return 0; + } + url[0] = 0; +- space = strchr(s->buf, ' '); ++ space = strchr((char *)s->buf, ' '); + if(space) + { + int i = 0; +@@ -1134,6 +1135,8 @@ int read_http(sockets * s) return 0; } @@ -598,7 +1284,7 @@ index 71b4881..a645854 100755 if(!strncasecmp((const char*) s->buf, "HEAD ", 5)) is_head = 1; -@@ -1149,13 +1153,11 @@ int read_http(sockets * s) +@@ -1149,13 +1152,11 @@ int read_http(sockets * s) split(arg, (char*) s->buf, 50, ' '); // LOG("args: %s -> %s -> %s",arg[0],arg[1],arg[2]); @@ -613,7 +1299,7 @@ index 71b4881..a645854 100755 if (strcmp(arg[1], "/"DESC_XML) == 0) { extern int tuner_s2, tuner_t, tuner_c, tuner_t2, tuner_c2; -@@ -1179,11 +1181,29 @@ int read_http(sockets * s) +@@ -1179,11 +1180,29 @@ int read_http(sockets * s) snprintf(buf, sizeof(buf), xml, app_name, app_name, app_name, uuid, opts.http_host, adapters, opts.playlist); sprintf(headers, @@ -644,7 +1330,7 @@ index 71b4881..a645854 100755 // process file from html directory, the images are just sent back if (!strcmp(arg[1], "/")) -@@ -1206,8 +1226,7 @@ int read_http(sockets * s) +@@ -1206,8 +1225,7 @@ int read_http(sockets * s) http_response(s, 200, ctype, NULL, 0, 0, 1); return 0; } @@ -654,8 +1340,17 @@ index 71b4881..a645854 100755 { http_response(s, 200, ctype, f, 0, nl, 1); closefile(f, nl); +@@ -1433,7 +1451,7 @@ pthread_t main_tid; + extern int sock_signal; + int main(int argc, char *argv[]) + { +- int sock_st, sock_bw, rv; ++ int sock_bw, rv; + main_tid = get_tid(); + thread_name = "main"; + set_options(argc, argv); diff --git a/minisatip.h b/minisatip.h -index a242532..137f50b 100644 +index a242532..5f67288 100644 --- a/minisatip.h +++ b/minisatip.h @@ -10,7 +10,7 @@ @@ -663,12 +1358,193 @@ index a242532..137f50b 100644 #define VERSION_BUILD "4" #define CC(a,b,c) #a b #c -#define VERSION CC(0.7.,VERSION_BUILD,) -+#define VERSION CC(0.7.,VERSION_BUILD,-axe203) ++#define VERSION CC(0.7.,VERSION_BUILD,-axe204) void set_options (int argc, char *argv[]); +diff --git a/satipc.c b/satipc.c +index c16f5ef..e08d80f 100755 +--- a/satipc.c ++++ b/satipc.c +@@ -130,7 +130,7 @@ int satipc_reply(sockets * s) + LOG("satipc_reply (sock %d) handle %d, adapter %d:\n%s", s->id, s->sock, + s->sid, s->buf); + +- if ((timeout = strstr(s->buf, "timeout="))) ++ if ((timeout = strstr((char *)s->buf, "timeout="))) + { + int tmout; + timeout += strlen("timeout="); +@@ -138,21 +138,21 @@ int satipc_reply(sockets * s) + sockets_timeout(ad->fe_sock, tmout * 500); // 2 times 30s + } + +- sess = strstr(s->buf, "Session:"); ++ sess = strstr((char *)s->buf, "Session:"); + + if (sip->last_cmd == RTSP_DESCRIBE) + { +- set_adapter_signal(ad, s->buf, rlen); ++ set_adapter_signal(ad, (char *)s->buf, rlen); + } + +- sep = strstr(s->buf, "minisatip"); ++ sep = strstr((char *)s->buf, "minisatip"); + if(sep) + { + sip->option_no_session = 1; + sip->option_no_setup = 1; + sip->option_no_option = 1; + } +- sep = strstr(s->buf, "enigma_minisatip"); ++ sep = strstr((char *)s->buf, "enigma_minisatip"); + if(sep && !ad->restart_when_tune) + { + LOGL(3, "Setting adapter %d to restart every time the transponder is changed", ad->id); +@@ -288,7 +288,7 @@ int satipc_close(sockets * s) + void set_adapter_signal(adapter *ad, char *b, int rlen) + { + int i, strength, status, snr; +- char *ver, *tun, *signal; ++ char *ver, *tun, *signal = NULL; + for (i = 0; i < rlen - 4; i++) + if (b[i] == 'v' && b[i + 1] == 'e' && b[i + 2] == 'r' + && b[i + 3] == '=') +@@ -314,13 +314,11 @@ void set_adapter_signal(adapter *ad, char *b, int rlen) + + int satipc_rtcp_reply(sockets * s) + { +- unsigned char *b = s->buf, *ver, *signal; +- char *tun; +- int i, rlen = s->rlen; ++ unsigned char *b = s->buf; ++ int rlen = s->rlen; + adapter *ad; + satipc *sip; + get_ad_and_sipr(s->sid, 0); +- int strength, status, snr; + uint32_t rp; + + s->rlen = 0; +@@ -335,7 +333,7 @@ int satipc_rtcp_reply(sockets * s) + ad->id, rp - sip->rcvp, sip->rtp_miss, sip->rtp_ooo, + ad->pid_err - ad->dec_err); + } +- set_adapter_signal(ad, b, rlen); ++ set_adapter_signal(ad, (char *)b, rlen); + return 0; + } + +@@ -488,7 +486,7 @@ int process_rtsp_tcp(sockets *ss, unsigned char *rtsp, int rtsp_len, void *buf, + { + tmp_char = rtsp[rtsp_len + 4]; + rtsp[rtsp_len + 4] = 0; +- set_adapter_signal(ad, rtsp + 4, rtsp_len); ++ set_adapter_signal(ad, (char *)rtsp + 4, rtsp_len); + rtsp[rtsp_len + 4] = tmp_char; + return 0; + } +@@ -513,8 +511,6 @@ int satipc_tcp_read(int socket, void *buf, int len, sockets *ss, int *rb) + { + unsigned char *rtsp; + sockets tmp_sock; +- uint16_t seq; +- static int iter; + int pos; + int rtsp_len; + int tmp_len = 0; +@@ -620,7 +616,7 @@ int satipc_tcp_read(int socket, void *buf, int len, sockets *ss, int *rb) + *rb = pos; + + } +- else if (!strncmp(rtsp, "RTSP", 4)) ++ else if (!strncmp((char *)rtsp, "RTSP", 4)) + { + unsigned char *nlnl, *cl; + int bytes, icl = 0; +@@ -630,7 +626,7 @@ int satipc_tcp_read(int socket, void *buf, int len, sockets *ss, int *rb) + LOG("%s: skipped %d bytes", __FUNCTION__, skipped_bytes); + skipped_bytes = 0; + } +- nlnl = strstr(rtsp, "\r\n\r\n"); ++ nlnl = (unsigned char *)strstr((char *)rtsp, "\r\n\r\n"); + // LOG("found RTSP nlnl %d, len %d", nlnl - rtsp, sip->tcp_len); + if(nlnl > sip->tcp_data + sip->tcp_len) + { +@@ -638,13 +634,13 @@ int satipc_tcp_read(int socket, void *buf, int len, sockets *ss, int *rb) + nlnl = NULL; + sip->tcp_data[sip->tcp_size + 1] = 0; + } +- if (nlnl && (cl = strcasestr(rtsp, "content-length:"))) ++ if (nlnl && (cl = (unsigned char *)strcasestr((char *)rtsp, "content-length:"))) + { + cl += 15; + while (*cl == 0x20) + cl++; + +- icl = map_intd(cl, NULL, 0); ++ icl = map_intd((char *)cl, NULL, 0); + nlnl += icl; + } + if (!nlnl) +@@ -821,7 +817,6 @@ int http_request(adapter *ad, char *url, char *method) + + session[0] = 0; + sid[0] = 0; +- int64_t ctime = getTick(); + remote_socket = sip->use_tcp ? ad->dvr : ad->fe; + + if (!sip->option_no_setup && !method && sip->sent_transport == 0) +@@ -1041,7 +1036,6 @@ void satipc_commit(adapter *ad) + + if (send_apids) + { +- int pids[MAX_PIDS]; + int i; + if (len > 0) + len += sprintf(url + len, "&"); +diff --git a/socketworks.c b/socketworks.c +index 6891c27..139fc60 100755 +--- a/socketworks.c ++++ b/socketworks.c +@@ -324,7 +324,7 @@ int tcp_listen(char *addr, int port) + int connect_local_socket(char *file, int blocking) + { + struct sockaddr_un serv; +- int sock, optval = 1; ++ int sock; + + + sock = socket(AF_LOCAL, SOCK_STREAM, 0); +@@ -593,7 +593,6 @@ __thread char *thread_name; + + void *select_and_execute(void *arg) + { +- fd_set io; + int i, rv, rlen, les, es; + unsigned char buf[2001]; + int err; +@@ -870,7 +869,6 @@ int get_mac(char *mac) + struct ifreq ifr; + struct ifconf ifc; + char buf[1024]; +- int success = 0; + + if (opts.mac[0]) + { +@@ -900,10 +898,7 @@ int get_mac(char *mac) + if (!(ifr.ifr_flags & IFF_LOOPBACK)) + { // don't count loopback + if (ioctl(sock, SIOCGIFHWADDR, &ifr) == 0) +- { +- success = 1; + break; +- } + } + } + else diff --git a/stream.c b/stream.c -index 374488a..c80a3a0 100755 +index 374488a..2b559cb 100755 --- a/stream.c +++ b/stream.c @@ -47,7 +47,7 @@ @@ -680,7 +1556,15 @@ index 374488a..c80a3a0 100755 extern int tuner_s2, tuner_t, tuner_c, tuner_t2, tuner_c2; char *describe_streams(sockets *s, char *req, char *sbuf, int size) -@@ -545,6 +545,10 @@ int64_t tbw, bw, bwtt; +@@ -295,6 +295,7 @@ int close_stream_for_socket(sockets *s) + LOG("%s: start close_stream_for_socket for id %d %p", __FUNCTION__, s->sid, sid); + if(sid) + sid->timeout = 1; ++ return 0; + } + + int close_stream(int i) +@@ -545,6 +546,10 @@ int64_t tbw, bw, bwtt; uint32_t reads, writes, failed_writes; int64_t nsecs; @@ -691,7 +1575,35 @@ index 374488a..c80a3a0 100755 uint64_t last_sd; int send_rtp(streams * sid, const struct iovec *iov, int liov) -@@ -1078,10 +1082,21 @@ int calculate_bw(sockets *s) +@@ -618,7 +623,6 @@ int send_rtcp(int s_id, int64_t ctime) + char dad[1000]; + char ra[50]; + unsigned char rtcp_buf[1600]; +- int c_time = (int) (ctime / 1000) & 0xFFFFFFFF; + unsigned char *rtcp = rtcp_buf + 4; + streams *sid = get_sid(s_id); + +@@ -891,10 +895,9 @@ int process_dmx(sockets * s) + { + void *min, *max; + int i, j, dp; +- static int cnt; + streams *sid; + adapter *ad; +- int send = 0, flush_all = 0; ++ int flush_all = 0; + int64_t stime; + + ad = get_adapter(s->sid); +@@ -990,7 +993,6 @@ int read_dmx(sockets * s) + adapter *ad; + int send = 0, flush_all = 0, ls, lse, i; + int threshold = opts.udp_threshold; +- uint64_t stime; + uint64_t rtime = getTick(); + + if (s->rlen % DVB_FRAME != 0) +@@ -1078,10 +1080,21 @@ int calculate_bw(sockets *s) tbw += bw; if (!reads) reads = 1; @@ -715,7 +1627,17 @@ index 374488a..c80a3a0 100755 bw = 0; failed_writes = 0; nsecs = 0; -@@ -1348,10 +1363,10 @@ _symbols stream_sym[] = +@@ -1303,8 +1316,7 @@ int get_stream_rport(int s_id) + char* get_stream_pids(int s_id, char *dest, int max_size) + { + int len = 0; +- int pids[MAX_PIDS]; +- int lp, i, j; ++ int i, j; + streams *s = get_sid_nw(s_id); + adapter *ad; + dest[0] = 0; +@@ -1348,10 +1360,10 @@ _symbols stream_sym[] = { "st_useragent", VAR_AARRAY_STRING, st, 1, MAX_STREAMS, offsetof( streams, useragent) }, { "st_rhost", VAR_FUNCTION_STRING, (void *) &get_stream_rhost, @@ -744,12 +1666,38 @@ index 05e9f09..15414e2 100644 + #endif diff --git a/utils.c b/utils.c -index 953ebe1..0e4c223 100755 +index 953ebe1..9c1913b 100755 --- a/utils.c +++ b/utils.c -@@ -758,10 +758,125 @@ int snprintf_pointer(char *dest, int max_len, int type, void *p, +@@ -199,12 +199,10 @@ int setItemTimeout(int64_t key, int tmout) + + int setItem(int64_t key, unsigned char *data, int len, int pos) // pos = -1 -> append, owerwrite the existing key + { +- int new_key = 0; + STmpinfo *s = getItemPos(key); + if (!s) + { + s = getFreeItemPos(key); +- new_key = 1; + } + if (!s) + LOG_AND_RETURN(-1, "%s failed for key %jx", __FUNCTION__, key); +@@ -449,7 +447,6 @@ void print_trace(void) + { + void *array[10]; + size_t size; +- char **strings; + size_t i; + #if !defined(NO_BACKTRACE) + +@@ -757,16 +754,135 @@ int snprintf_pointer(char *dest, int max_len, int type, void *p, + case VAR_HEX: nb = snprintf(dest, max_len, "0x%x", (int) ((*(int *) p) * multiplier)); break; ++ ++ default: ++ nb = 0; ++ break; } + if (nb > max_len) /* see man 'snprintf' */ + nb = max_len; @@ -874,7 +1822,13 @@ index 953ebe1..0e4c223 100755 void * get_var_address(char *var, float *multiplier, int * type, void *storage, int ls) -@@ -797,7 +912,6 @@ void * get_var_address(char *var, float *multiplier, int * type, void *storage, + { +- int nb = 0, i, j, off; ++ int i, j, off; + *multiplier = 0; + for (i = 0; sym[i] != NULL; i++) + for (j = 0; sym[i][j].name; j++) +@@ -797,7 +913,6 @@ void * get_var_address(char *var, float *multiplier, int * type, void *storage, if (!p) { @@ -882,7 +1836,16 @@ index 953ebe1..0e4c223 100755 p = zero; } else -@@ -949,20 +1063,23 @@ char *readfile(char *fn, char *ctype, int *len) +@@ -917,7 +1032,7 @@ char *readfile(char *fn, char *ctype, int *len) + char ffn[256]; + char *mem; + struct stat sb; +- int fd, i, nl = 0, sr; ++ int fd, nl = 0; + *len = 0; + ctype[0] = 0; + +@@ -949,20 +1064,23 @@ char *readfile(char *fn, char *ctype, int *len) if (ctype) { if (endswith(fn, "png")) @@ -914,6 +1877,57 @@ index 953ebe1..0e4c223 100755 } return mem; } +@@ -1071,7 +1189,7 @@ int mutex_unlock1(char *FILE, int line, SMutex* mutex) + if (rv == 0 || rv == 1) + rv = 0; + +- if (rv != -1 && imtx > 0) ++ if (rv != -1 && imtx > 0) { + if ((imtx >= 1) && mutexes[imtx - 1] == mutex) + imtx--; + else if ((imtx >= 2) && mutexes[imtx - 2] == mutex) +@@ -1081,7 +1199,7 @@ int mutex_unlock1(char *FILE, int line, SMutex* mutex) + } + else + LOG("mutex_leak: Expected %p got %p", mutex, mutexes[imtx - 1]); +- ++ } + return rv; + } + +@@ -1294,14 +1412,14 @@ void hexdump (char *desc, void *addr, int len) { + if ((i % 16) == 0) { + // Just don't print ASCII for the zeroth line. + if (i != 0) +- pos += sprintf (buf + pos, " %s\n", buff); ++ pos += sprintf ((char *)buf + pos, " %s\n", buff); + + // Output the offset. +- pos += sprintf (buf + pos, " %04x ", i); ++ pos += sprintf ((char *)buf + pos, " %04x ", i); + } + + // Now the hex code for the specific character. +- pos += sprintf (buf + pos, " %02x", pc[i]); ++ pos += sprintf ((char *)buf + pos, " %02x", pc[i]); + + // And store a printable ASCII character for later. + if ((pc[i] < 0x20) || (pc[i] > 0x7e)) +@@ -1313,12 +1431,12 @@ void hexdump (char *desc, void *addr, int len) { + + // Pad out last line if not exactly 16 characters. + while ((i % 16) != 0) { +- pos += sprintf (buf + pos, " "); ++ pos += sprintf ((char *)buf + pos, " "); + i++; + } + + // And print the final ASCII bit. +- pos += sprintf (buf + pos, " %s\n", buff); ++ pos += sprintf ((char *)buf + pos, " %s\n", buff); + if(!desc) + LOG("\n%s", buf) + else diff --git a/utils.h b/utils.h index 109eff9..4619511 100755 --- a/utils.h