[linux-dvb] cx24116 and FE_DISEQC_SEND_MASTER_CMD
pierre gronlier
ticapix at gmail.com
Tue Oct 28 14:05:52 CET 2008
Hi,
I just bought a hvr4000 dvb-s card. I have a dish with a quattro
monobloc lnb head. The first head is pointing towards Astra-19.2E and
the second one towards Hotbird-13.0E. There is no motor.
I'm using a 2.6.26 kernel with the v4l-dvb (mercurial) driver.
I can scan Astra with this command
scan -s 0 /usr/share/dvb/dvb-s/Astra-19.2E
and Hotbird with
scan -s 1 /usr/share/dvb/dvb-s/Hotbird-13.0E
In order to test it quickly, I tried kaffeine and with success I
manage to watch an astra channel, a hotbird channel - and even a
dvb-s2 channel with the dvb-s2 patch from hf.
Then I tried to use dvbstream.
The streaming of a astra channel is working. I tried the same thing
with a hotbirt channel, but my option -D 1 to set the correct lnb head
isn't working.
I took a look in the kaffeine-svn code (svn rev-876871) in the
dvbstream.cpp file I have this:
multimedia/kaffeine/src/input/dvb/dvbstream.cpp:544
544 #define DISEQC_X 2
545 int DvbStream::setDiseqc( int switchPos, ChannelDesc *chan,
int hiband, int &rotor, bool dvr )
546 {
547 struct dvb_diseqc_master_cmd switchCmd[] = {
548 { { 0xe0, 0x10, 0x38, 0xf0, 0x00, 0x00 }, 4 },
549 { { 0xe0, 0x10, 0x38, 0xf2, 0x00, 0x00 }, 4 },
550 { { 0xe0, 0x10, 0x38, 0xf1, 0x00, 0x00 }, 4 },
551 { { 0xe0, 0x10, 0x38, 0xf3, 0x00, 0x00 }, 4 },
552 { { 0xe0, 0x10, 0x38, 0xf4, 0x00, 0x00 }, 4 },
553 { { 0xe0, 0x10, 0x38, 0xf6, 0x00, 0x00 }, 4 },
554 { { 0xe0, 0x10, 0x38, 0xf5, 0x00, 0x00 }, 4 },
555 { { 0xe0, 0x10, 0x38, 0xf7, 0x00, 0x00 }, 4 },
556 { { 0xe0, 0x10, 0x38, 0xf8, 0x00, 0x00 }, 4 },
557 { { 0xe0, 0x10, 0x38, 0xfa, 0x00, 0x00 }, 4 },
558 { { 0xe0, 0x10, 0x38, 0xf9, 0x00, 0x00 }, 4 },
559 { { 0xe0, 0x10, 0x38, 0xfb, 0x00, 0x00 }, 4 },
560 { { 0xe0, 0x10, 0x38, 0xfc, 0x00, 0x00 }, 4 },
561 { { 0xe0, 0x10, 0x38, 0xfe, 0x00, 0x00 }, 4 },
562 { { 0xe0, 0x10, 0x38, 0xfd, 0x00, 0x00 }, 4 },
563 { { 0xe0, 0x10, 0x38, 0xff, 0x00, 0x00 }, 4 },
564 };
565
566 int i;
567 int voltage18 = ( (chan->tp.pol=='H')||(chan->tp.pol=='h') );
568 int ci = 4 * switchPos + 2 * hiband + (voltage18 ? 1 : 0);
569
570 fprintf( stderr, "DiSEqC: switch pos %i, %sV, %sband
(index %d)\n", switchPos, voltage18 ? "18" : "13", hiband ? "hi" :
"lo", ci );
571 if ( ci < 0 || ci >=
(int)(sizeof(switchCmd)/sizeof(struct dvb_diseqc_master_cmd)) )
572 return -EINVAL;
573
574 if ( ioctl(fdFrontend, FE_SET_TONE, SEC_TONE_OFF) )
575 perror("FE_SET_TONE failed");
576 usleep(15*1000);
577 if ( ioctl(fdFrontend, FE_SET_VOLTAGE, ci%2 ?
SEC_VOLTAGE_18 : SEC_VOLTAGE_13) )
578 perror("FE_SET_VOLTAGE failed");
579
580 fprintf( stderr, "DiSEqC: %02x %02x %02x %02x %02x
%02x\n", switchCmd[ci].msg[0], switchCmd[ci].msg[1],
switchCmd[ci].msg[2], switchCmd[ci].msg[3], switchCmd[ci].msg[4],
switchCmd[ci].msg[5] );
581 for ( i=0; i<DISEQC_X; ++i ) {
582 usleep(15*1000);
583 if ( ioctl(fdFrontend,
FE_DISEQC_SEND_MASTER_CMD, &switchCmd[ci]) )
584 perror("FE_DISEQC_SEND_MASTER_CMD failed");
585 }
Then in the dvbstream-cvs project file tune.c:56
56 static int diseqc_send_msg(int fd, fe_sec_voltage_t v, struct
diseqc_cmd *cmd,
57 fe_sec_tone_mode_t t, unsigned char sat_no)
58 {
59 if(ioctl(fd, FE_SET_TONE, SEC_TONE_OFF) < 0)
60 return -1;
61 if(ioctl(fd, FE_SET_VOLTAGE, v) < 0)
62 return -1;
63 usleep(15 * 1000);
64 if(sat_no >= 1 && sat_no <= 4) //1.x compatible equipment
65 {
66 fprintf( stderr, "DiSEqC: %02x %02x %02x %02x %02x
%02x\n", &cmd->cmd.msg[0], &cmd->cmd.msg[1], &cmd->cmd.msg[2],
&cmd->cmd.msg[3], &
66 cmd->cmd.msg[4], &cmd->cmd.msg[5] );
67
68 fprintf(stderr, "DEBUG %d\n", sat_no);
69 if(ioctl(fd, FE_DISEQC_SEND_MASTER_CMD, &cmd->cmd) < 0)
70 return -1;
71 usleep(cmd->wait * 1000);
72 usleep(15 * 1000);
73 }
The main diff is that the FE_DISEQC_SEND_MASTER_CMD ioctl call is
made twince in kaffeine.
So I made some changes in tune.c:
diff -u -r1.26 tune.c
--- tune.c 25 Sep 2007 21:49:10 -0000 1.26
+++ tune.c 28 Oct 2008 11:01:56 -0000
@@ -63,6 +63,12 @@
usleep(15 * 1000);
if(sat_no >= 1 && sat_no <= 4) //1.x compatible equipment
{
+ fprintf(stderr, "DEBUG %d\n", sat_no);
+ if(ioctl(fd, FE_DISEQC_SEND_MASTER_CMD, &cmd->cmd) < 0)
+ return -1;
+ usleep(15 * 1000);
if(ioctl(fd, FE_DISEQC_SEND_MASTER_CMD, &cmd->cmd) < 0)
return -1;
usleep(cmd->wait * 1000);
And now dvbstream is working fine with streaming hotbird channels.
Is that normal to have to repeat the command twince ?
Seems to me like a timing problem.
--
pierre
--
Pierre Gronlier
More information about the linux-dvb
mailing list