2010-09-02 17:29:30 -03:00
/* DVB USB compliant linux driver for
*
* DM04 / QQBOX DVB - S USB BOX LME2510C + SHARP : BS2F7HZ7395
2010-10-16 16:44:43 -03:00
* LME2510C + LG TDQY - P001F
2011-02-12 22:35:08 -03:00
* LME2510C + BS2F7HZ0194
2010-10-16 16:44:43 -03:00
* LME2510 + LG TDQY - P001F
2011-02-12 22:35:08 -03:00
* LME2510 + BS2F7HZ0194
2010-09-02 17:29:30 -03:00
*
* MVB7395 ( LME2510C + SHARP : BS2F7HZ7395 )
* SHARP : BS2F7HZ7395 = ( STV0288 + Sharp IX2505V )
*
2010-10-16 16:44:43 -03:00
* MV001F ( LME2510 + LGTDQY - P001F )
2010-09-02 17:29:30 -03:00
* LG TDQY - P001F = ( TDA8263 + TDA10086H )
*
2010-10-16 16:44:43 -03:00
* MVB0001F ( LME2510C + LGTDQT - P001F )
*
2011-02-12 22:35:08 -03:00
* MV0194 ( LME2510 + SHARP : BS2F7HZ0194 )
* SHARP : BS2F7HZ0194 = ( STV0299 + IX2410 )
*
* MVB0194 ( LME2510C + SHARP0194 )
*
2012-08-06 16:21:40 -03:00
* LME2510C + M88RS2000
*
2010-09-02 17:29:30 -03:00
* For firmware see Documentation / dvb / lmedm04 . txt
*
* I2C addresses :
* 0xd0 - STV0288 - Demodulator
* 0xc0 - Sharp IX2505V - Tuner
2011-02-12 22:35:08 -03:00
* - -
2010-09-02 17:29:30 -03:00
* 0x1c - TDA10086 - Demodulator
* 0xc0 - TDA8263 - Tuner
2011-02-12 22:35:08 -03:00
* - -
* 0xd0 - STV0299 - Demodulator
* 0xc0 - IX2410 - Tuner
2010-09-02 17:29:30 -03:00
*
*
* VID = 3344 PID LME2510 = 1122 LME2510C = 1120
*
* Copyright ( C ) 2010 Malcolm Priestley ( tvboxspy @ gmail . com )
* LME2510 ( C ) ( C ) Leaguerme ( Shenzhen ) MicroElectronics Co . , Ltd .
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License Version 2 , as
* published by the Free Software Foundation .
*
* 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 General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 675 Mass Ave , Cambridge , MA 0213 9 , USA .
*
*
* see Documentation / dvb / README . dvb - usb for more information
*
* Known Issues :
* LME2510 : Non Intel USB chipsets fail to maintain High Speed on
* Boot or Hot Plug .
*
2010-10-16 16:44:43 -03:00
* QQbox suffers from noise on LNB voltage .
2010-09-02 17:29:30 -03:00
*
2011-02-12 22:35:08 -03:00
* LME2510 : SHARP : BS2F7HZ0194 ( MV0194 ) cannot cold reset and share system
* with other tuners . After a cold reset streaming will not start .
*
2012-08-06 16:21:40 -03:00
* M88RS2000 suffers from loss of lock .
2010-09-02 17:29:30 -03:00
*/
# define DVB_USB_LOG_PREFIX "LME2510(C)"
# include <linux/usb.h>
# include <linux/usb/input.h>
2010-11-17 13:28:38 -03:00
# include <media/rc-core.h>
2010-09-02 17:29:30 -03:00
2012-08-06 16:21:40 -03:00
# include "dvb_usb.h"
2010-09-02 17:29:30 -03:00
# include "lmedm04.h"
# include "tda826x.h"
# include "tda10086.h"
# include "stv0288.h"
# include "ix2505v.h"
2011-02-12 22:35:08 -03:00
# include "stv0299.h"
# include "dvb-pll.h"
# include "z0194a.h"
2012-03-07 18:08:10 -03:00
# include "m88rs2000.h"
2012-12-28 19:40:33 -03:00
# include "ts2020.h"
2010-09-02 17:29:30 -03:00
2012-08-06 16:21:40 -03:00
# define LME2510_C_S7395 "dvb-usb-lme2510c-s7395.fw";
# define LME2510_C_LG "dvb-usb-lme2510c-lg.fw";
# define LME2510_C_S0194 "dvb-usb-lme2510c-s0194.fw";
# define LME2510_C_RS2000 "dvb-usb-lme2510c-rs2000.fw";
# define LME2510_LG "dvb-usb-lme2510-lg.fw";
# define LME2510_S0194 "dvb-usb-lme2510-s0194.fw";
2010-09-02 17:29:30 -03:00
/* debug */
static int dvb_usb_lme2510_debug ;
2012-08-06 16:21:40 -03:00
# define lme_debug(var, level, args...) do { \
2010-09-02 17:29:30 -03:00
if ( ( var > = level ) ) \
2012-08-06 16:21:40 -03:00
pr_debug ( DVB_USB_LOG_PREFIX " : " args ) ; \
2010-09-02 17:29:30 -03:00
} while ( 0 )
2012-08-06 16:21:40 -03:00
# define deb_info(level, args...) lme_debug(dvb_usb_lme2510_debug, level, args)
2010-09-02 17:29:30 -03:00
# define debug_data_snipet(level, name, p) \
deb_info ( level , name " (%02x%02x%02x%02x%02x%02x%02x%02x) " , \
* p , * ( p + 1 ) , * ( p + 2 ) , * ( p + 3 ) , * ( p + 4 ) , \
* ( p + 5 ) , * ( p + 6 ) , * ( p + 7 ) ) ;
2012-08-06 16:21:40 -03:00
# define info(args...) pr_info(DVB_USB_LOG_PREFIX": "args)
2010-09-02 17:29:30 -03:00
module_param_named ( debug , dvb_usb_lme2510_debug , int , 0644 ) ;
2012-08-06 16:21:40 -03:00
MODULE_PARM_DESC ( debug , " set debugging level (1=info (or-able)). " ) ;
2010-09-02 17:29:30 -03:00
2010-10-16 16:44:43 -03:00
static int dvb_usb_lme2510_firmware ;
module_param_named ( firmware , dvb_usb_lme2510_firmware , int , 0644 ) ;
MODULE_PARM_DESC ( firmware , " set default firmware 0=Sharp7395 1=LG " ) ;
2011-04-02 18:59:29 -03:00
static int pid_filter ;
module_param_named ( pid , pid_filter , int , 0644 ) ;
2012-02-06 19:05:01 -03:00
MODULE_PARM_DESC ( pid , " set default 0=default 1=off 2=on " ) ;
2010-10-16 16:44:43 -03:00
2012-03-07 18:08:10 -03:00
2010-09-02 17:29:30 -03:00
DVB_DEFINE_MOD_OPT_ADAPTER_NR ( adapter_nr ) ;
2011-02-12 22:35:08 -03:00
# define TUNER_DEFAULT 0x0
2010-10-16 16:44:43 -03:00
# define TUNER_LG 0x1
# define TUNER_S7395 0x2
2011-02-12 22:35:08 -03:00
# define TUNER_S0194 0x3
2012-03-07 18:08:10 -03:00
# define TUNER_RS2000 0x4
2010-09-02 17:29:30 -03:00
struct lme2510_state {
u8 id ;
u8 tuner_config ;
u8 signal_lock ;
u8 signal_level ;
u8 signal_sn ;
u8 time_key ;
2012-03-07 18:08:10 -03:00
u8 last_key ;
u8 key_timeout ;
2010-09-02 17:29:30 -03:00
u8 i2c_talk_onoff ;
u8 i2c_gate ;
u8 i2c_tuner_gate_w ;
u8 i2c_tuner_gate_r ;
u8 i2c_tuner_addr ;
2010-10-16 16:44:43 -03:00
u8 stream_on ;
2011-04-22 06:20:57 -03:00
u8 pid_size ;
2012-03-07 18:08:10 -03:00
u8 pid_off ;
2010-09-02 17:29:30 -03:00
void * buffer ;
struct urb * lme_urb ;
void * usb_buffer ;
2012-08-06 16:21:40 -03:00
int ( * fe_set_voltage ) ( struct dvb_frontend * , fe_sec_voltage_t ) ;
u8 dvb_usb_lme2510_firmware ;
2010-09-02 17:29:30 -03:00
} ;
static int lme2510_bulk_write ( struct usb_device * dev ,
u8 * snd , int len , u8 pipe )
{
int ret , actual_l ;
2010-10-16 16:44:43 -03:00
2010-09-02 17:29:30 -03:00
ret = usb_bulk_msg ( dev , usb_sndbulkpipe ( dev , pipe ) ,
2010-11-04 17:17:51 -03:00
snd , len , & actual_l , 100 ) ;
2010-09-02 17:29:30 -03:00
return ret ;
}
static int lme2510_bulk_read ( struct usb_device * dev ,
u8 * rev , int len , u8 pipe )
{
int ret , actual_l ;
ret = usb_bulk_msg ( dev , usb_rcvbulkpipe ( dev , pipe ) ,
2010-11-04 17:17:51 -03:00
rev , len , & actual_l , 200 ) ;
2010-09-02 17:29:30 -03:00
return ret ;
}
static int lme2510_usb_talk ( struct dvb_usb_device * d ,
u8 * wbuf , int wlen , u8 * rbuf , int rlen )
{
struct lme2510_state * st = d - > priv ;
u8 * buff ;
int ret = 0 ;
if ( st - > usb_buffer = = NULL ) {
2011-09-11 19:30:10 -03:00
st - > usb_buffer = kmalloc ( 64 , GFP_KERNEL ) ;
2010-09-02 17:29:30 -03:00
if ( st - > usb_buffer = = NULL ) {
info ( " MEM Error no memory " ) ;
return - ENOMEM ;
}
}
buff = st - > usb_buffer ;
ret = mutex_lock_interruptible ( & d - > usb_mutex ) ;
if ( ret < 0 )
return - EAGAIN ;
2011-09-11 19:30:10 -03:00
/* the read/write capped at 64 */
memcpy ( buff , wbuf , ( wlen < 64 ) ? wlen : 64 ) ;
2011-04-22 06:07:40 -03:00
2010-10-16 16:44:43 -03:00
ret | = lme2510_bulk_write ( d - > udev , buff , wlen , 0x01 ) ;
2011-09-11 19:30:10 -03:00
ret | = lme2510_bulk_read ( d - > udev , buff , ( rlen < 64 ) ?
rlen : 64 , 0x01 ) ;
2010-09-02 17:29:30 -03:00
if ( rlen > 0 )
memcpy ( rbuf , buff , rlen ) ;
mutex_unlock ( & d - > usb_mutex ) ;
return ( ret < 0 ) ? - ENODEV : 0 ;
}
2010-10-27 19:50:36 -03:00
static int lme2510_stream_restart ( struct dvb_usb_device * d )
{
2012-03-07 18:08:10 -03:00
struct lme2510_state * st = d - > priv ;
u8 all_pids [ ] = LME_ALL_PIDS ;
u8 stream_on [ ] = LME_ST_ON_W ;
2010-10-16 16:44:43 -03:00
int ret ;
2012-03-07 18:08:10 -03:00
u8 rbuff [ 1 ] ;
if ( st - > pid_off )
ret = lme2510_usb_talk ( d , all_pids , sizeof ( all_pids ) ,
rbuff , sizeof ( rbuff ) ) ;
2010-10-16 16:44:43 -03:00
/*Restart Stream Command*/
2010-10-27 19:50:36 -03:00
ret = lme2510_usb_talk ( d , stream_on , sizeof ( stream_on ) ,
2010-10-16 16:44:43 -03:00
rbuff , sizeof ( rbuff ) ) ;
return ret ;
}
2010-09-02 17:29:30 -03:00
2011-04-02 18:59:29 -03:00
static int lme2510_enable_pid ( struct dvb_usb_device * d , u8 index , u16 pid_out )
{
struct lme2510_state * st = d - > priv ;
static u8 pid_buff [ ] = LME_ZERO_PID ;
static u8 rbuf [ 1 ] ;
u8 pid_no = index * 2 ;
2011-04-22 06:20:57 -03:00
u8 pid_len = pid_no + 2 ;
2011-04-02 18:59:29 -03:00
int ret = 0 ;
deb_info ( 1 , " PID Setting Pid %04x " , pid_out ) ;
2011-04-22 06:20:57 -03:00
if ( st - > pid_size = = 0 )
ret | = lme2510_stream_restart ( d ) ;
2011-04-02 18:59:29 -03:00
pid_buff [ 2 ] = pid_no ;
pid_buff [ 3 ] = ( u8 ) pid_out & 0xff ;
pid_buff [ 4 ] = pid_no + 1 ;
pid_buff [ 5 ] = ( u8 ) ( pid_out > > 8 ) ;
2011-04-22 06:20:57 -03:00
if ( pid_len > st - > pid_size )
st - > pid_size = pid_len ;
pid_buff [ 7 ] = 0x80 + st - > pid_size ;
2011-04-02 18:59:29 -03:00
ret | = lme2510_usb_talk ( d , pid_buff ,
sizeof ( pid_buff ) , rbuf , sizeof ( rbuf ) ) ;
2011-04-22 06:20:57 -03:00
if ( st - > stream_on )
2011-04-02 18:59:29 -03:00
ret | = lme2510_stream_restart ( d ) ;
return ret ;
}
2010-09-02 17:29:30 -03:00
static void lme2510_int_response ( struct urb * lme_urb )
{
struct dvb_usb_adapter * adap = lme_urb - > context ;
2012-08-06 16:21:40 -03:00
struct lme2510_state * st = adap_to_priv ( adap ) ;
2010-09-02 17:29:30 -03:00
static u8 * ibuf , * rbuf ;
int i = 0 , offset ;
2011-05-25 18:28:29 -03:00
u32 key ;
2010-09-02 17:29:30 -03:00
switch ( lme_urb - > status ) {
case 0 :
case - ETIMEDOUT :
break ;
case - ECONNRESET :
case - ENOENT :
case - ESHUTDOWN :
return ;
default :
info ( " Error %x " , lme_urb - > status ) ;
break ;
}
rbuf = ( u8 * ) lme_urb - > transfer_buffer ;
offset = ( ( lme_urb - > actual_length / 8 ) > 4 )
? 4 : ( lme_urb - > actual_length / 8 ) ;
for ( i = 0 ; i < offset ; + + i ) {
ibuf = ( u8 * ) & rbuf [ i * 8 ] ;
deb_info ( 5 , " INT O/S C =%02x C/O=%02x Type =%02x%02x " ,
offset , i , ibuf [ 0 ] , ibuf [ 1 ] ) ;
switch ( ibuf [ 0 ] ) {
case 0xaa :
2011-05-25 18:28:29 -03:00
debug_data_snipet ( 1 , " INT Remote data snipet " , ibuf ) ;
if ( ( ibuf [ 4 ] + ibuf [ 5 ] ) = = 0xff ) {
key = ibuf [ 5 ] ;
key + = ( ibuf [ 3 ] > 0 )
? ( ibuf [ 3 ] ^ 0xff ) < < 8 : 0 ;
key + = ( ibuf [ 2 ] ^ 0xff ) < < 16 ;
deb_info ( 1 , " INT Key =%08x " , key ) ;
2012-08-06 16:21:40 -03:00
if ( adap_to_d ( adap ) - > rc_dev ! = NULL )
rc_keydown ( adap_to_d ( adap ) - > rc_dev ,
key , 0 ) ;
2011-05-25 18:28:29 -03:00
}
2010-09-02 17:29:30 -03:00
break ;
case 0xbb :
switch ( st - > tuner_config ) {
case TUNER_LG :
2010-10-16 16:44:43 -03:00
if ( ibuf [ 2 ] > 0 )
st - > signal_lock = ibuf [ 2 ] ;
2010-09-02 17:29:30 -03:00
st - > signal_level = ibuf [ 4 ] ;
st - > signal_sn = ibuf [ 3 ] ;
st - > time_key = ibuf [ 7 ] ;
break ;
case TUNER_S7395 :
2011-02-12 22:35:08 -03:00
case TUNER_S0194 :
2010-09-02 17:29:30 -03:00
/* Tweak for earlier firmware*/
if ( ibuf [ 1 ] = = 0x03 ) {
2010-10-27 19:50:36 -03:00
if ( ibuf [ 2 ] > 1 )
st - > signal_lock = ibuf [ 2 ] ;
2010-09-02 17:29:30 -03:00
st - > signal_level = ibuf [ 3 ] ;
2010-10-16 16:44:43 -03:00
st - > signal_sn = ibuf [ 4 ] ;
2010-09-02 17:29:30 -03:00
} else {
st - > signal_level = ibuf [ 4 ] ;
st - > signal_sn = ibuf [ 5 ] ;
2010-10-27 19:50:36 -03:00
st - > signal_lock =
( st - > signal_lock & 0xf7 ) +
( ( ibuf [ 2 ] & 0x01 ) < < 0x03 ) ;
2010-09-02 17:29:30 -03:00
}
break ;
2012-03-07 18:08:10 -03:00
case TUNER_RS2000 :
2012-08-06 16:21:40 -03:00
if ( ibuf [ 1 ] = = 0x3 & & ibuf [ 6 ] = = 0xff )
2012-03-07 18:08:10 -03:00
st - > signal_lock = 0xff ;
else
2012-08-06 16:21:40 -03:00
st - > signal_lock = 0x00 ;
st - > signal_level = ibuf [ 5 ] ;
st - > signal_sn = ibuf [ 4 ] ;
2012-03-07 18:08:10 -03:00
st - > time_key = ibuf [ 7 ] ;
2010-09-02 17:29:30 -03:00
default :
break ;
}
debug_data_snipet ( 5 , " INT Remote data snipet in " , ibuf ) ;
break ;
case 0xcc :
debug_data_snipet ( 1 , " INT Control data snipet " , ibuf ) ;
break ;
default :
debug_data_snipet ( 1 , " INT Unknown data snipet " , ibuf ) ;
break ;
}
}
usb_submit_urb ( lme_urb , GFP_ATOMIC ) ;
}
static int lme2510_int_read ( struct dvb_usb_adapter * adap )
{
2012-08-06 16:21:40 -03:00
struct dvb_usb_device * d = adap_to_d ( adap ) ;
struct lme2510_state * lme_int = adap_to_priv ( adap ) ;
2010-09-02 17:29:30 -03:00
lme_int - > lme_urb = usb_alloc_urb ( 0 , GFP_ATOMIC ) ;
if ( lme_int - > lme_urb = = NULL )
return - ENOMEM ;
2012-08-06 16:21:40 -03:00
lme_int - > buffer = usb_alloc_coherent ( d - > udev , 128 , GFP_ATOMIC ,
2010-09-02 17:29:30 -03:00
& lme_int - > lme_urb - > transfer_dma ) ;
if ( lme_int - > buffer = = NULL )
return - ENOMEM ;
usb_fill_int_urb ( lme_int - > lme_urb ,
2012-08-06 16:21:40 -03:00
d - > udev ,
usb_rcvintpipe ( d - > udev , 0xa ) ,
2010-09-02 17:29:30 -03:00
lme_int - > buffer ,
2011-09-11 19:26:50 -03:00
128 ,
2010-09-02 17:29:30 -03:00
lme2510_int_response ,
adap ,
2011-09-11 19:26:50 -03:00
8 ) ;
2010-09-02 17:29:30 -03:00
lme_int - > lme_urb - > transfer_flags | = URB_NO_TRANSFER_DMA_MAP ;
usb_submit_urb ( lme_int - > lme_urb , GFP_ATOMIC ) ;
2011-03-30 22:57:33 -03:00
info ( " INT Interrupt Service Started " ) ;
2010-09-02 17:29:30 -03:00
return 0 ;
}
2011-04-02 18:59:29 -03:00
static int lme2510_pid_filter_ctrl ( struct dvb_usb_adapter * adap , int onoff )
{
2012-08-06 16:21:40 -03:00
struct dvb_usb_device * d = adap_to_d ( adap ) ;
struct lme2510_state * st = adap_to_priv ( adap ) ;
2012-03-07 18:08:10 -03:00
static u8 clear_pid_reg [ ] = LME_ALL_PIDS ;
2011-04-02 18:59:29 -03:00
static u8 rbuf [ 1 ] ;
2012-05-07 12:04:42 -03:00
int ret = 0 ;
2011-04-02 18:59:29 -03:00
deb_info ( 1 , " PID Clearing Filter " ) ;
2012-08-06 16:21:40 -03:00
mutex_lock ( & d - > i2c_mutex ) ;
2011-04-02 18:59:29 -03:00
2012-03-07 18:08:10 -03:00
if ( ! onoff ) {
2012-08-06 16:21:40 -03:00
ret | = lme2510_usb_talk ( d , clear_pid_reg ,
2011-04-02 18:59:29 -03:00
sizeof ( clear_pid_reg ) , rbuf , sizeof ( rbuf ) ) ;
2012-03-07 18:08:10 -03:00
st - > pid_off = true ;
} else
st - > pid_off = false ;
2011-04-02 18:59:29 -03:00
2011-04-22 06:20:57 -03:00
st - > pid_size = 0 ;
2012-08-06 16:21:40 -03:00
mutex_unlock ( & d - > i2c_mutex ) ;
2011-04-02 18:59:29 -03:00
return 0 ;
}
static int lme2510_pid_filter ( struct dvb_usb_adapter * adap , int index , u16 pid ,
int onoff )
{
2012-08-06 16:21:40 -03:00
struct dvb_usb_device * d = adap_to_d ( adap ) ;
2011-04-02 18:59:29 -03:00
int ret = 0 ;
deb_info ( 3 , " %s PID=%04x Index=%04x onoff=%02x " , __func__ ,
pid , index , onoff ) ;
2011-12-30 11:33:03 -03:00
if ( onoff ) {
2012-08-06 16:21:40 -03:00
mutex_lock ( & d - > i2c_mutex ) ;
ret | = lme2510_enable_pid ( d , index , pid ) ;
mutex_unlock ( & d - > i2c_mutex ) ;
2011-04-22 06:20:57 -03:00
}
2011-04-02 18:59:29 -03:00
return ret ;
}
2012-08-06 16:21:40 -03:00
static int lme2510_return_status ( struct dvb_usb_device * d )
2010-09-02 17:29:30 -03:00
{
int ret = 0 ;
2011-03-20 18:50:52 -03:00
u8 * data ;
data = kzalloc ( 10 , GFP_KERNEL ) ;
if ( ! data )
return - ENOMEM ;
2010-10-16 16:44:43 -03:00
2012-08-06 16:21:40 -03:00
ret | = usb_control_msg ( d - > udev , usb_rcvctrlpipe ( d - > udev , 0 ) ,
2010-09-02 17:29:30 -03:00
0x06 , 0x80 , 0x0302 , 0x00 , data , 0x0006 , 200 ) ;
info ( " Firmware Status: %x (%x) " , ret , data [ 2 ] ) ;
2011-03-20 18:50:52 -03:00
ret = ( ret < 0 ) ? - ENODEV : data [ 2 ] ;
kfree ( data ) ;
return ret ;
2010-09-02 17:29:30 -03:00
}
static int lme2510_msg ( struct dvb_usb_device * d ,
u8 * wbuf , int wlen , u8 * rbuf , int rlen )
{
int ret = 0 ;
struct lme2510_state * st = d - > priv ;
2010-10-16 16:44:43 -03:00
if ( st - > i2c_talk_onoff = = 1 ) {
2010-09-02 17:29:30 -03:00
ret = lme2510_usb_talk ( d , wbuf , wlen , rbuf , rlen ) ;
switch ( st - > tuner_config ) {
2010-10-16 16:44:43 -03:00
case TUNER_LG :
if ( wbuf [ 2 ] = = 0x1c ) {
if ( wbuf [ 3 ] = = 0x0e ) {
st - > signal_lock = rbuf [ 1 ] ;
if ( ( st - > stream_on & 1 ) & &
( st - > signal_lock & 0x10 ) ) {
2010-10-27 19:50:36 -03:00
lme2510_stream_restart ( d ) ;
2010-10-16 16:44:43 -03:00
st - > i2c_talk_onoff = 0 ;
}
2010-10-27 19:50:36 -03:00
msleep ( 80 ) ;
2010-10-16 16:44:43 -03:00
}
}
break ;
2010-09-02 17:29:30 -03:00
case TUNER_S7395 :
2010-10-16 16:44:43 -03:00
if ( wbuf [ 2 ] = = 0xd0 ) {
if ( wbuf [ 3 ] = = 0x24 ) {
st - > signal_lock = rbuf [ 1 ] ;
if ( ( st - > stream_on & 1 ) & &
( st - > signal_lock & 0x8 ) ) {
2010-10-27 19:50:36 -03:00
lme2510_stream_restart ( d ) ;
2010-10-16 16:44:43 -03:00
st - > i2c_talk_onoff = 0 ;
}
}
}
2010-09-02 17:29:30 -03:00
break ;
2011-02-12 22:35:08 -03:00
case TUNER_S0194 :
if ( wbuf [ 2 ] = = 0xd0 ) {
if ( wbuf [ 3 ] = = 0x1b ) {
st - > signal_lock = rbuf [ 1 ] ;
if ( ( st - > stream_on & 1 ) & &
( st - > signal_lock & 0x8 ) ) {
lme2510_stream_restart ( d ) ;
st - > i2c_talk_onoff = 0 ;
}
}
}
break ;
2012-03-07 18:08:10 -03:00
case TUNER_RS2000 :
2010-09-02 17:29:30 -03:00
default :
break ;
}
} else {
2012-03-07 18:08:10 -03:00
/* TODO rewrite this section */
2010-09-02 17:29:30 -03:00
switch ( st - > tuner_config ) {
case TUNER_LG :
switch ( wbuf [ 3 ] ) {
case 0x0e :
rbuf [ 0 ] = 0x55 ;
rbuf [ 1 ] = st - > signal_lock ;
break ;
case 0x43 :
rbuf [ 0 ] = 0x55 ;
rbuf [ 1 ] = st - > signal_level ;
break ;
case 0x1c :
rbuf [ 0 ] = 0x55 ;
rbuf [ 1 ] = st - > signal_sn ;
break ;
2010-10-27 19:50:36 -03:00
case 0x15 :
case 0x16 :
case 0x17 :
case 0x18 :
rbuf [ 0 ] = 0x55 ;
rbuf [ 1 ] = 0x00 ;
break ;
2010-09-02 17:29:30 -03:00
default :
2010-10-27 19:50:36 -03:00
lme2510_usb_talk ( d , wbuf , wlen , rbuf , rlen ) ;
st - > i2c_talk_onoff = 1 ;
2010-09-02 17:29:30 -03:00
break ;
}
break ;
case TUNER_S7395 :
switch ( wbuf [ 3 ] ) {
case 0x10 :
rbuf [ 0 ] = 0x55 ;
rbuf [ 1 ] = ( st - > signal_level & 0x80 )
? 0 : ( st - > signal_level * 2 ) ;
break ;
case 0x2d :
rbuf [ 0 ] = 0x55 ;
rbuf [ 1 ] = st - > signal_sn ;
break ;
case 0x24 :
rbuf [ 0 ] = 0x55 ;
2010-10-27 19:50:36 -03:00
rbuf [ 1 ] = st - > signal_lock ;
2010-10-16 16:44:43 -03:00
break ;
2010-10-27 19:50:36 -03:00
case 0x2e :
case 0x26 :
case 0x27 :
2010-10-16 16:44:43 -03:00
rbuf [ 0 ] = 0x55 ;
rbuf [ 1 ] = 0x00 ;
2010-09-02 17:29:30 -03:00
break ;
2010-10-27 19:50:36 -03:00
default :
lme2510_usb_talk ( d , wbuf , wlen , rbuf , rlen ) ;
st - > i2c_talk_onoff = 1 ;
break ;
2010-09-02 17:29:30 -03:00
}
break ;
2011-02-12 22:35:08 -03:00
case TUNER_S0194 :
switch ( wbuf [ 3 ] ) {
case 0x18 :
rbuf [ 0 ] = 0x55 ;
rbuf [ 1 ] = ( st - > signal_level & 0x80 )
? 0 : ( st - > signal_level * 2 ) ;
break ;
case 0x24 :
rbuf [ 0 ] = 0x55 ;
rbuf [ 1 ] = st - > signal_sn ;
break ;
case 0x1b :
rbuf [ 0 ] = 0x55 ;
rbuf [ 1 ] = st - > signal_lock ;
break ;
case 0x19 :
case 0x25 :
case 0x1e :
case 0x1d :
rbuf [ 0 ] = 0x55 ;
rbuf [ 1 ] = 0x00 ;
break ;
default :
lme2510_usb_talk ( d , wbuf , wlen , rbuf , rlen ) ;
st - > i2c_talk_onoff = 1 ;
break ;
}
break ;
2012-03-07 18:08:10 -03:00
case TUNER_RS2000 :
switch ( wbuf [ 3 ] ) {
case 0x8c :
rbuf [ 0 ] = 0x55 ;
rbuf [ 1 ] = 0xff ;
if ( st - > last_key = = st - > time_key ) {
st - > key_timeout + + ;
if ( st - > key_timeout > 5 )
rbuf [ 1 ] = 0 ;
} else
st - > key_timeout = 0 ;
st - > last_key = st - > time_key ;
break ;
default :
lme2510_usb_talk ( d , wbuf , wlen , rbuf , rlen ) ;
st - > i2c_talk_onoff = 1 ;
break ;
}
2010-09-02 17:29:30 -03:00
default :
break ;
}
2011-03-30 22:57:33 -03:00
deb_info ( 4 , " I2C From Interrupt Message out(%02x) in(%02x) " ,
2010-09-02 17:29:30 -03:00
wbuf [ 3 ] , rbuf [ 1 ] ) ;
}
return ret ;
}
static int lme2510_i2c_xfer ( struct i2c_adapter * adap , struct i2c_msg msg [ ] ,
int num )
{
struct dvb_usb_device * d = i2c_get_adapdata ( adap ) ;
struct lme2510_state * st = d - > priv ;
2011-09-11 19:30:10 -03:00
static u8 obuf [ 64 ] , ibuf [ 64 ] ;
2010-09-02 17:29:30 -03:00
int i , read , read_o ;
u16 len ;
u8 gate = st - > i2c_gate ;
2012-03-07 18:08:10 -03:00
mutex_lock ( & d - > i2c_mutex ) ;
2010-09-02 17:29:30 -03:00
if ( gate = = 0 )
gate = 5 ;
for ( i = 0 ; i < num ; i + + ) {
2012-12-29 07:34:24 -03:00
read_o = msg [ i ] . flags & I2C_M_RD ;
read = i + 1 < num & & msg [ i + 1 ] . flags & I2C_M_RD ;
2010-09-02 17:29:30 -03:00
read | = read_o ;
gate = ( msg [ i ] . addr = = st - > i2c_tuner_addr )
? ( read ) ? st - > i2c_tuner_gate_r
: st - > i2c_tuner_gate_w
: st - > i2c_gate ;
obuf [ 0 ] = gate | ( read < < 7 ) ;
if ( gate = = 5 )
obuf [ 1 ] = ( read ) ? 2 : msg [ i ] . len + 1 ;
else
obuf [ 1 ] = msg [ i ] . len + read + 1 ;
2012-12-29 07:34:24 -03:00
obuf [ 2 ] = msg [ i ] . addr < < 1 ;
2010-09-02 17:29:30 -03:00
if ( read ) {
if ( read_o )
len = 3 ;
else {
memcpy ( & obuf [ 3 ] , msg [ i ] . buf , msg [ i ] . len ) ;
obuf [ msg [ i ] . len + 3 ] = msg [ i + 1 ] . len ;
len = msg [ i ] . len + 4 ;
}
} else {
memcpy ( & obuf [ 3 ] , msg [ i ] . buf , msg [ i ] . len ) ;
len = msg [ i ] . len + 3 ;
}
2011-09-11 19:30:10 -03:00
if ( lme2510_msg ( d , obuf , len , ibuf , 64 ) < 0 ) {
2010-09-02 17:29:30 -03:00
deb_info ( 1 , " i2c transfer failed. " ) ;
2012-03-07 18:08:10 -03:00
mutex_unlock ( & d - > i2c_mutex ) ;
2010-09-02 17:29:30 -03:00
return - EAGAIN ;
}
if ( read ) {
if ( read_o )
memcpy ( msg [ i ] . buf , & ibuf [ 1 ] , msg [ i ] . len ) ;
else {
memcpy ( msg [ i + 1 ] . buf , & ibuf [ 1 ] , msg [ i + 1 ] . len ) ;
i + + ;
}
}
}
2012-03-07 18:08:10 -03:00
mutex_unlock ( & d - > i2c_mutex ) ;
2010-09-02 17:29:30 -03:00
return i ;
}
static u32 lme2510_i2c_func ( struct i2c_adapter * adapter )
{
return I2C_FUNC_I2C ;
}
static struct i2c_algorithm lme2510_i2c_algo = {
. master_xfer = lme2510_i2c_xfer ,
. functionality = lme2510_i2c_func ,
} ;
2012-08-06 16:21:40 -03:00
static int lme2510_streaming_ctrl ( struct dvb_frontend * fe , int onoff )
2010-09-02 17:29:30 -03:00
{
2012-08-06 16:21:40 -03:00
struct dvb_usb_adapter * adap = fe_to_adap ( fe ) ;
struct dvb_usb_device * d = adap_to_d ( adap ) ;
struct lme2510_state * st = adap_to_priv ( adap ) ;
2012-03-07 18:08:10 -03:00
static u8 clear_reg_3 [ ] = LME_ALL_PIDS ;
2010-09-02 17:29:30 -03:00
static u8 rbuf [ 1 ] ;
2010-10-27 19:50:36 -03:00
int ret = 0 , rlen = sizeof ( rbuf ) ;
2010-09-02 17:29:30 -03:00
deb_info ( 1 , " STM (%02x) " , onoff ) ;
2010-10-27 19:50:36 -03:00
/* Streaming is started by FE_HAS_LOCK */
if ( onoff = = 1 )
2010-10-16 16:44:43 -03:00
st - > stream_on = 1 ;
2010-10-27 19:50:36 -03:00
else {
2010-09-02 17:29:30 -03:00
deb_info ( 1 , " STM Steam Off " ) ;
2010-10-27 19:50:36 -03:00
/* mutex is here only to avoid collision with I2C */
2012-08-06 16:21:40 -03:00
mutex_lock ( & d - > i2c_mutex ) ;
2010-10-27 19:50:36 -03:00
2012-08-06 16:21:40 -03:00
ret = lme2510_usb_talk ( d , clear_reg_3 ,
2010-09-02 17:29:30 -03:00
sizeof ( clear_reg_3 ) , rbuf , rlen ) ;
2010-10-16 16:44:43 -03:00
st - > stream_on = 0 ;
2010-09-02 17:29:30 -03:00
st - > i2c_talk_onoff = 1 ;
2010-10-27 19:50:36 -03:00
2012-08-06 16:21:40 -03:00
mutex_unlock ( & d - > i2c_mutex ) ;
2010-09-02 17:29:30 -03:00
}
return ( ret < 0 ) ? - ENODEV : 0 ;
}
static u8 check_sum ( u8 * p , u8 len )
{
u8 sum = 0 ;
while ( len - - )
sum + = * p + + ;
return sum ;
}
2012-08-06 16:21:40 -03:00
static int lme2510_download_firmware ( struct dvb_usb_device * d ,
2010-09-02 17:29:30 -03:00
const struct firmware * fw )
{
int ret = 0 ;
2011-03-20 18:50:52 -03:00
u8 * data ;
2010-09-02 17:29:30 -03:00
u16 j , wlen , len_in , start , end ;
u8 packet_size , dlen , i ;
u8 * fw_data ;
packet_size = 0x31 ;
len_in = 1 ;
2012-08-06 16:21:40 -03:00
data = kzalloc ( 128 , GFP_KERNEL ) ;
2011-03-20 18:50:52 -03:00
if ( ! data ) {
2012-08-06 16:21:40 -03:00
info ( " FRM Could not start Firmware Download " \
" (Buffer allocation failed) " ) ;
2011-03-20 18:50:52 -03:00
return - ENOMEM ;
}
2010-09-02 17:29:30 -03:00
info ( " FRM Starting Firmware Download " ) ;
for ( i = 1 ; i < 3 ; i + + ) {
start = ( i = = 1 ) ? 0 : 512 ;
end = ( i = = 1 ) ? 512 : fw - > size ;
for ( j = start ; j < end ; j + = ( packet_size + 1 ) ) {
fw_data = ( u8 * ) ( fw - > data + j ) ;
if ( ( end - j ) > packet_size ) {
data [ 0 ] = i ;
dlen = packet_size ;
} else {
data [ 0 ] = i | 0x80 ;
dlen = ( u8 ) ( end - j ) - 1 ;
}
2011-03-20 18:50:51 -03:00
data [ 1 ] = dlen ;
memcpy ( & data [ 2 ] , fw_data , dlen + 1 ) ;
wlen = ( u8 ) dlen + 4 ;
data [ wlen - 1 ] = check_sum ( fw_data , dlen + 1 ) ;
deb_info ( 1 , " Data S=%02x:E=%02x CS= %02x " , data [ 3 ] ,
2010-09-02 17:29:30 -03:00
data [ dlen + 2 ] , data [ dlen + 3 ] ) ;
2012-08-06 16:21:40 -03:00
lme2510_usb_talk ( d , data , wlen , data , len_in ) ;
2011-03-20 18:50:51 -03:00
ret | = ( data [ 0 ] = = 0x88 ) ? 0 : - 1 ;
2010-09-02 17:29:30 -03:00
}
}
2010-10-27 19:50:36 -03:00
2010-09-02 17:29:30 -03:00
data [ 0 ] = 0x8a ;
len_in = 1 ;
msleep ( 2000 ) ;
2012-08-06 16:21:40 -03:00
lme2510_usb_talk ( d , data , len_in , data , len_in ) ;
2010-09-02 17:29:30 -03:00
msleep ( 400 ) ;
if ( ret < 0 )
info ( " FRM Firmware Download Failed (%04x) " , ret ) ;
else
info ( " FRM Firmware Download Completed - Resetting Device " ) ;
2011-03-20 18:50:52 -03:00
kfree ( data ) ;
2012-08-06 16:21:40 -03:00
return RECONNECTS_USB ;
2010-09-02 17:29:30 -03:00
}
2012-08-06 16:21:40 -03:00
static void lme_coldreset ( struct dvb_usb_device * d )
2010-10-16 16:44:43 -03:00
{
2012-08-06 16:21:40 -03:00
u8 data [ 1 ] = { 0 } ;
2010-10-16 16:44:43 -03:00
data [ 0 ] = 0x0a ;
info ( " FRM Firmware Cold Reset " ) ;
2012-08-06 16:21:40 -03:00
lme2510_usb_talk ( d , data , sizeof ( data ) , data , sizeof ( data ) ) ;
2010-10-27 19:50:36 -03:00
2010-10-16 16:44:43 -03:00
return ;
}
2012-08-06 16:21:40 -03:00
static const char fw_c_s7395 [ ] = LME2510_C_S7395 ;
static const char fw_c_lg [ ] = LME2510_C_LG ;
static const char fw_c_s0194 [ ] = LME2510_C_S0194 ;
static const char fw_c_rs2000 [ ] = LME2510_C_RS2000 ;
static const char fw_lg [ ] = LME2510_LG ;
static const char fw_s0194 [ ] = LME2510_S0194 ;
2012-10-27 14:11:15 -03:00
static const char * lme_firmware_switch ( struct dvb_usb_device * d , int cold )
2010-10-16 16:44:43 -03:00
{
2012-08-06 16:21:40 -03:00
struct lme2510_state * st = d - > priv ;
struct usb_device * udev = d - > udev ;
2010-10-16 16:44:43 -03:00
const struct firmware * fw = NULL ;
2011-02-12 22:35:08 -03:00
const char * fw_lme ;
2012-08-06 16:21:40 -03:00
int ret = 0 ;
2010-10-16 16:44:43 -03:00
2010-10-27 19:50:36 -03:00
cold = ( cold > 0 ) ? ( cold & 1 ) : 0 ;
2012-03-07 18:08:10 -03:00
switch ( le16_to_cpu ( udev - > descriptor . idProduct ) ) {
case 0x1122 :
2012-08-06 16:21:40 -03:00
switch ( st - > dvb_usb_lme2510_firmware ) {
2011-02-12 22:35:08 -03:00
default :
2012-08-06 16:21:40 -03:00
st - > dvb_usb_lme2510_firmware = TUNER_S0194 ;
2011-02-12 22:35:08 -03:00
case TUNER_S0194 :
fw_lme = fw_s0194 ;
ret = request_firmware ( & fw , fw_lme , & udev - > dev ) ;
if ( ret = = 0 ) {
2011-02-13 20:12:15 -03:00
cold = 0 ;
2011-02-12 22:35:08 -03:00
break ;
}
2012-08-06 16:21:40 -03:00
st - > dvb_usb_lme2510_firmware = TUNER_LG ;
2011-02-12 22:35:08 -03:00
case TUNER_LG :
fw_lme = fw_lg ;
ret = request_firmware ( & fw , fw_lme , & udev - > dev ) ;
if ( ret = = 0 )
break ;
2012-08-06 16:21:40 -03:00
st - > dvb_usb_lme2510_firmware = TUNER_DEFAULT ;
2010-10-16 16:44:43 -03:00
break ;
}
2012-03-07 18:08:10 -03:00
break ;
case 0x1120 :
2012-08-06 16:21:40 -03:00
switch ( st - > dvb_usb_lme2510_firmware ) {
2011-02-12 22:35:08 -03:00
default :
2012-08-06 16:21:40 -03:00
st - > dvb_usb_lme2510_firmware = TUNER_S7395 ;
2011-02-12 22:35:08 -03:00
case TUNER_S7395 :
fw_lme = fw_c_s7395 ;
ret = request_firmware ( & fw , fw_lme , & udev - > dev ) ;
2011-02-13 20:12:15 -03:00
if ( ret = = 0 ) {
cold = 0 ;
2011-02-12 22:35:08 -03:00
break ;
2011-02-13 20:12:15 -03:00
}
2012-08-06 16:21:40 -03:00
st - > dvb_usb_lme2510_firmware = TUNER_LG ;
2011-02-12 22:35:08 -03:00
case TUNER_LG :
fw_lme = fw_c_lg ;
ret = request_firmware ( & fw , fw_lme , & udev - > dev ) ;
if ( ret = = 0 )
break ;
2012-08-06 16:21:40 -03:00
st - > dvb_usb_lme2510_firmware = TUNER_S0194 ;
2011-02-12 22:35:08 -03:00
case TUNER_S0194 :
fw_lme = fw_c_s0194 ;
ret = request_firmware ( & fw , fw_lme , & udev - > dev ) ;
if ( ret = = 0 )
break ;
2012-08-06 16:21:40 -03:00
st - > dvb_usb_lme2510_firmware = TUNER_DEFAULT ;
2010-10-16 16:44:43 -03:00
cold = 0 ;
break ;
}
2012-03-07 18:08:10 -03:00
break ;
case 0x22f0 :
fw_lme = fw_c_rs2000 ;
2012-08-06 16:21:40 -03:00
st - > dvb_usb_lme2510_firmware = TUNER_RS2000 ;
2012-03-07 18:08:10 -03:00
break ;
default :
fw_lme = fw_c_s7395 ;
2010-10-16 16:44:43 -03:00
}
2010-10-27 19:50:36 -03:00
2011-02-13 20:12:15 -03:00
release_firmware ( fw ) ;
[media] DM04/QQBOX Frontend attach change
On Fri, 2010-12-03 at 09:32 -0200, Mauro Carvalho Chehab wrote:
> Em 27-11-2010 11:13, Malcolm Priestley escreveu:
> > Driver Version v1.73 - Frontend attach change.
> > To stop double rc registration in multi tuner environment or firmware change.
> >
> > Signed-off-by: Malcolm Priestley <tvboxspy@gmail.com>
> >
> >
> > +static int lme_name(struct dvb_usb_adapter *adap)
> > +{
> > + struct lme2510_state *st = adap->dev->priv;
> > + const char *desc = adap->dev->desc->name;
> > + char *fe_name[] = {"", " LG TDQY-P001F", " SHARP:BS2F7HZ7395"};
> > + char *name = adap->fe->ops.info.name;
> > +
> > + strcpy(name, desc);
> > + strcat(name, fe_name[st->tuner_config]);
>
> Please use, instead, strlcpy/strlcat, to avoid writing outside the buffer size.
>
Driver Version v1.74
Amended patch with change to strlcpy/strlcat.
Signed-off-by: Malcolm Priestley <tvboxspy@gmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
2010-12-07 19:49:24 -03:00
if ( cold ) {
2012-08-06 16:21:40 -03:00
dvb_usb_lme2510_firmware = st - > dvb_usb_lme2510_firmware ;
2011-02-12 22:35:08 -03:00
info ( " FRM Changing to %s firmware " , fw_lme ) ;
2012-08-06 16:21:40 -03:00
lme_coldreset ( d ) ;
return NULL ;
[media] DM04/QQBOX Frontend attach change
On Fri, 2010-12-03 at 09:32 -0200, Mauro Carvalho Chehab wrote:
> Em 27-11-2010 11:13, Malcolm Priestley escreveu:
> > Driver Version v1.73 - Frontend attach change.
> > To stop double rc registration in multi tuner environment or firmware change.
> >
> > Signed-off-by: Malcolm Priestley <tvboxspy@gmail.com>
> >
> >
> > +static int lme_name(struct dvb_usb_adapter *adap)
> > +{
> > + struct lme2510_state *st = adap->dev->priv;
> > + const char *desc = adap->dev->desc->name;
> > + char *fe_name[] = {"", " LG TDQY-P001F", " SHARP:BS2F7HZ7395"};
> > + char *name = adap->fe->ops.info.name;
> > +
> > + strcpy(name, desc);
> > + strcat(name, fe_name[st->tuner_config]);
>
> Please use, instead, strlcpy/strlcat, to avoid writing outside the buffer size.
>
Driver Version v1.74
Amended patch with change to strlcpy/strlcat.
Signed-off-by: Malcolm Priestley <tvboxspy@gmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
2010-12-07 19:49:24 -03:00
}
2010-10-27 19:50:36 -03:00
2012-08-06 16:21:40 -03:00
return fw_lme ;
2010-10-16 16:44:43 -03:00
}
2010-09-02 17:29:30 -03:00
static int lme2510_kill_urb ( struct usb_data_stream * stream )
{
int i ;
2010-10-27 19:50:36 -03:00
2010-09-02 17:29:30 -03:00
for ( i = 0 ; i < stream - > urbs_submitted ; i + + ) {
deb_info ( 3 , " killing URB no. %d. " , i ) ;
/* stop the URB */
usb_kill_urb ( stream - > urb_list [ i ] ) ;
}
stream - > urbs_submitted = 0 ;
2010-10-27 19:50:36 -03:00
2010-09-02 17:29:30 -03:00
return 0 ;
}
static struct tda10086_config tda10086_config = {
2012-12-29 07:34:24 -03:00
. demod_address = 0x0e ,
2010-09-02 17:29:30 -03:00
. invert = 0 ,
. diseqc_tone = 1 ,
. xtal_freq = TDA10086_XTAL_16M ,
} ;
static struct stv0288_config lme_config = {
2012-12-29 07:34:24 -03:00
. demod_address = 0x68 ,
2010-09-02 17:29:30 -03:00
. min_delay_ms = 15 ,
. inittab = s7395_inittab ,
} ;
static struct ix2505v_config lme_tuner = {
2012-12-29 07:34:24 -03:00
. tuner_address = 0x60 ,
2010-09-02 17:29:30 -03:00
. min_delay_ms = 100 ,
. tuner_gain = 0x0 ,
. tuner_chargepump = 0x3 ,
} ;
2011-02-12 22:35:08 -03:00
static struct stv0299_config sharp_z0194_config = {
2012-12-29 07:34:24 -03:00
. demod_address = 0x68 ,
2011-02-12 22:35:08 -03:00
. inittab = sharp_z0194a_inittab ,
. mclk = 88000000UL ,
. invert = 0 ,
. skip_reinit = 0 ,
. lock_output = STV0299_LOCKOUTPUT_1 ,
. volt13_op0_op1 = STV0299_VOLT13_OP1 ,
. min_delay_ms = 100 ,
. set_symbol_rate = sharp_z0194a_set_symbol_rate ,
} ;
2012-03-07 18:08:10 -03:00
static int dm04_rs2000_set_ts_param ( struct dvb_frontend * fe ,
int caller )
{
2012-08-06 16:21:40 -03:00
struct dvb_usb_adapter * adap = fe_to_adap ( fe ) ;
struct dvb_usb_device * d = adap_to_d ( adap ) ;
2012-03-07 18:08:10 -03:00
struct lme2510_state * st = d - > priv ;
mutex_lock ( & d - > i2c_mutex ) ;
if ( ( st - > i2c_talk_onoff = = 1 ) & & ( st - > stream_on & 1 ) ) {
st - > i2c_talk_onoff = 0 ;
lme2510_stream_restart ( d ) ;
}
mutex_unlock ( & d - > i2c_mutex ) ;
return 0 ;
}
static struct m88rs2000_config m88rs2000_config = {
2012-12-29 07:34:24 -03:00
. demod_addr = 0x68 ,
2012-03-07 18:08:10 -03:00
. set_ts_params = dm04_rs2000_set_ts_param ,
} ;
2012-12-28 19:40:33 -03:00
static struct ts2020_config ts2020_config = {
. tuner_address = 0x60 ,
. clk_out_div = 7 ,
} ;
2010-09-02 17:29:30 -03:00
static int dm04_lme2510_set_voltage ( struct dvb_frontend * fe ,
fe_sec_voltage_t voltage )
{
2012-08-06 16:21:40 -03:00
struct dvb_usb_device * d = fe_to_d ( fe ) ;
struct lme2510_state * st = fe_to_priv ( fe ) ;
static u8 voltage_low [ ] = LME_VOLTAGE_L ;
2010-09-02 17:29:30 -03:00
static u8 voltage_high [ ] = LME_VOLTAGE_H ;
static u8 rbuf [ 1 ] ;
int ret = 0 , len = 3 , rlen = 1 ;
2012-08-06 16:21:40 -03:00
mutex_lock ( & d - > i2c_mutex ) ;
2010-09-02 17:29:30 -03:00
2010-10-16 16:44:43 -03:00
switch ( voltage ) {
case SEC_VOLTAGE_18 :
2012-08-06 16:21:40 -03:00
ret | = lme2510_usb_talk ( d ,
2010-10-16 16:44:43 -03:00
voltage_high , len , rbuf , rlen ) ;
2010-09-02 17:29:30 -03:00
break ;
2010-10-16 16:44:43 -03:00
case SEC_VOLTAGE_OFF :
case SEC_VOLTAGE_13 :
default :
2012-08-06 16:21:40 -03:00
ret | = lme2510_usb_talk ( d ,
2010-09-02 17:29:30 -03:00
voltage_low , len , rbuf , rlen ) ;
break ;
2010-10-27 19:50:36 -03:00
}
2010-09-02 17:29:30 -03:00
2012-08-06 16:21:40 -03:00
mutex_unlock ( & d - > i2c_mutex ) ;
if ( st - > tuner_config = = TUNER_RS2000 )
if ( st - > fe_set_voltage )
st - > fe_set_voltage ( fe , voltage ) ;
2010-09-02 17:29:30 -03:00
return ( ret < 0 ) ? - ENODEV : 0 ;
}
2012-03-07 18:08:10 -03:00
static int dm04_rs2000_read_signal_strength ( struct dvb_frontend * fe ,
u16 * strength )
{
2012-08-06 16:21:40 -03:00
struct lme2510_state * st = fe_to_priv ( fe ) ;
* strength = ( u16 ) ( ( u32 ) st - > signal_level * 0xffff / 0xff ) ;
2012-03-07 18:08:10 -03:00
return 0 ;
}
static int dm04_rs2000_read_snr ( struct dvb_frontend * fe , u16 * snr )
{
2012-08-06 16:21:40 -03:00
struct lme2510_state * st = fe_to_priv ( fe ) ;
* snr = ( u16 ) ( ( u32 ) st - > signal_sn * 0xffff / 0x7f ) ;
return 0 ;
}
static int dm04_read_ber ( struct dvb_frontend * fe , u32 * ber )
{
* ber = 0 ;
return 0 ;
}
static int dm04_read_ucblocks ( struct dvb_frontend * fe , u32 * ucblocks )
{
* ucblocks = 0 ;
2012-03-07 18:08:10 -03:00
return 0 ;
}
[media] DM04/QQBOX Frontend attach change
On Fri, 2010-12-03 at 09:32 -0200, Mauro Carvalho Chehab wrote:
> Em 27-11-2010 11:13, Malcolm Priestley escreveu:
> > Driver Version v1.73 - Frontend attach change.
> > To stop double rc registration in multi tuner environment or firmware change.
> >
> > Signed-off-by: Malcolm Priestley <tvboxspy@gmail.com>
> >
> >
> > +static int lme_name(struct dvb_usb_adapter *adap)
> > +{
> > + struct lme2510_state *st = adap->dev->priv;
> > + const char *desc = adap->dev->desc->name;
> > + char *fe_name[] = {"", " LG TDQY-P001F", " SHARP:BS2F7HZ7395"};
> > + char *name = adap->fe->ops.info.name;
> > +
> > + strcpy(name, desc);
> > + strcat(name, fe_name[st->tuner_config]);
>
> Please use, instead, strlcpy/strlcat, to avoid writing outside the buffer size.
>
Driver Version v1.74
Amended patch with change to strlcpy/strlcat.
Signed-off-by: Malcolm Priestley <tvboxspy@gmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
2010-12-07 19:49:24 -03:00
static int lme_name ( struct dvb_usb_adapter * adap )
{
2012-08-06 16:21:40 -03:00
struct dvb_usb_device * d = adap_to_d ( adap ) ;
struct lme2510_state * st = adap_to_priv ( adap ) ;
const char * desc = d - > name ;
2011-02-12 22:35:08 -03:00
char * fe_name [ ] = { " " , " LG TDQY-P001F " , " SHARP:BS2F7HZ7395 " ,
2012-03-07 18:08:10 -03:00
" SHARP:BS2F7HZ0194 " , " RS2000 " } ;
2012-08-06 16:21:40 -03:00
char * name = adap - > fe [ 0 ] - > ops . info . name ;
[media] DM04/QQBOX Frontend attach change
On Fri, 2010-12-03 at 09:32 -0200, Mauro Carvalho Chehab wrote:
> Em 27-11-2010 11:13, Malcolm Priestley escreveu:
> > Driver Version v1.73 - Frontend attach change.
> > To stop double rc registration in multi tuner environment or firmware change.
> >
> > Signed-off-by: Malcolm Priestley <tvboxspy@gmail.com>
> >
> >
> > +static int lme_name(struct dvb_usb_adapter *adap)
> > +{
> > + struct lme2510_state *st = adap->dev->priv;
> > + const char *desc = adap->dev->desc->name;
> > + char *fe_name[] = {"", " LG TDQY-P001F", " SHARP:BS2F7HZ7395"};
> > + char *name = adap->fe->ops.info.name;
> > +
> > + strcpy(name, desc);
> > + strcat(name, fe_name[st->tuner_config]);
>
> Please use, instead, strlcpy/strlcat, to avoid writing outside the buffer size.
>
Driver Version v1.74
Amended patch with change to strlcpy/strlcat.
Signed-off-by: Malcolm Priestley <tvboxspy@gmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
2010-12-07 19:49:24 -03:00
strlcpy ( name , desc , 128 ) ;
strlcat ( name , fe_name [ st - > tuner_config ] , 128 ) ;
return 0 ;
}
2010-09-02 17:29:30 -03:00
static int dm04_lme2510_frontend_attach ( struct dvb_usb_adapter * adap )
{
2012-08-06 16:21:40 -03:00
struct dvb_usb_device * d = adap_to_d ( adap ) ;
struct lme2510_state * st = d - > priv ;
[media] DM04/QQBOX Frontend attach change
On Fri, 2010-12-03 at 09:32 -0200, Mauro Carvalho Chehab wrote:
> Em 27-11-2010 11:13, Malcolm Priestley escreveu:
> > Driver Version v1.73 - Frontend attach change.
> > To stop double rc registration in multi tuner environment or firmware change.
> >
> > Signed-off-by: Malcolm Priestley <tvboxspy@gmail.com>
> >
> >
> > +static int lme_name(struct dvb_usb_adapter *adap)
> > +{
> > + struct lme2510_state *st = adap->dev->priv;
> > + const char *desc = adap->dev->desc->name;
> > + char *fe_name[] = {"", " LG TDQY-P001F", " SHARP:BS2F7HZ7395"};
> > + char *name = adap->fe->ops.info.name;
> > +
> > + strcpy(name, desc);
> > + strcat(name, fe_name[st->tuner_config]);
>
> Please use, instead, strlcpy/strlcat, to avoid writing outside the buffer size.
>
Driver Version v1.74
Amended patch with change to strlcpy/strlcat.
Signed-off-by: Malcolm Priestley <tvboxspy@gmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
2010-12-07 19:49:24 -03:00
int ret = 0 ;
2010-09-02 17:29:30 -03:00
st - > i2c_talk_onoff = 1 ;
2012-08-06 16:21:40 -03:00
switch ( le16_to_cpu ( d - > udev - > descriptor . idProduct ) ) {
2012-03-07 18:08:10 -03:00
case 0x1122 :
case 0x1120 :
st - > i2c_gate = 4 ;
2012-08-06 16:21:40 -03:00
adap - > fe [ 0 ] = dvb_attach ( tda10086_attach ,
& tda10086_config , & d - > i2c_adap ) ;
if ( adap - > fe [ 0 ] ) {
2012-03-07 18:08:10 -03:00
info ( " TUN Found Frontend TDA10086 " ) ;
st - > i2c_tuner_gate_w = 4 ;
st - > i2c_tuner_gate_r = 4 ;
2012-12-29 07:34:24 -03:00
st - > i2c_tuner_addr = 0x60 ;
2012-03-07 18:08:10 -03:00
st - > tuner_config = TUNER_LG ;
2012-08-06 16:21:40 -03:00
if ( st - > dvb_usb_lme2510_firmware ! = TUNER_LG ) {
st - > dvb_usb_lme2510_firmware = TUNER_LG ;
ret = lme_firmware_switch ( d , 1 ) ? 0 : - ENODEV ;
2012-03-07 18:08:10 -03:00
}
break ;
}
2010-09-02 17:29:30 -03:00
2012-03-07 18:08:10 -03:00
st - > i2c_gate = 4 ;
2012-08-06 16:21:40 -03:00
adap - > fe [ 0 ] = dvb_attach ( stv0299_attach ,
& sharp_z0194_config , & d - > i2c_adap ) ;
if ( adap - > fe [ 0 ] ) {
2012-03-07 18:08:10 -03:00
info ( " FE Found Stv0299 " ) ;
st - > i2c_tuner_gate_w = 4 ;
st - > i2c_tuner_gate_r = 5 ;
2012-12-29 07:34:24 -03:00
st - > i2c_tuner_addr = 0x60 ;
2012-03-07 18:08:10 -03:00
st - > tuner_config = TUNER_S0194 ;
2012-08-06 16:21:40 -03:00
if ( st - > dvb_usb_lme2510_firmware ! = TUNER_S0194 ) {
st - > dvb_usb_lme2510_firmware = TUNER_S0194 ;
ret = lme_firmware_switch ( d , 1 ) ? 0 : - ENODEV ;
2012-03-07 18:08:10 -03:00
}
break ;
2011-02-12 22:35:08 -03:00
}
2012-03-07 18:08:10 -03:00
st - > i2c_gate = 5 ;
2012-08-06 16:21:40 -03:00
adap - > fe [ 0 ] = dvb_attach ( stv0288_attach , & lme_config ,
& d - > i2c_adap ) ;
2012-03-07 18:08:10 -03:00
2012-08-06 16:21:40 -03:00
if ( adap - > fe [ 0 ] ) {
2012-03-07 18:08:10 -03:00
info ( " FE Found Stv0288 " ) ;
st - > i2c_tuner_gate_w = 4 ;
st - > i2c_tuner_gate_r = 5 ;
2012-12-29 07:34:24 -03:00
st - > i2c_tuner_addr = 0x60 ;
2012-03-07 18:08:10 -03:00
st - > tuner_config = TUNER_S7395 ;
2012-08-06 16:21:40 -03:00
if ( st - > dvb_usb_lme2510_firmware ! = TUNER_S7395 ) {
st - > dvb_usb_lme2510_firmware = TUNER_S7395 ;
ret = lme_firmware_switch ( d , 1 ) ? 0 : - ENODEV ;
2012-03-07 18:08:10 -03:00
}
break ;
2011-02-12 22:35:08 -03:00
}
2012-03-07 18:08:10 -03:00
case 0x22f0 :
st - > i2c_gate = 5 ;
2012-08-06 16:21:40 -03:00
adap - > fe [ 0 ] = dvb_attach ( m88rs2000_attach ,
& m88rs2000_config , & d - > i2c_adap ) ;
2010-10-27 19:50:36 -03:00
2012-08-06 16:21:40 -03:00
if ( adap - > fe [ 0 ] ) {
2012-03-07 18:08:10 -03:00
info ( " FE Found M88RS2000 " ) ;
2012-12-28 19:40:33 -03:00
dvb_attach ( ts2020_attach , adap - > fe [ 0 ] , & ts2020_config ,
& d - > i2c_adap ) ;
2012-03-07 18:08:10 -03:00
st - > i2c_tuner_gate_w = 5 ;
st - > i2c_tuner_gate_r = 5 ;
2012-12-29 07:34:24 -03:00
st - > i2c_tuner_addr = 0x60 ;
2012-03-07 18:08:10 -03:00
st - > tuner_config = TUNER_RS2000 ;
2012-08-06 16:21:40 -03:00
st - > fe_set_voltage =
adap - > fe [ 0 ] - > ops . set_voltage ;
adap - > fe [ 0 ] - > ops . read_signal_strength =
2012-03-07 18:08:10 -03:00
dm04_rs2000_read_signal_strength ;
2012-08-06 16:21:40 -03:00
adap - > fe [ 0 ] - > ops . read_snr =
2012-03-07 18:08:10 -03:00
dm04_rs2000_read_snr ;
2012-08-06 16:21:40 -03:00
adap - > fe [ 0 ] - > ops . read_ber =
dm04_read_ber ;
adap - > fe [ 0 ] - > ops . read_ucblocks =
dm04_read_ucblocks ;
2010-09-02 17:29:30 -03:00
}
2012-03-07 18:08:10 -03:00
break ;
[media] DM04/QQBOX Frontend attach change
On Fri, 2010-12-03 at 09:32 -0200, Mauro Carvalho Chehab wrote:
> Em 27-11-2010 11:13, Malcolm Priestley escreveu:
> > Driver Version v1.73 - Frontend attach change.
> > To stop double rc registration in multi tuner environment or firmware change.
> >
> > Signed-off-by: Malcolm Priestley <tvboxspy@gmail.com>
> >
> >
> > +static int lme_name(struct dvb_usb_adapter *adap)
> > +{
> > + struct lme2510_state *st = adap->dev->priv;
> > + const char *desc = adap->dev->desc->name;
> > + char *fe_name[] = {"", " LG TDQY-P001F", " SHARP:BS2F7HZ7395"};
> > + char *name = adap->fe->ops.info.name;
> > +
> > + strcpy(name, desc);
> > + strcat(name, fe_name[st->tuner_config]);
>
> Please use, instead, strlcpy/strlcat, to avoid writing outside the buffer size.
>
Driver Version v1.74
Amended patch with change to strlcpy/strlcat.
Signed-off-by: Malcolm Priestley <tvboxspy@gmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
2010-12-07 19:49:24 -03:00
}
2012-08-06 16:21:40 -03:00
if ( adap - > fe [ 0 ] = = NULL ) {
info ( " DM04/QQBOX Not Powered up or not Supported " ) ;
return - ENODEV ;
2012-03-07 18:08:10 -03:00
}
2011-02-12 22:35:08 -03:00
2012-03-07 18:08:10 -03:00
if ( ret ) {
2012-08-06 16:21:40 -03:00
if ( adap - > fe [ 0 ] ) {
dvb_frontend_detach ( adap - > fe [ 0 ] ) ;
adap - > fe [ 0 ] = NULL ;
2011-05-25 18:28:29 -03:00
}
2012-08-06 16:21:40 -03:00
d - > rc_map = NULL ;
[media] DM04/QQBOX Frontend attach change
On Fri, 2010-12-03 at 09:32 -0200, Mauro Carvalho Chehab wrote:
> Em 27-11-2010 11:13, Malcolm Priestley escreveu:
> > Driver Version v1.73 - Frontend attach change.
> > To stop double rc registration in multi tuner environment or firmware change.
> >
> > Signed-off-by: Malcolm Priestley <tvboxspy@gmail.com>
> >
> >
> > +static int lme_name(struct dvb_usb_adapter *adap)
> > +{
> > + struct lme2510_state *st = adap->dev->priv;
> > + const char *desc = adap->dev->desc->name;
> > + char *fe_name[] = {"", " LG TDQY-P001F", " SHARP:BS2F7HZ7395"};
> > + char *name = adap->fe->ops.info.name;
> > +
> > + strcpy(name, desc);
> > + strcat(name, fe_name[st->tuner_config]);
>
> Please use, instead, strlcpy/strlcat, to avoid writing outside the buffer size.
>
Driver Version v1.74
Amended patch with change to strlcpy/strlcat.
Signed-off-by: Malcolm Priestley <tvboxspy@gmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
2010-12-07 19:49:24 -03:00
return - ENODEV ;
2010-09-02 17:29:30 -03:00
}
2012-08-06 16:21:40 -03:00
adap - > fe [ 0 ] - > ops . set_voltage = dm04_lme2510_set_voltage ;
[media] DM04/QQBOX Frontend attach change
On Fri, 2010-12-03 at 09:32 -0200, Mauro Carvalho Chehab wrote:
> Em 27-11-2010 11:13, Malcolm Priestley escreveu:
> > Driver Version v1.73 - Frontend attach change.
> > To stop double rc registration in multi tuner environment or firmware change.
> >
> > Signed-off-by: Malcolm Priestley <tvboxspy@gmail.com>
> >
> >
> > +static int lme_name(struct dvb_usb_adapter *adap)
> > +{
> > + struct lme2510_state *st = adap->dev->priv;
> > + const char *desc = adap->dev->desc->name;
> > + char *fe_name[] = {"", " LG TDQY-P001F", " SHARP:BS2F7HZ7395"};
> > + char *name = adap->fe->ops.info.name;
> > +
> > + strcpy(name, desc);
> > + strcat(name, fe_name[st->tuner_config]);
>
> Please use, instead, strlcpy/strlcat, to avoid writing outside the buffer size.
>
Driver Version v1.74
Amended patch with change to strlcpy/strlcat.
Signed-off-by: Malcolm Priestley <tvboxspy@gmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
2010-12-07 19:49:24 -03:00
ret = lme_name ( adap ) ;
return ret ;
}
static int dm04_lme2510_tuner ( struct dvb_usb_adapter * adap )
{
2012-08-06 16:21:40 -03:00
struct dvb_usb_device * d = adap_to_d ( adap ) ;
struct lme2510_state * st = adap_to_priv ( adap ) ;
2012-03-07 18:08:10 -03:00
char * tun_msg [ ] = { " " , " TDA8263 " , " IX2505V " , " DVB_PLL_OPERA " , " RS2000 " } ;
[media] DM04/QQBOX Frontend attach change
On Fri, 2010-12-03 at 09:32 -0200, Mauro Carvalho Chehab wrote:
> Em 27-11-2010 11:13, Malcolm Priestley escreveu:
> > Driver Version v1.73 - Frontend attach change.
> > To stop double rc registration in multi tuner environment or firmware change.
> >
> > Signed-off-by: Malcolm Priestley <tvboxspy@gmail.com>
> >
> >
> > +static int lme_name(struct dvb_usb_adapter *adap)
> > +{
> > + struct lme2510_state *st = adap->dev->priv;
> > + const char *desc = adap->dev->desc->name;
> > + char *fe_name[] = {"", " LG TDQY-P001F", " SHARP:BS2F7HZ7395"};
> > + char *name = adap->fe->ops.info.name;
> > +
> > + strcpy(name, desc);
> > + strcat(name, fe_name[st->tuner_config]);
>
> Please use, instead, strlcpy/strlcat, to avoid writing outside the buffer size.
>
Driver Version v1.74
Amended patch with change to strlcpy/strlcat.
Signed-off-by: Malcolm Priestley <tvboxspy@gmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
2010-12-07 19:49:24 -03:00
int ret = 0 ;
switch ( st - > tuner_config ) {
case TUNER_LG :
2012-12-29 07:34:24 -03:00
if ( dvb_attach ( tda826x_attach , adap - > fe [ 0 ] , 0x60 ,
2012-08-06 16:21:40 -03:00
& d - > i2c_adap , 1 ) )
[media] DM04/QQBOX Frontend attach change
On Fri, 2010-12-03 at 09:32 -0200, Mauro Carvalho Chehab wrote:
> Em 27-11-2010 11:13, Malcolm Priestley escreveu:
> > Driver Version v1.73 - Frontend attach change.
> > To stop double rc registration in multi tuner environment or firmware change.
> >
> > Signed-off-by: Malcolm Priestley <tvboxspy@gmail.com>
> >
> >
> > +static int lme_name(struct dvb_usb_adapter *adap)
> > +{
> > + struct lme2510_state *st = adap->dev->priv;
> > + const char *desc = adap->dev->desc->name;
> > + char *fe_name[] = {"", " LG TDQY-P001F", " SHARP:BS2F7HZ7395"};
> > + char *name = adap->fe->ops.info.name;
> > +
> > + strcpy(name, desc);
> > + strcat(name, fe_name[st->tuner_config]);
>
> Please use, instead, strlcpy/strlcat, to avoid writing outside the buffer size.
>
Driver Version v1.74
Amended patch with change to strlcpy/strlcat.
Signed-off-by: Malcolm Priestley <tvboxspy@gmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
2010-12-07 19:49:24 -03:00
ret = st - > tuner_config ;
break ;
case TUNER_S7395 :
2012-08-06 16:21:40 -03:00
if ( dvb_attach ( ix2505v_attach , adap - > fe [ 0 ] , & lme_tuner ,
& d - > i2c_adap ) )
[media] DM04/QQBOX Frontend attach change
On Fri, 2010-12-03 at 09:32 -0200, Mauro Carvalho Chehab wrote:
> Em 27-11-2010 11:13, Malcolm Priestley escreveu:
> > Driver Version v1.73 - Frontend attach change.
> > To stop double rc registration in multi tuner environment or firmware change.
> >
> > Signed-off-by: Malcolm Priestley <tvboxspy@gmail.com>
> >
> >
> > +static int lme_name(struct dvb_usb_adapter *adap)
> > +{
> > + struct lme2510_state *st = adap->dev->priv;
> > + const char *desc = adap->dev->desc->name;
> > + char *fe_name[] = {"", " LG TDQY-P001F", " SHARP:BS2F7HZ7395"};
> > + char *name = adap->fe->ops.info.name;
> > +
> > + strcpy(name, desc);
> > + strcat(name, fe_name[st->tuner_config]);
>
> Please use, instead, strlcpy/strlcat, to avoid writing outside the buffer size.
>
Driver Version v1.74
Amended patch with change to strlcpy/strlcat.
Signed-off-by: Malcolm Priestley <tvboxspy@gmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
2010-12-07 19:49:24 -03:00
ret = st - > tuner_config ;
break ;
2011-02-12 22:35:08 -03:00
case TUNER_S0194 :
2012-12-29 07:34:24 -03:00
if ( dvb_attach ( dvb_pll_attach , adap - > fe [ 0 ] , 0x60 ,
2012-08-06 16:21:40 -03:00
& d - > i2c_adap , DVB_PLL_OPERA1 ) )
2011-02-12 22:35:08 -03:00
ret = st - > tuner_config ;
break ;
2012-03-07 18:08:10 -03:00
case TUNER_RS2000 :
ret = st - > tuner_config ;
break ;
[media] DM04/QQBOX Frontend attach change
On Fri, 2010-12-03 at 09:32 -0200, Mauro Carvalho Chehab wrote:
> Em 27-11-2010 11:13, Malcolm Priestley escreveu:
> > Driver Version v1.73 - Frontend attach change.
> > To stop double rc registration in multi tuner environment or firmware change.
> >
> > Signed-off-by: Malcolm Priestley <tvboxspy@gmail.com>
> >
> >
> > +static int lme_name(struct dvb_usb_adapter *adap)
> > +{
> > + struct lme2510_state *st = adap->dev->priv;
> > + const char *desc = adap->dev->desc->name;
> > + char *fe_name[] = {"", " LG TDQY-P001F", " SHARP:BS2F7HZ7395"};
> > + char *name = adap->fe->ops.info.name;
> > +
> > + strcpy(name, desc);
> > + strcat(name, fe_name[st->tuner_config]);
>
> Please use, instead, strlcpy/strlcat, to avoid writing outside the buffer size.
>
Driver Version v1.74
Amended patch with change to strlcpy/strlcat.
Signed-off-by: Malcolm Priestley <tvboxspy@gmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
2010-12-07 19:49:24 -03:00
default :
break ;
}
if ( ret )
info ( " TUN Found %s tuner " , tun_msg [ ret ] ) ;
else {
2012-01-27 09:47:04 -03:00
info ( " TUN No tuner found --- resetting device " ) ;
2012-08-06 16:21:40 -03:00
lme_coldreset ( d ) ;
[media] DM04/QQBOX Frontend attach change
On Fri, 2010-12-03 at 09:32 -0200, Mauro Carvalho Chehab wrote:
> Em 27-11-2010 11:13, Malcolm Priestley escreveu:
> > Driver Version v1.73 - Frontend attach change.
> > To stop double rc registration in multi tuner environment or firmware change.
> >
> > Signed-off-by: Malcolm Priestley <tvboxspy@gmail.com>
> >
> >
> > +static int lme_name(struct dvb_usb_adapter *adap)
> > +{
> > + struct lme2510_state *st = adap->dev->priv;
> > + const char *desc = adap->dev->desc->name;
> > + char *fe_name[] = {"", " LG TDQY-P001F", " SHARP:BS2F7HZ7395"};
> > + char *name = adap->fe->ops.info.name;
> > +
> > + strcpy(name, desc);
> > + strcat(name, fe_name[st->tuner_config]);
>
> Please use, instead, strlcpy/strlcat, to avoid writing outside the buffer size.
>
Driver Version v1.74
Amended patch with change to strlcpy/strlcat.
Signed-off-by: Malcolm Priestley <tvboxspy@gmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
2010-12-07 19:49:24 -03:00
return - ENODEV ;
}
2011-05-25 18:28:29 -03:00
/* Start the Interrupt*/
ret = lme2510_int_read ( adap ) ;
if ( ret < 0 ) {
info ( " INT Unable to start Interrupt Service " ) ;
return - ENODEV ;
}
[media] DM04/QQBOX Frontend attach change
On Fri, 2010-12-03 at 09:32 -0200, Mauro Carvalho Chehab wrote:
> Em 27-11-2010 11:13, Malcolm Priestley escreveu:
> > Driver Version v1.73 - Frontend attach change.
> > To stop double rc registration in multi tuner environment or firmware change.
> >
> > Signed-off-by: Malcolm Priestley <tvboxspy@gmail.com>
> >
> >
> > +static int lme_name(struct dvb_usb_adapter *adap)
> > +{
> > + struct lme2510_state *st = adap->dev->priv;
> > + const char *desc = adap->dev->desc->name;
> > + char *fe_name[] = {"", " LG TDQY-P001F", " SHARP:BS2F7HZ7395"};
> > + char *name = adap->fe->ops.info.name;
> > +
> > + strcpy(name, desc);
> > + strcat(name, fe_name[st->tuner_config]);
>
> Please use, instead, strlcpy/strlcat, to avoid writing outside the buffer size.
>
Driver Version v1.74
Amended patch with change to strlcpy/strlcat.
Signed-off-by: Malcolm Priestley <tvboxspy@gmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
2010-12-07 19:49:24 -03:00
return ret ;
2010-09-02 17:29:30 -03:00
}
static int lme2510_powerup ( struct dvb_usb_device * d , int onoff )
{
struct lme2510_state * st = d - > priv ;
2010-10-27 19:50:36 -03:00
static u8 lnb_on [ ] = LNB_ON ;
static u8 lnb_off [ ] = LNB_OFF ;
static u8 rbuf [ 1 ] ;
2012-03-07 18:08:10 -03:00
int ret = 0 , len = 3 , rlen = 1 ;
2010-10-27 19:50:36 -03:00
2012-03-07 18:08:10 -03:00
mutex_lock ( & d - > i2c_mutex ) ;
2010-10-27 19:50:36 -03:00
if ( onoff )
2011-04-15 17:40:17 -03:00
ret = lme2510_usb_talk ( d , lnb_on , len , rbuf , rlen ) ;
2010-10-27 19:50:36 -03:00
else
2011-04-15 17:40:17 -03:00
ret = lme2510_usb_talk ( d , lnb_off , len , rbuf , rlen ) ;
2010-10-27 19:50:36 -03:00
2010-09-02 17:29:30 -03:00
st - > i2c_talk_onoff = 1 ;
2010-10-27 19:50:36 -03:00
mutex_unlock ( & d - > i2c_mutex ) ;
return ret ;
2010-09-02 17:29:30 -03:00
}
2012-08-06 16:21:40 -03:00
static int lme2510_get_adapter_count ( struct dvb_usb_device * d )
2010-09-02 17:29:30 -03:00
{
2012-08-06 16:21:40 -03:00
return 1 ;
}
2010-09-02 17:29:30 -03:00
2012-08-06 16:21:40 -03:00
static int lme2510_identify_state ( struct dvb_usb_device * d , const char * * name )
{
struct lme2510_state * st = d - > priv ;
2010-09-02 17:29:30 -03:00
2012-08-06 16:21:40 -03:00
usb_reset_configuration ( d - > udev ) ;
2010-09-02 17:29:30 -03:00
2012-08-06 16:21:40 -03:00
usb_set_interface ( d - > udev ,
d - > intf - > cur_altsetting - > desc . bInterfaceNumber , 1 ) ;
2010-09-02 17:29:30 -03:00
2012-08-06 16:21:40 -03:00
st - > dvb_usb_lme2510_firmware = dvb_usb_lme2510_firmware ;
2010-10-16 16:44:43 -03:00
2012-08-06 16:21:40 -03:00
if ( lme2510_return_status ( d ) = = 0x44 ) {
* name = lme_firmware_switch ( d , 0 ) ;
return COLD ;
2010-09-02 17:29:30 -03:00
}
2012-08-06 16:21:40 -03:00
return 0 ;
2010-09-02 17:29:30 -03:00
}
2012-08-06 16:21:40 -03:00
static int lme2510_get_stream_config ( struct dvb_frontend * fe , u8 * ts_type ,
struct usb_data_stream_properties * stream )
{
struct dvb_usb_adapter * adap = fe_to_adap ( fe ) ;
struct dvb_usb_device * d = adap_to_d ( adap ) ;
2010-09-02 17:29:30 -03:00
2012-08-06 16:21:40 -03:00
if ( adap = = NULL )
return 0 ;
/* Turn PID filter on the fly by module option */
if ( pid_filter = = 2 ) {
adap - > pid_filtering = 1 ;
adap - > max_feed_count = 15 ;
2010-09-02 17:29:30 -03:00
}
2012-08-06 16:21:40 -03:00
if ( ! ( le16_to_cpu ( d - > udev - > descriptor . idProduct )
= = 0x1122 ) )
stream - > endpoint = 0x8 ;
2010-09-02 17:29:30 -03:00
2012-08-06 16:21:40 -03:00
return 0 ;
}
static int lme2510_get_rc_config ( struct dvb_usb_device * d ,
struct dvb_usb_rc * rc )
{
2012-10-11 19:11:54 -03:00
rc - > allowed_protos = RC_BIT_NEC ;
2012-08-06 16:21:40 -03:00
return 0 ;
}
2010-09-02 17:29:30 -03:00
2011-04-22 06:07:40 -03:00
static void * lme2510_exit_int ( struct dvb_usb_device * d )
2010-09-02 17:29:30 -03:00
{
struct lme2510_state * st = d - > priv ;
2010-10-16 16:44:43 -03:00
struct dvb_usb_adapter * adap = & d - > adapter [ 0 ] ;
void * buffer = NULL ;
if ( adap ! = NULL ) {
2012-08-06 16:21:40 -03:00
lme2510_kill_urb ( & adap - > stream ) ;
2010-10-16 16:44:43 -03:00
}
2011-05-25 18:28:29 -03:00
if ( st - > usb_buffer ! = NULL ) {
2010-10-16 16:44:43 -03:00
st - > i2c_talk_onoff = 1 ;
2010-09-02 17:29:30 -03:00
st - > signal_lock = 0 ;
st - > signal_level = 0 ;
st - > signal_sn = 0 ;
2010-10-16 16:44:43 -03:00
buffer = st - > usb_buffer ;
2011-05-25 18:28:29 -03:00
}
if ( st - > lme_urb ! = NULL ) {
2010-09-02 17:29:30 -03:00
usb_kill_urb ( st - > lme_urb ) ;
2011-09-11 19:26:50 -03:00
usb_free_coherent ( d - > udev , 128 , st - > buffer ,
2010-09-02 17:29:30 -03:00
st - > lme_urb - > transfer_dma ) ;
2011-03-30 22:57:33 -03:00
info ( " Interrupt Service Stopped " ) ;
2010-09-02 17:29:30 -03:00
}
2011-05-25 18:28:29 -03:00
2010-10-16 16:44:43 -03:00
return buffer ;
2010-09-02 17:29:30 -03:00
}
2012-08-06 16:21:40 -03:00
static void lme2510_exit ( struct dvb_usb_device * d )
2010-09-02 17:29:30 -03:00
{
2010-10-16 16:44:43 -03:00
void * usb_buffer ;
2010-09-02 17:29:30 -03:00
if ( d ! = NULL ) {
2010-10-16 16:44:43 -03:00
usb_buffer = lme2510_exit_int ( d ) ;
2011-05-25 18:28:29 -03:00
if ( usb_buffer ! = NULL )
kfree ( usb_buffer ) ;
2010-09-02 17:29:30 -03:00
}
}
2012-08-06 16:21:40 -03:00
static struct dvb_usb_device_properties lme2510_props = {
. driver_name = KBUILD_MODNAME ,
. owner = THIS_MODULE ,
. bInterfaceNumber = 0 ,
. adapter_nr = adapter_nr ,
. size_of_priv = sizeof ( struct lme2510_state ) ,
. download_firmware = lme2510_download_firmware ,
. power_ctrl = lme2510_powerup ,
. identify_state = lme2510_identify_state ,
. i2c_algo = & lme2510_i2c_algo ,
. frontend_attach = dm04_lme2510_frontend_attach ,
. tuner_attach = dm04_lme2510_tuner ,
. get_stream_config = lme2510_get_stream_config ,
. get_adapter_count = lme2510_get_adapter_count ,
. streaming_ctrl = lme2510_streaming_ctrl ,
. get_rc_config = lme2510_get_rc_config ,
. exit = lme2510_exit ,
. adapter = {
{
. caps = DVB_USB_ADAP_HAS_PID_FILTER |
DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF ,
. pid_filter_count = 15 ,
. pid_filter = lme2510_pid_filter ,
. pid_filter_ctrl = lme2510_pid_filter_ctrl ,
. stream =
DVB_USB_STREAM_BULK ( 0x86 , 10 , 4096 ) ,
} ,
{
}
} ,
} ;
static const struct usb_device_id lme2510_id_table [ ] = {
{ DVB_USB_DEVICE ( 0x3344 , 0x1122 , & lme2510_props ,
" DM04_LME2510_DVB-S " , RC_MAP_LME2510 ) } ,
{ DVB_USB_DEVICE ( 0x3344 , 0x1120 , & lme2510_props ,
" DM04_LME2510C_DVB-S " , RC_MAP_LME2510 ) } ,
{ DVB_USB_DEVICE ( 0x3344 , 0x22f0 , & lme2510_props ,
" DM04_LME2510C_DVB-S RS2000 " , RC_MAP_LME2510 ) } ,
{ } /* Terminating entry */
} ;
MODULE_DEVICE_TABLE ( usb , lme2510_id_table ) ;
2010-09-02 17:29:30 -03:00
static struct usb_driver lme2510_driver = {
2012-08-06 16:21:40 -03:00
. name = KBUILD_MODNAME ,
. probe = dvb_usbv2_probe ,
. disconnect = dvb_usbv2_disconnect ,
. id_table = lme2510_id_table ,
. no_dynamic_id = 1 ,
. soft_unbind = 1 ,
2010-09-02 17:29:30 -03:00
} ;
2011-11-18 09:46:12 -08:00
module_usb_driver ( lme2510_driver ) ;
2010-09-02 17:29:30 -03:00
MODULE_AUTHOR ( " Malcolm Priestley <tvboxspy@gmail.com> " ) ;
[media] DM04/QQBOX Frontend attach change
On Fri, 2010-12-03 at 09:32 -0200, Mauro Carvalho Chehab wrote:
> Em 27-11-2010 11:13, Malcolm Priestley escreveu:
> > Driver Version v1.73 - Frontend attach change.
> > To stop double rc registration in multi tuner environment or firmware change.
> >
> > Signed-off-by: Malcolm Priestley <tvboxspy@gmail.com>
> >
> >
> > +static int lme_name(struct dvb_usb_adapter *adap)
> > +{
> > + struct lme2510_state *st = adap->dev->priv;
> > + const char *desc = adap->dev->desc->name;
> > + char *fe_name[] = {"", " LG TDQY-P001F", " SHARP:BS2F7HZ7395"};
> > + char *name = adap->fe->ops.info.name;
> > +
> > + strcpy(name, desc);
> > + strcat(name, fe_name[st->tuner_config]);
>
> Please use, instead, strlcpy/strlcat, to avoid writing outside the buffer size.
>
Driver Version v1.74
Amended patch with change to strlcpy/strlcat.
Signed-off-by: Malcolm Priestley <tvboxspy@gmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
2010-12-07 19:49:24 -03:00
MODULE_DESCRIPTION ( " LME2510(C) DVB-S USB2.0 " ) ;
2012-08-06 16:21:40 -03:00
MODULE_VERSION ( " 2.06 " ) ;
2010-09-02 17:29:30 -03:00
MODULE_LICENSE ( " GPL " ) ;
2012-08-06 16:21:40 -03:00
MODULE_FIRMWARE ( LME2510_C_S7395 ) ;
MODULE_FIRMWARE ( LME2510_C_LG ) ;
MODULE_FIRMWARE ( LME2510_C_S0194 ) ;
MODULE_FIRMWARE ( LME2510_C_RS2000 ) ;
MODULE_FIRMWARE ( LME2510_LG ) ;
MODULE_FIRMWARE ( LME2510_S0194 ) ;