2019-05-31 01:09:32 -07:00
// SPDX-License-Identifier: GPL-2.0-only
2005-06-23 22:02:35 -07:00
/* DVB USB framework compliant Linux driver for the AVerMedia AverTV DVB-T
* USB2 .0 ( A800 ) DVB - T receiver .
*
2016-01-24 12:56:58 -02:00
* Copyright ( C ) 2005 Patrick Boettcher ( patrick . boettcher @ posteo . de )
2005-06-23 22:02:35 -07:00
*
* Thanks to
* - AVerMedia who kindly provided information and
* - Glen Harris who suffered from my mistakes during development .
*
2018-05-08 18:29:30 -03:00
* see Documentation / media / dvb - drivers / dvb - usb . rst for more information
2005-06-23 22:02:35 -07:00
*/
# include "dibusb.h"
static int debug ;
module_param ( debug , int , 0644 ) ;
MODULE_PARM_DESC ( debug , " set debugging level (rc=1 (or-able)). " DVB_USB_DEBUG_STATUS ) ;
2008-04-09 19:13:13 -03:00
DVB_DEFINE_MOD_OPT_ADAPTER_NR ( adapter_nr ) ;
2005-06-23 22:02:35 -07:00
# define deb_rc(args...) dprintk(debug,0x01,args)
static int a800_power_ctrl ( struct dvb_usb_device * d , int onoff )
{
/* do nothing for the AVerMedia */
return 0 ;
}
2006-07-29 18:49:36 -03:00
/* assure to put cold to 0 for iManufacturer == 1 */
2006-09-30 06:53:48 -03:00
static int a800_identify_state ( struct usb_device * udev , struct dvb_usb_device_properties * props ,
struct dvb_usb_device_description * * desc , int * cold )
2006-07-29 18:49:36 -03:00
{
* cold = udev - > descriptor . iManufacturer ! = 1 ;
return 0 ;
}
2017-09-01 09:29:58 -03:00
static int a800_rc_query ( struct dvb_usb_device * d )
2005-06-23 22:02:35 -07:00
{
2017-09-01 09:29:58 -03:00
int ret = 0 ;
2011-03-21 15:33:41 -03:00
u8 * key = kmalloc ( 5 , GFP_KERNEL ) ;
if ( ! key )
return - ENOMEM ;
2005-06-23 22:02:35 -07:00
if ( usb_control_msg ( d - > udev , usb_rcvctrlpipe ( d - > udev , 0 ) ,
0x04 , USB_TYPE_VENDOR | USB_DIR_IN , 0 , 0 , key , 5 ,
2011-03-21 15:33:41 -03:00
2000 ) ! = 5 ) {
ret = - ENODEV ;
goto out ;
}
2005-06-23 22:02:35 -07:00
2017-09-01 09:29:58 -03:00
/* Note that extended nec and nec32 are dropped */
if ( key [ 0 ] = = 1 )
rc_keydown ( d - > rc_dev , RC_PROTO_NEC ,
RC_SCANCODE_NEC ( key [ 1 ] , key [ 3 ] ) , 0 ) ;
else if ( key [ 0 ] = = 2 )
rc_repeat ( d - > rc_dev ) ;
2011-03-21 15:33:41 -03:00
out :
kfree ( key ) ;
return ret ;
2005-06-23 22:02:35 -07:00
}
/* USB Driver stuff */
2006-09-30 06:53:48 -03:00
static struct dvb_usb_device_properties a800_properties ;
2005-06-23 22:02:35 -07:00
static int a800_probe ( struct usb_interface * intf ,
const struct usb_device_id * id )
{
2008-04-09 19:13:13 -03:00
return dvb_usb_device_init ( intf , & a800_properties ,
THIS_MODULE , NULL , adapter_nr ) ;
2005-06-23 22:02:35 -07:00
}
/* do not change the order of the ID table */
static struct usb_device_id a800_table [ ] = {
/* 00 */ { USB_DEVICE ( USB_VID_AVERMEDIA , USB_PID_AVERMEDIA_DVBT_USB2_COLD ) } ,
/* 01 */ { USB_DEVICE ( USB_VID_AVERMEDIA , USB_PID_AVERMEDIA_DVBT_USB2_WARM ) } ,
{ } /* Terminating entry */
} ;
MODULE_DEVICE_TABLE ( usb , a800_table ) ;
2006-09-30 06:53:48 -03:00
static struct dvb_usb_device_properties a800_properties = {
. caps = DVB_USB_IS_AN_I2C_ADAPTER ,
2005-06-23 22:02:35 -07:00
. usb_ctrl = CYPRESS_FX2 ,
. firmware = " dvb-usb-avertv-a800-02.fw " ,
2006-09-30 06:53:48 -03:00
. num_adapters = 1 ,
. adapter = {
{
2011-09-06 09:31:57 -03:00
. num_frontends = 1 ,
. fe = { {
2006-09-30 06:53:48 -03:00
. caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF ,
. pid_filter_count = 32 ,
2006-10-13 11:34:46 -03:00
. streaming_ctrl = dibusb2_0_streaming_ctrl ,
. pid_filter = dibusb_pid_filter ,
. pid_filter_ctrl = dibusb_pid_filter_ctrl ,
. frontend_attach = dibusb_dib3000mc_frontend_attach ,
. tuner_attach = dibusb_dib3000mc_tuner_attach ,
/* parameter for the MPEG2-data transfer */
. stream = {
. type = USB_BULK ,
. count = 7 ,
. endpoint = 0x06 ,
. u = {
. bulk = {
. buffersize = 4096 ,
}
}
} ,
2011-09-06 09:31:57 -03:00
} } ,
2006-09-30 06:53:48 -03:00
. size_of_priv = sizeof ( struct dibusb_state ) ,
} ,
} ,
. power_ctrl = a800_power_ctrl ,
. identify_state = a800_identify_state ,
2017-09-01 09:29:58 -03:00
. rc . core = {
. rc_interval = DEFAULT_RC_INTERVAL ,
. rc_codes = RC_MAP_AVERMEDIA_M135A ,
. module_name = KBUILD_MODNAME ,
. rc_query = a800_rc_query ,
. allowed_protos = RC_PROTO_BIT_NEC ,
2010-07-31 18:04:09 -03:00
} ,
2006-09-30 06:53:48 -03:00
. i2c_algo = & dibusb_i2c_algo ,
. generic_bulk_ctrl_endpoint = 0x01 ,
2005-06-23 22:02:35 -07:00
. num_device_descs = 1 ,
. devices = {
{ " AVerMedia AverTV DVB-T USB 2.0 (A800) " ,
{ & a800_table [ 0 ] , NULL } ,
{ & a800_table [ 1 ] , NULL } ,
} ,
}
} ;
static struct usb_driver a800_driver = {
2005-07-07 17:58:30 -07:00
. name = " dvb_usb_a800 " ,
2005-06-23 22:02:35 -07:00
. probe = a800_probe ,
. disconnect = dvb_usb_device_exit ,
. id_table = a800_table ,
} ;
2011-11-18 09:46:12 -08:00
module_usb_driver ( a800_driver ) ;
2005-06-23 22:02:35 -07:00
2016-01-24 12:56:58 -02:00
MODULE_AUTHOR ( " Patrick Boettcher <patrick.boettcher@posteo.de> " ) ;
2005-06-23 22:02:35 -07:00
MODULE_DESCRIPTION ( " AVerMedia AverTV DVB-T USB 2.0 (A800) " ) ;
MODULE_VERSION ( " 1.0 " ) ;
MODULE_LICENSE ( " GPL " ) ;