Compare commits

...

16 Commits

Author SHA1 Message Date
Jaroslav Kysela ac318f2b8c fix1 2018-10-21 15:57:02 +02:00
Jaroslav Kysela c57118c568 upgrade-fw: use tar balls from github releases 2018-10-21 15:46:22 +02:00
Jaroslav Kysela 61f769b0a5 add binaries satip-axe-201810171851-15 2018-10-17 19:11:40 +02:00
Jaroslav Kysela a000ec29ba update README (build 15) 2018-10-17 19:00:27 +02:00
Jaroslav Kysela f397fdaf6c another minisatip8 fix 2018-10-17 18:50:26 +02:00
Jaroslav Kysela 7078b99048 Revert "fix new dropbear build"
This reverts commit 3ee63f168e.
2018-10-17 17:34:13 +02:00
Jaroslav Kysela 9a60791649 Revert "updated dropbear to 2018.76"
This reverts commit dbce4ca82b.
2018-10-17 17:34:06 +02:00
Jaroslav Kysela 3ee63f168e fix new dropbear build 2018-10-17 17:33:59 +02:00
Jaroslav Kysela e983b7d842 minisatip8: ignore wrong PIDs (VDR sends PID 65535!) 2018-10-17 17:11:51 +02:00
Jaroslav Kysela dbce4ca82b updated dropbear to 2018.76 2018-10-17 17:11:51 +02:00
Jaroslav Kysela 5affe3cd94 oscam: update to 11434 2018-10-17 17:11:50 +02:00
Jaroslav Kysela caecc4b044 minisatip8: improve status/signal reporting, default is threaded mode now 2018-10-17 17:11:50 +02:00
Jaroslav Kysela 85a07ae86b i2c_mangle: always set PLS code and mode, it's independent from MIS 2018-10-17 17:11:50 +02:00
Jaroslav Kysela c4875893a3 i2c_mangle: always set PLS code and mode, it's independent from MIS 2018-10-13 10:34:46 +02:00
Jaroslav Kysela fb0fd9fdbb minisatip8: more multistream fixes (add PLS ROOT mode support) 2018-10-13 00:51:02 +02:00
Jaroslav Kysela 47de7247b5 i2c_mangle: allow to set PLS mode, too 2018-10-13 00:48:30 +02:00
8 changed files with 441 additions and 133 deletions

View File

@ -80,7 +80,7 @@ MULTICAST_RTP_PACKAGE_NAME=multicast-rtp-2
TVHEADEND_COMMIT=master TVHEADEND_COMMIT=master
# 10663 10937 11234 11398 # 10663 10937 11234 11398
OSCAM_REV=11432 OSCAM_REV=11434
define GIT_CLONE define GIT_CLONE
@mkdir -p apps/host @mkdir -p apps/host
@ -161,7 +161,7 @@ fs.cpio: $(CPIO_SRCS)
$(foreach f,$(notdir $(wildcard apps/minisatip8/html/*)), -e "apps/minisatip8/html/$f:usr/share/minisatip8/html/$f") \ $(foreach f,$(notdir $(wildcard apps/minisatip8/html/*)), -e "apps/minisatip8/html/$f:usr/share/minisatip8/html/$f") \
-e "apps/$(NANO)/src/nano:usr/bin/nano" \ -e "apps/$(NANO)/src/nano:usr/bin/nano" \
-e "apps/mtd-utils/nandwrite:usr/sbin/nandwrite2" \ -e "apps/mtd-utils/nandwrite:usr/sbin/nandwrite2" \
-e "apps/oscam-svn/Distribution/oscam-1.20-unstable_svn$(OSCAM_REV)-sh4-linux:sbin/oscamd" -e "apps/oscam-svn/Distribution/oscam-1.20_svn$(OSCAM_REV)-sh4-linux:sbin/oscamd"
.PHONY: fs-list .PHONY: fs-list
fs-list: fs-list:

9
dist/README vendored
View File

@ -250,13 +250,14 @@ Bugs:
History: History:
-------- --------
satip-axe-2018 (build15) - ?? satip-axe-201810211549-15 - Sun Oct 21 2018
- moved the releases (firmware files) to github - moved the releases (firmware files) to github
- added minisatip8 - added minisatip8
- theaded mode is turned on by default (use -T to toggle)
- updated minisatip code (latest minisatip 0.7.16) - updated minisatip code (latest minisatip 0.7.16)
- note that some options were removed (-M) or added (-2) - note that some options were removed (-M) or added (-2)
- follow /etc/config.default and this file - follow /etc/config.default and this file
- fixed reported VDR problem (issue #108) - fixed reported VDR problems (issue #108)
- added DVB-S2 multistream support - added DVB-S2 multistream support
- fixed the improper tuner release problem for complex diseqc settings - fixed the improper tuner release problem for complex diseqc settings
where one input is used by multiple tuners (minisatip7 and minisatip8) where one input is used by multiple tuners (minisatip7 and minisatip8)
@ -264,7 +265,9 @@ satip-axe-2018 (build15) - ??
- modified net.ipv4.tcp_wmem (issue #102) - modified net.ipv4.tcp_wmem (issue #102)
- increased net.core.wmem_max=12582912 , it might help to prevent - increased net.core.wmem_max=12582912 , it might help to prevent
the UDP packet loss (issue #88) the UDP packet loss (issue #88)
- fixed time sync (ntpd) issue when DHCP is used (issue #109) - partly fixed time sync (ntpd) issue when DHCP is used (issue #109)
- upgraded python to 3.5.6 (package)
- upgraded oscam to rev.11434
satip-axe-201705251044-14 - Wed Jun 7 2017 satip-axe-201705251044-14 - Wed Jun 7 2017
- kernel modules from idl4k-1.25.0.157 (frontend + demux) - kernel modules from idl4k-1.25.0.157 (frontend + demux)

BIN
dist/satip-axe-201810211549-15.flash vendored Normal file

Binary file not shown.

BIN
dist/satip-axe-201810211549-15.fw vendored Normal file

Binary file not shown.

BIN
dist/satip-axe-201810211549-15.usb vendored Normal file

Binary file not shown.

View File

@ -1,11 +1,12 @@
#!/bin/sh #!/bin/sh
FILE="$1" FILE="$1"
DOWNLOAD=""
MTDDEV="/dev/mtd3" MTDDEV="/dev/mtd3"
SAFEFILE="/root/new.fw" SAFEFILE="/root/new.fw"
CHECKSTR="Linux-2.6.32.42_stm24_0208-idl4k" CHECKSTR="Linux-2.6.32.42_stm24_0208-idl4k"
GITHUB1="https://github.com/perexg/satip-axe/tree/master/dist"
GITHUB2="https://github.com/perexg/satip-axe/blob/master/dist/$FILE?raw=true" GITHUB1="https://api.github.com/repos/perexg/satip-axe/releases"
if test "$PWD" != "/root" -a "$PWD" != "/"; then if test "$PWD" != "/root" -a "$PWD" != "/"; then
echo "Run this utility from / or /root directory" echo "Run this utility from / or /root directory"
@ -17,23 +18,65 @@ if test "$FILE" = "-h" -o "$FILE" = "--help"; then
exit 1 exit 1
fi fi
if test -z "$FILE"; then if ! test -r "$FILE"; then
echo "Trying to fetch the list of available firmware files:" if test -z "$FILE"; then
if ! wget -q -O /root/list.txt "$GITHUB1"; then echo "Trying to fetch the list of available firmware files:"
else
echo "Trying to fetch the URL for the firmware:"
fi
if ! wget -q -O /root/list.json "$GITHUB1"; then
echo "FAILED" echo "FAILED"
exit 1 exit 1
fi fi
grep -o -E ">satip-axe-.*.fw<" /root/list.txt | grep -o -E "satip-axe.*.fw" cat /root/list.json | grep -E '("name"|"browser_download_url")' | \
rm /root/list.txt grep -v -E '"name":.*.tgz' | \
exit 0 while IFS="\n" read line
do
case "$line" in
\ *\"name\":*)
name=$(echo "$line" | cut -d '"' -f 4)
;;
\ *\"browser_download_url\":*)
fw=$(echo "$line" | cut -d '/' -f 9 | cut -d '"' -f 1 | cut -d '.' -f 1)
fw="$fw.fw"
if test -z "$FILE"; then
printf "%-40s : %s\n" "$name" "$fw"
else
if test "$FILE" = "$fw"; then
f=$(echo "$line" | cut -d '"' -f 4)
echo "$f" > /root/url.txt
printf " %s\n" "$f"
fi
fi
name=''
;;
esac
done
rm /root/list.json
if test -z "$FILE"; then
exit 0
fi
if test -r /root/url.txt; then
DOWNLOAD=$(cat /root/url.txt)
fi
fi fi
if ! test -r "$FILE"; then if test -n "$DOWNLOAD"; then
echo "Downloading $FILE:" echo "Downloading $FILE from $DOWNLOAD to $SAFEFILE:"
if ! wget -O "$SAFEFILE" "$GITHUB2/$FILE"; then if ! wget -O - "$DOWNLOAD" | tar xOzf - "$FILE" > "$SAFEFILE"; then
echo "Unable to fetch firmware file $GITHUB2" echo "Unable to fetch firmware file $DOWNLOAD / $FILE"
exit 1 exit 1
fi fi
if ! test -r "$SAFEFILE"; then
echo "Unable to fetch firmware file $DOWNLOAD / $FILE"
exit 1
fi
FILESIZE=$(stat -c "%s" "$SAFEFILE")
if test -z "$FILESIZE" -o $FILESIZE -le 0; then
echo "Download failed (wrong file size)!"
else
echo "Downloaded firmware $FILE (file $SAFEFILE size $FILESIZE bytes)..."
fi
FILE="$SAFEFILE" FILE="$SAFEFILE"
fi fi
@ -69,7 +112,7 @@ while test 1 -eq 1; do
nanddump -f "$SAFEFILE.old" -l "$FILESIZE" "$MTDDEV" nanddump -f "$SAFEFILE.old" -l "$FILESIZE" "$MTDDEV"
FILESIZE2=$(stat -c "%s" "$SAFEFILE.old") FILESIZE2=$(stat -c "%s" "$SAFEFILE.old")
if test "$FILESIZE" -gt "$FILESIZE2"; then if test "$FILESIZE" -gt "$FILESIZE2"; then
echo "Unable to verify (file sizes does not match - $FILESIZE > $FILESIZE2" echo "Unable to verify (file sizes does not match - $FILESIZE > $FILESIZE2)"
exit 1 exit 1
fi fi
if ! dd if=/dev/null seek="$FILESIZE" bs=1 of="$SAFEFILE.old" 2> /dev/null; then if ! dd if=/dev/null seek="$FILESIZE" bs=1 of="$SAFEFILE.old" 2> /dev/null; then
@ -78,7 +121,7 @@ while test 1 -eq 1; do
fi fi
FILESIZE2=$(stat -c "%s" "$SAFEFILE.old") FILESIZE2=$(stat -c "%s" "$SAFEFILE.old")
if test "$FILESIZE" != "$FILESIZE2"; then if test "$FILESIZE" != "$FILESIZE2"; then
echo "Unable to verify (file sizes does not match - $FILESIZE != $FILESIZE2" echo "Unable to verify (file sizes does not match - $FILESIZE != $FILESIZE2)"
exit 1 exit 1
fi fi
result=$(diff "$SAFEFILE.old" "$SAFEFILE") result=$(diff "$SAFEFILE.old" "$SAFEFILE")

View File

@ -32,7 +32,7 @@ index 8812322..519f3da 100755
myTable += "<td class='dt-right'>" + state['ad_axe_pktc'][i] + " </td>"; myTable += "<td class='dt-right'>" + state['ad_axe_pktc'][i] + " </td>";
myTable += "<td class='dt-right'>" + state['ad_axe_ccerr'][i] + " </td>"; myTable += "<td class='dt-right'>" + state['ad_axe_ccerr'][i] + " </td>";
diff --git a/src/adapter.c b/src/adapter.c diff --git a/src/adapter.c b/src/adapter.c
index e034e3e..9862114 100644 index e034e3e..2edf766 100644
--- a/src/adapter.c --- a/src/adapter.c
+++ b/src/adapter.c +++ b/src/adapter.c
@@ -75,6 +75,7 @@ adapter *adapter_alloc() @@ -75,6 +75,7 @@ adapter *adapter_alloc()
@ -97,7 +97,16 @@ index e034e3e..9862114 100644
#ifndef DISABLE_PMT #ifndef DISABLE_PMT
SPid *p = find_pid(aid, 0); SPid *p = find_pid(aid, 0);
SPid *p_all = find_pid(aid, 8192); SPid *p_all = find_pid(aid, 8192);
@@ -1066,7 +1070,7 @@ void mark_pids_deleted(int aid, int sid, char *pids) //pids==NULL -> delete all @@ -947,6 +951,8 @@ int tune(int aid, int sid)
ad->status = -1;
ad->status_cnt = 0;
ad->wait_new_stream = 1;
+ ad->strength = 0;
+ ad->snr = 0;
flush_data = 1;
ad->is_t2mi = 0;
if (ad->restart_when_tune)
@@ -1066,7 +1072,7 @@ void mark_pids_deleted(int aid, int sid, char *pids) //pids==NULL -> delete all
pids ? pids : "NULL"); pids ? pids : "NULL");
if (pids) if (pids)
{ {
@ -106,7 +115,7 @@ index e034e3e..9862114 100644
for (i = 0; i < la; i++) for (i = 0; i < la; i++)
{ {
pid = map_int(arg[i], NULL); pid = map_int(arg[i], NULL);
@@ -1146,7 +1150,7 @@ int mark_pids_add(int sid, int aid, char *pids) @@ -1146,11 +1152,11 @@ int mark_pids_add(int sid, int aid, char *pids)
LOG("adding pids to adapter %d, sid %d, pids=%s", aid, sid, LOG("adding pids to adapter %d, sid %d, pids=%s", aid, sid,
pids ? pids : "NULL"); pids ? pids : "NULL");
@ -115,7 +124,12 @@ index e034e3e..9862114 100644
for (i = 0; i < la; i++) for (i = 0; i < la; i++)
{ {
pid = map_intd(arg[i], NULL, -1); pid = map_intd(arg[i], NULL, -1);
@@ -1165,11 +1169,11 @@ int compare_tunning_parameters(int aid, transponder *tp) - if (pid == -1)
+ if (pid < 0 || pid > 8192)
continue;
if (mark_pid_add(sid, aid, pid) < 0)
return -1;
@@ -1165,11 +1171,11 @@ int compare_tunning_parameters(int aid, transponder *tp)
if (!ad) if (!ad)
return -1; return -1;
@ -132,7 +146,7 @@ index e034e3e..9862114 100644
return 1; return 1;
@@ -1196,11 +1200,11 @@ int set_adapter_parameters(int aid, int sid, transponder *tp) @@ -1196,11 +1202,11 @@ int set_adapter_parameters(int aid, int sid, transponder *tp)
{ {
mutex_unlock(&ad->mutex); mutex_unlock(&ad->mutex);
LOG( LOG(
@ -148,7 +162,7 @@ index e034e3e..9862114 100644
return -1; return -1;
} }
ad->do_tune = 1; ad->do_tune = 1;
@@ -1242,7 +1246,7 @@ int set_adapter_parameters(int aid, int sid, transponder *tp) @@ -1242,7 +1248,7 @@ int set_adapter_parameters(int aid, int sid, transponder *tp)
{ {
char *arg[64]; char *arg[64];
int i, la; int i, la;
@ -157,7 +171,38 @@ index e034e3e..9862114 100644
for (i = 0; i < la; i++) for (i = 0; i < la; i++)
{ {
int pmt = map_int(arg[i], NULL); int pmt = map_int(arg[i], NULL);
@@ -1346,7 +1350,7 @@ describe_adapter(int sid, int aid, char *dad, int ld) @@ -1316,16 +1322,20 @@ describe_adapter(int sid, int aid, char *dad, int ld)
if (use_ad)
{
- strength = ad->strength;
- snr = ad->snr;
- if (snr > 15)
- snr = snr >> 4;
- status = (ad->status & FE_HAS_LOCK) > 0;
-
- if (strength > 255 || strength < 0)
- strength = 1;
- if (snr > 15 || snr < 0)
- snr = 1;
+ if (ad->status == -1) {
+ status = strength = snr = 0;
+ } else {
+ strength = ad->strength;
+ snr = ad->snr;
+ if (snr > 15)
+ snr = snr >> 4;
+ status = (ad->status & FE_HAS_LOCK) > 0;
+
+ if (strength > 255 || strength < 0)
+ strength = 1;
+ if (snr > 15 || snr < 0)
+ snr = 1;
+ }
}
if (t->sys == 0)
len = snprintf(dad, ld, "ver=1.0;src=1;tuner=%d,0,0,0,0,,,,,,,;pids=",
@@ -1346,7 +1356,7 @@ describe_adapter(int sid, int aid, char *dad, int ld)
ad ? ad->tp.fe : aid + 1, strength, status, snr, ad ? ad->tp.fe : aid + 1, strength, status, snr,
(double)t->freq / 1000.0, t->bw / 1000000, get_delsys(t->sys), (double)t->freq / 1000.0, t->bw / 1000000, get_delsys(t->sys),
get_tmode(t->tmode), get_modulation(t->mtype), get_tmode(t->tmode), get_modulation(t->mtype),
@ -166,7 +211,7 @@ index e034e3e..9862114 100644
else else
len = len =
snprintf(dad, ld, snprintf(dad, ld,
@@ -1354,7 +1358,7 @@ describe_adapter(int sid, int aid, char *dad, int ld) @@ -1354,7 +1364,7 @@ describe_adapter(int sid, int aid, char *dad, int ld)
ad ? ad->tp.fe : aid + 1, strength, status, snr, ad ? ad->tp.fe : aid + 1, strength, status, snr,
(double)t->freq / 1000, get_delsys(t->sys), (double)t->freq / 1000, get_delsys(t->sys),
get_modulation(t->mtype), t->sr / 1000, t->c2tft, t->ds, get_modulation(t->mtype), t->sr / 1000, t->c2tft, t->ds,
@ -175,7 +220,7 @@ index e034e3e..9862114 100644
if (use_ad) if (use_ad)
len += strlen(get_stream_pids(sid, dad + len, ld - len)); len += strlen(get_stream_pids(sid, dad + len, ld - len));
@@ -1436,12 +1440,12 @@ void set_disable(int i, int v) @@ -1436,12 +1446,12 @@ void set_disable(int i, int v)
void enable_adapters(char *o) void enable_adapters(char *o)
{ {
int i, la, st, end, j; int i, la, st, end, j;
@ -190,7 +235,7 @@ index e034e3e..9862114 100644
for (i = 0; i < la; i++) for (i = 0; i < la; i++)
{ {
sep = strchr(arg[i], '-'); sep = strchr(arg[i], '-');
@@ -1463,10 +1467,10 @@ void enable_adapters(char *o) @@ -1463,10 +1473,10 @@ void enable_adapters(char *o)
void set_unicable_adapters(char *o, int type) void set_unicable_adapters(char *o, int type)
{ {
int i, la, a_id, slot, freq, pin, o13v; int i, la, a_id, slot, freq, pin, o13v;
@ -203,7 +248,7 @@ index e034e3e..9862114 100644
for (i = 0; i < la; i++) for (i = 0; i < la; i++)
{ {
a_id = map_intd(arg[i], NULL, -1); a_id = map_intd(arg[i], NULL, -1);
@@ -1503,11 +1507,11 @@ void set_unicable_adapters(char *o, int type) @@ -1503,11 +1513,11 @@ void set_unicable_adapters(char *o, int type)
void set_diseqc_adapters(char *o) void set_diseqc_adapters(char *o)
{ {
@ -218,7 +263,7 @@ index e034e3e..9862114 100644
for (i = 0; i < la; i++) for (i = 0; i < la; i++)
{ {
if (arg[i] && arg[i][0] == '*') if (arg[i] && arg[i][0] == '*')
@@ -1531,8 +1535,28 @@ void set_diseqc_adapters(char *o) @@ -1531,8 +1541,28 @@ void set_diseqc_adapters(char *o)
if (!sep1 || !sep2) if (!sep1 || !sep2)
continue; continue;
@ -249,7 +294,7 @@ index e034e3e..9862114 100644
committed_no = map_intd(sep1 + 1, NULL, -1); committed_no = map_intd(sep1 + 1, NULL, -1);
uncommitted_no = map_intd(sep2 + 1, NULL, -1); uncommitted_no = map_intd(sep2 + 1, NULL, -1);
if (committed_no < 0 || uncommitted_no < 0) if (committed_no < 0 || uncommitted_no < 0)
@@ -1541,12 +1565,14 @@ void set_diseqc_adapters(char *o) @@ -1541,12 +1571,14 @@ void set_diseqc_adapters(char *o)
if (ad) if (ad)
{ {
ad->diseqc_param.fast = fast; ad->diseqc_param.fast = fast;
@ -264,7 +309,7 @@ index e034e3e..9862114 100644
opts.diseqc_committed_no = committed_no; opts.diseqc_committed_no = committed_no;
opts.diseqc_uncommitted_no = uncommitted_no; opts.diseqc_uncommitted_no = uncommitted_no;
int j; int j;
@@ -1554,23 +1580,24 @@ void set_diseqc_adapters(char *o) @@ -1554,23 +1586,24 @@ void set_diseqc_adapters(char *o)
if (a[j]) if (a[j])
{ {
a[j]->diseqc_param.fast = fast; a[j]->diseqc_param.fast = fast;
@ -293,7 +338,7 @@ index e034e3e..9862114 100644
for (i = 0; i < la; i++) for (i = 0; i < la; i++)
{ {
if (arg[i] && arg[i][0] == '*') if (arg[i] && arg[i][0] == '*')
@@ -1619,10 +1646,10 @@ void set_diseqc_multi(char *o) @@ -1619,10 +1652,10 @@ void set_diseqc_multi(char *o)
void set_lnb_adapters(char *o) void set_lnb_adapters(char *o)
{ {
int i, la, a_id, lnb_low, lnb_high, lnb_switch; int i, la, a_id, lnb_low, lnb_high, lnb_switch;
@ -306,7 +351,7 @@ index e034e3e..9862114 100644
for (i = 0; i < la; i++) for (i = 0; i < la; i++)
{ {
if (arg[i] && arg[i][0] == '*') if (arg[i] && arg[i][0] == '*')
@@ -1692,11 +1719,11 @@ void set_diseqc_timing(char *o) @@ -1692,11 +1725,11 @@ void set_diseqc_timing(char *o)
int i, la, a_id; int i, la, a_id;
int before_cmd, after_cmd, after_repeated_cmd; int before_cmd, after_cmd, after_repeated_cmd;
int after_switch, after_burst, after_tone; int after_switch, after_burst, after_tone;
@ -320,7 +365,7 @@ index e034e3e..9862114 100644
for (i = 0; i < la; i++) for (i = 0; i < la; i++)
{ {
if (arg[i] && arg[i][0] == '*') if (arg[i] && arg[i][0] == '*')
@@ -1773,10 +1800,10 @@ void set_diseqc_timing(char *o) @@ -1773,10 +1806,10 @@ void set_diseqc_timing(char *o)
void set_slave_adapters(char *o) void set_slave_adapters(char *o)
{ {
int i, j, la, a_id, a_id2, master = 0; int i, j, la, a_id, a_id2, master = 0;
@ -333,7 +378,7 @@ index e034e3e..9862114 100644
for (i = 0; i < la; i++) for (i = 0; i < la; i++)
{ {
a_id = map_intd(arg[i], NULL, -1); a_id = map_intd(arg[i], NULL, -1);
@@ -1826,13 +1853,13 @@ void set_timeout_adapters(char *o) @@ -1826,13 +1859,13 @@ void set_timeout_adapters(char *o)
{ {
int i, j, la, a_id, a_id2; int i, j, la, a_id, a_id2;
int timeout = opts.adapter_timeout / 1000; int timeout = opts.adapter_timeout / 1000;
@ -349,7 +394,7 @@ index e034e3e..9862114 100644
if (arg[0] && (arg[0][0] == '*')) if (arg[0] && (arg[0][0] == '*'))
{ {
opts.adapter_timeout = timeout * 1000; opts.adapter_timeout = timeout * 1000;
@@ -1876,10 +1903,10 @@ extern char *fe_delsys[]; @@ -1876,10 +1909,10 @@ extern char *fe_delsys[];
void set_adapters_delsys(char *o) void set_adapters_delsys(char *o)
{ {
int i, la, a_id, ds; int i, la, a_id, ds;
@ -362,7 +407,7 @@ index e034e3e..9862114 100644
for (i = 0; i < la; i++) for (i = 0; i < la; i++)
{ {
a_id = map_intd(arg[i], NULL, -1); a_id = map_intd(arg[i], NULL, -1);
@@ -1916,10 +1943,10 @@ void set_adapters_delsys(char *o) @@ -1916,10 +1949,10 @@ void set_adapters_delsys(char *o)
void set_adapter_dmxsource(char *o) void set_adapter_dmxsource(char *o)
{ {
int i, j, la, st, end, fd; int i, j, la, st, end, fd;
@ -375,7 +420,7 @@ index e034e3e..9862114 100644
for (i = 0; i < la; i++) for (i = 0; i < la; i++)
{ {
sep = strchr(arg[i], '-'); sep = strchr(arg[i], '-');
@@ -1956,10 +1983,10 @@ void set_signal_multiplier(char *o) @@ -1956,10 +1989,10 @@ void set_signal_multiplier(char *o)
{ {
int i, la, a_id; int i, la, a_id;
float strength_multiplier, snr_multiplier; float strength_multiplier, snr_multiplier;
@ -388,7 +433,52 @@ index e034e3e..9862114 100644
for (i = 0; i < la; i++) for (i = 0; i < la; i++)
{ {
if (arg[i] && arg[i][0] == '*') if (arg[i] && arg[i][0] == '*')
@@ -2193,6 +2220,7 @@ _symbols adapters_sym[] = @@ -2030,24 +2063,28 @@ int delsys_match(adapter *ad, int del_sys)
int signal_thread(sockets *s)
{
- int i;
+ int i, status;
int64_t ts, ctime;
adapter *ad;
- for (i = 0; i < MAX_ADAPTERS; i++)
- if ((ad = get_adapter_nw(i)) && ad->get_signal && (ad->fe > 0) && ad->tp.freq && (ad->status_cnt++ > 0) // make sure the kernel has updated the status
- && (!opts.no_threads || (ad->status < 0)))
-
- {
- int status = ad->status;
- ts = getTick();
- ad->get_signal(ad);
- ctime = getTick();
- if (status == -1 || (opts.log & DEFAULT_LOG))
- LOG(
- "get_signal%s took %jd ms for adapter %d handle %d (status: %d, ber: %d, strength:%d, snr: %d, force scan %d)",
- (ad->new_gs == 1) ? "_new" : "", ctime - ts, ad->id, ad->fe,
- ad->status, ad->ber, ad->strength, ad->snr, opts.force_scan);
- }
+ for (i = 0; i < MAX_ADAPTERS; i++) {
+ if ((ad = get_adapter_nw(i)) == NULL || ad->get_signal == NULL)
+ continue;
+ if (ad->fe <= 0 || ad->tp.freq <= 0)
+ continue;
+ status = ad->status;
+ if (ad->status_cnt++ <= 0) // make sure the kernel has updated the status
+ continue;
+ if (opts.no_threads && !ad->fast_status && status >= 0)
+ continue;
+ ts = getTick();
+ ad->get_signal(ad);
+ ctime = getTick();
+ if (status == -1 || (opts.log & DEFAULT_LOG))
+ LOG(
+ "get_signal%s took %jd ms for adapter %d handle %d (status: %d, ber: %d, strength:%d, snr: %d, force scan %d)",
+ (ad->new_gs == 1) ? "_new" : "", ctime - ts, ad->id, ad->fe,
+ ad->status, ad->ber, ad->strength, ad->snr, opts.force_scan);
+ }
return 0;
}
@@ -2193,6 +2230,7 @@ _symbols adapters_sym[] =
{"ad_sr", VAR_AARRAY_INT, a, 1. / 1000, MAX_ADAPTERS, offsetof(adapter, tp.sr)}, {"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_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_diseqc", VAR_AARRAY_INT, a, 1, MAX_ADAPTERS, offsetof(adapter, tp.diseqc)},
@ -396,8 +486,21 @@ index e034e3e..9862114 100644
{"ad_fe", VAR_AARRAY_INT, a, 1, MAX_ADAPTERS, offsetof(adapter, fe)}, {"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_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)}, {"ad_sidcount", VAR_AARRAY_UINT8, a, 1, MAX_ADAPTERS, offsetof(adapter, sid_cnt)},
diff --git a/src/adapter.h b/src/adapter.h
index d1c3ec8..9ea412c 100644
--- a/src/adapter.h
+++ b/src/adapter.h
@@ -58,7 +58,7 @@ typedef struct struct_adapter
int64_t rtime;
int64_t last_sort;
int new_gs;
- int status, status_cnt;
+ int status, status_cnt, fast_status;
int dmx_source;
int master_source;
int is_fbc;
diff --git a/src/axe.c b/src/axe.c diff --git a/src/axe.c b/src/axe.c
index 52e8dad..57ba3a6 100644 index 52e8dad..e618c46 100644
--- a/src/axe.c --- a/src/axe.c
+++ b/src/axe.c +++ b/src/axe.c
@@ -48,7 +48,7 @@ @@ -48,7 +48,7 @@
@ -418,7 +521,7 @@ index 52e8dad..57ba3a6 100644
len = strlen(b = s); len = strlen(b = s);
while (len > 0) while (len > 0)
{ {
@@ -152,6 +154,49 @@ void axe_post_init(adapter *ad) @@ -152,6 +154,54 @@ void axe_post_init(adapter *ad)
sockets_setread(ad->sock, axe_read); sockets_setread(ad->sock, axe_read);
} }
@ -453,6 +556,7 @@ index 52e8dad..57ba3a6 100644
+ static int isi[4] = { -2, -2, -2, -2 }; + static int isi[4] = { -2, -2, -2, -2 };
+ static int pls_code[4] = { -2, -2, -2, -2 }; + static int pls_code[4] = { -2, -2, -2, -2 };
+ int v; + int v;
+ LOGM("axe: isi %d pls %d mode %d", tp->plp_isi, tp->pls_code, tp->pls_mode);
+ if (tp->plp_isi != isi[ad->pa]) { + if (tp->plp_isi != isi[ad->pa]) {
+ v = tp->plp_isi < 0 ? -1 : (tp->plp_isi & 0xff); + v = tp->plp_isi < 0 ? -1 : (tp->plp_isi & 0xff);
+ axe_stv0900_i2c_4("mis", ad->pa, v); + axe_stv0900_i2c_4("mis", ad->pa, v);
@ -460,6 +564,10 @@ index 52e8dad..57ba3a6 100644
+ } + }
+ if (tp->pls_code != pls_code[ad->pa]) { + if (tp->pls_code != pls_code[ad->pa]) {
+ v = tp->pls_code < 0 ? 0 : (tp->pls_code & 0x3ffff); + v = tp->pls_code < 0 ? 0 : (tp->pls_code & 0x3ffff);
+ if (tp->pls_mode == PLS_MODE_GOLD || tp->pls_mode < 0)
+ v |= 0x40000;
+ else if (tp->pls_mode == PLS_MODE_COMBO)
+ v |= 0x80000; /* really? */
+ axe_stv0900_i2c_4("pls", ad->pa, v); + axe_stv0900_i2c_4("pls", ad->pa, v);
+ pls_code[ad->pa] = tp->pls_code; + pls_code[ad->pa] = tp->pls_code;
+ } + }
@ -468,7 +576,7 @@ index 52e8dad..57ba3a6 100644
void axe_wakeup(void *_ad, int fe_fd, int voltage) void axe_wakeup(void *_ad, int fe_fd, int voltage)
{ {
int i, mask; int i, mask;
@@ -210,7 +255,7 @@ static inline int extra_quattro(int input, int diseqc, int *equattro) @@ -210,7 +260,7 @@ static inline int extra_quattro(int input, int diseqc, int *equattro)
return *equattro; return *equattro;
} }
@ -477,13 +585,13 @@ index 52e8dad..57ba3a6 100644
{ {
int input2 = input < 4 ? input : -1; int input2 = input < 4 ? input : -1;
adapter *ad = get_configured_adapter(input2); adapter *ad = get_configured_adapter(input2);
@@ -229,8 +274,30 @@ adapter *use_adapter(int input) @@ -229,8 +279,30 @@ adapter *use_adapter(int input)
return ad; return ad;
} }
-int tune_check(adapter *ad, int pol, int hiband, int diseqc) -int tune_check(adapter *ad, int pol, int hiband, int diseqc)
+int axe_get_hiband(transponder *tp, diseqc *diseqc_param) +int axe_get_hiband(transponder *tp, diseqc *diseqc_param)
+{ {
+ if (tp->pol > 2 && diseqc_param->lnb_circular > 0) + if (tp->pol > 2 && diseqc_param->lnb_circular > 0)
+ return 0; + return 0;
+ if (tp->freq < diseqc_param->lnb_switch) + if (tp->freq < diseqc_param->lnb_switch)
@ -503,13 +611,13 @@ index 52e8dad..57ba3a6 100644
+} +}
+ +
+int axe_tune_check(adapter *ad, transponder *tp, diseqc *diseqc_param, int diseqc) +int axe_tune_check(adapter *ad, transponder *tp, diseqc *diseqc_param, int diseqc)
{ +{
+ int pol = (tp->pol - 1) & 1; + int pol = (tp->pol - 1) & 1;
+ int hiband = axe_get_hiband(tp, diseqc_param); + int hiband = axe_get_hiband(tp, diseqc_param);
LOGM("axe: tune check for adapter %d, pol %d/%d, hiband %d/%d, diseqc %d/%d", 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); ad->id, ad->old_pol, pol, ad->old_hiband, hiband, ad->old_diseqc, diseqc);
if (ad->old_pol != pol) if (ad->old_pol != pol)
@@ -249,33 +316,25 @@ int axe_setup_switch(adapter *ad) @@ -249,33 +321,25 @@ int axe_setup_switch(adapter *ad)
{ {
int frontend_fd = ad->fe; int frontend_fd = ad->fe;
transponder *tp = &ad->tp; transponder *tp = &ad->tp;
@ -555,7 +663,7 @@ index 52e8dad..57ba3a6 100644
{ {
input = ad->id; input = ad->id;
if (!opts.quattro || extra_quattro(input, diseqc, &equattro)) if (!opts.quattro || extra_quattro(input, diseqc, &equattro))
@@ -298,7 +357,7 @@ int axe_setup_switch(adapter *ad) @@ -298,7 +362,7 @@ int axe_setup_switch(adapter *ad)
continue; continue;
if ((ad2->axe_used & ~(1 << ad->id)) == 0) if ((ad2->axe_used & ~(1 << ad->id)) == 0)
continue; continue;
@ -564,7 +672,7 @@ index 52e8dad..57ba3a6 100644
continue; continue;
break; break;
} }
@@ -327,7 +386,7 @@ int axe_setup_switch(adapter *ad) @@ -327,7 +391,7 @@ int axe_setup_switch(adapter *ad)
} }
diseqc = pos; diseqc = pos;
master = aid; master = aid;
@ -573,7 +681,7 @@ index 52e8dad..57ba3a6 100644
if (adm == NULL) if (adm == NULL)
{ {
LOG("axe_fe: unknown master adapter for input %d", input); LOG("axe_fe: unknown master adapter for input %d", input);
@@ -337,7 +396,7 @@ int axe_setup_switch(adapter *ad) @@ -337,7 +401,7 @@ int axe_setup_switch(adapter *ad)
else else
{ {
master = (ad->master_source >= 0) ? ad->master_source : ad->pa; master = (ad->master_source >= 0) ? ad->master_source : ad->pa;
@ -582,7 +690,7 @@ index 52e8dad..57ba3a6 100644
if (adm == NULL) if (adm == NULL)
{ {
LOG("axe_fe: unknown master adapter for input %d", input); LOG("axe_fe: unknown master adapter for input %d", input);
@@ -357,7 +416,7 @@ int axe_setup_switch(adapter *ad) @@ -357,7 +421,7 @@ int axe_setup_switch(adapter *ad)
if (ad2->sid_cnt > 0) if (ad2->sid_cnt > 0)
break; break;
} }
@ -591,7 +699,7 @@ index 52e8dad..57ba3a6 100644
{ {
LOG("unable to use slave adapter %d (master %d)", input, adm->pa); LOG("unable to use slave adapter %d (master %d)", input, adm->pa);
return 0; return 0;
@@ -368,10 +427,13 @@ int axe_setup_switch(adapter *ad) @@ -368,10 +432,13 @@ int axe_setup_switch(adapter *ad)
if (master >= 0) if (master >= 0)
{ {
input = master; input = master;
@ -607,7 +715,7 @@ index 52e8dad..57ba3a6 100644
adm->old_pol = pol; adm->old_pol = pol;
adm->old_hiband = hiband; adm->old_hiband = hiband;
adm->old_diseqc = diseqc; adm->old_diseqc = diseqc;
@@ -381,6 +443,7 @@ int axe_setup_switch(adapter *ad) @@ -381,6 +448,7 @@ int axe_setup_switch(adapter *ad)
} }
else if (opts.quattro) else if (opts.quattro)
{ {
@ -615,7 +723,7 @@ index 52e8dad..57ba3a6 100644
if (opts.quattro_hiband == 1 && hiband) if (opts.quattro_hiband == 1 && hiband)
{ {
LOG("axe_fe: hiband is not allowed for quattro config (adapter %d)", input); LOG("axe_fe: hiband is not allowed for quattro config (adapter %d)", input);
@@ -392,17 +455,19 @@ int axe_setup_switch(adapter *ad) @@ -392,17 +460,19 @@ int axe_setup_switch(adapter *ad)
return 0; return 0;
} }
input = ((hiband ^ 1) << 1) | (pol ^ 1); input = ((hiband ^ 1) << 1) | (pol ^ 1);
@ -639,7 +747,7 @@ index 52e8dad..57ba3a6 100644
adm->old_pol = pol; adm->old_pol = pol;
adm->old_hiband = hiband; adm->old_hiband = hiband;
adm->old_diseqc = 0; adm->old_diseqc = 0;
@@ -414,9 +479,15 @@ int axe_setup_switch(adapter *ad) @@ -414,9 +484,15 @@ int axe_setup_switch(adapter *ad)
else else
{ {
aid = ad->id & 3; aid = ad->id & 3;
@ -657,7 +765,7 @@ index 52e8dad..57ba3a6 100644
if (ad == NULL) if (ad == NULL)
{ {
LOGM("axe setup: unable to find adapter %d", input); LOGM("axe setup: unable to find adapter %d", input);
@@ -429,17 +500,20 @@ int axe_setup_switch(adapter *ad) @@ -429,17 +505,20 @@ int axe_setup_switch(adapter *ad)
ad->id, input, ad->fe, ad->fe2); ad->id, input, ad->fe, ad->fe2);
} }
@ -683,7 +791,7 @@ index 52e8dad..57ba3a6 100644
{ {
LOG("FD %d (%d) is a slave adapter", frontend_fd); LOG("FD %d (%d) is a slave adapter", frontend_fd);
} }
@@ -447,7 +521,7 @@ int axe_setup_switch(adapter *ad) @@ -447,7 +526,7 @@ int axe_setup_switch(adapter *ad)
{ {
if (ad->old_pol != pol || ad->old_hiband != hiband || ad->old_diseqc != diseqc) if (ad->old_pol != pol || ad->old_hiband != hiband || ad->old_diseqc != diseqc)
send_diseqc(ad, frontend_fd, diseqc, ad->old_diseqc != diseqc, pol, send_diseqc(ad, frontend_fd, diseqc, ad->old_diseqc != diseqc, pol,
@ -692,37 +800,44 @@ index 52e8dad..57ba3a6 100644
else else
LOGM("Skip sending diseqc commands since " LOGM("Skip sending diseqc commands since "
"the switch position doesn't need to be changed: " "the switch position doesn't need to be changed: "
@@ -545,7 +619,10 @@ int axe_tune(int aid, transponder *tp) @@ -545,7 +624,11 @@ int axe_tune(int aid, transponder *tp)
ADD_PROP(DTV_SYMBOL_RATE, tp->sr) ADD_PROP(DTV_SYMBOL_RATE, tp->sr)
ADD_PROP(DTV_INNER_FEC, tp->fec) ADD_PROP(DTV_INNER_FEC, tp->fec)
#if DVBAPIVERSION >= 0x0502 #if DVBAPIVERSION >= 0x0502
- ADD_PROP(DTV_STREAM_ID, tp->plp) - ADD_PROP(DTV_STREAM_ID, tp->plp)
+ ADD_PROP(DTV_STREAM_ID, tp->plp_isi) + if (tp->plp_isi >= 0)
+ ADD_PROP(DTV_STREAM_ID, tp->plp_isi & 0xFF)
+#endif +#endif
+#if DVBAPIVERSION >= 0x050b /* 5.11 */ +#if DVBAPIVERSION >= 0x050b /* 5.11 */
+ ADD_PROP(DTV_SCRAMBLING_SEQUENCE_INDEX, tp->pls_code) + ADD_PROP(DTV_SCRAMBLING_SEQUENCE_INDEX, pls_scrambling_index(tp))
#endif #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", 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) @@ -569,7 +652,8 @@ int axe_tune(int aid, transponder *tp)
ADD_PROP(DTV_TRANSMISSION_MODE, tp->tmode) ADD_PROP(DTV_TRANSMISSION_MODE, tp->tmode)
ADD_PROP(DTV_HIERARCHY, HIERARCHY_AUTO) ADD_PROP(DTV_HIERARCHY, HIERARCHY_AUTO)
#if DVBAPIVERSION >= 0x0502 #if DVBAPIVERSION >= 0x0502
- ADD_PROP(DTV_STREAM_ID, tp->plp & 0xFF) - ADD_PROP(DTV_STREAM_ID, tp->plp & 0xFF)
+ ADD_PROP(DTV_STREAM_ID, tp->plp_isi & 0xFF) + if (tp->plp_isi >= 0)
+ ADD_PROP(DTV_STREAM_ID, tp->plp_isi & 0xFF)
#endif #endif
LOG( LOG(
@@ -588,7 +665,7 @@ int axe_tune(int aid, transponder *tp) @@ -588,7 +672,12 @@ int axe_tune(int aid, transponder *tp)
freq = freq * 1000; freq = freq * 1000;
ADD_PROP(DTV_SYMBOL_RATE, tp->sr) ADD_PROP(DTV_SYMBOL_RATE, tp->sr)
#if DVBAPIVERSION >= 0x0502 #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 & 0xFF))
+ ADD_PROP(DTV_STREAM_ID, ((tp->ds & 0xFF) << 8) | (tp->plp_isi & 0xFF)) + if (tp->plp_isi >= 0) {
+ int v = tp->plp_isi & 0xFF;
+ if (tp->ds >= 0)
+ v |= (tp->ds & 0xFF) << 8;
+ ADD_PROP(DTV_STREAM_ID, v);
+ }
#endif #endif
// valid for DD DVB-C2 devices // valid for DD DVB-C2 devices
@@ -617,6 +694,8 @@ int axe_tune(int aid, transponder *tp) @@ -617,6 +706,8 @@ int axe_tune(int aid, transponder *tp)
break; break;
} }
@ -731,7 +846,7 @@ index 52e8dad..57ba3a6 100644
if ((ioctl(fd_frontend, FE_SET_PROPERTY, &p)) == -1) if ((ioctl(fd_frontend, FE_SET_PROPERTY, &p)) == -1)
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) @@ -669,8 +760,8 @@ fe_delivery_system_t axe_delsys(int aid, int fd, fe_delivery_system_t *sys)
void axe_get_signal(adapter *ad) void axe_get_signal(adapter *ad)
{ {
@ -742,7 +857,15 @@ index 52e8dad..57ba3a6 100644
get_signal(ad, &status, &ber, &strength, &snr); get_signal(ad, &status, &ber, &strength, &snr);
strength = strength * 240 / 24000; strength = strength * 240 / 24000;
@@ -819,9 +898,11 @@ void free_axe_input(adapter *ad) @@ -792,6 +883,7 @@ void find_axe_adapter(adapter **a)
ad->get_signal = (Device_signal)axe_get_signal;
ad->wakeup = (Device_wakeup)axe_wakeup;
ad->type = ADAPTER_DVB;
+ ad->fast_status = 1;
close(fd);
na++;
a_count = na; // update adapter counter
@@ -819,9 +911,11 @@ void free_axe_input(adapter *ad)
for (aid = 0; aid < 4; aid++) for (aid = 0; aid < 4; aid++)
{ {
@ -756,7 +879,7 @@ index 52e8dad..57ba3a6 100644
} }
} }
@@ -829,11 +910,11 @@ void free_axe_input(adapter *ad) @@ -829,11 +923,11 @@ void free_axe_input(adapter *ad)
void set_link_adapters(char *o) void set_link_adapters(char *o)
{ {
int i, la, a_id, b_id; int i, la, a_id, b_id;
@ -770,7 +893,7 @@ index 52e8dad..57ba3a6 100644
for (i = 0; i < la; i++) for (i = 0; i < la; i++)
{ {
a_id = map_intd(arg[i], NULL, -1); a_id = map_intd(arg[i], NULL, -1);
@@ -857,11 +938,11 @@ void set_link_adapters(char *o) @@ -857,11 +951,11 @@ void set_link_adapters(char *o)
void set_absolute_src(char *o) void set_absolute_src(char *o)
{ {
int i, la, src, inp, pos; int i, la, src, inp, pos;
@ -785,20 +908,40 @@ index 52e8dad..57ba3a6 100644
{ {
inps = strchr(arg[i], ':'); inps = strchr(arg[i], ':');
diff --git a/src/dvb.c b/src/dvb.c diff --git a/src/dvb.c b/src/dvb.c
index 5184c4d..1171f54 100644 index 5184c4d..aee0c75 100644
--- a/src/dvb.c --- a/src/dvb.c
+++ b/src/dvb.c +++ b/src/dvb.c
@@ -177,7 +177,8 @@ int detect_dvb_parameters(char *s, transponder *tp) @@ -120,6 +120,10 @@ char *fe_pol[] =
{"none", "v", "h", "r", "l",
NULL};
+char *fe_pls_mode[] =
+ {"root", "gold", "combo",
+ NULL};
+
#define make_func(a) \
char *get_##a(int i) \
{ \
@@ -142,6 +146,7 @@ make_func(gi);
make_func(specinv);
make_func(inversion);
make_func(pol);
+make_func(pls_mode);
#define INVALID_URL(a) \
{ \
@@ -177,7 +182,9 @@ int detect_dvb_parameters(char *s, transponder *tp)
tp->diseqc = -1; tp->diseqc = -1;
tp->c2tft = -1; tp->c2tft = -1;
tp->ds = -1; tp->ds = -1;
- tp->plp = -1; - tp->plp = -1;
+ tp->plp_isi = -1; + tp->plp_isi = -1;
+ tp->pls_mode = -1;
+ tp->pls_code = -1; + tp->pls_code = -1;
tp->pids = tp->apids = tp->dpids = tp->x_pmt = NULL; tp->pids = tp->apids = tp->dpids = tp->x_pmt = NULL;
@@ -192,7 +193,7 @@ int detect_dvb_parameters(char *s, transponder *tp) @@ -192,7 +199,7 @@ int detect_dvb_parameters(char *s, transponder *tp)
init_dvb_parameters(tp); init_dvb_parameters(tp);
LOG("detect_dvb_parameters (S)-> %s", s); LOG("detect_dvb_parameters (S)-> %s", s);
@ -807,7 +950,7 @@ index 5184c4d..1171f54 100644
for (i = 0; i < la; i++) for (i = 0; i < la; i++)
{ {
@@ -228,8 +229,11 @@ int detect_dvb_parameters(char *s, transponder *tp) @@ -228,8 +235,13 @@ int detect_dvb_parameters(char *s, transponder *tp)
tp->c2tft = map_int(arg[i] + 6, NULL); tp->c2tft = map_int(arg[i] + 6, NULL);
if (strncmp("ds=", arg[i], 3) == 0) if (strncmp("ds=", arg[i], 3) == 0)
tp->ds = map_int(arg[i] + 3, NULL); tp->ds = map_int(arg[i] + 3, NULL);
@ -816,12 +959,24 @@ index 5184c4d..1171f54 100644
+ if (strncmp("plp=", arg[i], 4) == 0 || + if (strncmp("plp=", arg[i], 4) == 0 ||
+ strncmp("isi=", arg[i], 4) == 0) + strncmp("isi=", arg[i], 4) == 0)
+ tp->plp_isi = map_int(arg[i] + 4, NULL); + tp->plp_isi = map_int(arg[i] + 4, NULL);
+ if (strncmp("plsm=", arg[i], 5) == 0)
+ tp->pls_mode = map_int(arg[i] + 5, fe_pls_mode);
+ if (strncmp("plsc=", arg[i], 5) == 0) + if (strncmp("plsc=", arg[i], 5) == 0)
+ tp->pls_code = map_int(arg[i] + 5, NULL); + tp->pls_code = map_int(arg[i] + 5, NULL);
if (strncmp("x_pmt=", arg[i], 6) == 0) if (strncmp("x_pmt=", arg[i], 6) == 0)
tp->x_pmt = arg[i] + 6; tp->x_pmt = arg[i] + 6;
@@ -323,8 +327,10 @@ void copy_dvb_parameters(transponder *s, transponder *d) @@ -275,6 +287,9 @@ void init_dvb_parameters(transponder *tp)
tp->mtype = QAM_AUTO;
tp->plts = PILOT_AUTO;
tp->fec = FEC_AUTO;
+ tp->ds = TP_VALUE_UNSET;
+ tp->plp_isi = TP_VALUE_UNSET;
+ tp->pls_mode = TP_VALUE_UNSET;
}
void copy_dvb_parameters(transponder *s, transponder *d)
@@ -323,8 +338,12 @@ void copy_dvb_parameters(transponder *s, transponder *d)
d->c2tft = s->c2tft; d->c2tft = s->c2tft;
if (s->ds != -1) if (s->ds != -1)
d->ds = s->ds; d->ds = s->ds;
@ -829,12 +984,14 @@ index 5184c4d..1171f54 100644
- d->plp = s->plp; - d->plp = s->plp;
+ if (s->plp_isi != -1) + if (s->plp_isi != -1)
+ d->plp_isi = s->plp_isi; + d->plp_isi = s->plp_isi;
+ if (s->pls_mode != -1)
+ d->pls_mode = s->pls_mode;
+ if (s->pls_code != -1) + if (s->pls_code != -1)
+ d->pls_code = s->pls_code; + d->pls_code = s->pls_code;
d->x_pmt = s->x_pmt; d->x_pmt = s->x_pmt;
d->apids = s->apids; d->apids = s->apids;
@@ -506,7 +512,9 @@ int send_diseqc(adapter *ad, int fd, int pos, int pos_change, int pol, int hiban @@ -506,7 +525,9 @@ int send_diseqc(adapter *ad, int fd, int pos, int pos_change, int pol, int hiban
posu = pos / 4; posu = pos / 4;
} }
@ -844,7 +1001,7 @@ index 5184c4d..1171f54 100644
uncmd.msg[3] = 0xf0 | (posu & 0x0f); uncmd.msg[3] = 0xf0 | (posu & 0x0f);
LOGM("send_diseqc fd %d, pos = %d (c %d u %d), pol = %d, hiband = %d", 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 @@ -554,12 +575,13 @@ int send_unicable(adapter *ad, int fd, int freq, int pos, int pol, int hiband, d
{ {
struct dvb_diseqc_master_cmd cmd = struct dvb_diseqc_master_cmd cmd =
{ {
@ -859,41 +1016,92 @@ index 5184c4d..1171f54 100644
cmd.msg[3] = ((t & 0x0300) >> 8) | (d->uslot << 5) | (pos ? 0x10 : 0) | (hiband ? 4 : 0) | (pol ? 8 : 0); cmd.msg[3] = ((t & 0x0300) >> 8) | (d->uslot << 5) | (pos ? 0x10 : 0) | (hiband ? 4 : 0) | (pol ? 8 : 0);
cmd.msg[4] = t & 0xff; cmd.msg[4] = t & 0xff;
@@ -825,7 +834,10 @@ int dvb_tune(int aid, transponder *tp) @@ -768,6 +790,21 @@ int setup_switch(adapter *ad)
iProp++; \
}
+uint32_t pls_scrambling_index(transponder *tp)
+{
+ if (tp->pls_mode == PLS_MODE_ROOT) {
+ /* convert ROOT code to GOLD code */
+ uint32_t x, g;
+ for (g = 0, x = 1; g < 0x3ffff; g++) {
+ if (tp->pls_code == x)
+ return g;
+ x = (((x ^ (x >> 7)) & 1) << 17) | (x >> 1);
+ }
+ return 0x3ffff;
+ }
+ return tp->pls_code; /* GOLD code 0 (default) */
+}
+
int dvb_tune(int aid, transponder *tp)
{
int64_t bclear, bpol;
@@ -825,7 +862,11 @@ int dvb_tune(int aid, transponder *tp)
ADD_PROP(DTV_PILOT, tp->plts) ADD_PROP(DTV_PILOT, tp->plts)
ADD_PROP(DTV_ROLLOFF, tp->ro) ADD_PROP(DTV_ROLLOFF, tp->ro)
#if DVBAPIVERSION >= 0x0502 #if DVBAPIVERSION >= 0x0502
- ADD_PROP(DTV_STREAM_ID, tp->plp) - ADD_PROP(DTV_STREAM_ID, tp->plp)
+ ADD_PROP(DTV_STREAM_ID, tp->plp_isi) + if (tp->plp_isi >= 0)
+ ADD_PROP(DTV_STREAM_ID, tp->plp_isi)
+#endif +#endif
+#if DVBAPIVERSION >= 0x050b /* 5.11 */ +#if DVBAPIVERSION >= 0x050b /* 5.11 */
+ ADD_PROP(DTV_SCRAMBLING_SEQUENCE_INDEX, tp->pls_code) + ADD_PROP(DTV_SCRAMBLING_SEQUENCE_INDEX, pls_scrambling_index(tp))
#endif #endif
#ifdef USE_DVBAPI3 #ifdef USE_DVBAPI3
@@ -856,7 +868,7 @@ int dvb_tune(int aid, transponder *tp) @@ -856,7 +897,8 @@ int dvb_tune(int aid, transponder *tp)
ADD_PROP(DTV_TRANSMISSION_MODE, tp->tmode) ADD_PROP(DTV_TRANSMISSION_MODE, tp->tmode)
ADD_PROP(DTV_HIERARCHY, HIERARCHY_AUTO) ADD_PROP(DTV_HIERARCHY, HIERARCHY_AUTO)
#if DVBAPIVERSION >= 0x0502 #if DVBAPIVERSION >= 0x0502
- ADD_PROP(DTV_STREAM_ID, tp->plp & 0xFF) - ADD_PROP(DTV_STREAM_ID, tp->plp & 0xFF)
+ ADD_PROP(DTV_STREAM_ID, tp->plp_isi & 0xFF) + if (tp->plp_isi >= 0)
+ ADD_PROP(DTV_STREAM_ID, tp->plp_isi & 0xFF)
#endif #endif
// old DVBAPI version 3 // old DVBAPI version 3
@@ -894,7 +906,7 @@ int dvb_tune(int aid, transponder *tp) @@ -894,7 +936,12 @@ int dvb_tune(int aid, transponder *tp)
freq = freq * 1000; freq = freq * 1000;
ADD_PROP(DTV_SYMBOL_RATE, tp->sr) ADD_PROP(DTV_SYMBOL_RATE, tp->sr)
#if DVBAPIVERSION >= 0x0502 #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 & 0xFF))
+ ADD_PROP(DTV_STREAM_ID, ((tp->ds & 0xFF) << 8) | (tp->plp_isi & 0xFF)) + if (tp->plp_isi >= 0) {
+ int v = tp->plp_isi & 0xFF;
+ if (tp->ds >= 0)
+ v |= (tp->ds & 0xFF) << 8;
+ ADD_PROP(DTV_STREAM_ID, v);
+ }
#endif #endif
// valid for DD DVB-C2 devices // valid for DD DVB-C2 devices
diff --git a/src/dvb.h b/src/dvb.h diff --git a/src/dvb.h b/src/dvb.h
index 9830487..21622dc 100644 index 9830487..99fc8f9 100644
--- a/src/dvb.h --- a/src/dvb.h
+++ b/src/dvb.h +++ b/src/dvb.h
@@ -189,12 +189,14 @@ typedef struct diseqc @@ -143,6 +143,12 @@ typedef enum fe_modulation {
} fe_modulation_t;
#endif
+typedef enum fe_pls_mode {
+ PLS_MODE_ROOT,
+ PLS_MODE_GOLD,
+ PLS_MODE_COMBO,
+} fe_pls_mode_t;
+
#if DVBAPIVERSION < 0x0505
#define DTV_ENUM_DELSYS 44
#define SYS_DVBC_ANNEX_A SYS_DVBC_ANNEX_AC
@@ -182,6 +188,8 @@ typedef enum fe_modulation {
#define MIN_FRQ_DVBS 950000
#define MAX_FRQ_DVBS 2150000
+#define TP_VALUE_UNSET (-255)
+
typedef struct diseqc
{
#define SWITCH_UNICABLE 1
@@ -189,12 +197,14 @@ typedef struct diseqc
#define SWITCH_SLAVE 3 #define SWITCH_SLAVE 3
int switch_type; int switch_type;
/* parameters */ /* parameters */
@ -914,7 +1122,7 @@ index 9830487..21622dc 100644
/* timing */ /* timing */
int before_cmd; int before_cmd;
int after_cmd; int after_cmd;
@@ -232,10 +234,10 @@ typedef struct struct_transponder @@ -232,10 +242,11 @@ typedef struct struct_transponder
diseqc diseqc_param; diseqc diseqc_param;
@ -925,12 +1133,30 @@ index 9830487..21622dc 100644
+ int c2tft; // DVB-C2 + int c2tft; // DVB-C2
+ int ds; // DVB-C2 (data slice) + int ds; // DVB-C2 (data slice)
+ int plp_isi; // DVB-T2/DVB-S2 + int plp_isi; // DVB-T2/DVB-S2
+ int pls_mode; // DVB-S2
+ int pls_code; // DVB-S2 + int pls_code; // DVB-S2
char *apids, *pids, *dpids, *x_pmt; char *apids, *pids, *dpids, *x_pmt;
} transponder; } transponder;
@@ -269,6 +280,8 @@ int detect_dvb_parameters(char *s, transponder *tp);
void init_dvb_parameters(transponder *tp);
void copy_dvb_parameters(transponder *s, transponder *d);
+uint32_t pls_scrambling_index(transponder *tp);
+
char *get_pilot(int i);
char *get_rolloff(int i);
char *get_delsys(int i);
@@ -279,6 +292,7 @@ char *get_gi(int i);
char *get_specinv(int i);
char *get_pol(int i);
char *get_inversion(int i);
+char *get_pls_mode(int i);
extern char *fe_delsys[];
extern char *fe_fec[];
diff --git a/src/minisatip.c b/src/minisatip.c diff --git a/src/minisatip.c b/src/minisatip.c
index 0cd9b0b..884f14c 100644 index 0cd9b0b..20e73e3 100644
--- a/src/minisatip.c --- a/src/minisatip.c
+++ b/src/minisatip.c +++ b/src/minisatip.c
@@ -286,6 +286,8 @@ Help\n\ @@ -286,6 +286,8 @@ Help\n\
@ -950,16 +1176,17 @@ index 0cd9b0b..884f14c 100644
opts.diseqc_before_cmd = 15; opts.diseqc_before_cmd = 15;
opts.diseqc_after_cmd = 54; opts.diseqc_after_cmd = 54;
opts.diseqc_after_repeated_cmd = 15; opts.diseqc_after_repeated_cmd = 15;
@@ -552,7 +555,7 @@ void set_options(int argc, char *argv[]) @@ -551,8 +554,7 @@ void set_options(int argc, char *argv[])
opts.no_threads = 1;
#endif #endif
#ifdef AXE #ifdef AXE
opts.no_threads = 1; - opts.no_threads = 1;
- opts.document_root = "/usr/share/minisatip/html"; - opts.document_root = "/usr/share/minisatip/html";
+ opts.document_root = "/usr/share/minisatip8/html"; + opts.document_root = "/usr/share/minisatip8/html";
#define AXE_OPTS "7:QW:8:A:" #define AXE_OPTS "7:QW:8:A:"
#else #else
#define AXE_OPTS "" #define AXE_OPTS ""
@@ -614,7 +617,7 @@ void set_options(int argc, char *argv[]) @@ -614,7 +616,7 @@ void set_options(int argc, char *argv[])
int i; int i;
memset(buf, 0, sizeof(buf)); memset(buf, 0, sizeof(buf));
strncpy(buf, optarg, sizeof(buf) - 1); strncpy(buf, optarg, sizeof(buf) - 1);
@ -968,7 +1195,7 @@ index 0cd9b0b..884f14c 100644
for (i = 0; i < la; i++) for (i = 0; i < la; i++)
{ {
int level = map_intd(arg[i], loglevels, -1); int level = map_intd(arg[i], loglevels, -1);
@@ -1046,7 +1049,7 @@ int read_rtsp(sockets *s) @@ -1046,7 +1048,7 @@ int read_rtsp(sockets *s)
return 0; return 0;
} }
@ -977,7 +1204,7 @@ index 0cd9b0b..884f14c 100644
cseq = 0; cseq = 0;
if (la < 2) if (la < 2)
LOG_AND_RETURN(0, LOG_AND_RETURN(0,
@@ -1311,7 +1314,7 @@ int read_http(sockets *s) @@ -1311,7 +1313,7 @@ int read_http(sockets *s)
LOG("read HTTP from %d sid: %d: ", s->sock, s->sid); LOG("read HTTP from %d sid: %d: ", s->sock, s->sid);
LOGM("%s", s->buf); LOGM("%s", s->buf);
@ -987,7 +1214,7 @@ index 0cd9b0b..884f14c 100644
if (strncmp(arg[0], "GET", 3) && strncmp(arg[0], "POST", 4) && !is_head) if (strncmp(arg[0], "GET", 3) && strncmp(arg[0], "POST", 4) && !is_head)
REPLY_AND_RETURN(503); REPLY_AND_RETURN(503);
diff --git a/src/minisatip.h b/src/minisatip.h diff --git a/src/minisatip.h b/src/minisatip.h
index 6512250..af22d77 100644 index 6512250..ad12dfa 100644
--- a/src/minisatip.h --- a/src/minisatip.h
+++ b/src/minisatip.h +++ b/src/minisatip.h
@@ -9,7 +9,7 @@ @@ -9,7 +9,7 @@
@ -995,7 +1222,7 @@ index 6512250..af22d77 100644
#define VERSION_BUILD "16" #define VERSION_BUILD "16"
#define CC(a, b, c) #a b #c #define CC(a, b, c) #a b #c
-#define VERSION CC(0.7., VERSION_BUILD, ) -#define VERSION CC(0.7., VERSION_BUILD, )
+#define VERSION CC(0.7., VERSION_BUILD, -axe212) +#define VERSION CC(0.7., VERSION_BUILD, -axe215)
void set_options(int argc, char *argv[]); void set_options(int argc, char *argv[]);
@ -1008,7 +1235,7 @@ index 6512250..af22d77 100644
int diseqc_uncommitted_no; int diseqc_uncommitted_no;
int diseqc_before_cmd; int diseqc_before_cmd;
diff --git a/src/satipc.c b/src/satipc.c diff --git a/src/satipc.c b/src/satipc.c
index 24c82ff..46ecb90 100644 index 24c82ff..e748048 100644
--- a/src/satipc.c --- a/src/satipc.c
+++ b/src/satipc.c +++ b/src/satipc.c
@@ -176,7 +176,7 @@ int satipc_reply(sockets *s) @@ -176,7 +176,7 @@ int satipc_reply(sockets *s)
@ -1020,34 +1247,43 @@ index 24c82ff..46ecb90 100644
rc = map_int(arg[1], NULL); rc = map_int(arg[1], NULL);
if (sip->option_no_session && sip->last_cmd == RTSP_OPTIONS && !sess && sip->session[0]) if (sip->option_no_session && sip->last_cmd == RTSP_OPTIONS && !sess && sip->session[0])
@@ -807,6 +807,8 @@ void get_s2_url(adapter *ad, char *url) @@ -807,6 +807,12 @@ void get_s2_url(adapter *ad, char *url)
FILL("&fec=%s", tp->fec, FEC_AUTO, get_fec(tp->fec)); FILL("&fec=%s", tp->fec, FEC_AUTO, get_fec(tp->fec));
FILL("&ro=%s", ro, ROLLOFF_AUTO, get_rolloff(ro)); FILL("&ro=%s", ro, ROLLOFF_AUTO, get_rolloff(ro));
FILL("&plts=%s", plts, PILOT_AUTO, get_pilot(plts)); FILL("&plts=%s", plts, PILOT_AUTO, get_pilot(plts));
+ FILL("&isi=%d", tp->plp_isi, 0, tp->plp_isi); + if (tp->plp_isi >= 0)
+ FILL("&plsc=%d", tp->pls_code, -1, tp->pls_code); + FILL("&isi=%d", tp->plp_isi, 0, tp->plp_isi);
+ if (tp->pls_mode >= 0)
+ FILL("&plsm=%s", tp->pls_mode, -1, get_pls_mode(tp->pls_mode));
+ if (tp->pls_code >= 0)
+ FILL("&plsc=%d", tp->pls_code, -1, tp->pls_code);
url[len] = 0; url[len] = 0;
return; return;
} }
@@ -831,7 +833,7 @@ void get_c2_url(adapter *ad, char *url) @@ -831,7 +837,8 @@ void get_c2_url(adapter *ad, char *url)
FILL("&specinv=%d", tp->inversion, INVERSION_AUTO, tp->inversion); FILL("&specinv=%d", tp->inversion, INVERSION_AUTO, tp->inversion);
FILL("&t2id=%d", tp->t2id, 0, tp->t2id); FILL("&t2id=%d", tp->t2id, 0, tp->t2id);
FILL("&sm=%d", tp->sm, 0, tp->sm); FILL("&sm=%d", tp->sm, 0, tp->sm);
- FILL("&plp=%d", tp->plp, 0, tp->plp); - FILL("&plp=%d", tp->plp, 0, tp->plp);
+ FILL("&plp=%d", tp->plp_isi, 0, tp->plp_isi); + if (tp->plp_isi >= 0)
+ FILL("&plp=%d", tp->plp_isi, 0, tp->plp_isi);
url[len] = 0; url[len] = 0;
return; return;
} }
@@ -855,7 +857,7 @@ void get_t2_url(adapter *ad, char *url) @@ -854,8 +861,10 @@ void get_t2_url(adapter *ad, char *url)
FILL("&tmode=%s", tp->tmode, TRANSMISSION_MODE_AUTO, get_tmode(tp->tmode));
FILL("&specinv=%d", tp->inversion, INVERSION_AUTO, tp->inversion); FILL("&specinv=%d", tp->inversion, INVERSION_AUTO, tp->inversion);
FILL("&c2tft=%d", tp->c2tft, 0, tp->c2tft); FILL("&c2tft=%d", tp->c2tft, 0, tp->c2tft);
FILL("&ds=%d", tp->ds, 0, tp->ds); - FILL("&ds=%d", tp->ds, 0, tp->ds);
- FILL("&plp=%d", tp->plp, 0, tp->plp); - FILL("&plp=%d", tp->plp, 0, tp->plp);
+ FILL("&plp=%d", tp->plp_isi, 0, tp->plp_isi); + if (tp->ds >= 0)
+ FILL("&ds=%d", tp->ds, 0, tp->ds);
+ if (tp->plp_isi >= 0)
+ FILL("&plp=%d", tp->plp_isi, 0, tp->plp_isi);
url[len] = 0; url[len] = 0;
return; return;
} }
@@ -1288,7 +1290,7 @@ void find_satip_adapter(adapter **a) @@ -1288,7 +1297,7 @@ void find_satip_adapter(adapter **a)
return; return;
char satip_servers[strlen(opts.satip_servers) + 10]; char satip_servers[strlen(opts.satip_servers) + 10];
strcpy(satip_servers, opts.satip_servers); strcpy(satip_servers, opts.satip_servers);
@ -1056,7 +1292,7 @@ index 24c82ff..46ecb90 100644
for (i = 0; i < la; i++) for (i = 0; i < la; i++)
{ {
@@ -1420,7 +1422,7 @@ void satip_getxml_data(char *data, int len, void *opaque, Shttp_client *h) @@ -1420,7 +1429,7 @@ void satip_getxml_data(char *data, int len, void *opaque, Shttp_client *h)
eos = strchr(sep, '<'); eos = strchr(sep, '<');
if (eos) if (eos)
*eos = 0; *eos = 0;
@ -1065,7 +1301,7 @@ index 24c82ff..46ecb90 100644
for (i = 0; i < la; i++) for (i = 0; i < la; i++)
{ {
int ds = map_intd(arg[i], satip_delsys, -1); int ds = map_intd(arg[i], satip_delsys, -1);
@@ -1474,7 +1476,7 @@ int satip_getxml(void *x) @@ -1474,7 +1483,7 @@ int satip_getxml(void *x)
memset(satip_xml, 0, sizeof(satip_xml)); memset(satip_xml, 0, sizeof(satip_xml));
memset(sxd, 0, sizeof(sxd)); memset(sxd, 0, sizeof(sxd));
strncpy(satip_xml, opts.satip_xml, sizeof(satip_xml) - 1); strncpy(satip_xml, opts.satip_xml, sizeof(satip_xml) - 1);
@ -1074,6 +1310,32 @@ index 24c82ff..46ecb90 100644
for (i = 0; i < la; i++) for (i = 0; i < la; i++)
{ {
SAFE_STRCPY(sxd[i].url, arg[i]); SAFE_STRCPY(sxd[i].url, arg[i]);
diff --git a/src/socketworks.c b/src/socketworks.c
index a6fb95e..0d0dac8 100644
--- a/src/socketworks.c
+++ b/src/socketworks.c
@@ -897,9 +897,10 @@ void *select_and_execute(void *arg)
sockets *ss;
lt = c_time;
i = -1;
- while (++i < max_sock)
- if ((ss = get_sockets(i)) && (ss->tid == tid) &&
- (((ss->timeout_ms > 0) && (lt - ss->rtime > ss->timeout_ms) && (ss->spos == ss->wpos)) || (ss->force_close)))
+ while (++i < max_sock) {
+ if ((ss = get_sockets(i)) == NULL || (ss->tid != tid))
+ continue;
+ if (((ss->timeout_ms > 0) && (lt - ss->rtime > ss->timeout_ms) && (ss->spos == ss->wpos)) || (ss->force_close))
{
if (ss->timeout && !ss->force_close)
{
@@ -915,6 +916,7 @@ void *select_and_execute(void *arg)
else
sockets_del(i);
}
+ }
}
}
diff --git a/src/stream.c b/src/stream.c diff --git a/src/stream.c b/src/stream.c
index bde2992..f587e93 100644 index bde2992..f587e93 100644
--- a/src/stream.c --- a/src/stream.c

View File

@ -25,7 +25,7 @@ static int i2c_mangle_enable = 1;
static int i2c_mangle_debug = 0; static int i2c_mangle_debug = 0;
static int stv6120_gain = 8; static int stv6120_gain = 8;
static int stv0900_mis[4] = { -1, -1, -1, -1 }; static int stv0900_mis[4] = { -1, -1, -1, -1 };
static int stv0900_pls[4] = { -1, -1, -1, -1 }; static int stv0900_pls[4] = { 1, 1, 1, 1 }; /* ROOT code 1 is equal to GOLD code 0 */
static void i2c_transfer_axe_dump(struct i2c_msg *msgs, int num) static void i2c_transfer_axe_dump(struct i2c_msg *msgs, int num)
{ {
@ -67,14 +67,14 @@ static void mangle(u8 *dst, struct i2c_msg *m, int i, int val, int shift, int ma
m->buf = dst; m->buf = dst;
} }
#define REG_SET3(b, b1, b2, b3) \ #define REG_SET3(b1, b2, b3) \
b[0] = b1, b[1] = b2, b[2] = b3 do { buf[num][0] = b1; buf[num][1] = b2; buf[num][2] = b3; num++; } while (0)
static void demod_set_pls_and_mis(struct i2c_adapter *adap, struct i2c_msg *src, int p) static void demod_set_pls_and_mis(struct i2c_adapter *adap, struct i2c_msg *src, int p)
{ {
struct i2c_msg m[6]; struct i2c_msg m[6];
u8 buf[6][3]; u8 buf[6][3];
int num, r, mis, idx = p ? 1 : 0; int num = 0, r, mis, idx = p ? 1 : 0;
u32 pls; u32 pls;
u8 iaddr = p ? 0xf3 : 0xf5; u8 iaddr = p ? 0xf3 : 0xf5;
@ -87,27 +87,27 @@ static void demod_set_pls_and_mis(struct i2c_adapter *adap, struct i2c_msg *src,
mis = stv0900_mis[idx]; mis = stv0900_mis[idx];
if (mis >= 0 && mis <= 255) { if (mis >= 0 && mis <= 255) {
/* PDELCTRL1 - enable filter */ /* PDELCTRL1 - enable filter */
REG_SET3(buf[0], iaddr, 0x50, 0x20); REG_SET3(iaddr, 0x50, 0x20);
/* ISIENTRY */ /* ISIENTRY */
REG_SET3(buf[1], iaddr, 0x5e, mis); REG_SET3(iaddr, 0x5e, mis);
/* ISIBITENA */ /* ISIBITENA */
REG_SET3(buf[2], iaddr, 0x5f, 0xff); REG_SET3(iaddr, 0x5f, 0xff);
/* set GOLD PLS code */
pls = stv0900_pls[idx];
iaddr--;
REG_SET3(buf[3], iaddr, 0xae, pls); /* PLROOT0 */
REG_SET3(buf[4], iaddr, 0xad, pls >> 8); /* PLROOT1 */
REG_SET3(buf[5], iaddr, 0xac, 0x04 | ((pls >> 16) & 3)); /* PLROOT3 */
num = 6;
if (i2c_mangle_debug & 4)
printk("i2c idx=%d: pls=%d mis=%d\n", idx, pls, mis);
} else { } else {
/* SWRST */
REG_SET3(iaddr, 0x72, 0xd1);
/* PDELCTRL1 - disable filter */ /* PDELCTRL1 - disable filter */
REG_SET3(buf[0], iaddr, 0x50, 0x00); REG_SET3(iaddr, 0x50, 0x00);
num = 1;
if (i2c_mangle_debug & 4)
printk("i2c idx=%d: disable mis filter\n", idx);
} }
/* set PLS code and mode (upper three bits) */
pls = stv0900_pls[idx];
REG_SET3(iaddr-1, 0xae, pls); /* PLROOT0 */
REG_SET3(iaddr-1, 0xad, pls >> 8); /* PLROOT1 */
REG_SET3(iaddr-1, 0xac, (pls >> 16) & 0x0f); /* PLROOT3 */
if (i2c_mangle_debug & 4)
printk("i2c idx=%d: pls=%d mode=%d mis=%d\n", idx,
pls & 0x3ffff, (pls >> 18) & 3, mis);
for (r = 0; r < num; r++) { for (r = 0; r < num; r++) {
m[r] = *src; m[r] = *src;
m[r].len = 3; m[r].len = 3;
@ -135,11 +135,11 @@ static void i2c_transfer_axe_mangle(struct i2c_adapter *adap, struct i2c_msg *ms
if (r == 0x01 || r == 0x0b) if (r == 0x01 || r == 0x0b)
mangle(mbuf[ret], m, i, stv6120_gain, 0, 0x0f); mangle(mbuf[ret], m, i, stv6120_gain, 0, 0x0f);
} else if (m->addr == STV0900_1 || m->addr == STV0900_2) { } else if (m->addr == STV0900_1 || m->addr == STV0900_2) {
/* inject pls/mis settings before CARCFG register update */ /* inject pls/mis settings before TSCFGH path merger reset */
if (m->flags == 0 && m->len == 3 && if (m->flags == 0 && m->len == 3 &&
(m->buf[0] == 0xf2 || m->buf[0] == 0xf4) && (m->buf[0] == 0xf3 || m->buf[0] == 0xf5) &&
m->buf[1] == 0x38 && m->buf[2] == 0x46) m->buf[1] == 0x72 && m->buf[2] == 0xd1)
demod_set_pls_and_mis(adap, m, m->buf[0] == 0xf2); demod_set_pls_and_mis(adap, m, m->buf[0] == 0xf3);
} }
} }
} }
@ -147,10 +147,10 @@ static void i2c_transfer_axe_mangle(struct i2c_adapter *adap, struct i2c_msg *ms
static int i2c_transfer_axe(struct i2c_adapter *adap, struct i2c_msg *msgs, int num) static int i2c_transfer_axe(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
{ {
if (adap == i2c_adapter0) { if (adap == i2c_adapter0) {
if (i2c_mangle_debug & 1)
i2c_transfer_axe_dump(msgs, num);
if (i2c_mangle_enable) if (i2c_mangle_enable)
i2c_transfer_axe_mangle(adap, msgs, num); i2c_transfer_axe_mangle(adap, msgs, num);
if (i2c_mangle_debug & 1)
i2c_transfer_axe_dump(msgs, num);
} }
return i2c_transfer2(adap, msgs, num); return i2c_transfer2(adap, msgs, num);
} }