Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
Steve Lhomme
VLC
Commits
756a9df7
Commit
756a9df7
authored
Aug 05, 2003
by
Jean-Paul Saman
Browse files
- Enabled tuning for DVB-C and DVB-T cards.
- Syncing with old satellite plugin. - Cleanup of code.
parent
712d1a84
Changes
4
Hide whitespace changes
Inline
Side-by-side
modules/access/dvb/access.c
View file @
756a9df7
...
...
@@ -78,21 +78,27 @@ int E_(Open) ( vlc_object_t *p_this )
char
*
psz_parser
;
char
*
psz_next
;
int
i_fd
=
0
;
unsigned
int
u_adapter
=
1
;
unsigned
int
u_device
=
0
;
unsigned
int
u_adapter
=
1
;
unsigned
int
u_device
=
0
;
unsigned
int
u_freq
=
0
;
unsigned
int
u_srate
=
0
;
vlc_bool_t
b_polarisation
=
0
;
int
i_fec
=
0
;
fe_code_rate_t
fe_fec
=
FEC_NONE
;
vlc_bool_t
b_diseqc
;
vlc_bool_t
b_probe
;
int
i_lnb_lof1
;
int
i_lnb_lof2
;
int
i_lnb_slof
;
char
dvr
[]
=
DVR
;
char
frontend
[]
=
FRONTEND
;
int
i_len
=
0
;
int
i_bandwidth
=
0
;
int
i_modulation
=
0
;
int
i_guard
=
0
;
int
i_transmission
=
0
;
int
i_hierarchy
=
0
;
vlc_bool_t
b_polarisation
=
0
;
int
i_fec
=
0
;
int
i_code_rate_HP
=
0
;
int
i_code_rate_LP
=
0
;
vlc_bool_t
b_diseqc
;
vlc_bool_t
b_probe
;
char
dvr
[]
=
DVR
;
char
frontend
[]
=
FRONTEND
;
int
i_len
=
0
;
/* parse the options passed in command line : */
psz_parser
=
strdup
(
p_input
->
psz_name
);
...
...
@@ -105,42 +111,44 @@ int E_(Open) ( vlc_object_t *p_this )
// Get adapter and device number to use for this dvb card
u_adapter
=
config_GetInt
(
p_input
,
"adapter"
);
u_device
=
config_GetInt
(
p_input
,
"device"
);
/* Determine frontend device information and capabilities */
b_probe
=
config_GetInt
(
p_input
,
"probe"
);
if
(
b_probe
)
{
{
if
(
ioctl_InfoFrontend
(
p_input
,
&
frontend_info
,
u_adapter
,
u_device
)
<
0
)
{
msg_Err
(
p_input
,
"(access) cannot determine frontend info"
);
return
-
1
;
}
if
(
frontend_info
.
type
!=
FE_QPSK
)
{
msg_Err
(
p_input
,
"frontend not of type satellite"
);
msg_Err
(
p_input
,
"(access) cannot determine frontend info"
);
return
-
1
;
}
}
else
/* no frontend probing is done so use default values. */
{
int
i_len
;
msg_Dbg
(
p_input
,
"using default values for frontend info"
);
i_len
=
sizeof
(
FRONTEND
);
if
(
snprintf
(
frontend
,
sizeof
(
FRONTEND
),
FRONTEND
,
u_adapter
,
u_device
)
>=
i_len
)
{
msg_Err
(
p_input
,
"snprintf() truncated string for FRONTEND"
);
frontend
[
sizeof
(
FRONTEND
)]
=
'\0'
;
else
/* no frontend probing is done so use default border values. */
{
msg_Dbg
(
p_input
,
"using default bvalues for frontend info"
);
i_len
=
sizeof
(
FRONTEND
);
if
(
snprintf
(
frontend
,
sizeof
(
FRONTEND
),
FRONTEND
,
u_adapter
,
u_device
)
>=
i_len
)
{
msg_Err
(
p_input
,
"snprintf() truncated string for FRONTEND"
);
frontend
[
sizeof
(
FRONTEND
)]
=
'\0'
;
}
strncpy
(
frontend_info
.
name
,
frontend
,
128
);
frontend_info
.
type
=
FE_QPSK
;
frontend_info
.
frequency_max
=
12999
;
strncpy
(
frontend_info
.
name
,
frontend
,
128
);
msg_Dbg
(
p_input
,
"method of access is %s"
,
p_input
->
psz_access
);
frontend_info
.
type
=
FE_QPSK
;
if
(
strncmp
(
p_input
->
psz_access
,
"qpsk"
,
4
)
==
0
)
frontend_info
.
type
=
FE_QPSK
;
else
if
(
strncmp
(
p_input
->
psz_access
,
"cable"
,
5
)
==
0
)
frontend_info
.
type
=
FE_QAM
;
else
if
(
strncmp
(
p_input
->
psz_access
,
"terrestrial"
,
11
)
==
0
)
frontend_info
.
type
=
FE_OFDM
;
frontend_info
.
frequency_max
=
12999
;
frontend_info
.
frequency_min
=
10000
;
frontend_info
.
symbol_rate_max
=
30000
;
frontend_info
.
symbol_rate_max
=
30000
;
frontend_info
.
symbol_rate_min
=
1000
;
/* b_polarisation */
}
/* Register Callback functions */
p_input
->
pf_read
=
SatelliteRead
;
p_input
->
pf_set_program
=
SatelliteSetProgram
;
...
...
@@ -164,10 +172,11 @@ int E_(Open) ( vlc_object_t *p_this )
}
}
/* Validating input values */
if
(
((
u_freq
)
>
frontend_info
.
frequency_max
)
||
((
u_freq
)
<
frontend_info
.
frequency_min
)
)
{
msg_Warn
(
p_input
,
"invalid frequency %d, using default one"
,
u_freq
);
msg_Warn
(
p_input
,
"invalid frequency %d
(kHz)
, using default one"
,
u_freq
);
u_freq
=
config_GetInt
(
p_input
,
"frequency"
);
if
(
((
u_freq
)
>
frontend_info
.
frequency_max
)
||
((
u_freq
)
<
frontend_info
.
frequency_min
)
)
...
...
@@ -212,57 +221,58 @@ int E_(Open) ( vlc_object_t *p_this )
}
}
switch
(
i_fec
)
{
case
1
:
fe_fec
=
FEC_1_2
;
break
;
case
2
:
fe_fec
=
FEC_2_3
;
break
;
case
3
:
fe_fec
=
FEC_3_4
;
break
;
case
4
:
fe_fec
=
FEC_4_5
;
break
;
case
5
:
fe_fec
=
FEC_5_6
;
break
;
case
6
:
fe_fec
=
FEC_6_7
;
break
;
case
7
:
fe_fec
=
FEC_7_8
;
break
;
case
8
:
fe_fec
=
FEC_8_9
;
break
;
case
9
:
fe_fec
=
FEC_AUTO
;
break
;
default:
/* cannot happen */
fe_fec
=
FEC_NONE
;
msg_Err
(
p_input
,
"invalid FEC (unknown)"
);
break
;
}
/* Get antenna configuration options */
b_diseqc
=
config_GetInt
(
p_input
,
"diseqc"
);
i_lnb_lof1
=
config_GetInt
(
p_input
,
"lnb-lof1"
);
i_lnb_lof2
=
config_GetInt
(
p_input
,
"lnb-lof2"
);
i_lnb_slof
=
config_GetInt
(
p_input
,
"lnb-slof"
);
/* Setting frontend parameters for tuning the hardware */
switch
(
frontend_info
.
type
)
{
case
FE_QPSK
:
/* DVB-S: satellite and budget cards (nova) */
case
FE_QPSK
:
fep
.
frequency
=
u_freq
*
1000
;
fep
.
inversion
=
INVERSION_AUTO
;
fep
.
u
.
qpsk
.
symbol_rate
=
u_srate
*
1000
;
fep
.
u
.
qpsk
.
fec_inner
=
fe
_fec
;
msg_Dbg
(
p_input
,
"satellite frontend found on %s"
,
frontend_info
.
name
);
fep
.
inversion
=
dvb_DecodeInversion
(
p_input
,
(
int
)
b_polarisation
)
;
fep
.
u
.
qpsk
.
symbol_rate
=
u_srate
*
1000
;
fep
.
u
.
qpsk
.
fec_inner
=
dvb_DecodeFEC
(
p_input
,
i
_fec
);
msg_Dbg
(
p_input
,
"satellite
(QPSK)
frontend found on %s"
,
frontend_info
.
name
);
break
;
case
FE_QAM
:
msg_Dbg
(
p_input
,
"cable frontend found on %s"
,
frontend_info
.
name
);
/* DVB-C */
case
FE_QAM
:
i_modulation
=
config_GetInt
(
p_input
,
"modulation"
);
fep
.
frequency
=
u_freq
*
1000
;
fep
.
inversion
=
dvb_DecodeInversion
(
p_input
,
(
int
)
b_polarisation
);
fep
.
u
.
qam
.
symbol_rate
=
u_srate
*
1000
;
fep
.
u
.
qam
.
fec_inner
=
dvb_DecodeFEC
(
p_input
,
i_fec
);
fep
.
u
.
qam
.
modulation
=
dvb_DecodeModulation
(
p_input
,
i_modulation
);
msg_Dbg
(
p_input
,
"cable (QAM) frontend found on %s"
,
frontend_info
.
name
);
break
;
/* DVB-T */
case
FE_OFDM
:
msg_Dbg
(
p_input
,
"terrestrial frontend found on %s"
,
frontend_info
.
name
);
i_bandwidth
=
config_GetInt
(
p_input
,
"bandwidth"
);
i_code_rate_HP
=
config_GetInt
(
p_input
,
"code-rate-hp"
);
i_code_rate_LP
=
config_GetInt
(
p_input
,
"code-rate-lp"
);
i_modulation
=
config_GetInt
(
p_input
,
"modulation"
);
i_transmission
=
config_GetInt
(
p_input
,
"transmission"
);
i_guard
=
config_GetInt
(
p_input
,
"guard"
);
i_hierarchy
=
config_GetInt
(
p_input
,
"hierarchy"
);
fep
.
frequency
=
u_freq
*
1000
;
fep
.
inversion
=
dvb_DecodeInversion
(
p_input
,
(
int
)
b_polarisation
);
fep
.
u
.
ofdm
.
bandwidth
=
dvb_DecodeBandwidth
(
p_input
,
i_bandwidth
);
fep
.
u
.
ofdm
.
code_rate_HP
=
dvb_DecodeFEC
(
p_input
,
i_code_rate_HP
);
fep
.
u
.
ofdm
.
code_rate_LP
=
dvb_DecodeFEC
(
p_input
,
i_code_rate_LP
);
fep
.
u
.
ofdm
.
constellation
=
dvb_DecodeModulation
(
p_input
,
i_modulation
);
fep
.
u
.
ofdm
.
transmission_mode
=
dvb_DecodeTransmission
(
p_input
,
i_transmission
);
fep
.
u
.
ofdm
.
guard_interval
=
dvb_DecodeGuardInterval
(
p_input
,
i_guard
);
fep
.
u
.
ofdm
.
hierarchy_information
=
dvb_DecodeHierarchy
(
p_input
,
i_hierarchy
);
msg_Dbg
(
p_input
,
"terrestrial (OFDM) frontend found on %s"
,
frontend_info
.
name
);
break
;
default:
msg_Err
(
p_input
,
"Could not determine frontend type on %s"
,
frontend_info
.
name
);
return
-
1
;
...
...
@@ -280,11 +290,11 @@ int E_(Open) ( vlc_object_t *p_this )
p_input
->
p_access_data
=
(
void
*
)
p_satellite
;
/* Open the DVR device */
i_len
=
sizeof
(
DVR
);
if
(
snprintf
(
dvr
,
sizeof
(
DVR
),
DVR
,
u_adapter
,
u_device
)
>=
i_len
)
{
msg_Err
(
p_input
,
"snprintf() truncated string for DVR"
);
dvr
[
sizeof
(
DVR
)]
=
'\0'
;
i_len
=
sizeof
(
DVR
);
if
(
snprintf
(
dvr
,
sizeof
(
DVR
),
DVR
,
u_adapter
,
u_device
)
>=
i_len
)
{
msg_Err
(
p_input
,
"snprintf() truncated string for DVR"
);
dvr
[
sizeof
(
DVR
)]
=
'\0'
;
}
msg_Dbg
(
p_input
,
"opening DVR device '%s'"
,
dvr
);
...
...
@@ -300,17 +310,8 @@ int E_(Open) ( vlc_object_t *p_this )
return
-
1
;
}
/* Get antenna configuration options */
b_diseqc
=
config_GetInt
(
p_input
,
"diseqc"
);
i_lnb_lof1
=
config_GetInt
(
p_input
,
"lnb-lof1"
);
i_lnb_lof2
=
config_GetInt
(
p_input
,
"lnb-lof2"
);
i_lnb_slof
=
config_GetInt
(
p_input
,
"lnb-slof"
);
/* Initialize the Satellite Card */
msg_Dbg
(
p_input
,
"initializing Sat Card with Freq: %u, Pol: %d, "
"FEC: %d, Srate: %u"
,
u_freq
,
b_polarisation
,
fe_fec
,
u_srate
);
switch
(
ioctl_SetQPSKFrontend
(
p_input
,
fep
,
b_polarisation
,
u_adapter
,
u_device
))
switch
(
ioctl_SetFrontend
(
p_input
,
fep
,
b_polarisation
,
u_adapter
,
u_device
))
{
case
-
2
:
msg_Err
(
p_input
,
"frontend returned an unexpected event"
);
...
...
@@ -413,8 +414,8 @@ static ssize_t SatelliteRead( input_thread_t * p_input, byte_t * p_buffer,
{
input_socket_t
*
p_access_data
=
(
input_socket_t
*
)
p_input
->
p_access_data
;
ssize_t
i_ret
;
unsigned
int
u_adapter
=
1
;
unsigned
int
u_device
=
0
;
unsigned
int
u_adapter
=
1
;
unsigned
int
u_device
=
0
;
unsigned
int
i
;
// Get adapter and device number to use for this dvb card
...
...
@@ -460,11 +461,14 @@ static int SatelliteSetArea( input_thread_t * p_input, input_area_t * p_area )
* and makes the appropriate changes to stream structure.
*****************************************************************************/
int
SatelliteSetProgram
(
input_thread_t
*
p_input
,
pgrm_descriptor_t
*
p_new_prg
)
pgrm_descriptor_t
*
p_new_prg
)
{
unsigned
int
i_es_index
;
unsigned
int
u_adapter
=
1
;
unsigned
int
u_device
=
0
;
vlc_value_t
val
;
unsigned
int
u_adapter
=
1
;
unsigned
int
u_device
=
0
;
unsigned
int
u_video_type
=
1
;
/* default video type */
unsigned
int
u_audio_type
=
2
;
/* default audio type */
// Get adapter and device number to use for this dvb card
u_adapter
=
config_GetInt
(
p_input
,
"adapter"
);
...
...
@@ -497,17 +501,22 @@ int SatelliteSetProgram( input_thread_t * p_input,
{
case
MPEG1_VIDEO_ES
:
case
MPEG2_VIDEO_ES
:
case
MPEG2_MOTO_VIDEO_ES
:
if
(
input_SelectES
(
p_input
,
p_es
)
==
0
)
{
ioctl_SetDMXFilter
(
p_input
,
p_es
->
i_id
,
&
p_es
->
i_demux_fd
,
1
,
u_adapter
,
u_device
);
ioctl_SetDMXFilter
(
p_input
,
p_es
->
i_id
,
&
p_es
->
i_demux_fd
,
u_video_type
,
u_adapter
,
u_device
);
u_video_type
+=
3
;
}
break
;
case
MPEG1_AUDIO_ES
:
case
MPEG2_AUDIO_ES
:
if
(
input_SelectES
(
p_input
,
p_es
)
==
0
)
{
ioctl_SetDMXFilter
(
p_input
,
p_es
->
i_id
,
&
p_es
->
i_demux_fd
,
2
,
u_adapter
,
u_device
);
ioctl_SetDMXFilter
(
p_input
,
p_es
->
i_id
,
&
p_es
->
i_demux_fd
,
u_audio_type
,
u_adapter
,
u_device
);
input_SelectES
(
p_input
,
p_es
);
u_audio_type
+=
3
;
}
break
;
default:
...
...
@@ -520,6 +529,10 @@ int SatelliteSetProgram( input_thread_t * p_input,
p_input
->
stream
.
p_selected_program
=
p_new_prg
;
/* Update the navigation variables without triggering a callback */
val
.
i_int
=
p_new_prg
->
i_number
;
var_Change
(
p_input
,
"program"
,
VLC_VAR_SETVALUE
,
&
val
,
NULL
);
return
0
;
}
...
...
modules/access/dvb/dvb.c
View file @
756a9df7
...
...
@@ -55,59 +55,59 @@
struct
diseqc_cmd_t
{
struct
dvb_diseqc_master_cmd
cmd
;
uint32_t
wait
;
struct
dvb_diseqc_master_cmd
cmd
;
uint32_t
wait
;
};
struct
diseqc_cmd_t
switch_cmds
[]
=
{
{
{
{
0xe0
,
0x10
,
0x38
,
0xf0
,
0x00
,
0x00
},
4
},
0
},
{
{
{
0xe0
,
0x10
,
0x38
,
0xf2
,
0x00
,
0x00
},
4
},
0
},
{
{
{
0xe0
,
0x10
,
0x38
,
0xf1
,
0x00
,
0x00
},
4
},
0
},
{
{
{
0xe0
,
0x10
,
0x38
,
0xf3
,
0x00
,
0x00
},
4
},
0
},
{
{
{
0xe0
,
0x10
,
0x38
,
0xf4
,
0x00
,
0x00
},
4
},
0
},
{
{
{
0xe0
,
0x10
,
0x38
,
0xf6
,
0x00
,
0x00
},
4
},
0
},
{
{
{
0xe0
,
0x10
,
0x38
,
0xf5
,
0x00
,
0x00
},
4
},
0
},
{
{
{
0xe0
,
0x10
,
0x38
,
0xf7
,
0x00
,
0x00
},
4
},
0
},
{
{
{
0xe0
,
0x10
,
0x38
,
0xf8
,
0x00
,
0x00
},
4
},
0
},
{
{
{
0xe0
,
0x10
,
0x38
,
0xfa
,
0x00
,
0x00
},
4
},
0
},
{
{
{
0xe0
,
0x10
,
0x38
,
0xf9
,
0x00
,
0x00
},
4
},
0
},
{
{
{
0xe0
,
0x10
,
0x38
,
0xfb
,
0x00
,
0x00
},
4
},
0
},
{
{
{
0xe0
,
0x10
,
0x38
,
0xfc
,
0x00
,
0x00
},
4
},
0
},
{
{
{
0xe0
,
0x10
,
0x38
,
0xfe
,
0x00
,
0x00
},
4
},
0
},
{
{
{
0xe0
,
0x10
,
0x38
,
0xfd
,
0x00
,
0x00
},
4
},
0
},
{
{
{
0xe0
,
0x10
,
0x38
,
0xff
,
0x00
,
0x00
},
4
},
0
}
{
{
{
0xe0
,
0x10
,
0x38
,
0xf0
,
0x00
,
0x00
},
4
},
0
},
{
{
{
0xe0
,
0x10
,
0x38
,
0xf2
,
0x00
,
0x00
},
4
},
0
},
{
{
{
0xe0
,
0x10
,
0x38
,
0xf1
,
0x00
,
0x00
},
4
},
0
},
{
{
{
0xe0
,
0x10
,
0x38
,
0xf3
,
0x00
,
0x00
},
4
},
0
},
{
{
{
0xe0
,
0x10
,
0x38
,
0xf4
,
0x00
,
0x00
},
4
},
0
},
{
{
{
0xe0
,
0x10
,
0x38
,
0xf6
,
0x00
,
0x00
},
4
},
0
},
{
{
{
0xe0
,
0x10
,
0x38
,
0xf5
,
0x00
,
0x00
},
4
},
0
},
{
{
{
0xe0
,
0x10
,
0x38
,
0xf7
,
0x00
,
0x00
},
4
},
0
},
{
{
{
0xe0
,
0x10
,
0x38
,
0xf8
,
0x00
,
0x00
},
4
},
0
},
{
{
{
0xe0
,
0x10
,
0x38
,
0xfa
,
0x00
,
0x00
},
4
},
0
},
{
{
{
0xe0
,
0x10
,
0x38
,
0xf9
,
0x00
,
0x00
},
4
},
0
},
{
{
{
0xe0
,
0x10
,
0x38
,
0xfb
,
0x00
,
0x00
},
4
},
0
},
{
{
{
0xe0
,
0x10
,
0x38
,
0xfc
,
0x00
,
0x00
},
4
},
0
},
{
{
{
0xe0
,
0x10
,
0x38
,
0xfe
,
0x00
,
0x00
},
4
},
0
},
{
{
{
0xe0
,
0x10
,
0x38
,
0xfd
,
0x00
,
0x00
},
4
},
0
},
{
{
{
0xe0
,
0x10
,
0x38
,
0xff
,
0x00
,
0x00
},
4
},
0
}
};
static
int
ioctl_Check
QPSK
(
input_thread_t
*
p_input
,
int
front
);
static
int
ioctl_Check
Frontend
(
input_thread_t
*
p_input
,
int
front
);
/*****************************************************************************
* ioctl_FrontendControl : commands the SEC device
*****************************************************************************/
int
ioctl_FrontendControl
(
input_thread_t
*
p_input
,
int
freq
,
int
pol
,
int
lnb_slof
,
int
diseqc
,
unsigned
int
u_adapter
,
unsigned
int
u_device
)
int
diseqc
,
unsigned
int
u_adapter
,
unsigned
int
u_device
)
{
struct
dvb_diseqc_master_cmd
cmd
;
fe_sec_tone_mode_t
tone
;
fe_sec_voltage_t
voltage
;
int
frontend
;
char
front
[]
=
FRONTEND
;
int
i_len
;
i_len
=
sizeof
(
FRONTEND
);
if
(
snprintf
(
front
,
sizeof
(
FRONTEND
),
FRONTEND
,
u_adapter
,
u_device
)
>=
i_len
)
{
msg_Err
(
p_input
,
"snprintf() truncated string for FRONTEND"
);
front
[
sizeof
(
FRONTEND
)]
=
'\0'
;
char
front
[]
=
FRONTEND
;
int
i_len
;
i_len
=
sizeof
(
FRONTEND
);
if
(
snprintf
(
front
,
sizeof
(
FRONTEND
),
FRONTEND
,
u_adapter
,
u_device
)
>=
i_len
)
{
msg_Err
(
p_input
,
"snprintf() truncated string for FRONTEND"
);
front
[
sizeof
(
FRONTEND
)]
=
'\0'
;
}
msg_Dbg
(
p_input
,
"Opening frontend %s"
,
front
);
msg_Dbg
(
p_input
,
"Opening frontend %s"
,
front
);
if
((
frontend
=
open
(
front
,
O_RDWR
))
<
0
)
{
# ifdef HAVE_ERRNO_H
msg_Err
(
p_input
,
"ioctl_FrontEndControl: Opening frontend failed (%s)"
,
strerror
(
errno
));
msg_Err
(
p_input
,
"ioctl_FrontEndControl: Opening frontend failed (%s)"
,
strerror
(
errno
));
# else
msg_Err
(
p_input
,
"ioctl_FrontEndControl: Opening frontend failed"
);
msg_Err
(
p_input
,
"ioctl_FrontEndControl: Opening frontend failed"
);
# endif
return
-
1
;
}
...
...
@@ -121,9 +121,9 @@ int ioctl_FrontendControl(input_thread_t * p_input, int freq, int pol, int lnb_s
voltage
=
(
pol
)
?
SEC_VOLTAGE_18
:
SEC_VOLTAGE_13
;
/* In case we have a DiSEqC, set it to the correct address */
cmd
.
msg
[
0
]
=
0x0
;
/* framing */
cmd
.
msg
[
1
]
=
0x10
;
/* address */
cmd
.
msg
[
2
]
=
0x38
;
/* command */
cmd
.
msg
[
0
]
=
0x0
;
/* framing */
cmd
.
msg
[
1
]
=
0x10
;
/* address */
cmd
.
msg
[
2
]
=
0x38
;
/* command */
/* command parameters start at index 3 */
cmd
.
msg
[
3
]
=
0xF0
|
((
diseqc
*
4
)
&
0x0F
);
cmd
.
msg_len
=
4
;
...
...
@@ -169,23 +169,23 @@ int ioctl_InfoFrontend(input_thread_t * p_input, struct dvb_frontend_info *info,
{
int
front
;
int
ret
;
char
frontend
[]
=
FRONTEND
;
int
i_len
;
i_len
=
sizeof
(
FRONTEND
);
if
(
snprintf
(
frontend
,
sizeof
(
FRONTEND
),
FRONTEND
,
u_adapter
,
u_device
)
>=
i_len
)
{
msg_Err
(
p_input
,
"snprintf() truncated string for FRONTEND"
);
frontend
[
sizeof
(
FRONTEND
)]
=
'\0'
;
char
frontend
[]
=
FRONTEND
;
int
i_len
;
i_len
=
sizeof
(
FRONTEND
);
if
(
snprintf
(
frontend
,
sizeof
(
FRONTEND
),
FRONTEND
,
u_adapter
,
u_device
)
>=
i_len
)
{
msg_Err
(
p_input
,
"snprintf() truncated string for FRONTEND"
);
frontend
[
sizeof
(
FRONTEND
)]
=
'\0'
;
}
msg_Dbg
(
p_input
,
"Opening device %s"
,
frontend
);
msg_Dbg
(
p_input
,
"Opening device %s"
,
frontend
);
if
((
front
=
open
(
frontend
,
O_RDWR
))
<
0
)
{
# ifdef HAVE_ERRNO_H
msg_Err
(
p_input
,
"ioctl_InfoFrontEnd: opening device failed (%s)"
,
strerror
(
errno
));
msg_Err
(
p_input
,
"ioctl_InfoFrontEnd: opening device failed (%s)"
,
strerror
(
errno
));
# else
msg_Err
(
p_input
,
"ioctl_InfoFrontEnd: opening device failed"
);
msg_Err
(
p_input
,
"ioctl_InfoFrontEnd: opening device failed"
);
# endif
return
-
1
;
}
...
...
@@ -193,126 +193,178 @@ int ioctl_InfoFrontend(input_thread_t * p_input, struct dvb_frontend_info *info,
/* Determine type of frontend */
if
((
ret
=
ioctl
(
front
,
FE_GET_INFO
,
info
))
<
0
)
{
close
(
front
);
close
(
front
);
# ifdef HAVE_ERRNO_H
msg_Err
(
p_input
,
"ioctl FE_GET_INFO failed (%d) %s"
,
ret
,
strerror
(
errno
));
# else
msg_Err
(
p_input
,
"ioctl FE_GET_INFO failed (%d)"
,
ret
);
# endif
return
-
1
;
return
-
1
;
}
msg_Dbg
(
p_input
,
"Frontend Info:
\t
name = %s
\n\t\t
frequency_min = %d
\n\t\t
frequency_max = %d
\n\t\t
frequency_stepsize = %d
\n\t\t
frequency_tolerance = %d
\n\t\t
symbol_rate_min = %d
\n\t\t
symbol_rate_max = %d
\n\t\t
symbol_rate_tolerance (ppm) = %d
\n\t\t
notifier_delay (ms)= %d
\n
"
,
info
->
name
,
info
->
frequency_min
,
info
->
frequency_max
,
info
->
frequency_stepsize
,
info
->
frequency_tolerance
,
info
->
symbol_rate_min
,
info
->
symbol_rate_max
,
info
->
symbol_rate_tolerance
,
info
->
notifier_delay
);
/* Print out frontend capabilities. */
msg_Dbg
(
p_input
,
"Frontend Info:
\t
name = %s
\n\t\t
frequency_min = %d
\n\t\t
frequency_max = %d
\n\t\t
frequency_stepsize = %d
\n\t\t
frequency_tolerance = %d
\n\t\t
symbol_rate_min = %d
\n\t\t
symbol_rate_max = %d
\n\t\t
symbol_rate_tolerance (ppm) = %d
\n\t\t
notifier_delay (ms)= %d
\n
"
,
info
->
name
,
info
->
frequency_min
,
info
->
frequency_max
,
info
->
frequency_stepsize
,
info
->
frequency_tolerance
,
info
->
symbol_rate_min
,
info
->
symbol_rate_max
,
info
->
symbol_rate_tolerance
,
info
->
notifier_delay
);
msg_Dbg
(
p_input
,
"Frontend Info capability list:"
);
if
(
info
->
caps
&
FE_IS_STUPID
)
msg_Dbg
(
p_input
,
"no capabilities - frontend is stupid!"
);
if
(
info
->
caps
&
FE_CAN_INVERSION_AUTO
)
msg_Dbg
(
p_input
,
"inversion auto"
);
if
(
info
->
caps
&
FE_CAN_FEC_1_2
)
msg_Dbg
(
p_input
,
"forward error correction 1/2"
);
if
(
info
->
caps
&
FE_CAN_FEC_2_3
)
msg_Dbg
(
p_input
,
"forward error correction 2/3"
);
if
(
info
->
caps
&
FE_CAN_FEC_3_4
)
msg_Dbg
(
p_input
,
"forward error correction 3/4"
);
if
(
info
->
caps
&
FE_CAN_FEC_4_5
)
msg_Dbg
(
p_input
,
"forward error correction 4/5"
);
if
(
info
->
caps
&
FE_CAN_FEC_5_6
)
msg_Dbg
(
p_input
,
"forward error correction 5/6"
);
if
(
info
->
caps
&
FE_CAN_FEC_6_7
)
msg_Dbg
(
p_input
,
"forward error correction 6/7"
);
if
(
info
->
caps
&
FE_CAN_FEC_7_8
)
msg_Dbg
(
p_input
,
"forward error correction 7/8"
);
if
(
info
->
caps
&
FE_CAN_FEC_8_9
)
msg_Dbg
(
p_input
,
"forward error correction 8/9"
);
if
(
info
->
caps
&
FE_CAN_FEC_AUTO
)
msg_Dbg
(
p_input
,
"forward error correction auto"
);
if
(
info
->
caps
&
FE_CAN_QPSK
)
msg_Dbg
(
p_input
,
"card can do QPSK"
);
if
(
info
->
caps
&
FE_CAN_QAM_16
)
msg_Dbg
(
p_input
,
"card can do QAM 16"
);
if
(
info
->
caps
&
FE_CAN_QAM_32
)
msg_Dbg
(
p_input
,
"card can do QAM 32"
);
if
(
info
->
caps
&
FE_CAN_QAM_64
)
msg_Dbg
(
p_input
,
"card can do QAM 64"
);
if
(
info
->
caps
&
FE_CAN_QAM_128
)
msg_Dbg
(
p_input
,
"card can do QAM 128"
);
if
(
info
->
caps
&
FE_CAN_QAM_256
)
msg_Dbg
(
p_input
,
"card can do QAM 256"
);
if
(
info
->
caps
&
FE_CAN_QAM_AUTO
)
msg_Dbg
(
p_input
,
"card can do QAM auto"
);
if
(
info
->
caps
&
FE_CAN_TRANSMISSION_MODE_AUTO
)
msg_Dbg
(
p_input
,
"transmission mode auto"
);
if
(
info
->
caps
&
FE_CAN_BANDWIDTH_AUTO
)
msg_Dbg
(
p_input
,
"bandwidth mode auto"
);
if
(
info
->
caps
&
FE_CAN_GUARD_INTERVAL_AUTO
)
msg_Dbg
(
p_input
,
"guard interval mode auto"
);
if
(
info
->
caps
&
FE_CAN_HIERARCHY_AUTO
)
msg_Dbg
(
p_input
,
"hierarchy mode auto"
);
if
(
info
->
caps
&
FE_CAN_MUTE_TS
)
msg_Dbg
(
p_input
,
"card can mute TS"
);
if
(
info
->
caps
&
FE_CAN_CLEAN_SETUP
)
msg_Dbg
(
p_input
,
"clean setup"
);
msg_Dbg
(
p_input
,
"End of capability list"
);
close
(
front
);
return
0
;
}
int
ioctl_DiseqcSendMsg
(
input_thread_t
*
p_input
,
int
fd
,
fe_sec_voltage_t
v
,
struct
diseqc_cmd_t
**
cmd
,
fe_sec_tone_mode_t
t
,
fe_sec_mini_cmd_t
b
)
fe_sec_tone_mode_t
t
,
fe_sec_mini_cmd_t
b
)
{
int
err
;
if
((
err
=
ioctl
(
fd
,
FE_SET_TONE
,
SEC_TONE_OFF
))
<
0
)
{
if
((
err
=
ioctl
(
fd
,
FE_SET_TONE
,
SEC_TONE_OFF
))
<
0
)
{
# ifdef HAVE_ERRNO_H
msg_Err
(
p_input
,
"ioclt FE_SET_TONE failed, tone=%s (%d) %s"
,
SEC_TONE_ON
?
"on"
:
"off"
,
err
,
strerror
(
errno
));
msg_Err
(
p_input
,
"ioclt FE_SET_TONE failed, tone=%s (%d) %s"
,
SEC_TONE_ON
?
"on"
:
"off"
,
err
,
strerror
(
errno
));
# else
msg_Err
(
p_input
,
"ioclt FE_SET_TONE failed, tone=%s (%d)"
,
SEC_TONE_ON
?
"on"
:
"off"
,
err
);
msg_Err
(
p_input
,
"ioclt FE_SET_TONE failed, tone=%s (%d)"
,
SEC_TONE_ON
?
"on"
:
"off"
,
err
);
# endif
return
err
;
return
err
;
}
if
((
err
=
ioctl
(
fd
,
FE_SET_VOLTAGE
,
v
))
<
0
)
{
if
((
err
=
ioctl
(
fd
,
FE_SET_VOLTAGE
,
v
))
<
0
)
{
# ifdef HAVE_ERRNO_H
msg_Err
(
p_input
,
"ioclt FE_SET_VOLTAGE failed, voltage=%d (%d) %s"
,
v
,
err
,
strerror
(
errno
));
msg_Err
(
p_input
,
"ioclt FE_SET_VOLTAGE failed, voltage=%d (%d) %s"
,
v
,
err
,
strerror
(
errno
));
# else
msg_Err
(
p_input
,
"ioclt FE_SET_VOLTAGE failed, voltage=%d (%d)"
,
v
,
err
);
msg_Err
(
p_input
,
"ioclt FE_SET_VOLTAGE failed, voltage=%d (%d)"
,
v
,
err
);
# endif
return
err
;
return
err
;
}
msleep
(
15
);
while
(
*
cmd
)
{
msg_Dbg
(
p_input
,
"
msg
: %02x %02x %02x %02x %02x %02x"
,
(
*
cmd
)
->
cmd
.
msg
[
0
],
(
*
cmd
)
->
cmd
.
msg
[
1
],
(
*
cmd
)
->
cmd
.
msg
[
2
],
(
*
cmd
)
->
cmd
.
msg
[
3
],
(
*
cmd
)
->
cmd
.
msg
[
4
],
(
*
cmd
)
->
cmd
.
msg
[
5
]);
msleep
(
15
);
while
(
*
cmd
)
{
msg_Dbg
(
p_input
,
"
DiseqcSendMsg()
: %02x %02x %02x %02x %02x %02x"
,
(
*
cmd
)
->
cmd
.
msg
[
0
],
(
*
cmd
)
->
cmd
.
msg
[
1
],
(
*
cmd
)
->
cmd
.
msg
[
2
],
(
*
cmd
)
->
cmd
.
msg
[
3
],
(
*
cmd
)
->
cmd
.
msg
[
4
],
(
*
cmd
)
->
cmd
.
msg
[
5
]);