aboutsummaryrefslogtreecommitdiffstats
path: root/test/test_switch.c
diff options
context:
space:
mode:
authoretobi <git@e-tobi.net>2013-09-03 09:48:38 +0200
committeretobi <git@e-tobi.net>2013-09-03 09:48:38 +0200
commit6e40287e2f39a80fc72bd8d0fbc1a8334d688c2d (patch)
tree024bef311226653bdd1da4fa588becf5098bcff7 /test/test_switch.c
downloadlinux-dvb-apps-6e40287e2f39a80fc72bd8d0fbc1a8334d688c2d.tar.gz
Imported Upstream version 1.1.0upstream/1.1.0
Diffstat (limited to '')
-rw-r--r--test/test_switch.c355
1 files changed, 355 insertions, 0 deletions
diff --git a/test/test_switch.c b/test/test_switch.c
new file mode 100644
index 0000000..7f80891
--- /dev/null
+++ b/test/test_switch.c
@@ -0,0 +1,355 @@
+/*
+ * test_switch.c - Test program for new API
+ *
+ * Copyright (C) 2001 Ralph Metzler <ralph@convergence.de>
+ * & Marcus Metzler <marcus@convergence.de>
+ for convergence integrated media GmbH
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ */
+
+#include <sys/ioctl.h>
+#include <stdio.h>
+#include <stdint.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <time.h>
+#include <sys/poll.h>
+
+#include <linux/dvb/dmx.h>
+#include <linux/dvb/frontend_old.h>
+#include <linux/dvb/sec.h>
+#include <linux/dvb/video.h>
+
+int fd_frontend;
+int fd_sec;
+int fd_demuxa;
+int fd_demuxv;
+int fd_demuxtt;
+
+struct dmx_sct_filter_params sctFilterParams;
+
+struct secCommand scmd;
+struct secCmdSequence scmds;
+struct dmx_pes_filter_params pesFilterParams;
+struct dmx_pes_filter_params pesFilterParamsV;
+struct dmx_pes_filter_params pesFilterParamsA;
+struct dmx_pes_filter_params pesFilterParamsTT;
+FrontendParameters frp;
+int front_type;
+
+
+set_front(void)
+{
+ fe_status_t stat = 0;
+ int i, freq;
+ uint32_t soff;
+
+ scmds.miniCommand = SEC_MINI_NONE;
+ scmds.numCommands = 1;
+ scmds.commands = &scmd;
+
+ soff = frp.u.qpsk.SymbolRate/16000;
+
+ if (ioctl(fd_sec, SEC_SEND_SEQUENCE, &scmds) < 0)
+ perror("setfront sec");
+ usleep(100000);
+
+ freq = frp.Frequency;
+
+ while(tune_it(&frp));
+}
+
+set_diseqc_nb(int nr)
+{
+ scmd.type=0;
+ scmd.u.diseqc.addr = 0x10;
+ scmd.u.diseqc.cmd = 0x38;
+ scmd.u.diseqc.numParams = 1;
+ scmd.u.diseqc.params[0] = 0xF0 | ((nr * 4) & 0x0F) |
+ (scmds.continuousTone == SEC_TONE_ON ? 1 : 0) |
+ (scmds.voltage==SEC_VOLTAGE_18 ? 2 : 0);
+}
+
+set_ttpid(ushort ttpid)
+{
+ if (ttpid==0 || ttpid==0xffff || ttpid==0x1fff) {
+ ioctl(fd_demuxtt, DMX_STOP, 0);
+ return;
+ }
+
+ pesFilterParamsTT.pid = ttpid;
+ pesFilterParamsTT.input = DMX_IN_FRONTEND;
+ pesFilterParamsTT.output = DMX_OUT_DECODER;
+ pesFilterParamsTT.pes_type = DMX_PES_TELETEXT;
+ pesFilterParamsTT.flags = DMX_IMMEDIATE_START;
+ if (ioctl(fd_demuxtt, DMX_SET_PES_FILTER,
+ &pesFilterParamsTT) < 0) {
+ printf("PID=%04x\n", ttpid);
+ perror("set_ttpid");
+ }
+}
+
+set_vpid(ushort vpid)
+{
+ if (vpid==0 || vpid==0xffff || vpid==0x1fff) {
+ ioctl(fd_demuxv, DMX_STOP, 0);
+ return;
+ }
+
+ pesFilterParamsV.pid = vpid;
+ pesFilterParamsV.input = DMX_IN_FRONTEND;
+ pesFilterParamsV.output = DMX_OUT_DECODER;
+ pesFilterParamsV.pes_type = DMX_PES_VIDEO;
+ pesFilterParamsV.flags = DMX_IMMEDIATE_START;
+ if (ioctl(fd_demuxv, DMX_SET_PES_FILTER,
+ &pesFilterParamsV) < 0)
+ perror("set_vpid");
+}
+
+set_apid(ushort apid)
+{
+ if (apid==0 || apid==0xffff || apid==0x1fff) {
+ ioctl(fd_demuxa, DMX_STOP, apid);
+ return;
+ }
+ pesFilterParamsA.pid = apid;
+ pesFilterParamsA.input = DMX_IN_FRONTEND;
+ pesFilterParamsA.output = DMX_OUT_DECODER;
+ pesFilterParamsA.pes_type = DMX_PES_AUDIO;
+ pesFilterParamsA.flags = DMX_IMMEDIATE_START;
+ if (ioctl(fd_demuxa, DMX_SET_PES_FILTER,
+ &pesFilterParamsA) < 0)
+ perror("set_apid");
+}
+
+int tune_it(FrontendParameters *frp)
+{
+ fe_status_t stat = 0;
+ int res;
+ FrontendEvent event;
+ int count = 0;
+ struct pollfd pfd[1];
+
+ if (ioctl(fd_frontend, FE_SET_FRONTEND, frp) <0)
+ perror("setfront front");
+
+
+
+ pfd[0].fd = fd_frontend;
+ pfd[0].events = POLLIN;
+
+ if (poll(pfd,1,3000)){
+ if (pfd[0].revents & POLLIN){
+ printf("Getting QPSK event\n");
+ if ( ioctl(fd_frontend, FE_GET_EVENT, &event)
+
+ == -EOVERFLOW){
+ perror("qpsk get event");
+ return -1;
+ }
+ printf("Received ");
+ switch(event.type){
+ case FE_UNEXPECTED_EV:
+ printf("unexpected event\n");
+ return -1;
+ case FE_FAILURE_EV:
+ printf("failure event\n");
+ return -1;
+
+ case FE_COMPLETION_EV:
+ printf("completion event\n");
+ }
+ }
+ }
+ return 0;
+}
+
+set_tp(uint *freq, int ttk, int pol, uint srate, int dis)
+{
+ if (*freq < 11700000) {
+ frp.Frequency = (*freq - 9750000);
+ scmds.continuousTone = SEC_TONE_OFF;
+ } else {
+ frp.Frequency = (*freq - 10600000);
+ scmds.continuousTone = SEC_TONE_ON;
+ }
+ if (pol) scmds.voltage = SEC_VOLTAGE_18;
+ else scmds.voltage = SEC_VOLTAGE_13;
+ set_diseqc_nb(dis);
+ frp.u.qpsk.SymbolRate = srate;
+ frp.u.qpsk.FEC_inner = 0;
+}
+
+get_front(void)
+{
+ set_vpid(0);
+ set_apid(0);
+ set_ttpid(0);
+ scmds.voltage = SEC_VOLTAGE_18;
+ scmds.miniCommand = SEC_MINI_NONE;
+ scmds.continuousTone = SEC_TONE_OFF;
+ scmds.numCommands=1;
+ scmds.commands=&scmd;
+
+ frp.Frequency=(12073000-10600000);
+ frp.u.qpsk.SymbolRate=25378000;
+ frp.u.qpsk.FEC_inner=(fe_code_rate_t)5;
+}
+
+
+void get_sect(int fd)
+{
+ u_char sec[4096];
+ int len, i;
+ uint16_t cpid = 0;
+ uint16_t length;
+ struct pollfd pfd;
+
+ pfd.fd = fd;
+ pfd.events = POLLIN;
+
+ while (1){
+ if (poll(&pfd, 1, 5000) != POLLIN) {
+ printf("not found\n");
+ printf("Timeout\n");
+ } else {
+ len = read(fd, sec, 4096);
+
+ length = (sec[1]& 0x0F)<<8;
+ length |= (sec[2]& 0xFF);
+
+
+ for (i= 0; i < length+3; i++) {
+ printf("0x%02x ",sec[i]);
+ if ( !((i+1)%8))
+ printf("\n");
+ }
+ printf("\n");
+ }
+ }
+}
+
+int FEReadStatus(int fd, fe_status_t *stat)
+{
+ int ans;
+
+ if ( (ans = ioctl(fd,FE_READ_STATUS,stat) < 0)){
+ perror("FE READ STATUS: ");
+ return -1;
+ }
+
+ if (*stat & FE_HAS_POWER)
+ printf("FE HAS POWER\n");
+
+ if (*stat & FE_HAS_SIGNAL)
+ printf("FE HAS SIGNAL\n");
+
+ if (*stat & FE_SPECTRUM_INV)
+ printf("QPSK SPEKTRUM INV\n");
+
+ return 0;
+}
+
+int has_signal()
+{
+ fe_status_t stat;
+
+ FEReadStatus(fd_frontend, &stat);
+ if (stat & FE_HAS_SIGNAL)
+ return 1;
+ else {
+ printf("Tuning failed\n");
+ return 0;
+ }
+}
+
+main()
+{
+ int freq;
+
+ fd_demuxtt = open("/dev/ost/demux", O_RDWR|O_NONBLOCK);
+ fd_frontend = open("/dev/ost/frontend", O_RDWR);
+ fd_sec = open("/dev/ost/sec", O_RDWR);
+ fd_demuxa = open("/dev/ost/demux", O_RDWR|O_NONBLOCK);
+ fd_demuxv = open("/dev/ost/demux", O_RDWR|O_NONBLOCK);
+
+// get_front();
+// set_vpid(0x7d0);
+// set_apid(0x7d2);
+// set_ttpid(0);
+// freq = 12073000;
+// set_tp(&freq, 1, 1, 25378000, 3);
+// set_diseqc_nb(dis);
+
+ scmds.voltage = SEC_VOLTAGE_18;
+// scmds.voltage = SEC_VOLTAGE_13;
+ scmds.miniCommand = SEC_MINI_NONE;
+ scmds.continuousTone = SEC_TONE_OFF;
+ scmds.numCommands=1;
+ scmds.commands=&scmd;
+ frp.Frequency = (12073000 - 10600000);
+// frp.Frequency = (11975000 - 10600000);
+ scmds.continuousTone = SEC_TONE_ON;
+ frp.u.qpsk.SymbolRate = 25378000;
+// frp.u.qpsk.SymbolRate = 27500000;
+// frp.u.qpsk.FEC_inner = FEC_AUTO;
+ frp.u.qpsk.FEC_inner = (fe_code_rate_t)5;
+ scmd.type=0;
+ scmd.u.diseqc.addr = 0x10;
+ scmd.u.diseqc.cmd = 0x38;
+ scmd.u.diseqc.numParams = 1;
+ scmd.u.diseqc.params[0] = 0xF0 | ((3 * 4) & 0x0F) |
+ (scmds.continuousTone == SEC_TONE_ON ? 1 : 0) |
+ (scmds.voltage==SEC_VOLTAGE_18 ? 2 : 0);
+
+ if (ioctl(fd_sec, SEC_SEND_SEQUENCE, &scmds) < 0)
+ perror("setfront sec");
+
+ while(tune_it(&frp));
+
+
+/*
+ if ((fd_demuxa=open("/dev/ost/demux", O_RDWR|O_NONBLOCK))
+ < 0){
+ perror("DEMUX DEVICE: ");
+ return -1;
+ }
+ memset(&sctFilterParams.filter, 0, sizeof(struct dmx_filter));
+ sctFilterParams.pid = 0x1fff;
+ sctFilterParams.filter.filter[0] = 0x00;
+ sctFilterParams.filter.mask[0] = 0x00;
+ sctFilterParams.timeout = 0;
+ sctFilterParams.flags = DMX_IMMEDIATE_START;
+
+ if (ioctl(fd_demuxa, DMX_SET_FILTER, &sctFilterParams) < 0)
+ perror("DMX SET FILTER:");
+
+
+ get_sect(fd_demuxa);
+*/
+ pesFilterParamsA.pid = 0x1fff;
+ pesFilterParamsA.input = DMX_IN_FRONTEND;
+ pesFilterParamsA.output = DMX_OUT_TS_TAP;
+ pesFilterParamsA.pes_type = DMX_PES_OTHER;
+ pesFilterParamsA.flags = DMX_IMMEDIATE_START;
+ if (ioctl(fd_demuxa, DMX_SET_PES_FILTER,
+ &pesFilterParamsA) < 0)
+ perror("set_apid");
+
+ while(1);
+}