2008-05-17 23:05:48 -03:00
/*
* DVB USB Linux driver for Anysee E30 DVB - C & DVB - T USB2 .0 receiver
*
* Copyright ( C ) 2007 Antti Palosaari < crope @ iki . fi >
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 2 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 General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 675 Mass Ave , Cambridge , MA 0213 9 , USA .
*
* TODO :
* - add smart card reader support for Conditional Access ( CA )
*
* Card reader in Anysee is nothing more than ISO 7816 card reader .
* There is no hardware CAM in any Anysee device sold .
* In my understanding it should be implemented by making own module
2008-06-11 11:43:19 -03:00
* for ISO 7816 card reader , like dvb_ca_en50221 is implemented . This
* module registers serial interface that can be used to communicate
2008-05-17 23:05:48 -03:00
* with any ISO 7816 smart card .
*
* Any help according to implement serial smart card reader support
* is highly welcome !
*/
# include "anysee.h"
# include "tda1002x.h"
# include "mt352.h"
# include "mt352_priv.h"
# include "zl10353.h"
/* debug */
static int dvb_usb_anysee_debug ;
module_param_named ( debug , dvb_usb_anysee_debug , int , 0644 ) ;
MODULE_PARM_DESC ( debug , " set debugging level " DVB_USB_DEBUG_STATUS ) ;
2009-01-05 01:34:20 -03:00
static int dvb_usb_anysee_delsys ;
2008-08-11 10:54:16 -03:00
module_param_named ( delsys , dvb_usb_anysee_delsys , int , 0644 ) ;
MODULE_PARM_DESC ( delsys , " select delivery mode (0=DVB-C, 1=DVB-T) " ) ;
2008-05-17 23:05:48 -03:00
DVB_DEFINE_MOD_OPT_ADAPTER_NR ( adapter_nr ) ;
2008-10-29 21:16:04 -03:00
static DEFINE_MUTEX ( anysee_usb_mutex ) ;
2008-05-17 23:05:48 -03:00
static int anysee_ctrl_msg ( struct dvb_usb_device * d , u8 * sbuf , u8 slen ,
u8 * rbuf , u8 rlen )
{
struct anysee_state * state = d - > priv ;
int act_len , ret ;
u8 buf [ 64 ] ;
if ( slen > sizeof ( buf ) )
slen = sizeof ( buf ) ;
memcpy ( & buf [ 0 ] , sbuf , slen ) ;
buf [ 60 ] = state - > seq + + ;
if ( mutex_lock_interruptible ( & anysee_usb_mutex ) < 0 )
return - EAGAIN ;
/* We need receive one message more after dvb_usb_generic_rw due
to weird transaction flow , which is 1 x send + 2 x receive . */
ret = dvb_usb_generic_rw ( d , buf , sizeof ( buf ) , buf , sizeof ( buf ) , 0 ) ;
if ( ! ret ) {
/* receive 2nd answer */
ret = usb_bulk_msg ( d - > udev , usb_rcvbulkpipe ( d - > udev ,
d - > props . generic_bulk_ctrl_endpoint ) , buf , sizeof ( buf ) ,
& act_len , 2000 ) ;
if ( ret )
err ( " %s: recv bulk message failed: %d " , __func__ , ret ) ;
else {
deb_xfer ( " <<< " ) ;
debug_dump ( buf , act_len , deb_xfer ) ;
}
}
/* read request, copy returned data to return buf */
if ( ! ret & & rbuf & & rlen )
memcpy ( rbuf , buf , rlen ) ;
mutex_unlock ( & anysee_usb_mutex ) ;
return ret ;
}
static int anysee_read_reg ( struct dvb_usb_device * d , u16 reg , u8 * val )
{
u8 buf [ ] = { CMD_REG_READ , reg > > 8 , reg & 0xff , 0x01 } ;
int ret ;
ret = anysee_ctrl_msg ( d , buf , sizeof ( buf ) , val , 1 ) ;
deb_info ( " %s: reg:%04x val:%02x \n " , __func__ , reg , * val ) ;
return ret ;
}
static int anysee_write_reg ( struct dvb_usb_device * d , u16 reg , u8 val )
{
u8 buf [ ] = { CMD_REG_WRITE , reg > > 8 , reg & 0xff , 0x01 , val } ;
deb_info ( " %s: reg:%04x val:%02x \n " , __func__ , reg , val ) ;
return anysee_ctrl_msg ( d , buf , sizeof ( buf ) , NULL , 0 ) ;
}
2011-04-10 17:53:52 -03:00
/* write single register with mask */
static int anysee_wr_reg_mask ( struct dvb_usb_device * d , u16 reg , u8 val ,
u8 mask )
{
int ret ;
u8 tmp ;
/* no need for read if whole reg is written */
if ( mask ! = 0xff ) {
ret = anysee_read_reg ( d , reg , & tmp ) ;
if ( ret )
return ret ;
val & = mask ;
tmp & = ~ mask ;
val | = tmp ;
}
return anysee_write_reg ( d , reg , val ) ;
}
2008-05-17 23:05:48 -03:00
static int anysee_get_hw_info ( struct dvb_usb_device * d , u8 * id )
{
u8 buf [ ] = { CMD_GET_HW_INFO } ;
return anysee_ctrl_msg ( d , buf , sizeof ( buf ) , id , 3 ) ;
}
static int anysee_streaming_ctrl ( struct dvb_usb_adapter * adap , int onoff )
{
u8 buf [ ] = { CMD_STREAMING_CTRL , ( u8 ) onoff , 0x00 } ;
deb_info ( " %s: onoff:%02x \n " , __func__ , onoff ) ;
return anysee_ctrl_msg ( adap - > dev , buf , sizeof ( buf ) , NULL , 0 ) ;
}
static int anysee_led_ctrl ( struct dvb_usb_device * d , u8 mode , u8 interval )
{
u8 buf [ ] = { CMD_LED_AND_IR_CTRL , 0x01 , mode , interval } ;
deb_info ( " %s: state:%02x interval:%02x \n " , __func__ , mode , interval ) ;
return anysee_ctrl_msg ( d , buf , sizeof ( buf ) , NULL , 0 ) ;
}
static int anysee_ir_ctrl ( struct dvb_usb_device * d , u8 onoff )
{
u8 buf [ ] = { CMD_LED_AND_IR_CTRL , 0x02 , onoff } ;
deb_info ( " %s: onoff:%02x \n " , __func__ , onoff ) ;
return anysee_ctrl_msg ( d , buf , sizeof ( buf ) , NULL , 0 ) ;
}
static int anysee_init ( struct dvb_usb_device * d )
{
int ret ;
/* LED light */
ret = anysee_led_ctrl ( d , 0x01 , 0x03 ) ;
if ( ret )
return ret ;
/* enable IR */
ret = anysee_ir_ctrl ( d , 1 ) ;
if ( ret )
return ret ;
return 0 ;
}
/* I2C */
static int anysee_master_xfer ( struct i2c_adapter * adap , struct i2c_msg * msg ,
int num )
{
struct dvb_usb_device * d = i2c_get_adapdata ( adap ) ;
2008-12-29 19:02:24 -03:00
int ret = 0 , inc , i = 0 ;
2008-05-17 23:05:48 -03:00
if ( mutex_lock_interruptible ( & d - > i2c_mutex ) < 0 )
return - EAGAIN ;
while ( i < num ) {
if ( num > i + 1 & & ( msg [ i + 1 ] . flags & I2C_M_RD ) ) {
u8 buf [ 6 ] ;
buf [ 0 ] = CMD_I2C_READ ;
2011-04-09 20:50:07 -03:00
buf [ 1 ] = ( msg [ i ] . addr < < 1 ) | 0x01 ;
2008-05-17 23:05:48 -03:00
buf [ 2 ] = msg [ i ] . buf [ 0 ] ;
buf [ 3 ] = 0x00 ;
buf [ 4 ] = 0x00 ;
2011-04-09 21:00:51 -03:00
buf [ 5 ] = msg [ i + 1 ] . len ;
2008-05-17 23:05:48 -03:00
ret = anysee_ctrl_msg ( d , buf , sizeof ( buf ) , msg [ i + 1 ] . buf ,
msg [ i + 1 ] . len ) ;
inc = 2 ;
} else {
u8 buf [ 4 + msg [ i ] . len ] ;
buf [ 0 ] = CMD_I2C_WRITE ;
2011-04-09 20:50:07 -03:00
buf [ 1 ] = ( msg [ i ] . addr < < 1 ) ;
2008-05-17 23:05:48 -03:00
buf [ 2 ] = msg [ i ] . len ;
buf [ 3 ] = 0x01 ;
memcpy ( & buf [ 4 ] , msg [ i ] . buf , msg [ i ] . len ) ;
ret = anysee_ctrl_msg ( d , buf , sizeof ( buf ) , NULL , 0 ) ;
inc = 1 ;
}
if ( ret )
2008-08-11 10:36:43 -03:00
break ;
2008-05-17 23:05:48 -03:00
i + = inc ;
}
mutex_unlock ( & d - > i2c_mutex ) ;
2008-08-11 10:36:43 -03:00
return ret ? ret : i ;
2008-05-17 23:05:48 -03:00
}
static u32 anysee_i2c_func ( struct i2c_adapter * adapter )
{
return I2C_FUNC_I2C ;
}
static struct i2c_algorithm anysee_i2c_algo = {
. master_xfer = anysee_master_xfer ,
. functionality = anysee_i2c_func ,
} ;
static int anysee_mt352_demod_init ( struct dvb_frontend * fe )
{
2009-09-16 19:50:25 -03:00
static u8 clock_config [ ] = { CLOCK_CTL , 0x38 , 0x28 } ;
static u8 reset [ ] = { RESET , 0x80 } ;
static u8 adc_ctl_1_cfg [ ] = { ADC_CTL_1 , 0x40 } ;
static u8 agc_cfg [ ] = { AGC_TARGET , 0x28 , 0x20 } ;
static u8 gpp_ctl_cfg [ ] = { GPP_CTL , 0x33 } ;
2008-05-17 23:05:48 -03:00
static u8 capt_range_cfg [ ] = { CAPT_RANGE , 0x32 } ;
mt352_write ( fe , clock_config , sizeof ( clock_config ) ) ;
udelay ( 200 ) ;
mt352_write ( fe , reset , sizeof ( reset ) ) ;
mt352_write ( fe , adc_ctl_1_cfg , sizeof ( adc_ctl_1_cfg ) ) ;
mt352_write ( fe , agc_cfg , sizeof ( agc_cfg ) ) ;
mt352_write ( fe , gpp_ctl_cfg , sizeof ( gpp_ctl_cfg ) ) ;
mt352_write ( fe , capt_range_cfg , sizeof ( capt_range_cfg ) ) ;
return 0 ;
}
/* Callbacks for DVB USB */
static struct tda10023_config anysee_tda10023_config = {
2011-04-09 20:50:07 -03:00
. demod_address = ( 0x1a > > 1 ) ,
2008-05-17 23:05:48 -03:00
. invert = 0 ,
. xtal = 16000000 ,
. pll_m = 11 ,
. pll_p = 3 ,
. pll_n = 1 ,
2008-06-09 22:58:22 -03:00
. output_mode = TDA10023_OUTPUT_MODE_PARALLEL_C ,
. deltaf = 0xfeeb ,
2008-05-17 23:05:48 -03:00
} ;
static struct mt352_config anysee_mt352_config = {
2011-04-09 20:50:07 -03:00
. demod_address = ( 0x1e > > 1 ) ,
2008-05-17 23:05:48 -03:00
. demod_init = anysee_mt352_demod_init ,
} ;
static struct zl10353_config anysee_zl10353_config = {
2011-04-09 20:50:07 -03:00
. demod_address = ( 0x1e > > 1 ) ,
2008-05-17 23:05:48 -03:00
. parallel_ts = 1 ,
} ;
2011-04-10 17:53:52 -03:00
/*
* New USB device strings : Mfr = 1 , Product = 2 , SerialNumber = 0
* Manufacturer : AMT . CO . KR
*
* E30 VID = 04 b4 PID = 861f HW = 2 FW = 2.1 Product = ? ? ? ? ? ? ? ?
* PCB : ?
* parts : MT352 , DTT7579 ( ? ) , DNOS404ZH102A NIM
*
* E30 VID = 04 b4 PID = 861f HW = 2 FW = 2.1 Product = ? ? ? ? ? ? ? ?
* PCB : ?
* parts : ZL10353 , DTT7579 ( ? ) , DNOS404ZH103A NIM
*
* E30 Plus VID = 04 b4 PID = 861f HW = 6 FW = 1.0 " anysee "
* PCB : 507 CD ( rev1 .1 )
* parts : ZL10353 , DTT7579 ( ? ) , CST56I01 , DNOS404ZH103A NIM
* OEA = 80 OEB = 00 OEC = 00 OED = ff OEF = fe
* IOD [ 0 ] ZL10353 1 = enabled
* IOA [ 7 ] TS 0 = enabled
* tuner is not behind ZL10353 I2C - gate ( no care if gate disabled or not )
*
* E30 C Plus VID = 04 b4 PID = 861f HW = 10 FW = 1.0 " anysee-DC(LP) "
* PCB : 507 DC ( rev0 .2 )
* parts : TDA10023 , CST56I01 , DTOS403IH102B TM
* OEA = 80 OEB = 00 OEC = 00 OED = ff OEF = fe
* IOD [ 0 ] TDA10023 1 = enabled
*
* E30 C Plus VID = 1 c73 PID = 861f HW = 15 FW = 1.2 " anysee-FA(LP) "
* PCB : 507F A ( rev0 .4 )
* parts : TDA10023 , TDA8024 , DTOS403IH102B TM
* OEA = 80 OEB = 00 OEC = ff OED = ff OEF = ff
* IOD [ 5 ] TDA10023 1 = enabled
* IOE [ 0 ] tuner 1 = enabled
*
* E30 Combo Plus VID = 1 c73 PID = 861f HW = 15 FW = 1.2 " anysee-FA(LP) "
* PCB : 507F A ( rev1 .1 )
* parts : ZL10353 , TDA10023 , TDA8024 , DTOS403IH102B TM
* OEA = 80 OEB = 00 OEC = ff OED = ff OEF = ff
* DVB - C :
* IOD [ 5 ] TDA10023 1 = enabled
* IOE [ 0 ] tuner 1 = enabled
* DVB - T :
* IOD [ 0 ] ZL10353 1 = enabled
* IOE [ 0 ] tuner 0 = enabled
* tuner is behind ZL10353 I2C - gate
*/
2008-05-17 23:05:48 -03:00
static int anysee_frontend_attach ( struct dvb_usb_adapter * adap )
{
int ret ;
struct anysee_state * state = adap - > dev - > priv ;
u8 hw_info [ 3 ] ;
2011-04-10 17:53:52 -03:00
/* Check which hardware we have.
* We must do this call two times to get reliable values ( hw bug ) .
*/
2008-05-17 23:05:48 -03:00
ret = anysee_get_hw_info ( adap - > dev , hw_info ) ;
if ( ret )
2011-04-10 17:53:52 -03:00
goto error ;
2008-05-17 23:05:48 -03:00
ret = anysee_get_hw_info ( adap - > dev , hw_info ) ;
if ( ret )
2011-04-10 17:53:52 -03:00
goto error ;
2008-05-17 23:05:48 -03:00
/* Meaning of these info bytes are guessed. */
2011-04-09 21:13:33 -03:00
info ( " firmware version:%d.%d hardware id:%d " ,
hw_info [ 1 ] , hw_info [ 2 ] , hw_info [ 0 ] ) ;
2008-05-17 23:05:48 -03:00
2011-04-10 17:53:52 -03:00
state - > hw = hw_info [ 0 ] ;
2008-05-17 23:05:48 -03:00
2011-04-10 17:53:52 -03:00
switch ( state - > hw ) {
case ANYSEE_HW_02 : /* 2 */
/* E30 */
2008-05-17 23:05:48 -03:00
2011-04-10 17:53:52 -03:00
/* attach demod */
adap - > fe = dvb_attach ( mt352_attach , & anysee_mt352_config ,
& adap - > dev - > i2c_adap ) ;
if ( adap - > fe )
break ;
2008-08-11 10:54:16 -03:00
2011-04-10 17:53:52 -03:00
/* attach demod */
2008-08-11 10:54:16 -03:00
adap - > fe = dvb_attach ( zl10353_attach , & anysee_zl10353_config ,
2011-04-10 17:53:52 -03:00
& adap - > dev - > i2c_adap ) ;
if ( adap - > fe )
break ;
2008-08-11 10:54:16 -03:00
2011-04-10 17:53:52 -03:00
break ;
case ANYSEE_HW_507CD : /* 6 */
/* E30 Plus */
2008-05-17 23:05:48 -03:00
2011-04-10 17:53:52 -03:00
/* enable DVB-T demod on IOD[0] */
ret = anysee_wr_reg_mask ( adap - > dev , REG_IOD , ( 1 < < 0 ) , 0x01 ) ;
if ( ret )
goto error ;
2008-05-17 23:05:48 -03:00
2011-04-10 17:53:52 -03:00
/* enable transport stream on IOA[7] */
ret = anysee_wr_reg_mask ( adap - > dev , REG_IOA , ( 0 < < 7 ) , 0x80 ) ;
if ( ret )
goto error ;
2008-05-17 23:05:48 -03:00
2011-04-10 17:53:52 -03:00
/* attach demod */
adap - > fe = dvb_attach ( zl10353_attach , & anysee_zl10353_config ,
& adap - > dev - > i2c_adap ) ;
if ( adap - > fe )
break ;
2008-05-17 23:05:48 -03:00
2011-04-10 17:53:52 -03:00
break ;
case ANYSEE_HW_507DC : /* 10 */
/* E30 C Plus */
/* enable DVB-C demod on IOD[0] */
ret = anysee_wr_reg_mask ( adap - > dev , REG_IOD , ( 1 < < 0 ) , 0x01 ) ;
if ( ret )
goto error ;
/* attach demod */
adap - > fe = dvb_attach ( tda10023_attach , & anysee_tda10023_config ,
& adap - > dev - > i2c_adap , 0x48 ) ;
if ( adap - > fe )
break ;
2008-05-17 23:05:48 -03:00
2011-04-10 17:53:52 -03:00
break ;
case ANYSEE_HW_507FA : /* 15 */
/* E30 Combo Plus */
/* E30 C Plus */
if ( dvb_usb_anysee_delsys ) {
/* disable DVB-C demod on IOD[5] */
ret = anysee_wr_reg_mask ( adap - > dev , REG_IOD , ( 0 < < 5 ) ,
0x20 ) ;
if ( ret )
goto error ;
/* enable DVB-T demod on IOD[0] */
ret = anysee_wr_reg_mask ( adap - > dev , REG_IOD , ( 1 < < 0 ) ,
0x01 ) ;
if ( ret )
goto error ;
/* attach demod */
adap - > fe = dvb_attach ( zl10353_attach ,
& anysee_zl10353_config , & adap - > dev - > i2c_adap ) ;
if ( adap - > fe )
break ;
} else {
/* disable DVB-T demod on IOD[0] */
ret = anysee_wr_reg_mask ( adap - > dev , REG_IOD , ( 0 < < 0 ) ,
0x01 ) ;
if ( ret )
goto error ;
/* enable DVB-C demod on IOD[5] */
ret = anysee_wr_reg_mask ( adap - > dev , REG_IOD , ( 1 < < 5 ) ,
0x20 ) ;
if ( ret )
goto error ;
/* attach demod */
adap - > fe = dvb_attach ( tda10023_attach ,
& anysee_tda10023_config , & adap - > dev - > i2c_adap ,
0x48 ) ;
if ( adap - > fe )
break ;
}
break ;
}
2008-05-17 23:05:48 -03:00
2011-04-10 17:53:52 -03:00
if ( ! adap - > fe ) {
/* we have no frontend :-( */
ret = - ENODEV ;
err ( " Unknown Anysee version: %02x %02x %02x. " \
" Please report the <linux-media@vger.kernel.org>. " ,
hw_info [ 0 ] , hw_info [ 1 ] , hw_info [ 2 ] ) ;
}
error :
return ret ;
2008-05-17 23:05:48 -03:00
}
static int anysee_tuner_attach ( struct dvb_usb_adapter * adap )
{
struct anysee_state * state = adap - > dev - > priv ;
2011-04-10 17:53:52 -03:00
int ret = 0 ;
2010-10-17 18:25:10 -03:00
deb_info ( " %s: \n " , __func__ ) ;
2008-05-17 23:05:48 -03:00
2011-04-10 17:53:52 -03:00
switch ( state - > hw ) {
case ANYSEE_HW_02 : /* 2 */
/* E30 */
/* attach tuner */
2011-04-09 20:50:07 -03:00
dvb_attach ( dvb_pll_attach , adap - > fe , ( 0xc2 > > 1 ) ,
NULL , DVB_PLL_THOMSON_DTT7579 ) ;
2008-05-17 23:05:48 -03:00
break ;
2011-04-10 17:53:52 -03:00
case ANYSEE_HW_507CD : /* 6 */
/* E30 Plus */
/* attach tuner */
dvb_attach ( dvb_pll_attach , adap - > fe , ( 0xc2 > > 1 ) ,
& adap - > dev - > i2c_adap , DVB_PLL_THOMSON_DTT7579 ) ;
break ;
case ANYSEE_HW_507DC : /* 10 */
/* E30 C Plus */
/* attach tuner */
dvb_attach ( dvb_pll_attach , adap - > fe , ( 0xc0 > > 1 ) ,
& adap - > dev - > i2c_adap , DVB_PLL_SAMSUNG_DTOS403IH102A ) ;
break ;
case ANYSEE_HW_507FA : /* 15 */
/* E30 Combo Plus */
/* E30 C Plus */
if ( dvb_usb_anysee_delsys ) {
/* enable DVB-T tuner on IOE[0] */
ret = anysee_wr_reg_mask ( adap - > dev , REG_IOE , ( 0 < < 0 ) ,
0x01 ) ;
if ( ret )
goto error ;
} else {
/* enable DVB-C tuner on IOE[0] */
ret = anysee_wr_reg_mask ( adap - > dev , REG_IOE , ( 1 < < 0 ) ,
0x01 ) ;
if ( ret )
goto error ;
}
/* attach tuner */
2011-04-09 20:50:07 -03:00
dvb_attach ( dvb_pll_attach , adap - > fe , ( 0xc0 > > 1 ) ,
& adap - > dev - > i2c_adap , DVB_PLL_SAMSUNG_DTOS403IH102A ) ;
2011-04-10 17:53:52 -03:00
2008-05-17 23:05:48 -03:00
break ;
2011-04-10 17:53:52 -03:00
default :
ret = - ENODEV ;
2008-05-17 23:05:48 -03:00
}
2011-04-10 17:53:52 -03:00
error :
return ret ;
2008-05-17 23:05:48 -03:00
}
2010-10-17 18:25:10 -03:00
static int anysee_rc_query ( struct dvb_usb_device * d )
2008-05-17 23:05:48 -03:00
{
u8 buf [ ] = { CMD_GET_IR_CODE } ;
u8 ircode [ 2 ] ;
2010-10-17 18:25:10 -03:00
int ret ;
/* Remote controller is basic NEC using address byte 0x08.
Anysee device RC query returns only two bytes , status and code ,
address byte is dropped . Also it does not return any value for
NEC RCs having address byte other than 0x08 . Due to that , we
cannot use that device as standard NEC receiver .
It could be possible make hack which reads whole code directly
from device memory . . . */
2008-05-17 23:05:48 -03:00
2010-10-17 18:25:10 -03:00
ret = anysee_ctrl_msg ( d , buf , sizeof ( buf ) , ircode , sizeof ( ircode ) ) ;
2008-05-17 23:05:48 -03:00
if ( ret )
return ret ;
2010-10-17 18:25:10 -03:00
if ( ircode [ 0 ] ) {
deb_rc ( " %s: key pressed %02x \n " , __func__ , ircode [ 1 ] ) ;
2010-11-17 13:53:11 -03:00
rc_keydown ( d - > rc_dev , 0x08 < < 8 | ircode [ 1 ] , 0 ) ;
2008-05-17 23:05:48 -03:00
}
2010-10-17 18:25:10 -03:00
2008-05-17 23:05:48 -03:00
return 0 ;
}
/* DVB USB Driver stuff */
static struct dvb_usb_device_properties anysee_properties ;
static int anysee_probe ( struct usb_interface * intf ,
const struct usb_device_id * id )
{
struct dvb_usb_device * d ;
struct usb_host_interface * alt ;
int ret ;
/* There is one interface with two alternate settings.
Alternate setting 0 is for bulk transfer .
Alternate setting 1 is for isochronous transfer .
We use bulk transfer ( alternate setting 0 ) . */
if ( intf - > num_altsetting < 1 )
return - ENODEV ;
2010-05-31 16:27:39 -03:00
/*
* Anysee is always warm ( its USB - bridge , Cypress FX2 , uploads
* firmware from eeprom ) . If dvb_usb_device_init ( ) succeeds that
* means d is a valid pointer .
*/
2008-05-17 23:05:48 -03:00
ret = dvb_usb_device_init ( intf , & anysee_properties , THIS_MODULE , & d ,
adapter_nr ) ;
if ( ret )
return ret ;
alt = usb_altnum_to_altsetting ( intf , 0 ) ;
if ( alt = = NULL ) {
deb_info ( " %s: no alt found! \n " , __func__ ) ;
return - ENODEV ;
}
ret = usb_set_interface ( d - > udev , alt - > desc . bInterfaceNumber ,
alt - > desc . bAlternateSetting ) ;
if ( ret )
return ret ;
2010-05-31 16:27:39 -03:00
return anysee_init ( d ) ;
2008-05-17 23:05:48 -03:00
}
2009-09-16 19:50:25 -03:00
static struct usb_device_id anysee_table [ ] = {
2008-05-17 23:05:48 -03:00
{ USB_DEVICE ( USB_VID_CYPRESS , USB_PID_ANYSEE ) } ,
{ USB_DEVICE ( USB_VID_AMT , USB_PID_ANYSEE ) } ,
{ } /* Terminating entry */
} ;
MODULE_DEVICE_TABLE ( usb , anysee_table ) ;
static struct dvb_usb_device_properties anysee_properties = {
. caps = DVB_USB_IS_AN_I2C_ADAPTER ,
. usb_ctrl = DEVICE_SPECIFIC ,
. size_of_priv = sizeof ( struct anysee_state ) ,
. num_adapters = 1 ,
. adapter = {
{
. streaming_ctrl = anysee_streaming_ctrl ,
. frontend_attach = anysee_frontend_attach ,
. tuner_attach = anysee_tuner_attach ,
. stream = {
. type = USB_BULK ,
. count = 8 ,
. endpoint = 0x82 ,
. u = {
. bulk = {
2009-09-16 19:47:01 -03:00
. buffersize = ( 16 * 512 ) ,
2008-05-17 23:05:48 -03:00
}
}
} ,
}
} ,
2010-10-17 18:25:10 -03:00
. rc . core = {
. rc_codes = RC_MAP_ANYSEE ,
2010-11-17 14:20:52 -03:00
. protocol = RC_TYPE_OTHER ,
2010-10-17 18:25:10 -03:00
. module_name = " anysee " ,
2010-07-31 18:04:09 -03:00
. rc_query = anysee_rc_query ,
2010-10-17 18:25:10 -03:00
. rc_interval = 250 , /* windows driver uses 500ms */
2010-07-31 18:04:09 -03:00
} ,
2008-05-17 23:05:48 -03:00
. i2c_algo = & anysee_i2c_algo ,
. generic_bulk_ctrl_endpoint = 1 ,
. num_device_descs = 1 ,
. devices = {
{
. name = " Anysee DVB USB2.0 " ,
. cold_ids = { NULL } ,
. warm_ids = { & anysee_table [ 0 ] ,
& anysee_table [ 1 ] , NULL } ,
} ,
}
} ;
static struct usb_driver anysee_driver = {
. name = " dvb_usb_anysee " ,
. probe = anysee_probe ,
. disconnect = dvb_usb_device_exit ,
. id_table = anysee_table ,
} ;
/* module stuff */
static int __init anysee_module_init ( void )
{
int ret ;
ret = usb_register ( & anysee_driver ) ;
if ( ret )
err ( " %s: usb_register failed. Error number %d " , __func__ , ret ) ;
return ret ;
}
static void __exit anysee_module_exit ( void )
{
/* deregister this driver from the USB subsystem */
usb_deregister ( & anysee_driver ) ;
}
module_init ( anysee_module_init ) ;
module_exit ( anysee_module_exit ) ;
MODULE_AUTHOR ( " Antti Palosaari <crope@iki.fi> " ) ;
MODULE_DESCRIPTION ( " Driver Anysee E30 DVB-C & DVB-T USB2.0 " ) ;
MODULE_LICENSE ( " GPL " ) ;