16 Commits

Author SHA1 Message Date
Jaroslav Kysela
6c7c2fb61e i2c_mangle: fix msi -> mis typo 2018-10-12 11:24:41 +02:00
Jaroslav Kysela
83d670b4c8 updated minisatip8 - multistream, diseqc address 2018-10-12 11:24:41 +02:00
perexg
9c91484e29 Update README 2018-10-12 11:24:40 +02:00
perexg
da33b45c9d Update README.md 2018-10-12 11:24:40 +02:00
Jaroslav Kysela
a0060a0d3a i2c_mangle module: add support for mis/pls settings (multistream) 2018-10-12 09:23:30 +02:00
Jaroslav Kysela
41964656ff dist/README: add note that releases are on github now 2018-10-08 17:40:20 +02:00
Jaroslav Kysela
495bc2efe4 README.md sync 2018-10-08 17:38:30 +02:00
Oliver Kurz
8f633628b9 Delete outdated firmware images which are better provided by github releases 2018-10-08 16:59:00 +02:00
Oliver Kurz
85f777c078 dist: Add notes regarding automount, missing web interface and DLNA 2018-10-08 16:58:42 +02:00
Jaroslav Kysela
516c4b1cb6 minisatip.md: remove -S for minisatip8 in the first table 2018-09-25 13:38:47 +02:00
Jaroslav Kysela
69febad731 added multicast-rtp-2.tar.gz and Python-3.5.6-1.tar.gz 2018-09-25 11:16:42 +02:00
Jaroslav Kysela
686cf548a7 fix python3-makefile.patch 2018-09-25 11:16:42 +02:00
Jaroslav Kysela
6b3ee4236f upgrade multicast-rtp, upgrade to python 3.5.6, upgrade oscam to 11432
Thanks to @lars18th on github for the multicast-rtp improvement.
2018-09-25 11:16:13 +02:00
Jaroslav Kysela
1472ca205c minisatip8: polarization fix 2018-09-24 20:37:20 +02:00
Jaroslav Kysela
18b4f42460 correct .md files for minisatip8 2018-09-24 17:13:01 +02:00
Jaroslav Kysela
d4130c5564 minisatip8 fixes (free input mode, argument parsing) 2018-09-24 16:56:39 +02:00
17 changed files with 1550 additions and 110 deletions

View File

@@ -69,18 +69,18 @@ NANO_FILENAME=$(NANO).tar.gz
NANO_DOWNLOAD=http://www.nano-editor.org/dist/v2.8/$(NANO_FILENAME)
PYTHON3_VERSION0=3.5
PYTHON3_VERSION=$(PYTHON3_VERSION0).3
PYTHON3_VERSION=$(PYTHON3_VERSION0).6
PYTHON3=Python-$(PYTHON3_VERSION)
PYTHON3_PACKAGE_NAME=$(PYTHON3)-1
PYTHON3_FILENAME=$(PYTHON3).tgz
PYTHON3_DOWNLOAD=https://www.python.org/ftp/python/$(PYTHON3_VERSION)/$(PYTHON3_FILENAME)
MULTICAST_RTP_PACKAGE_NAME=multicast-rtp-1
MULTICAST_RTP_PACKAGE_NAME=multicast-rtp-2
TVHEADEND_COMMIT=master
# 10663 10937 11234
OSCAM_REV=11398
# 10663 10937 11234 11398
OSCAM_REV=11432
define GIT_CLONE
@mkdir -p apps/host

View File

@@ -5,47 +5,23 @@ A firmware with minisatip for Inverto IDL-400s/Grundig GSS.BOX/Telestar Digibit
[![paypal](https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif)](http://paypal.me/perex)
The firmware contains various versions of [minisatip](https://github.com/catalinii/minisatip)
which is tuned to get the best performance on this hardware. There are many extensions for
the complex hobby satellite reception (like free input mode - use any tuner with any physical input,
DVB-S2 multistream support etc.).
There is no DLNA server, but there is HTTP and FTP server to server for
example m3u playlists to clients.
Releases:
---------
- download from [github releases](https://github.com/perexg/satip-axe/releases)
- see to [dist](https://github.com/perexg/satip-axe/tree/master/dist) directory - README file
- a TTL USB serial is not required to boot this precompiled firmware
from the USB stick or an installation to the internal flash
A notes for developers (might be outdated):
-------------------------------------------
Developers:
-----------
Requirements:
- git, python
- STLinux 2.4 (all-sh4-glibc) - http://www.stlinux.com - installed to /opt/STM/STLinux-2.4/
- fakeroot package/tools
Compilation:
- just type 'make'
- kernel with rootfs is in kernel/arch/sh/boot/uImage.gz
Booting uImage.gz on Inverto IDL-400S/Grundig GSS.BOX/Telestar Digibit R1 from USB:
- connect TTL USB serial adapter to J3 connector (4 pins at the power supply)
- pin 1 = 3.6V (do not use), pin 2 = GND, pin 3 = RXD (STM CPU), pin 4 = TXD (STM CPU)
- parameters: 115200,8N1
- press 'Enter' when you turn on the box (you have only one second) to get 'idl4k> ' prompt
(it seems that 'Enter' is required also to enable the serial console)
- modify bootargs (optional - for original firmware)
set bootargs=console=ttyAS0,115200
- set debugfw environment variable
set debugfw "debugfw=usb start;usb start;fatload usb 0 0x84000000 uimage.gz;set bootargs console=ttyAS0,115200 bigphysarea=20000;bootm 0x84000000"
- you may type 'save' to store this settings permanently
- to execute the debugfw type 'run debugfw'
- note that the USB stick should be in the first (upper) USB connector
Configuration
- dhcp client, telnetd, dropbear (ssh daemon) and minisatip are active by default
- configuration is stored in /etc/sysconfig/config
- see [debug](https://github.com/perexg/satip-axe/tree/master/debug)

37
debug/README.md Normal file
View File

@@ -0,0 +1,37 @@
A notes for developers (might be outdated):
-------------------------------------------
Requirements:
- git, python
- STLinux 2.4 (all-sh4-glibc) - http://www.stlinux.com - installed to /opt/STM/STLinux-2.4/
- fakeroot package/tools
Compilation:
- just type 'make'
- kernel with rootfs is in kernel/arch/sh/boot/uImage.gz
Booting uImage.gz on Inverto IDL-400S/Grundig GSS.BOX/Telestar Digibit R1 from USB:
- connect TTL USB serial adapter to J3 connector (4 pins at the power supply)
- pin 1 = 3.6V (do not use), pin 2 = GND, pin 3 = RXD (STM CPU), pin 4 = TXD (STM CPU)
- parameters: 115200,8N1
- press 'Enter' when you turn on the box (you have only one second) to get 'idl4k> ' prompt
(it seems that 'Enter' is required also to enable the serial console)
- modify bootargs (optional - for original firmware)
set bootargs=console=ttyAS0,115200
- set debugfw environment variable
set debugfw "debugfw=usb start;usb start;fatload usb 0 0x84000000 uimage.gz;set bootargs console=ttyAS0,115200 bigphysarea=20000;bootm 0x84000000"
- you may type 'save' to store this settings permanently
- to execute the debugfw type 'run debugfw'
- note that the USB stick should be in the first (upper) USB connector
Configuration
- dhcp client, telnetd, dropbear (ssh daemon) and minisatip are active by default
- configuration is stored in /etc/sysconfig/config

36
dist/README vendored
View File

@@ -79,6 +79,7 @@ Customization:
- if /etc/sysconfig/profile script exists, it is executed at login
- writeable ftp - copy /etc/inetd.conf to /etc/sysconfig/inetd.conf and
add -w argument to the ftpd daemon
- flash drives are automounted on /media
httpd:
------
@@ -97,21 +98,21 @@ nfsd:
- to list connected clients 'showmount'
- to list exports 'exportfs'
Minisatip8 (0.7.15) config:
Minisatip8 (0.7.16) config:
---------------------------
- this is the preferred minisatip server now
- you may add extra parameters to MINISATIP8_OPTS= in /etc/sysconfig/config
- WARNING: use -D with unique numbers if you have _multiple_ SAT>IP servers on net
- SEE: minisatip.md file in this directory for more details
- example 1: only two tuners: MINISATIP_OPTS="-e 0-1"
- example 2: unicable: MINISATIP_OPTS="-u 0:1-1420,1:0-1210,2:2-1680,3:3-2040"
- example 1: only two tuners: MINISATIP8_OPTS="-e 0-1"
- example 2: unicable: MINISATIP8_OPTS="-u 0:1-1420,1:0-1210,2:2-1680,3:3-2040"
- AXE hardware specific options:
-7 link adapters (identical src,lo/hi,h/v), the format is M:S (master:slave)
-Q quattro LNB config (H/H,H/V,L/H,L/V)
-9 X AXE unicable/jess input (0-3)
- example 3: unicable coax in input 2: MINISATIP_OPTS="-9 1"
- example 4: quattro LNB: MINISATIP_OPTS="-Q"
- example 4: quattro LNB: MINISATIP8_OPTS="-Q"
- example 5: coax in inputs 1,2, tuner 3 slave to input 1, tuner 4 slave to input 2
MINISATIP_OPTS="-7 0:2,1:3"
@@ -121,14 +122,14 @@ Minisatip 0.7 config:
- you may add extra parameters to MINISATIP7_OPTS= in /etc/sysconfig/config
- WARNING: use -D with unique numbers if you have _multiple_ SAT>IP servers on net
- SEE: minisatip.md file in this directory for more details
- example 1: only two tuners: MINISATIP_OPTS="-e 0-1"
- example 2: unicable: MINISATIP_OPTS="-u 0:1-1420,1:0-1210,2:2-1680,3:3-2040"
- example 1: only two tuners: MINISATIP7_OPTS="-e 0-1"
- example 2: unicable: MINISATIP7_OPTS="-u 0:1-1420,1:0-1210,2:2-1680,3:3-2040"
- AXE hardware specific options:
-7 link adapters (identical src,lo/hi,h/v), the format is M:S (master:slave)
-Q quattro LNB config (H/H,H/V,L/H,L/V)
-9 X AXE unicable/jess input (0-3)
- example 3: unicable coax in input 2: MINISATIP_OPTS="-9 1"
- example 4: quattro LNB: MINISATIP_OPTS="-Q"
- example 4: quattro LNB: MINISATIP7_OPTS="-Q"
- example 5: coax in inputs 1,2, tuner 3 slave to input 1, tuner 4 slave to input 2
MINISATIP_OPTS="-7 0:2,1:3"
@@ -200,6 +201,11 @@ Notes:
- the original firmware uses fw1-nand0 flash region (32M)
- the satip-axe firmware uses fw2-nand0 flash region (32M)
- data block is named data-nand0 - uses rest of flash
- the original firmware provides a web interface for administration, the
satip-axe uses local files for configuration.
- the original firmware provides a DLNA server. Within satip-axe the http
server can be used to provide for example channels maps in the form of
.m3u files
Disclaimer:
-----------
@@ -244,6 +250,22 @@ Bugs:
History:
--------
satip-axe-2018 (build15) - ??
- moved the releases (firmware files) to github
- added minisatip8
- updated minisatip code (latest minisatip 0.7.16)
- note that some options were removed (-M) or added (-2)
- follow /etc/config.default and this file
- fixed reported VDR problem (issue #108)
- added DVB-S2 multistream support
- fixed the improper tuner release problem for complex diseqc settings
where one input is used by multiple tuners (minisatip7 and minisatip8)
- added SYSLOGD_OPTS to pass extra options to syslog
- modified net.ipv4.tcp_wmem (issue #102)
- increased net.core.wmem_max=12582912 , it might help to prevent
the UDP packet loss (issue #88)
- fixed time sync (ntpd) issue when DHCP is used (issue #109)
satip-axe-201705251044-14 - Wed Jun 7 2017
- kernel modules from idl4k-1.25.0.157 (frontend + demux)
- updated minisatip5 (0.5.54)

14
dist/minisatip.md vendored
View File

@@ -8,12 +8,12 @@ the physical F-type connector on the box have numering 1-4.
NOTE: Some options identifiers were changed between minisatip5 and minisatip7:
minisatip7 | minisatip5/minisatip | description
-----------|----------------------|-----------------------------------
-7 | -L | tuner linking
-9 | -X | unicable input (-S for minisatip8)
-W | -P | AXE power
-8 | -Z | quattro hiband mode
minisatip7,8 | minisatip5/minisatip | description
-------------|----------------------|-----------------------------------
-7 | -L | tuner linking
-9 | -X | unicable input
-W | -P | AXE power
-8 | -Z | quattro hiband mode
other AXE specific option | decription
--------------------------|----------------------------------------
@@ -156,8 +156,6 @@ control the standard LNBs/diseqc equipment.
### Multiple unicable groups
For minisatip8 use -S argument.
You may connect multiple unicable LNBs through multiple coaxial
wires to the box. In this case, it is necessary to tell which tuners
will use which physical input. In this case '-9 T1,T2,T3,T4 /

BIN
dist/packages/Python-3.5.6-1.tar.gz vendored Normal file

Binary file not shown.

BIN
dist/packages/multicast-rtp-2.tar.gz vendored Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
--- Makefile.orig 2017-05-03 16:45:40.962475569 +0200
+++ Makefile 2017-05-03 16:48:52.644079190 +0200
@@ -618,7 +618,7 @@
--- Makefile.orig 2018-09-25 11:01:33.853198226 +0200
+++ Makefile 2018-09-25 11:07:57.416371544 +0200
@@ -587,7 +587,7 @@
*) quiet="";; \
esac; \
$(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED)' OPT='$(OPT)' \
@@ -9,7 +9,7 @@
$(PYTHON_FOR_BUILD) $(srcdir)/setup.py $$quiet build
# Build static library
@@ -728,17 +728,19 @@
@@ -697,6 +697,8 @@
############################################################################
# Importlib
@@ -18,30 +18,35 @@
Programs/_freeze_importlib.o: Programs/_freeze_importlib.c Makefile
Programs/_freeze_importlib: Programs/_freeze_importlib.o $(LIBRARY_OBJS_OMIT_FROZEN)
$(LINKCC) $(PY_LDFLAGS) -o $@ Programs/_freeze_importlib.o $(LIBRARY_OBJS_OMIT_FROZEN) $(LIBS) $(MODLIBS) $(SYSLIBS) $(LDLAST)
Python/importlib_external.h: # $(srcdir)/Lib/importlib/_bootstrap_external.py Programs/_freeze_importlib
@@ -706,12 +708,12 @@
regen-importlib: Programs/_freeze_importlib
# Regenerate Python/importlib_external.h
# from Lib/importlib/_bootstrap_external.py using _freeze_importlib
- ./Programs/_freeze_importlib \
+ $(FREEZE_IMPORTLIB) \
$(srcdir)/Lib/importlib/_bootstrap_external.py Python/importlib_external.h
Python/importlib.h: # $(srcdir)/Lib/importlib/_bootstrap.py Programs/_freeze_importlib
$(srcdir)/Lib/importlib/_bootstrap_external.py \
$(srcdir)/Python/importlib_external.h
# Regenerate Python/importlib.h from Lib/importlib/_bootstrap.py
# using _freeze_importlib
- ./Programs/_freeze_importlib \
+ $(FREEZE_IMPORTLIB) \
$(srcdir)/Lib/importlib/_bootstrap.py Python/importlib.h
$(srcdir)/Lib/importlib/_bootstrap.py \
$(srcdir)/Python/importlib.h
@@ -778,11 +780,8 @@
@@ -805,9 +807,6 @@
$(GRAMMAR_C): # $(GRAMMAR_H)
touch $(GRAMMAR_C)
$(IO_OBJS): $(IO_H)
-$(PGEN): $(PGENOBJS)
- $(CC) $(OPT) $(PY_LDFLAGS) $(PGENOBJS) $(LIBS) -o $(PGEN)
-
Parser/grammar.o: $(srcdir)/Parser/grammar.c \
$(srcdir)/Include/token.h \
$(srcdir)/Include/grammar.h
@@ -1620,7 +1619,7 @@
.PHONY: regen-grammar
-regen-grammar: $(PGEN)
+regen-grammar:
# Regenerate Include/graminit.h and Python/graminit.c
# from Grammar/Grammar using pgen
@$(MKDIR_P) Include
@@ -1625,7 +1624,7 @@
rm -rf $(COVERAGE_REPORT)
clobber: clean profile-removal

View File

@@ -14,6 +14,8 @@
#define STV6120_1 (0xc0 >> 1)
#define STV6120_2 (0xc6 >> 1)
#define STV0900_1 (0xd0 >> 1)
#define STV0900_2 (0xd2 >> 1)
extern int (*i2c_transfer_mangle)(struct i2c_adapter *adap, struct i2c_msg *msg, int num);
int i2c_transfer2(struct i2c_adapter *adap, struct i2c_msg *msg, int num);
@@ -22,17 +24,34 @@ static struct i2c_adapter *i2c_adapter0;
static int i2c_mangle_enable = 1;
static int i2c_mangle_debug = 0;
static int stv6120_gain = 8;
static int stv0900_mis[4] = { -1, -1, -1, -1 };
static int stv0900_pls[4] = { -1, -1, -1, -1 };
static void i2c_transfer_axe_dump(struct i2c_msg *msgs, int num)
{
struct i2c_msg *m;
int ret;
u8 *b;
for (ret = 0; ret < num; ret++) {
m = msgs + ret;
b = m->buf;
printk("i2c master_xfer[%d] %c, addr=0x%02x, "
"len=%d%s, flags=0x%x\n", ret, (msgs[ret].flags & I2C_M_RD)
? 'R' : 'W', msgs[ret].addr, msgs[ret].len,
(msgs[ret].flags & I2C_M_RECV_LEN) ? "+" : "",
msgs[ret].flags);
"len=%d%s, flags=0x%04x, "
"data[%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x]\n",
ret,
(m->flags & I2C_M_RD) ? 'R' : 'W',
m->addr, m->len,
(m->flags & I2C_M_RECV_LEN) ? "+" : "",
m->flags,
m->len > 0 ? b[0] : 0,
m->len > 1 ? b[1] : 0,
m->len > 2 ? b[2] : 0,
m->len > 3 ? b[3] : 0,
m->len > 4 ? b[4] : 0,
m->len > 5 ? b[5] : 0,
m->len > 6 ? b[6] : 0,
m->len > 7 ? b[7] : 0);
}
}
@@ -48,7 +67,60 @@ static void mangle(u8 *dst, struct i2c_msg *m, int i, int val, int shift, int ma
m->buf = dst;
}
static void i2c_transfer_axe_mangle(struct i2c_msg *msgs, int num)
#define REG_SET3(b, b1, b2, b3) \
b[0] = b1, b[1] = b2, b[2] = b3
static void demod_set_pls_and_mis(struct i2c_adapter *adap, struct i2c_msg *src, int p)
{
struct i2c_msg m[6];
u8 buf[6][3];
int num, r, mis, idx = p ? 1 : 0;
u32 pls;
u8 iaddr = p ? 0xf3 : 0xf5;
switch (src->addr) {
case STV0900_1: idx += 0; break;
case STV0900_2: idx += 2; break;
default: return;
}
mis = stv0900_mis[idx];
if (mis >= 0 && mis <= 255) {
/* PDELCTRL1 - enable filter */
REG_SET3(buf[0], iaddr, 0x50, 0x20);
/* ISIENTRY */
REG_SET3(buf[1], iaddr, 0x5e, mis);
/* ISIBITENA */
REG_SET3(buf[2], 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 {
/* PDELCTRL1 - disable filter */
REG_SET3(buf[0], iaddr, 0x50, 0x00);
num = 1;
if (i2c_mangle_debug & 4)
printk("i2c idx=%d: disable mis filter\n", idx);
}
for (r = 0; r < num; r++) {
m[r] = *src;
m[r].len = 3;
m[r].buf = buf[r];
}
if (i2c_mangle_debug & 1)
i2c_transfer_axe_dump(m, num);
r = i2c_transfer2(adap, m, num);
if (r < 0)
printk("i2c mangle demod pls and mis error! (%d)\n", r);
}
static void i2c_transfer_axe_mangle(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
{
static u8 mbuf[4][32];
struct i2c_msg *m;
@@ -58,10 +130,17 @@ static void i2c_transfer_axe_mangle(struct i2c_msg *msgs, int num)
m = msgs + ret;
if (m->len < 1 || (m->flags & I2C_M_RD) != 0)
continue;
if (m->addr == STV6120_1 || m->addr == STV6120_2)
if (m->addr == STV6120_1 || m->addr == STV6120_2) {
for (r = m->buf[0], i = 1; i < m->len; i++, r++)
if (r == 0x01 || r == 0x0b)
mangle(mbuf[ret], m, i, stv6120_gain, 0, 0x0f);
} else if (m->addr == STV0900_1 || m->addr == STV0900_2) {
/* inject pls/mis settings before CARCFG register update */
if (m->flags == 0 && m->len == 3 &&
(m->buf[0] == 0xf2 || m->buf[0] == 0xf4) &&
m->buf[1] == 0x38 && m->buf[2] == 0x46)
demod_set_pls_and_mis(adap, m, m->buf[0] == 0xf2);
}
}
}
@@ -71,7 +150,7 @@ static int i2c_transfer_axe(struct i2c_adapter *adap, struct i2c_msg *msgs, int
if (i2c_mangle_debug & 1)
i2c_transfer_axe_dump(msgs, num);
if (i2c_mangle_enable)
i2c_transfer_axe_mangle(msgs, num);
i2c_transfer_axe_mangle(adap, msgs, num);
}
return i2c_transfer2(adap, msgs, num);
}
@@ -140,6 +219,166 @@ static DEVICE_ATTR(stv6120_gain, 0644,
stv6120_gain_show,
stv6120_gain_store);
static ssize_t stv0900_mis1_show
(struct device *dev, struct device_attribute *attr, char *page)
{
return sprintf(page, "%i\n", stv0900_mis[0]);
}
static ssize_t stv0900_mis1_store
(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
{
int val = 0;
if (sscanf(buf, "%i", &val) != 1)
return -EINVAL;
stv0900_mis[0] = val;
return count;
}
static DEVICE_ATTR(stv0900_mis1, 0644,
stv0900_mis1_show,
stv0900_mis1_store);
static ssize_t stv0900_mis2_show
(struct device *dev, struct device_attribute *attr, char *page)
{
return sprintf(page, "%i\n", stv0900_mis[1]);
}
static ssize_t stv0900_mis2_store
(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
{
int val = 0;
if (sscanf(buf, "%i", &val) != 1)
return -EINVAL;
stv0900_mis[1] = val;
return count;
}
static DEVICE_ATTR(stv0900_mis2, 0644,
stv0900_mis2_show,
stv0900_mis2_store);
static ssize_t stv0900_mis3_show
(struct device *dev, struct device_attribute *attr, char *page)
{
return sprintf(page, "%i\n", stv0900_mis[2]);
}
static ssize_t stv0900_mis3_store
(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
{
int val = 0;
if (sscanf(buf, "%i", &val) != 1)
return -EINVAL;
stv0900_mis[2] = val;
return count;
}
static DEVICE_ATTR(stv0900_mis3, 0644,
stv0900_mis3_show,
stv0900_mis3_store);
static ssize_t stv0900_mis4_show
(struct device *dev, struct device_attribute *attr, char *page)
{
return sprintf(page, "%i\n", stv0900_mis[3]);
}
static ssize_t stv0900_mis4_store
(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
{
int val = 0;
if (sscanf(buf, "%i", &val) != 1)
return -EINVAL;
stv0900_mis[3] = val;
return count;
}
static DEVICE_ATTR(stv0900_mis4, 0644,
stv0900_mis4_show,
stv0900_mis4_store);
static ssize_t stv0900_pls1_show
(struct device *dev, struct device_attribute *attr, char *page)
{
return sprintf(page, "%i\n", stv0900_pls[0]);
}
static ssize_t stv0900_pls1_store
(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
{
int val = 0;
if (sscanf(buf, "%i", &val) != 1)
return -EINVAL;
stv0900_pls[0] = val;
return count;
}
static DEVICE_ATTR(stv0900_pls1, 0644,
stv0900_pls1_show,
stv0900_pls1_store);
static ssize_t stv0900_pls2_show
(struct device *dev, struct device_attribute *attr, char *page)
{
return sprintf(page, "%i\n", stv0900_pls[1]);
}
static ssize_t stv0900_pls2_store
(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
{
int val = 0;
if (sscanf(buf, "%i", &val) != 1)
return -EINVAL;
stv0900_pls[1] = val;
return count;
}
static DEVICE_ATTR(stv0900_pls2, 0644,
stv0900_pls2_show,
stv0900_pls2_store);
static ssize_t stv0900_pls3_show
(struct device *dev, struct device_attribute *attr, char *page)
{
return sprintf(page, "%i\n", stv0900_pls[2]);
}
static ssize_t stv0900_pls3_store
(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
{
int val = 0;
if (sscanf(buf, "%i", &val) != 1)
return -EINVAL;
stv0900_pls[2] = val;
return count;
}
static DEVICE_ATTR(stv0900_pls3, 0644,
stv0900_pls3_show,
stv0900_pls3_store);
static ssize_t stv0900_pls4_show
(struct device *dev, struct device_attribute *attr, char *page)
{
return sprintf(page, "%i\n", stv0900_pls[3]);
}
static ssize_t stv0900_pls4_store
(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
{
int val = 0;
if (sscanf(buf, "%i", &val) != 1)
return -EINVAL;
stv0900_pls[3] = val;
return count;
}
static DEVICE_ATTR(stv0900_pls4, 0644,
stv0900_pls4_show,
stv0900_pls4_store);
static void sysfs_create_entries(void)
{
struct kobject *kobj = &i2c_adapter0->dev.kobj;
@@ -147,6 +386,14 @@ static void sysfs_create_entries(void)
sysfs_create_file(kobj, &dev_attr_i2c_mangle_enable.attr);
sysfs_create_file(kobj, &dev_attr_i2c_mangle_debug.attr);
sysfs_create_file(kobj, &dev_attr_stv6120_gain.attr);
sysfs_create_file(kobj, &dev_attr_stv0900_mis1.attr);
sysfs_create_file(kobj, &dev_attr_stv0900_mis2.attr);
sysfs_create_file(kobj, &dev_attr_stv0900_mis3.attr);
sysfs_create_file(kobj, &dev_attr_stv0900_mis4.attr);
sysfs_create_file(kobj, &dev_attr_stv0900_pls1.attr);
sysfs_create_file(kobj, &dev_attr_stv0900_pls2.attr);
sysfs_create_file(kobj, &dev_attr_stv0900_pls3.attr);
sysfs_create_file(kobj, &dev_attr_stv0900_pls4.attr);
}
static void sysfs_remove_entries(void)
@@ -156,6 +403,14 @@ static void sysfs_remove_entries(void)
sysfs_remove_file(kobj, &dev_attr_i2c_mangle_enable.attr);
sysfs_remove_file(kobj, &dev_attr_i2c_mangle_debug.attr);
sysfs_remove_file(kobj, &dev_attr_stv6120_gain.attr);
sysfs_remove_file(kobj, &dev_attr_stv0900_mis1.attr);
sysfs_remove_file(kobj, &dev_attr_stv0900_mis2.attr);
sysfs_remove_file(kobj, &dev_attr_stv0900_mis3.attr);
sysfs_remove_file(kobj, &dev_attr_stv0900_mis4.attr);
sysfs_remove_file(kobj, &dev_attr_stv0900_pls1.attr);
sysfs_remove_file(kobj, &dev_attr_stv0900_pls2.attr);
sysfs_remove_file(kobj, &dev_attr_stv0900_pls3.attr);
sysfs_remove_file(kobj, &dev_attr_stv0900_pls4.attr);
}
/*

View File

@@ -2,6 +2,7 @@
#
# Tiny SAT>IP client which activates multicast streaming.
#
# Use command line parameters of
# Create /etc/sysconfig/multicast file with syntax:
#
# <mport>:<satip-params>
@@ -9,12 +10,12 @@
# You can modify this file when the program is active and
# reload the configuration using the SIGHUP signal.
#
# Example:
# Configuration Example:
#
# # Channel 1 on multicast port 5554, using first tuner (fe=1)
# 5554:fe=1&src=1&freq=12525&sr=27500&\
# msys=dvbs&mtype=qpsk&pol=v&fec=34&\
# pids=0,1,16,17,18,52,57,100,104,165,299,1029,3002,3003
# # Channel 1 on multicast port 5554, using first orbital position
# 5554:src=1&freq=11347&pol=v&ro=0.35&msys=dvbs2&\
# mtype=8psk&plts=on&sr=22000&fec=23&\
# pids=0,17,18,6600,6610,6620,6630
#
# The SAT>IP parameters should match the SAT>IP specification:
# http://www.satip.info/resources
@@ -23,27 +24,100 @@
# option -r <ipv4_mcast> or --remote-rtp <ipv4_mcast>. By default,
# this address is 239.255.255.250.
#
# Command-line example:
#
# ./multicast-rtp \
# -s 192.168.1.100:554 -d 239.0.0.1 -p 5554 \
# -u "src=1&freq=11347&pol=v&ro=0.35&msys=dvbs2&mtype=8psk&plts=on&sr=22000&fec=23&pids=0,17,18,6600,6610,6620,6630"
#
# Note: The SAT>IP server needs to support "target" spoofing
# and multicast address as "unicast" (minisatip project does it)
#
import os
import signal
import functools
import asyncio
import syslog
import argparse,sys
import signal
VERSION='0.1'
VERSION='0.2'
SYSLOG=False
SERVER='127.0.0.1:554'
CONFIG='/etc/sysconfig/multicast'
SYSLOG=True
if not os.path.exists('/etc/init.d/axe-settings'):
SERVER='gssbox1:554'
CONFIG='multicast'
SYSLOG=False
CONFIG=''
REQUEST=''
TARGET_ADDR=''
TARGET_PORT=0
USE_CONFIG=True
QUIET=False
#
# Command line parameters
#
parser = argparse.ArgumentParser(description='Request multicast streaming from a SAT>IP server.')
parser.add_argument('-q', '--quiet', dest='quiet',
action='store_true',
help='quiet display option')
parser.add_argument('-l', '--syslog', dest='syslog',
action='store_true',
help='enable System LOG')
parser.add_argument('-s', '--server', dest='server',
required=True,
help='server to connect')
parser.add_argument('-d', '--destination', dest='addr',
default='',
help='target address (Note: Only if server accept it!)')
parser.add_argument('-p', '--port', dest='port', type=int,
default=10000,
help='target port (default: 10000)')
group = parser.add_mutually_exclusive_group(required=True)
group.add_argument('-u', '--uri', dest='uri',
default='',
help='URI to request')
group.add_argument('-c', '--config', dest='config',
default='/etc/sysconfig/multicast',
help='config file with static multicast streams (default: /etc/sysconfig/multicast)')
args = parser.parse_args()
SYSLOG = args.syslog
if args.port > 0 and args.port < 65536 :
TARGET_PORT = args.port
else :
parser.print_help()
sys.exit()
if len(args.server) > 0 :
SERVER = args.server
else :
parser.print_help()
sys.exit()
if len(args.uri) > 0 :
REQUEST = args.uri
elif len(args.config) > 0 :
CONFIG = args.config
else :
parser.print_help()
sys.exit()
TARGET_ADDR = args.addr
QUIET = args.quiet
if len(REQUEST) > 0 :
USE_CONFIG = False
#
#
#
def log(msg):
if QUIET :
return
if SYSLOG:
syslog.syslog(msg)
else:
@@ -80,14 +154,19 @@ class RTSP_Protocol:
s = 'rtsp://%s:%d/?%s' % (peer[0], peer[1], self.params)
log('%d (open): %s' % (self.mport, s))
msg = 'SETUP ' + s + ' RTSP/1.0\r\n'
msg += 'Transport: RTP/AVP;multicast;port=%d-%d\r\n' % (self.mport, self.mport + 1)
if len(REQUEST) > 0 :
msg += 'Transport: RTP/AVP;unicast;destination=%s;client_port=%d-%d\r\n' % (TARGET_ADDR, self.mport, self.mport + 1)
else :
msg += 'Transport: RTP/AVP;multicast;port=%d-%d\r\n' % (self.mport, self.mport + 1)
msg += 'CSeq: 1\r\n\r\n'
log(' -----> : %s' % msg)
transport.write(msg.encode())
self.action = 'PLAY'
def data_received(self, data):
if not self.transport:
return
log(' <----- : %s' % data)
lines = data.decode("utf-8").splitlines()
if lines[0] != 'RTSP/1.0 200 OK':
return self.retry()
@@ -131,6 +210,10 @@ class RTSP_Protocol:
self.cseq = 2
elif self.action == 'OPTIONS' and self.cseq == 2:
log('%d (play): OK' % self.mport)
elif self.action == 'TEARDOWN':
log('%d (close): OK' % self.mport)
self.retry()
return
def options(self):
if not self.transport:
@@ -144,6 +227,19 @@ class RTSP_Protocol:
self.transport.write(msg.encode())
self.client.loop.call_at(loop.time() + self.timeout/2, self.options)
def teardown(self):
self.action = 'TEARDOWN'
if not self.transport:
return
peer = self.transport._sock.getpeername()
log('%d (teardown): Session %s, streamID %d' % (self.mport, self.session, self.streamID))
self.cseq += 1
msg = 'TEARDOWN rtsp://%s:%d/stream=%d RTSP/1.0\r\n' % (peer[0], peer[1], self.streamID)
msg += 'Session: %s\r\n' % self.session
msg += 'CSeq: %d\r\n\r\n' % self.cseq
self.transport.write(msg.encode())
self.client.loop.call_at(loop.time() + 1, self.retry)
def eof_received(self):
self.connection_lost(None)
@@ -159,7 +255,7 @@ class RTSP_Protocol:
def fatal(self):
if self.transport:
self.transport.close()
self.teardown()
self.client.protocol = None
self.client.fatal()
@@ -195,7 +291,7 @@ class RTSP_Client:
log("Remove multicast client: %s" % self.params)
self.dead = True
if self.protocol:
self.protocol.fatal()
self.protocol.teardown()
self.clients.remove_client(self)
#
@@ -207,8 +303,12 @@ class RTSP_Clients:
def __init__(self, loop):
self.loop = loop
self.clients = []
self.parse_config_file()
hupfcn = lambda: self.parse_config_file()
if USE_CONFIG :
self.parse_config_file()
hupfcn = lambda: self.parse_config_file()
else :
self.parse_request()
hupfcn = lambda: self.parse_request()
loop.add_signal_handler(signal.SIGHUP,
functools.partial(hupfcn))
@@ -224,6 +324,23 @@ class RTSP_Clients:
return
self.clients.append(RTSP_Client(self, params))
async def close_all(self):
for c in self.clients:
c.fatal()
def parse_request(self):
# mark clients
for c in self.clients:
c.deleteme = True
# parse command line
l = str(TARGET_PORT) + ':' + REQUEST
#print("parse_request: " + l)
self.add_client(l)
# remove marked clients
for c in self.clients:
if c.deleteme:
self.remove_client(c)
def parse_config_file(self):
# mark clients
for c in self.clients:
@@ -251,17 +368,43 @@ class RTSP_Clients:
self.remove_client(c)
#
# configuration file
# configuration
#
if SYSLOG:
syslog.openlog('multicast-rtp', 0, syslog.LOG_LOCAL7)
silent = QUIET
if QUIET :
QUIET = False
log('Version %s' % VERSION)
log('SERVER: %s' % SERVER)
log('CONFIG: %s' % CONFIG)
log('TARGET: %s:%d' % (TARGET_ADDR, TARGET_PORT))
log('REQUEST: %s' % REQUEST)
log('------------')
if silent :
log(' Start.')
QUIET = True
loop = asyncio.get_event_loop()
loop.add_signal_handler(signal.SIGTERM, signal.getsignal(signal.SIGINT))
clients = RTSP_Clients(loop)
try:
loop.run_forever()
except (KeyboardInterrupt, SystemExit) as e:
## Send TEARDOWN before exit!
log(' Closing.')
loop.run_until_complete(clients.close_all())
loop.run_until_complete(asyncio.sleep(1.0))
except:
print('*******')
finally:
QUIET = False
log(' Stop.')
loop.close()
if SYSLOG:
syslog.closelog()
sys.exit(0)